{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/moment/locale/fr.js","node_modules/moment/moment.js","src/chrono.js","src/options.js","src/parsers/DE/DECasualDateParser.js","src/parsers/DE/DEDeadlineFormatParser.js","src/parsers/DE/DEMonthNameLittleEndianParser.js","src/parsers/DE/DEMonthNameParser.js","src/parsers/DE/DESlashDateFormatParser.js","src/parsers/DE/DETimeAgoFormatParser.js","src/parsers/DE/DETimeExpressionParser.js","src/parsers/DE/DEWeekdayParser.js","src/parsers/EN/ENCasualDateParser.js","src/parsers/EN/ENCasualTimeParser.js","src/parsers/EN/ENDeadlineFormatParser.js","src/parsers/EN/ENISOFormatParser.js","src/parsers/EN/ENMonthNameLittleEndianParser.js","src/parsers/EN/ENMonthNameMiddleEndianParser.js","src/parsers/EN/ENMonthNameParser.js","src/parsers/EN/ENRelativeDateFormatParser.js","src/parsers/EN/ENSlashDateFormatParser.js","src/parsers/EN/ENSlashDateFormatStartWithYearParser.js","src/parsers/EN/ENSlashMonthFormatParser.js","src/parsers/EN/ENTimeAgoFormatParser.js","src/parsers/EN/ENTimeExpressionParser.js","src/parsers/EN/ENTimeLaterFormatParser.js","src/parsers/EN/ENWeekdayParser.js","src/parsers/ES/ESCasualDateParser.js","src/parsers/ES/ESDeadlineFormatParser.js","src/parsers/ES/ESMonthNameLittleEndianParser.js","src/parsers/ES/ESSlashDateFormatParser.js","src/parsers/ES/ESTimeAgoFormatParser.js","src/parsers/ES/ESTimeExpressionParser.js","src/parsers/ES/ESWeekdayParser.js","src/parsers/FR/FRCasualDateParser.js","src/parsers/FR/FRDeadlineFormatParser.js","src/parsers/FR/FRMonthNameLittleEndianParser.js","src/parsers/FR/FRRelativeDateFormatParser.js","src/parsers/FR/FRSlashDateFormatParser.js","src/parsers/FR/FRTimeAgoFormatParser.js","src/parsers/FR/FRTimeExpressionParser.js","src/parsers/FR/FRWeekdayParser.js","src/parsers/JP/JPCasualDateParser.js","src/parsers/JP/JPStandardParser.js","src/parsers/ZH-Hant/ZHHantCasualDateParser.js","src/parsers/ZH-Hant/ZHHantDateParser.js","src/parsers/ZH-Hant/ZHHantDeadlineFormatParser.js","src/parsers/ZH-Hant/ZHHantTimeExpressionParser.js","src/parsers/ZH-Hant/ZHHantWeekdayParser.js","src/parsers/parser.js","src/refiners/DE/DEMergeDateRangeRefiner.js","src/refiners/DE/DEMergeDateTimeRefiner.js","src/refiners/EN/ENMergeDateRangeRefiner.js","src/refiners/EN/ENMergeDateTimeRefiner.js","src/refiners/EN/ENPrioritizeSpecificDateRefiner.js","src/refiners/ExtractTimezoneAbbrRefiner.js","src/refiners/ExtractTimezoneOffsetRefiner.js","src/refiners/FR/FRMergeDateRangeRefiner.js","src/refiners/FR/FRMergeDateTimeRefiner.js","src/refiners/ForwardDateRefiner.js","src/refiners/JP/JPMergeDateRangeRefiner.js","src/refiners/OverlapRemovalRefiner.js","src/refiners/UnlikelyFormatFilter.js","src/refiners/refiner.js","src/result.js","src/utils/DE.js","src/utils/EN.js","src/utils/ES.js","src/utils/FR.js","src/utils/JP.js","src/utils/ZH-Hant.js"],"names":["global","factory","exports","module","require","define","amd","moment","this","defineLocale","months","split","monthsShort","weekdays","weekdaysShort","weekdaysMin","longDateFormat","LT","LTS","L","LL","LLL","LLLL","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","relativeTime","future","past","s","m","mm","h","hh","d","dd","M","MM","y","yy","ordinalParse","ordinal","number","week","dow","doy","utils_hooks__hooks","hookCallback","apply","arguments","isArray","input","Object","prototype","toString","call","isDate","Date","map","arr","fn","i","res","length","push","hasOwnProp","a","b","hasOwnProperty","extend","valueOf","create_utc__createUTC","format","locale","strict","createLocalOrUTC","utc","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","getParsingFlags","_pf","valid__isValid","_isValid","flags","isNaN","_d","getTime","_strict","undefined","bigHour","valid__createInvalid","NaN","copyConfig","to","from","prop","val","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","momentProperties","Moment","config","updateInProgress","updateOffset","isMoment","obj","toInt","argumentForCoercion","coercedNumber","value","isFinite","Math","floor","ceil","compareArrays","array1","array2","dontConvert","len","min","lengthDiff","abs","diffs","Locale","normalizeLocale","key","toLowerCase","replace","chooseLocale","names","j","next","loadLocale","slice","join","name","oldLocale","locales","globalLocale","_abbr","locale_locales__getSetGlobalLocale","e","values","data","locale_locales__getLocale","abbr","set","addUnitAlias","unit","shorthand","lowerCase","aliases","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","makeGetSet","keepTime","get_set__set","get_set__get","mom","getSet","zeroFill","targetLength","forceSign","output","sign","addFormatToken","token","padded","callback","func","formatTokenFunctions","localeData","removeFormattingTokens","match","makeFormatFunction","array","formattingTokens","Function","formatMoment","isValid","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","localFormattingTokens","lastIndex","test","addRegexToken","regex","strictRegex","regexes","isStrict","getParseRegexForToken","RegExp","unescapeFormat","matched","p1","p2","p3","p4","addParseToken","tokens","addWeekParseToken","_w","addTimeToArrayFromToken","_a","daysInMonth","year","month","UTC","getUTCDate","localeMonths","_months","localeMonthsShort","_monthsShort","localeMonthsParse","monthName","_monthsParse","_longMonthsParse","_shortMonthsParse","setMonth","dayOfMonth","monthsParse","date","getSetMonth","getDaysInMonth","checkOverflow","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","warn","msg","suppressDeprecationWarnings","console","deprecate","firstTime","msgWithStack","Error","stack","deprecateSimple","deprecations","configFromISO","l","string","from_string__isoRegex","exec","isoDates","isoTimes","matchOffset","configFromStringAndFormat","configFromString","aspNetJsonRegex","createFromInputFallback","createDate","ms","setFullYear","createUTCDate","setUTCFullYear","daysInYear","isLeapYear","getIsLeapYear","weekOfYear","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","end","daysToDayOfWeek","day","local__createLocal","add","dayOfYear","localeWeek","_week","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","getSetISOWeek","dayOfYearFromWeeks","weekday","daysToAdd","getUTCDay","getSetDayOfYear","round","clone","startOf","defaults","c","currentDateArray","now","_useUTC","getUTCFullYear","getUTCMonth","getFullYear","getMonth","getDate","configFromArray","currentDate","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","setUTCMinutes","getUTCMinutes","w","weekYear","temp","GG","W","E","gg","ISO_8601","parsedInput","skipped","stringLength","totalParsedInputLength","substr","indexOf","meridiemFixWrap","_meridiem","hour","meridiem","isPm","meridiemHour","isPM","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromObject","minute","second","millisecond","createFromConfig","preparse","configFromInput","parseInt","isUTC","pickBy","moments","max","Duration","duration","years","quarters","quarter","weeks","days","hours","minutes","seconds","milliseconds","_milliseconds","_days","_data","_bubble","isDuration","offset","separator","utcOffset","offsetFromString","matches","chunk","parts","chunkOffset","cloneWithOffset","model","diff","setTime","local","getDateOffset","getTimezoneOffset","getSetOffset","keepLocalTime","localAdjust","_changeInProgress","add_subtract__addSubtract","create__createDuration","getSetZone","setOffsetToUTC","setOffsetToLocal","subtract","setOffsetToParsedOffset","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","other","toArray","isLocal","isUtcOffset","isUtc","ret","diffRes","aspNetRegex","create__isoRegex","parseIso","momentsDifference","inp","parseFloat","positiveMomentsDifference","base","isAfter","isBefore","createAdder","direction","period","dur","tmp","isAdding","moment_calendar__calendar","time","sod","inputMs","endOf","isBetween","isSame","absFloor","asFloat","delta","that","zoneDelta","monthDiff","anchor2","adjust","wholeMonthDiff","anchor","moment_format__toISOString","toISOString","toDate","inputString","defaultFormat","postformat","withoutSuffix","humanize","fromNow","toNow","newLocaleData","isoWeekday","to_type__valueOf","unix","moment_valid__isValid","parsingFlags","invalidAt","addWeekYearFormatToken","getter","weeksInYear","getSetWeekYear","getSetISOWeekYear","getISOWeeksInYear","getWeeksInYear","weekInfo","getSetQuarter","parseWeekday","weekdaysParse","localeWeekdays","_weekdays","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","localeWeekdaysParse","weekdayName","_weekdaysParse","getSetDayOfWeek","getDay","getSetLocaleDayOfWeek","getSetISODayOfWeek","lowercase","matchMeridiem","_meridiemParse","localeIsPM","charAt","localeMeridiem","isLower","millisecond__milliseconds","getZoneAbbr","getZoneName","moment__createUnix","moment__createInZone","parseZone","locale_calendar__calendar","_calendar","_longDateFormat","toUpperCase","_invalidDate","_ordinal","preParsePostFormat","relative__relativeTime","isFuture","_relativeTime","pastFuture","locale_set__set","_ordinalParseLenient","_ordinalParse","source","lists__get","index","field","setter","list","count","out","lists__listMonths","lists__listMonthsShort","lists__listWeekdays","lists__listWeekdaysShort","lists__listWeekdaysMin","duration_abs__abs","mathAbs","duration_add_subtract__addSubtract","duration_add_subtract__add","duration_add_subtract__subtract","bubble","daysToYears","yearsToDays","as","duration_as__valueOf","makeAs","alias","duration_get__get","makeGetter","substituteTimeAgo","duration_humanize__relativeTime","posNegDuration","thresholds","duration_humanize__getSetRelativeTimeThreshold","threshold","limit","withSuffix","iso_string__toISOString","Y","iso_string__abs","D","total","asSeconds","match1","match2","match3","match4","match6","match1to2","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchTimestamp","matchWord","defaultLocaleMonths","defaultLocaleMonthsShort","parseTwoDigitYear","getSetYear","defaultLocaleWeek","prototypeMin","prototypeMax","add_subtract__add","add_subtract__subtract","lang","isoWeekYear","getSetDayOfMonth","invalidWeekday","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","_isPm","defaultLocaleMeridiemParse","getSetHour","getSetMinute","getSetSecond","getSetMillisecond","momentPrototype__proto","get","toJSON","isoWeek","isoWeeks","isoWeeksInYear","isDST","isDSTShifted","zoneAbbr","zoneName","dates","zone","momentPrototype","defaultCalendar","defaultLongDateFormat","defaultOrdinalParse","defaultRelativeTime","prototype__proto","firstDayOfYear","langData","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","duration_get__milliseconds","duration_prototype__proto","toIsoString","version","invalid","relativeTimeThreshold","options","parser","refiner","Parser","Refiner","Filter","ParsedResult","ParsedComponents","Chrono","option","casualOption","parsers","refiners","parse","text","refDate","opt","forwardDate","allResults","forEach","results","execute","concat","sort","refine","parseDate","start","strictOption","casual","en","mergeOptions","commonPostProcessing","en_GB","de","es","fr","ja","addedTypes","mergedOption","p","constructor","r","ExtractTimezoneOffsetRefiner","ExtractTimezoneAbbrRefiner","UnlikelyFormatFilter","strictConfig","zh","DEDeadlineFormatParser","DEMonthNameLittleEndianParser","DEMonthNameParser","DESlashDateFormatParser","DETimeAgoFormatParser","DETimeExpressionParser","OverlapRemovalRefiner","ForwardDateRefiner","DEMergeDateTimeRefiner","DEMergeDateRangeRefiner","unshift","DECasualDateParser","DEWeekdayParser","ENISOFormatParser","ENDeadlineFormatParser","ENMonthNameLittleEndianParser","ENMonthNameMiddleEndianParser","ENMonthNameParser","ENSlashDateFormatParser","ENSlashDateFormatStartWithYearParser","ENSlashMonthFormatParser","ENTimeAgoFormatParser","ENTimeLaterFormatParser","ENTimeExpressionParser","ENMergeDateTimeRefiner","ENMergeDateRangeRefiner","ENPrioritizeSpecificDateRefiner","ENCasualDateParser","ENCasualTimeParser","ENWeekdayParser","ENRelativeDateFormatParser","littleEndian","JPStandardParser","JPMergeDateRangeRefiner","JPCasualDateParser","ESTimeAgoFormatParser","ESDeadlineFormatParser","ESTimeExpressionParser","ESMonthNameLittleEndianParser","ESSlashDateFormatParser","ESCasualDateParser","ESWeekdayParser","FRDeadlineFormatParser","FRMonthNameLittleEndianParser","FRSlashDateFormatParser","FRTimeAgoFormatParser","FRTimeExpressionParser","FRMergeDateRangeRefiner","FRMergeDateTimeRefiner","FRCasualDateParser","FRWeekdayParser","FRRelativeDateFormatParser","ZHHantDateParser","ZHHantWeekdayParser","ZHHantTimeExpressionParser","ZHHantCasualDateParser","ZHHantDeadlineFormatParser","PATTERN","pattern","extract","ref","result","refMoment","startMoment","lowerText","imply","secondMatch","assign","tags","util","INTEGER_WORDS_PATTERN","STRICT_PATTERN","isStrictMode","num","INTEGER_WORDS","WEEKDAY_GROUP","DATE_GROUP","DATE_TO_GROUP","MONTH_NAME_GROUP","YEAR_GROUP","YEAR_BE_GROUP","MONTH_OFFSET","nextYear","lastYear","WEEKDAY_OFFSET","YEAR_GROUP2","YEAR_BE_GROUP2","DAYS_OFFSET","sonntag","so","montag","mo","dienstag","di","mittwoch","mi","donnerstag","do","freitag","samstag","sa","OPENNING_GROUP","ENDING_GROUP","DAY_GROUP","MONTH_GROUP","argument","FIRST_REG_PATTERN","SECOND_REG_PATTERN","HOUR_GROUP","MINUTE_GROUP","SECOND_GROUP","AM_PM_HOUR_GROUP","substring","ampm","isCertain","keys","PREFIX_GROUP","POSTFIX_GROUP","dayOfWeek","prefix","postfix","refOffset","norm","TIME_MATCH","YEAR_NUMBER_GROUP","MONTH_NUMBER_GROUP","DATE_NUMBER_GROUP","HOUR_NUMBER_GROUP","MINUTE_NUMBER_GROUP","SECOND_NUMBER_GROUP","MILLISECOND_NUMBER_GROUP","TZD_HOUR_OFFSET_GROUP","TZD_MINUTE_OFFSET_GROUP","minuteOffset","hourOffset","ORDINAL_WORDS_PATTERN","DATE_NUM_GROUP","DATE_TO_NUM_GROUP","ORDINAL_WORDS","trim","endDate","yearBE","MODIFIER_WORD_GROUP","MULTIPLIER_WORD_GROUP","RELATIVE_WORD_GROUP","modifier","sunday","sun","monday","mon","tuesday","wednesday","wed","thursday","thur","friday","fri","saturday","sat","FIRST_NUMBERS_GROUP","SECOND_NUMBERS_GROUP","tday","TIME_UNIT_PATTERN","TIME_UNIT_STRICT_PATTERN","fragments","extractDateTimeUnitFragments","MILLI_SECOND_GROUP","tues","tue","thurs","thu","updateParsedComponent","startMomentFixed","firstMatch","domingo","dom","lunes","lun","martes","mar","miercoles","miércoles","mie","jueves","jue","viernes","vier","sábado","sabado","sab","originalLocale","MULTIPLIER_GROUP","MODIFIER_1_GROUP","MODIFIER_2_GROUP","multiplier","modifierFactor","dateFrom","dateTo","relative","dateTmp","dimanche","dim","lundi","mardi","mercredi","mer","jeudi","jeu","vendredi","ven","samedi","sam","ERA_GROUP","toHankaku","NOW_GROUP","DAY_GROUP_1","TIME_GROUP_1","TIME_GROUP_2","DAY_GROUP_3","TIME_GROUP_3","day1","time1","timeString2","time2","day3","timeString3","time3","NUMBER","zhStringToNumber","zhStringToYear","NUMBER_GROUP","UNIT_GROUP","unitAbbr","patternString1","patternString2","ZH_AM_PM_HOUR_GROUP_1","ZH_AM_PM_HOUR_GROUP_2","ZH_AM_PM_HOUR_GROUP_3","ZHTimeExpressionParser","zhAMPMString1","zhAMPM1","zhAMPMString2","zhAMPM2","zhAMPMString3","zhAMPM3","endMoment","strictMode","remainingText","hasPossibleDates","isAbleToMerge","prevResult","curResult","mergeResult","dateResult","timeResult","beginDate","beginTime","beginDateTime","mergeDateTimeComponent","endTime","endDateTime","startIndex","endIndex","tag","isDateOnly","isTimeOnly","mergedResult","currResult","result1","result2","begin","isWeekdayResult","fromResult","toResult","knownValues","fromMoment","toMoment","dateComponent","timeComponent","dateTimeComponent","isMoreSpecific","moreSpecific","textBetween","includesRelativeResult","referToSameDate","specificResult","nonSpecificResult","TIMEZONE_ABBR_MAP","TIMEZONE_NAME_PATTERN","timezoneAbbr","timezoneOffset","ACDT","ACST","ADT","AEDT","AEST","AFT","AKDT","AKST","ALMT","AMST","AMT","ANAST","ANAT","AQTT","ART","AST","AWDT","AWST","AZOST","AZOT","AZST","AZT","BNT","BOT","BRST","BRT","BST","BTT","CAST","CAT","CCT","CDT","CEST","CET","CHADT","CHAST","CKT","CLST","CLT","COT","CST","CVT","CXT","ChST","DAVT","EASST","EAST","EAT","ECT","EDT","EEST","EET","EGST","EGT","EST","ET","FJST","FJT","FKST","FKT","FNT","GALT","GAMT","GET","GFT","GILT","GMT","GST","GYT","HAA","HAC","HADT","HAE","HAP","HAR","HAST","HAT","HAY","HKT","HLV","HNA","HNC","HNE","HNP","HNR","HNT","HNY","HOVT","ICT","IDT","IOT","IRDT","IRKST","IRKT","IRST","IST","JST","KGT","KRAST","KRAT","KST","KUYT","LHDT","LHST","LINT","MAGST","MAGT","MART","MAWT","MDT","MESZ","MEZ","MHT","MMT","MSD","MSK","MST","MUT","MVT","MYT","NCT","NDT","NFT","NOVST","NOVT","NPT","NST","NUT","NZDT","NZST","OMSST","OMST","PDT","PET","PETST","PETT","PGT","PHOT","PHT","PKT","PMDT","PMST","PONT","PST","PT","PWT","PYST","PYT","RET","SAMT","SAST","SBT","SCT","SGT","SRT","SST","TAHT","TFT","TJT","TKT","TLT","TMT","TVT","ULAT","UYST","UYT","UZT","VET","VLAST","VLAT","VUT","WAST","WAT","WEST","WESZ","WET","WEZ","WFT","WGST","WGT","WIB","WIT","WITA","WST","WT","YAKST","YAKT","YAPT","YEKST","YEKT","TIMEZONE_OFFSET_PATTERN","TIMEZONE_OFFSET_SIGN_GROUP","TIMEZONE_OFFSET_HOUR_OFFSET_GROUP","TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP","filteredResults","filteredResult","components","impliedValues","JSON","stringify","isPossibleDate","component","dateMoment","currentTimezoneOffset","targetTimezoneOffset","adjustTimezoneOffset","januar","jan","jan.","februar","feb","feb.","märz","maerz","mär","mär.","mrz","mrz.","april","apr","apr.","mai","juni","jun","jun.","juli","jul","jul.","august","aug","aug.","september","sep","sep.","sept","sept.","oktober","okt","okt.","november","nov","nov.","dezember","dez","dez.","eins","zwei","drei","fünf","fuenf","sechs","sieben","acht","neun","zehn","elf","zwölf","zwoelf","collectDateTimeFragment","january","february","march","mar.","may","june","july","october","oct","oct.","december","dec","dec.","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","first","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth","thirteenth","fourteenth","fifteenth","sixteenth","seventeenth","eighteenth","nineteenth","twentieth","twenty first","twenty second","twenty third","twenty fourth","twenty fifth","twenty sixth","twenty seventh","twenty eighth","twenty ninth","thirtieth","thirty first","TIME_UNIT","TIME_UNIT_STRICT","PATTERN_TIME_UNIT","timeunitText","vie","enero","ene","ene.","febrero","marzo","abril","abr","abr.","mayo","may.","junio","julio","agosto","ago","ago.","septiembre","octubre","noviembre","diciembre","dic","dic.","janvier","février","fév","fév.","fevrier","fev","fev.","mars","avril","avr","avr.","juin","juillet","août","aout","septembre","octobre","novembre","décembre","decembre","un","deux","trois","quatre","cinq","huit","neuf","dix","onze","douze","treize","String","fromCharCode","alphaNum","charCodeAt","toZenkaku","零","一","二","兩","三","四","五","六","七","八","九","十","廿","卅","天","日","char"],"mappings":"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AAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,EAAEC,KAAO,GAAGC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,MAAQ,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,EAAEC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,GAAGC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,GAAGC,IAAM,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,GAAGC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,GAAGC,IAAM,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,IAAM,IA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","file":"bundle.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})","//! moment.js locale configuration\n//! locale : french (fr)\n//! author : John Fischer : https://github.com/jfroffice\n\n(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['moment'], factory) :\n   factory(global.moment)\n}(this, function (moment) { 'use strict';\n\n\n    var fr = moment.defineLocale('fr', {\n        months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n        monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n        weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n        weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n        weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),\n        longDateFormat : {\n            LT : 'HH:mm',\n            LTS : 'LT:ss',\n            L : 'DD/MM/YYYY',\n            LL : 'D MMMM YYYY',\n            LLL : 'D MMMM YYYY LT',\n            LLLL : 'dddd D MMMM YYYY LT'\n        },\n        calendar : {\n            sameDay: '[Aujourd\\'hui à] LT',\n            nextDay: '[Demain à] LT',\n            nextWeek: 'dddd [à] LT',\n            lastDay: '[Hier à] LT',\n            lastWeek: 'dddd [dernier à] LT',\n            sameElse: 'L'\n        },\n        relativeTime : {\n            future : 'dans %s',\n            past : 'il y a %s',\n            s : 'quelques secondes',\n            m : 'une minute',\n            mm : '%d minutes',\n            h : 'une heure',\n            hh : '%d heures',\n            d : 'un jour',\n            dd : '%d jours',\n            M : 'un mois',\n            MM : '%d mois',\n            y : 'un an',\n            yy : '%d ans'\n        },\n        ordinalParse: /\\d{1,2}(er|)/,\n        ordinal : function (number) {\n            return number + (number === 1 ? 'er' : '');\n        },\n        week : {\n            dow : 1, // Monday is the first day of the week.\n            doy : 4  // The week that contains Jan 4th is the first week of the year.\n        }\n    });\n\n    return fr;\n\n}));","//! moment.js\n//! version : 2.10.3\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, function () { 'use strict';\n\n    var hookCallback;\n\n    function utils_hooks__hooks () {\n        return hookCallback.apply(null, arguments);\n    }\n\n    // This is done to register the method called with moment()\n    // without creating circular dependencies.\n    function setHookCallback (callback) {\n        hookCallback = callback;\n    }\n\n    function isArray(input) {\n        return Object.prototype.toString.call(input) === '[object Array]';\n    }\n\n    function isDate(input) {\n        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n    }\n\n    function map(arr, fn) {\n        var res = [], i;\n        for (i = 0; i < arr.length; ++i) {\n            res.push(fn(arr[i], i));\n        }\n        return res;\n    }\n\n    function hasOwnProp(a, b) {\n        return Object.prototype.hasOwnProperty.call(a, b);\n    }\n\n    function extend(a, b) {\n        for (var i in b) {\n            if (hasOwnProp(b, i)) {\n                a[i] = b[i];\n            }\n        }\n\n        if (hasOwnProp(b, 'toString')) {\n            a.toString = b.toString;\n        }\n\n        if (hasOwnProp(b, 'valueOf')) {\n            a.valueOf = b.valueOf;\n        }\n\n        return a;\n    }\n\n    function create_utc__createUTC (input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, true).utc();\n    }\n\n    function defaultParsingFlags() {\n        // We need to deep clone this object.\n        return {\n            empty           : false,\n            unusedTokens    : [],\n            unusedInput     : [],\n            overflow        : -2,\n            charsLeftOver   : 0,\n            nullInput       : false,\n            invalidMonth    : null,\n            invalidFormat   : false,\n            userInvalidated : false,\n            iso             : false\n        };\n    }\n\n    function getParsingFlags(m) {\n        if (m._pf == null) {\n            m._pf = defaultParsingFlags();\n        }\n        return m._pf;\n    }\n\n    function valid__isValid(m) {\n        if (m._isValid == null) {\n            var flags = getParsingFlags(m);\n            m._isValid = !isNaN(m._d.getTime()) &&\n                flags.overflow < 0 &&\n                !flags.empty &&\n                !flags.invalidMonth &&\n                !flags.nullInput &&\n                !flags.invalidFormat &&\n                !flags.userInvalidated;\n\n            if (m._strict) {\n                m._isValid = m._isValid &&\n                    flags.charsLeftOver === 0 &&\n                    flags.unusedTokens.length === 0 &&\n                    flags.bigHour === undefined;\n            }\n        }\n        return m._isValid;\n    }\n\n    function valid__createInvalid (flags) {\n        var m = create_utc__createUTC(NaN);\n        if (flags != null) {\n            extend(getParsingFlags(m), flags);\n        }\n        else {\n            getParsingFlags(m).userInvalidated = true;\n        }\n\n        return m;\n    }\n\n    var momentProperties = utils_hooks__hooks.momentProperties = [];\n\n    function copyConfig(to, from) {\n        var i, prop, val;\n\n        if (typeof from._isAMomentObject !== 'undefined') {\n            to._isAMomentObject = from._isAMomentObject;\n        }\n        if (typeof from._i !== 'undefined') {\n            to._i = from._i;\n        }\n        if (typeof from._f !== 'undefined') {\n            to._f = from._f;\n        }\n        if (typeof from._l !== 'undefined') {\n            to._l = from._l;\n        }\n        if (typeof from._strict !== 'undefined') {\n            to._strict = from._strict;\n        }\n        if (typeof from._tzm !== 'undefined') {\n            to._tzm = from._tzm;\n        }\n        if (typeof from._isUTC !== 'undefined') {\n            to._isUTC = from._isUTC;\n        }\n        if (typeof from._offset !== 'undefined') {\n            to._offset = from._offset;\n        }\n        if (typeof from._pf !== 'undefined') {\n            to._pf = getParsingFlags(from);\n        }\n        if (typeof from._locale !== 'undefined') {\n            to._locale = from._locale;\n        }\n\n        if (momentProperties.length > 0) {\n            for (i in momentProperties) {\n                prop = momentProperties[i];\n                val = from[prop];\n                if (typeof val !== 'undefined') {\n                    to[prop] = val;\n                }\n            }\n        }\n\n        return to;\n    }\n\n    var updateInProgress = false;\n\n    // Moment prototype object\n    function Moment(config) {\n        copyConfig(this, config);\n        this._d = new Date(+config._d);\n        // Prevent infinite loop in case updateOffset creates new moment\n        // objects.\n        if (updateInProgress === false) {\n            updateInProgress = true;\n            utils_hooks__hooks.updateOffset(this);\n            updateInProgress = false;\n        }\n    }\n\n    function isMoment (obj) {\n        return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n    }\n\n    function toInt(argumentForCoercion) {\n        var coercedNumber = +argumentForCoercion,\n            value = 0;\n\n        if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n            if (coercedNumber >= 0) {\n                value = Math.floor(coercedNumber);\n            } else {\n                value = Math.ceil(coercedNumber);\n            }\n        }\n\n        return value;\n    }\n\n    function compareArrays(array1, array2, dontConvert) {\n        var len = Math.min(array1.length, array2.length),\n            lengthDiff = Math.abs(array1.length - array2.length),\n            diffs = 0,\n            i;\n        for (i = 0; i < len; i++) {\n            if ((dontConvert && array1[i] !== array2[i]) ||\n                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n                diffs++;\n            }\n        }\n        return diffs + lengthDiff;\n    }\n\n    function Locale() {\n    }\n\n    var locales = {};\n    var globalLocale;\n\n    function normalizeLocale(key) {\n        return key ? key.toLowerCase().replace('_', '-') : key;\n    }\n\n    // pick the locale from the array\n    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n    function chooseLocale(names) {\n        var i = 0, j, next, locale, split;\n\n        while (i < names.length) {\n            split = normalizeLocale(names[i]).split('-');\n            j = split.length;\n            next = normalizeLocale(names[i + 1]);\n            next = next ? next.split('-') : null;\n            while (j > 0) {\n                locale = loadLocale(split.slice(0, j).join('-'));\n                if (locale) {\n                    return locale;\n                }\n                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                    //the next array item is better than a shallower substring of this one\n                    break;\n                }\n                j--;\n            }\n            i++;\n        }\n        return null;\n    }\n\n    function loadLocale(name) {\n        var oldLocale = null;\n        // TODO: Find a better way to register and load all the locales in Node\n        if (!locales[name] && typeof module !== 'undefined' &&\n                module && module.exports) {\n            try {\n                oldLocale = globalLocale._abbr;\n                require('./locale/' + name);\n                // because defineLocale currently also sets the global locale, we\n                // want to undo that for lazy loaded locales\n                locale_locales__getSetGlobalLocale(oldLocale);\n            } catch (e) { }\n        }\n        return locales[name];\n    }\n\n    // This function will load locale and then set the global locale.  If\n    // no arguments are passed in, it will simply return the current global\n    // locale key.\n    function locale_locales__getSetGlobalLocale (key, values) {\n        var data;\n        if (key) {\n            if (typeof values === 'undefined') {\n                data = locale_locales__getLocale(key);\n            }\n            else {\n                data = defineLocale(key, values);\n            }\n\n            if (data) {\n                // moment.duration._locale = moment._locale = data;\n                globalLocale = data;\n            }\n        }\n\n        return globalLocale._abbr;\n    }\n\n    function defineLocale (name, values) {\n        if (values !== null) {\n            values.abbr = name;\n            if (!locales[name]) {\n                locales[name] = new Locale();\n            }\n            locales[name].set(values);\n\n            // backwards compat for now: also set the locale\n            locale_locales__getSetGlobalLocale(name);\n\n            return locales[name];\n        } else {\n            // useful for testing\n            delete locales[name];\n            return null;\n        }\n    }\n\n    // returns locale data\n    function locale_locales__getLocale (key) {\n        var locale;\n\n        if (key && key._locale && key._locale._abbr) {\n            key = key._locale._abbr;\n        }\n\n        if (!key) {\n            return globalLocale;\n        }\n\n        if (!isArray(key)) {\n            //short-circuit everything else\n            locale = loadLocale(key);\n            if (locale) {\n                return locale;\n            }\n            key = [key];\n        }\n\n        return chooseLocale(key);\n    }\n\n    var aliases = {};\n\n    function addUnitAlias (unit, shorthand) {\n        var lowerCase = unit.toLowerCase();\n        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n    }\n\n    function normalizeUnits(units) {\n        return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n    }\n\n    function normalizeObjectUnits(inputObject) {\n        var normalizedInput = {},\n            normalizedProp,\n            prop;\n\n        for (prop in inputObject) {\n            if (hasOwnProp(inputObject, prop)) {\n                normalizedProp = normalizeUnits(prop);\n                if (normalizedProp) {\n                    normalizedInput[normalizedProp] = inputObject[prop];\n                }\n            }\n        }\n\n        return normalizedInput;\n    }\n\n    function makeGetSet (unit, keepTime) {\n        return function (value) {\n            if (value != null) {\n                get_set__set(this, unit, value);\n                utils_hooks__hooks.updateOffset(this, keepTime);\n                return this;\n            } else {\n                return get_set__get(this, unit);\n            }\n        };\n    }\n\n    function get_set__get (mom, unit) {\n        return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]();\n    }\n\n    function get_set__set (mom, unit, value) {\n        return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n    }\n\n    // MOMENTS\n\n    function getSet (units, value) {\n        var unit;\n        if (typeof units === 'object') {\n            for (unit in units) {\n                this.set(unit, units[unit]);\n            }\n        } else {\n            units = normalizeUnits(units);\n            if (typeof this[units] === 'function') {\n                return this[units](value);\n            }\n        }\n        return this;\n    }\n\n    function zeroFill(number, targetLength, forceSign) {\n        var output = '' + Math.abs(number),\n            sign = number >= 0;\n\n        while (output.length < targetLength) {\n            output = '0' + output;\n        }\n        return (sign ? (forceSign ? '+' : '') : '-') + output;\n    }\n\n    var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g;\n\n    var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n    var formatFunctions = {};\n\n    var formatTokenFunctions = {};\n\n    // token:    'M'\n    // padded:   ['MM', 2]\n    // ordinal:  'Mo'\n    // callback: function () { this.month() + 1 }\n    function addFormatToken (token, padded, ordinal, callback) {\n        var func = callback;\n        if (typeof callback === 'string') {\n            func = function () {\n                return this[callback]();\n            };\n        }\n        if (token) {\n            formatTokenFunctions[token] = func;\n        }\n        if (padded) {\n            formatTokenFunctions[padded[0]] = function () {\n                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n            };\n        }\n        if (ordinal) {\n            formatTokenFunctions[ordinal] = function () {\n                return this.localeData().ordinal(func.apply(this, arguments), token);\n            };\n        }\n    }\n\n    function removeFormattingTokens(input) {\n        if (input.match(/\\[[\\s\\S]/)) {\n            return input.replace(/^\\[|\\]$/g, '');\n        }\n        return input.replace(/\\\\/g, '');\n    }\n\n    function makeFormatFunction(format) {\n        var array = format.match(formattingTokens), i, length;\n\n        for (i = 0, length = array.length; i < length; i++) {\n            if (formatTokenFunctions[array[i]]) {\n                array[i] = formatTokenFunctions[array[i]];\n            } else {\n                array[i] = removeFormattingTokens(array[i]);\n            }\n        }\n\n        return function (mom) {\n            var output = '';\n            for (i = 0; i < length; i++) {\n                output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];\n            }\n            return output;\n        };\n    }\n\n    // format date using native date object\n    function formatMoment(m, format) {\n        if (!m.isValid()) {\n            return m.localeData().invalidDate();\n        }\n\n        format = expandFormat(format, m.localeData());\n\n        if (!formatFunctions[format]) {\n            formatFunctions[format] = makeFormatFunction(format);\n        }\n\n        return formatFunctions[format](m);\n    }\n\n    function expandFormat(format, locale) {\n        var i = 5;\n\n        function replaceLongDateFormatTokens(input) {\n            return locale.longDateFormat(input) || input;\n        }\n\n        localFormattingTokens.lastIndex = 0;\n        while (i >= 0 && localFormattingTokens.test(format)) {\n            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n            localFormattingTokens.lastIndex = 0;\n            i -= 1;\n        }\n\n        return format;\n    }\n\n    var match1         = /\\d/;            //       0 - 9\n    var match2         = /\\d\\d/;          //      00 - 99\n    var match3         = /\\d{3}/;         //     000 - 999\n    var match4         = /\\d{4}/;         //    0000 - 9999\n    var match6         = /[+-]?\\d{6}/;    // -999999 - 999999\n    var match1to2      = /\\d\\d?/;         //       0 - 99\n    var match1to3      = /\\d{1,3}/;       //       0 - 999\n    var match1to4      = /\\d{1,4}/;       //       0 - 9999\n    var match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\n    var matchUnsigned  = /\\d+/;           //       0 - inf\n    var matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\n    var matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n\n    var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n    // any word (or two) characters or numbers including two/three word month in arabic.\n    var matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;\n\n    var regexes = {};\n\n    function addRegexToken (token, regex, strictRegex) {\n        regexes[token] = typeof regex === 'function' ? regex : function (isStrict) {\n            return (isStrict && strictRegex) ? strictRegex : regex;\n        };\n    }\n\n    function getParseRegexForToken (token, config) {\n        if (!hasOwnProp(regexes, token)) {\n            return new RegExp(unescapeFormat(token));\n        }\n\n        return regexes[token](config._strict, config._locale);\n    }\n\n    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n    function unescapeFormat(s) {\n        return s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n            return p1 || p2 || p3 || p4;\n        }).replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    }\n\n    var tokens = {};\n\n    function addParseToken (token, callback) {\n        var i, func = callback;\n        if (typeof token === 'string') {\n            token = [token];\n        }\n        if (typeof callback === 'number') {\n            func = function (input, array) {\n                array[callback] = toInt(input);\n            };\n        }\n        for (i = 0; i < token.length; i++) {\n            tokens[token[i]] = func;\n        }\n    }\n\n    function addWeekParseToken (token, callback) {\n        addParseToken(token, function (input, array, config, token) {\n            config._w = config._w || {};\n            callback(input, config._w, config, token);\n        });\n    }\n\n    function addTimeToArrayFromToken(token, input, config) {\n        if (input != null && hasOwnProp(tokens, token)) {\n            tokens[token](input, config._a, config, token);\n        }\n    }\n\n    var YEAR = 0;\n    var MONTH = 1;\n    var DATE = 2;\n    var HOUR = 3;\n    var MINUTE = 4;\n    var SECOND = 5;\n    var MILLISECOND = 6;\n\n    function daysInMonth(year, month) {\n        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n    }\n\n    // FORMATTING\n\n    addFormatToken('M', ['MM', 2], 'Mo', function () {\n        return this.month() + 1;\n    });\n\n    addFormatToken('MMM', 0, 0, function (format) {\n        return this.localeData().monthsShort(this, format);\n    });\n\n    addFormatToken('MMMM', 0, 0, function (format) {\n        return this.localeData().months(this, format);\n    });\n\n    // ALIASES\n\n    addUnitAlias('month', 'M');\n\n    // PARSING\n\n    addRegexToken('M',    match1to2);\n    addRegexToken('MM',   match1to2, match2);\n    addRegexToken('MMM',  matchWord);\n    addRegexToken('MMMM', matchWord);\n\n    addParseToken(['M', 'MM'], function (input, array) {\n        array[MONTH] = toInt(input) - 1;\n    });\n\n    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n        var month = config._locale.monthsParse(input, token, config._strict);\n        // if we didn't find a month name, mark the date as invalid.\n        if (month != null) {\n            array[MONTH] = month;\n        } else {\n            getParsingFlags(config).invalidMonth = input;\n        }\n    });\n\n    // LOCALES\n\n    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n    function localeMonths (m) {\n        return this._months[m.month()];\n    }\n\n    var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n    function localeMonthsShort (m) {\n        return this._monthsShort[m.month()];\n    }\n\n    function localeMonthsParse (monthName, format, strict) {\n        var i, mom, regex;\n\n        if (!this._monthsParse) {\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n        }\n\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = create_utc__createUTC([2000, i]);\n            if (strict && !this._longMonthsParse[i]) {\n                this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n                this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n            }\n            if (!strict && !this._monthsParse[i]) {\n                regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n                return i;\n            } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n                return i;\n            } else if (!strict && this._monthsParse[i].test(monthName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function setMonth (mom, value) {\n        var dayOfMonth;\n\n        // TODO: Move this out of here!\n        if (typeof value === 'string') {\n            value = mom.localeData().monthsParse(value);\n            // TODO: Another silent failure?\n            if (typeof value !== 'number') {\n                return mom;\n            }\n        }\n\n        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n        return mom;\n    }\n\n    function getSetMonth (value) {\n        if (value != null) {\n            setMonth(this, value);\n            utils_hooks__hooks.updateOffset(this, true);\n            return this;\n        } else {\n            return get_set__get(this, 'Month');\n        }\n    }\n\n    function getDaysInMonth () {\n        return daysInMonth(this.year(), this.month());\n    }\n\n    function checkOverflow (m) {\n        var overflow;\n        var a = m._a;\n\n        if (a && getParsingFlags(m).overflow === -2) {\n            overflow =\n                a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n                a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n                a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n                a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n                a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n                a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n                -1;\n\n            if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n                overflow = DATE;\n            }\n\n            getParsingFlags(m).overflow = overflow;\n        }\n\n        return m;\n    }\n\n    function warn(msg) {\n        if (utils_hooks__hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) {\n            console.warn('Deprecation warning: ' + msg);\n        }\n    }\n\n    function deprecate(msg, fn) {\n        var firstTime = true,\n            msgWithStack = msg + '\\n' + (new Error()).stack;\n\n        return extend(function () {\n            if (firstTime) {\n                warn(msgWithStack);\n                firstTime = false;\n            }\n            return fn.apply(this, arguments);\n        }, fn);\n    }\n\n    var deprecations = {};\n\n    function deprecateSimple(name, msg) {\n        if (!deprecations[name]) {\n            warn(msg);\n            deprecations[name] = true;\n        }\n    }\n\n    utils_hooks__hooks.suppressDeprecationWarnings = false;\n\n    var from_string__isoRegex = /^\\s*(?:[+-]\\d{6}|\\d{4})-(?:(\\d\\d-\\d\\d)|(W\\d\\d$)|(W\\d\\d-\\d)|(\\d\\d\\d))((T| )(\\d\\d(:\\d\\d(:\\d\\d(\\.\\d+)?)?)?)?([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\n    var isoDates = [\n        ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d{2}-\\d{2}/],\n        ['YYYY-MM-DD', /\\d{4}-\\d{2}-\\d{2}/],\n        ['GGGG-[W]WW-E', /\\d{4}-W\\d{2}-\\d/],\n        ['GGGG-[W]WW', /\\d{4}-W\\d{2}/],\n        ['YYYY-DDD', /\\d{4}-\\d{3}/]\n    ];\n\n    // iso time formats and regexes\n    var isoTimes = [\n        ['HH:mm:ss.SSSS', /(T| )\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n        ['HH:mm:ss', /(T| )\\d\\d:\\d\\d:\\d\\d/],\n        ['HH:mm', /(T| )\\d\\d:\\d\\d/],\n        ['HH', /(T| )\\d\\d/]\n    ];\n\n    var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n    // date from iso format\n    function configFromISO(config) {\n        var i, l,\n            string = config._i,\n            match = from_string__isoRegex.exec(string);\n\n        if (match) {\n            getParsingFlags(config).iso = true;\n            for (i = 0, l = isoDates.length; i < l; i++) {\n                if (isoDates[i][1].exec(string)) {\n                    // match[5] should be 'T' or undefined\n                    config._f = isoDates[i][0] + (match[6] || ' ');\n                    break;\n                }\n            }\n            for (i = 0, l = isoTimes.length; i < l; i++) {\n                if (isoTimes[i][1].exec(string)) {\n                    config._f += isoTimes[i][0];\n                    break;\n                }\n            }\n            if (string.match(matchOffset)) {\n                config._f += 'Z';\n            }\n            configFromStringAndFormat(config);\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    // date from iso format or fallback\n    function configFromString(config) {\n        var matched = aspNetJsonRegex.exec(config._i);\n\n        if (matched !== null) {\n            config._d = new Date(+matched[1]);\n            return;\n        }\n\n        configFromISO(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n            utils_hooks__hooks.createFromInputFallback(config);\n        }\n    }\n\n    utils_hooks__hooks.createFromInputFallback = deprecate(\n        'moment construction falls back to js Date. This is ' +\n        'discouraged and will be removed in upcoming major ' +\n        'release. Please refer to ' +\n        'https://github.com/moment/moment/issues/1407 for more info.',\n        function (config) {\n            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n        }\n    );\n\n    function createDate (y, m, d, h, M, s, ms) {\n        //can't just apply() to create a date:\n        //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply\n        var date = new Date(y, m, d, h, M, s, ms);\n\n        //the date constructor doesn't accept years < 1970\n        if (y < 1970) {\n            date.setFullYear(y);\n        }\n        return date;\n    }\n\n    function createUTCDate (y) {\n        var date = new Date(Date.UTC.apply(null, arguments));\n        if (y < 1970) {\n            date.setUTCFullYear(y);\n        }\n        return date;\n    }\n\n    addFormatToken(0, ['YY', 2], 0, function () {\n        return this.year() % 100;\n    });\n\n    addFormatToken(0, ['YYYY',   4],       0, 'year');\n    addFormatToken(0, ['YYYYY',  5],       0, 'year');\n    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n    // ALIASES\n\n    addUnitAlias('year', 'y');\n\n    // PARSING\n\n    addRegexToken('Y',      matchSigned);\n    addRegexToken('YY',     match1to2, match2);\n    addRegexToken('YYYY',   match1to4, match4);\n    addRegexToken('YYYYY',  match1to6, match6);\n    addRegexToken('YYYYYY', match1to6, match6);\n\n    addParseToken(['YYYY', 'YYYYY', 'YYYYYY'], YEAR);\n    addParseToken('YY', function (input, array) {\n        array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input);\n    });\n\n    // HELPERS\n\n    function daysInYear(year) {\n        return isLeapYear(year) ? 366 : 365;\n    }\n\n    function isLeapYear(year) {\n        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n    }\n\n    // HOOKS\n\n    utils_hooks__hooks.parseTwoDigitYear = function (input) {\n        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n    };\n\n    // MOMENTS\n\n    var getSetYear = makeGetSet('FullYear', false);\n\n    function getIsLeapYear () {\n        return isLeapYear(this.year());\n    }\n\n    addFormatToken('w', ['ww', 2], 'wo', 'week');\n    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n    // ALIASES\n\n    addUnitAlias('week', 'w');\n    addUnitAlias('isoWeek', 'W');\n\n    // PARSING\n\n    addRegexToken('w',  match1to2);\n    addRegexToken('ww', match1to2, match2);\n    addRegexToken('W',  match1to2);\n    addRegexToken('WW', match1to2, match2);\n\n    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n        week[token.substr(0, 1)] = toInt(input);\n    });\n\n    // HELPERS\n\n    // firstDayOfWeek       0 = sun, 6 = sat\n    //                      the day of the week that starts the week\n    //                      (usually sunday or monday)\n    // firstDayOfWeekOfYear 0 = sun, 6 = sat\n    //                      the first week is the week that contains the first\n    //                      of this day of the week\n    //                      (eg. ISO weeks use thursday (4))\n    function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {\n        var end = firstDayOfWeekOfYear - firstDayOfWeek,\n            daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),\n            adjustedMoment;\n\n\n        if (daysToDayOfWeek > end) {\n            daysToDayOfWeek -= 7;\n        }\n\n        if (daysToDayOfWeek < end - 7) {\n            daysToDayOfWeek += 7;\n        }\n\n        adjustedMoment = local__createLocal(mom).add(daysToDayOfWeek, 'd');\n        return {\n            week: Math.ceil(adjustedMoment.dayOfYear() / 7),\n            year: adjustedMoment.year()\n        };\n    }\n\n    // LOCALES\n\n    function localeWeek (mom) {\n        return weekOfYear(mom, this._week.dow, this._week.doy).week;\n    }\n\n    var defaultLocaleWeek = {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    };\n\n    function localeFirstDayOfWeek () {\n        return this._week.dow;\n    }\n\n    function localeFirstDayOfYear () {\n        return this._week.doy;\n    }\n\n    // MOMENTS\n\n    function getSetWeek (input) {\n        var week = this.localeData().week(this);\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    function getSetISOWeek (input) {\n        var week = weekOfYear(this, 1, 4).week;\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n    // ALIASES\n\n    addUnitAlias('dayOfYear', 'DDD');\n\n    // PARSING\n\n    addRegexToken('DDD',  match1to3);\n    addRegexToken('DDDD', match3);\n    addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n        config._dayOfYear = toInt(input);\n    });\n\n    // HELPERS\n\n    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n    function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {\n        var d = createUTCDate(year, 0, 1).getUTCDay();\n        var daysToAdd;\n        var dayOfYear;\n\n        d = d === 0 ? 7 : d;\n        weekday = weekday != null ? weekday : firstDayOfWeek;\n        daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);\n        dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;\n\n        return {\n            year      : dayOfYear > 0 ? year      : year - 1,\n            dayOfYear : dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear\n        };\n    }\n\n    // MOMENTS\n\n    function getSetDayOfYear (input) {\n        var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n        return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n    }\n\n    // Pick the first defined of two or three arguments.\n    function defaults(a, b, c) {\n        if (a != null) {\n            return a;\n        }\n        if (b != null) {\n            return b;\n        }\n        return c;\n    }\n\n    function currentDateArray(config) {\n        var now = new Date();\n        if (config._useUTC) {\n            return [now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()];\n        }\n        return [now.getFullYear(), now.getMonth(), now.getDate()];\n    }\n\n    // convert an array to a date.\n    // the array should mirror the parameters below\n    // note: all values past the year are optional and will default to the lowest possible value.\n    // [year, month, day , hour, minute, second, millisecond]\n    function configFromArray (config) {\n        var i, date, input = [], currentDate, yearToUse;\n\n        if (config._d) {\n            return;\n        }\n\n        currentDate = currentDateArray(config);\n\n        //compute day of the year from weeks and weekdays\n        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n            dayOfYearFromWeekInfo(config);\n        }\n\n        //if the day of the year is set, figure out what it is\n        if (config._dayOfYear) {\n            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n            if (config._dayOfYear > daysInYear(yearToUse)) {\n                getParsingFlags(config)._overflowDayOfYear = true;\n            }\n\n            date = createUTCDate(yearToUse, 0, config._dayOfYear);\n            config._a[MONTH] = date.getUTCMonth();\n            config._a[DATE] = date.getUTCDate();\n        }\n\n        // Default to current date.\n        // * if no year, month, day of month are given, default to today\n        // * if day of month is given, default month and year\n        // * if month is given, default only year\n        // * if year is given, don't default anything\n        for (i = 0; i < 3 && config._a[i] == null; ++i) {\n            config._a[i] = input[i] = currentDate[i];\n        }\n\n        // Zero out whatever was not defaulted, including time\n        for (; i < 7; i++) {\n            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n        }\n\n        // Check for 24:00:00.000\n        if (config._a[HOUR] === 24 &&\n                config._a[MINUTE] === 0 &&\n                config._a[SECOND] === 0 &&\n                config._a[MILLISECOND] === 0) {\n            config._nextDay = true;\n            config._a[HOUR] = 0;\n        }\n\n        config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n        // Apply timezone offset from input. The actual utcOffset can be changed\n        // with parseZone.\n        if (config._tzm != null) {\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n        }\n\n        if (config._nextDay) {\n            config._a[HOUR] = 24;\n        }\n    }\n\n    function dayOfYearFromWeekInfo(config) {\n        var w, weekYear, week, weekday, dow, doy, temp;\n\n        w = config._w;\n        if (w.GG != null || w.W != null || w.E != null) {\n            dow = 1;\n            doy = 4;\n\n            // TODO: We need to take the current isoWeekYear, but that depends on\n            // how we interpret now (local, utc, fixed offset). So create\n            // a now version of current config (take local/utc/offset flags, and\n            // create now).\n            weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year);\n            week = defaults(w.W, 1);\n            weekday = defaults(w.E, 1);\n        } else {\n            dow = config._locale._week.dow;\n            doy = config._locale._week.doy;\n\n            weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year);\n            week = defaults(w.w, 1);\n\n            if (w.d != null) {\n                // weekday -- low day numbers are considered next week\n                weekday = w.d;\n                if (weekday < dow) {\n                    ++week;\n                }\n            } else if (w.e != null) {\n                // local weekday -- counting starts from begining of week\n                weekday = w.e + dow;\n            } else {\n                // default to begining of week\n                weekday = dow;\n            }\n        }\n        temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);\n\n        config._a[YEAR] = temp.year;\n        config._dayOfYear = temp.dayOfYear;\n    }\n\n    utils_hooks__hooks.ISO_8601 = function () {};\n\n    // date from string and format string\n    function configFromStringAndFormat(config) {\n        // TODO: Move this to another part of the creation flow to prevent circular deps\n        if (config._f === utils_hooks__hooks.ISO_8601) {\n            configFromISO(config);\n            return;\n        }\n\n        config._a = [];\n        getParsingFlags(config).empty = true;\n\n        // This array is used to make a Date, either with `new Date` or `Date.UTC`\n        var string = '' + config._i,\n            i, parsedInput, tokens, token, skipped,\n            stringLength = string.length,\n            totalParsedInputLength = 0;\n\n        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n        for (i = 0; i < tokens.length; i++) {\n            token = tokens[i];\n            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n            if (parsedInput) {\n                skipped = string.substr(0, string.indexOf(parsedInput));\n                if (skipped.length > 0) {\n                    getParsingFlags(config).unusedInput.push(skipped);\n                }\n                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n                totalParsedInputLength += parsedInput.length;\n            }\n            // don't parse if it's not a known token\n            if (formatTokenFunctions[token]) {\n                if (parsedInput) {\n                    getParsingFlags(config).empty = false;\n                }\n                else {\n                    getParsingFlags(config).unusedTokens.push(token);\n                }\n                addTimeToArrayFromToken(token, parsedInput, config);\n            }\n            else if (config._strict && !parsedInput) {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n        }\n\n        // add remaining unparsed input length to the string\n        getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n        if (string.length > 0) {\n            getParsingFlags(config).unusedInput.push(string);\n        }\n\n        // clear _12h flag if hour is <= 12\n        if (getParsingFlags(config).bigHour === true &&\n                config._a[HOUR] <= 12 &&\n                config._a[HOUR] > 0) {\n            getParsingFlags(config).bigHour = undefined;\n        }\n        // handle meridiem\n        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n        configFromArray(config);\n        checkOverflow(config);\n    }\n\n\n    function meridiemFixWrap (locale, hour, meridiem) {\n        var isPm;\n\n        if (meridiem == null) {\n            // nothing to do\n            return hour;\n        }\n        if (locale.meridiemHour != null) {\n            return locale.meridiemHour(hour, meridiem);\n        } else if (locale.isPM != null) {\n            // Fallback\n            isPm = locale.isPM(meridiem);\n            if (isPm && hour < 12) {\n                hour += 12;\n            }\n            if (!isPm && hour === 12) {\n                hour = 0;\n            }\n            return hour;\n        } else {\n            // this is not supposed to happen\n            return hour;\n        }\n    }\n\n    function configFromStringAndArray(config) {\n        var tempConfig,\n            bestMoment,\n\n            scoreToBeat,\n            i,\n            currentScore;\n\n        if (config._f.length === 0) {\n            getParsingFlags(config).invalidFormat = true;\n            config._d = new Date(NaN);\n            return;\n        }\n\n        for (i = 0; i < config._f.length; i++) {\n            currentScore = 0;\n            tempConfig = copyConfig({}, config);\n            if (config._useUTC != null) {\n                tempConfig._useUTC = config._useUTC;\n            }\n            tempConfig._f = config._f[i];\n            configFromStringAndFormat(tempConfig);\n\n            if (!valid__isValid(tempConfig)) {\n                continue;\n            }\n\n            // if there is any input that was not parsed add a penalty for that format\n            currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n            //or tokens\n            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n            getParsingFlags(tempConfig).score = currentScore;\n\n            if (scoreToBeat == null || currentScore < scoreToBeat) {\n                scoreToBeat = currentScore;\n                bestMoment = tempConfig;\n            }\n        }\n\n        extend(config, bestMoment || tempConfig);\n    }\n\n    function configFromObject(config) {\n        if (config._d) {\n            return;\n        }\n\n        var i = normalizeObjectUnits(config._i);\n        config._a = [i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond];\n\n        configFromArray(config);\n    }\n\n    function createFromConfig (config) {\n        var input = config._i,\n            format = config._f,\n            res;\n\n        config._locale = config._locale || locale_locales__getLocale(config._l);\n\n        if (input === null || (format === undefined && input === '')) {\n            return valid__createInvalid({nullInput: true});\n        }\n\n        if (typeof input === 'string') {\n            config._i = input = config._locale.preparse(input);\n        }\n\n        if (isMoment(input)) {\n            return new Moment(checkOverflow(input));\n        } else if (isArray(format)) {\n            configFromStringAndArray(config);\n        } else if (format) {\n            configFromStringAndFormat(config);\n        } else if (isDate(input)) {\n            config._d = input;\n        } else {\n            configFromInput(config);\n        }\n\n        res = new Moment(checkOverflow(config));\n        if (res._nextDay) {\n            // Adding is smart enough around DST\n            res.add(1, 'd');\n            res._nextDay = undefined;\n        }\n\n        return res;\n    }\n\n    function configFromInput(config) {\n        var input = config._i;\n        if (input === undefined) {\n            config._d = new Date();\n        } else if (isDate(input)) {\n            config._d = new Date(+input);\n        } else if (typeof input === 'string') {\n            configFromString(config);\n        } else if (isArray(input)) {\n            config._a = map(input.slice(0), function (obj) {\n                return parseInt(obj, 10);\n            });\n            configFromArray(config);\n        } else if (typeof(input) === 'object') {\n            configFromObject(config);\n        } else if (typeof(input) === 'number') {\n            // from milliseconds\n            config._d = new Date(input);\n        } else {\n            utils_hooks__hooks.createFromInputFallback(config);\n        }\n    }\n\n    function createLocalOrUTC (input, format, locale, strict, isUTC) {\n        var c = {};\n\n        if (typeof(locale) === 'boolean') {\n            strict = locale;\n            locale = undefined;\n        }\n        // object construction must be done this way.\n        // https://github.com/moment/moment/issues/1423\n        c._isAMomentObject = true;\n        c._useUTC = c._isUTC = isUTC;\n        c._l = locale;\n        c._i = input;\n        c._f = format;\n        c._strict = strict;\n\n        return createFromConfig(c);\n    }\n\n    function local__createLocal (input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, false);\n    }\n\n    var prototypeMin = deprecate(\n         'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',\n         function () {\n             var other = local__createLocal.apply(null, arguments);\n             return other < this ? this : other;\n         }\n     );\n\n    var prototypeMax = deprecate(\n        'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',\n        function () {\n            var other = local__createLocal.apply(null, arguments);\n            return other > this ? this : other;\n        }\n    );\n\n    // Pick a moment m from moments so that m[fn](other) is true for all\n    // other. This relies on the function fn to be transitive.\n    //\n    // moments should either be an array of moment objects or an array, whose\n    // first element is an array of moment objects.\n    function pickBy(fn, moments) {\n        var res, i;\n        if (moments.length === 1 && isArray(moments[0])) {\n            moments = moments[0];\n        }\n        if (!moments.length) {\n            return local__createLocal();\n        }\n        res = moments[0];\n        for (i = 1; i < moments.length; ++i) {\n            if (moments[i][fn](res)) {\n                res = moments[i];\n            }\n        }\n        return res;\n    }\n\n    // TODO: Use [].sort instead?\n    function min () {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isBefore', args);\n    }\n\n    function max () {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isAfter', args);\n    }\n\n    function Duration (duration) {\n        var normalizedInput = normalizeObjectUnits(duration),\n            years = normalizedInput.year || 0,\n            quarters = normalizedInput.quarter || 0,\n            months = normalizedInput.month || 0,\n            weeks = normalizedInput.week || 0,\n            days = normalizedInput.day || 0,\n            hours = normalizedInput.hour || 0,\n            minutes = normalizedInput.minute || 0,\n            seconds = normalizedInput.second || 0,\n            milliseconds = normalizedInput.millisecond || 0;\n\n        // representation for dateAddRemove\n        this._milliseconds = +milliseconds +\n            seconds * 1e3 + // 1000\n            minutes * 6e4 + // 1000 * 60\n            hours * 36e5; // 1000 * 60 * 60\n        // Because of dateAddRemove treats 24 hours as different from a\n        // day when working around DST, we need to store them separately\n        this._days = +days +\n            weeks * 7;\n        // It is impossible translate months into days without knowing\n        // which months you are are talking about, so we have to store\n        // it separately.\n        this._months = +months +\n            quarters * 3 +\n            years * 12;\n\n        this._data = {};\n\n        this._locale = locale_locales__getLocale();\n\n        this._bubble();\n    }\n\n    function isDuration (obj) {\n        return obj instanceof Duration;\n    }\n\n    function offset (token, separator) {\n        addFormatToken(token, 0, 0, function () {\n            var offset = this.utcOffset();\n            var sign = '+';\n            if (offset < 0) {\n                offset = -offset;\n                sign = '-';\n            }\n            return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n        });\n    }\n\n    offset('Z', ':');\n    offset('ZZ', '');\n\n    // PARSING\n\n    addRegexToken('Z',  matchOffset);\n    addRegexToken('ZZ', matchOffset);\n    addParseToken(['Z', 'ZZ'], function (input, array, config) {\n        config._useUTC = true;\n        config._tzm = offsetFromString(input);\n    });\n\n    // HELPERS\n\n    // timezone chunker\n    // '+10:00' > ['10',  '00']\n    // '-1530'  > ['-15', '30']\n    var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n    function offsetFromString(string) {\n        var matches = ((string || '').match(matchOffset) || []);\n        var chunk   = matches[matches.length - 1] || [];\n        var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n        var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n        return parts[0] === '+' ? minutes : -minutes;\n    }\n\n    // Return a moment from input, that is local/utc/zone equivalent to model.\n    function cloneWithOffset(input, model) {\n        var res, diff;\n        if (model._isUTC) {\n            res = model.clone();\n            diff = (isMoment(input) || isDate(input) ? +input : +local__createLocal(input)) - (+res);\n            // Use low-level api, because this fn is low-level api.\n            res._d.setTime(+res._d + diff);\n            utils_hooks__hooks.updateOffset(res, false);\n            return res;\n        } else {\n            return local__createLocal(input).local();\n        }\n        return model._isUTC ? local__createLocal(input).zone(model._offset || 0) : local__createLocal(input).local();\n    }\n\n    function getDateOffset (m) {\n        // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n        // https://github.com/moment/moment/pull/1871\n        return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n    }\n\n    // HOOKS\n\n    // This function will be called whenever a moment is mutated.\n    // It is intended to keep the offset in sync with the timezone.\n    utils_hooks__hooks.updateOffset = function () {};\n\n    // MOMENTS\n\n    // keepLocalTime = true means only change the timezone, without\n    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n    // +0200, so we adjust the time as needed, to be valid.\n    //\n    // Keeping the time actually adds/subtracts (one hour)\n    // from the actual represented time. That is why we call updateOffset\n    // a second time. In case it wants us to change the offset again\n    // _changeInProgress == true case, then we have to adjust, because\n    // there is no such time in the given timezone.\n    function getSetOffset (input, keepLocalTime) {\n        var offset = this._offset || 0,\n            localAdjust;\n        if (input != null) {\n            if (typeof input === 'string') {\n                input = offsetFromString(input);\n            }\n            if (Math.abs(input) < 16) {\n                input = input * 60;\n            }\n            if (!this._isUTC && keepLocalTime) {\n                localAdjust = getDateOffset(this);\n            }\n            this._offset = input;\n            this._isUTC = true;\n            if (localAdjust != null) {\n                this.add(localAdjust, 'm');\n            }\n            if (offset !== input) {\n                if (!keepLocalTime || this._changeInProgress) {\n                    add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false);\n                } else if (!this._changeInProgress) {\n                    this._changeInProgress = true;\n                    utils_hooks__hooks.updateOffset(this, true);\n                    this._changeInProgress = null;\n                }\n            }\n            return this;\n        } else {\n            return this._isUTC ? offset : getDateOffset(this);\n        }\n    }\n\n    function getSetZone (input, keepLocalTime) {\n        if (input != null) {\n            if (typeof input !== 'string') {\n                input = -input;\n            }\n\n            this.utcOffset(input, keepLocalTime);\n\n            return this;\n        } else {\n            return -this.utcOffset();\n        }\n    }\n\n    function setOffsetToUTC (keepLocalTime) {\n        return this.utcOffset(0, keepLocalTime);\n    }\n\n    function setOffsetToLocal (keepLocalTime) {\n        if (this._isUTC) {\n            this.utcOffset(0, keepLocalTime);\n            this._isUTC = false;\n\n            if (keepLocalTime) {\n                this.subtract(getDateOffset(this), 'm');\n            }\n        }\n        return this;\n    }\n\n    function setOffsetToParsedOffset () {\n        if (this._tzm) {\n            this.utcOffset(this._tzm);\n        } else if (typeof this._i === 'string') {\n            this.utcOffset(offsetFromString(this._i));\n        }\n        return this;\n    }\n\n    function hasAlignedHourOffset (input) {\n        if (!input) {\n            input = 0;\n        }\n        else {\n            input = local__createLocal(input).utcOffset();\n        }\n\n        return (this.utcOffset() - input) % 60 === 0;\n    }\n\n    function isDaylightSavingTime () {\n        return (\n            this.utcOffset() > this.clone().month(0).utcOffset() ||\n            this.utcOffset() > this.clone().month(5).utcOffset()\n        );\n    }\n\n    function isDaylightSavingTimeShifted () {\n        if (this._a) {\n            var other = this._isUTC ? create_utc__createUTC(this._a) : local__createLocal(this._a);\n            return this.isValid() && compareArrays(this._a, other.toArray()) > 0;\n        }\n\n        return false;\n    }\n\n    function isLocal () {\n        return !this._isUTC;\n    }\n\n    function isUtcOffset () {\n        return this._isUTC;\n    }\n\n    function isUtc () {\n        return this._isUTC && this._offset === 0;\n    }\n\n    var aspNetRegex = /(\\-)?(?:(\\d*)\\.)?(\\d+)\\:(\\d+)(?:\\:(\\d+)\\.?(\\d{3})?)?/;\n\n    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n    var create__isoRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;\n\n    function create__createDuration (input, key) {\n        var duration = input,\n            // matching against regexp is expensive, do it on demand\n            match = null,\n            sign,\n            ret,\n            diffRes;\n\n        if (isDuration(input)) {\n            duration = {\n                ms : input._milliseconds,\n                d  : input._days,\n                M  : input._months\n            };\n        } else if (typeof input === 'number') {\n            duration = {};\n            if (key) {\n                duration[key] = input;\n            } else {\n                duration.milliseconds = input;\n            }\n        } else if (!!(match = aspNetRegex.exec(input))) {\n            sign = (match[1] === '-') ? -1 : 1;\n            duration = {\n                y  : 0,\n                d  : toInt(match[DATE])        * sign,\n                h  : toInt(match[HOUR])        * sign,\n                m  : toInt(match[MINUTE])      * sign,\n                s  : toInt(match[SECOND])      * sign,\n                ms : toInt(match[MILLISECOND]) * sign\n            };\n        } else if (!!(match = create__isoRegex.exec(input))) {\n            sign = (match[1] === '-') ? -1 : 1;\n            duration = {\n                y : parseIso(match[2], sign),\n                M : parseIso(match[3], sign),\n                d : parseIso(match[4], sign),\n                h : parseIso(match[5], sign),\n                m : parseIso(match[6], sign),\n                s : parseIso(match[7], sign),\n                w : parseIso(match[8], sign)\n            };\n        } else if (duration == null) {// checks for null or undefined\n            duration = {};\n        } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n            diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to));\n\n            duration = {};\n            duration.ms = diffRes.milliseconds;\n            duration.M = diffRes.months;\n        }\n\n        ret = new Duration(duration);\n\n        if (isDuration(input) && hasOwnProp(input, '_locale')) {\n            ret._locale = input._locale;\n        }\n\n        return ret;\n    }\n\n    create__createDuration.fn = Duration.prototype;\n\n    function parseIso (inp, sign) {\n        // We'd normally use ~~inp for this, but unfortunately it also\n        // converts floats to ints.\n        // inp may be undefined, so careful calling replace on it.\n        var res = inp && parseFloat(inp.replace(',', '.'));\n        // apply sign while we're at it\n        return (isNaN(res) ? 0 : res) * sign;\n    }\n\n    function positiveMomentsDifference(base, other) {\n        var res = {milliseconds: 0, months: 0};\n\n        res.months = other.month() - base.month() +\n            (other.year() - base.year()) * 12;\n        if (base.clone().add(res.months, 'M').isAfter(other)) {\n            --res.months;\n        }\n\n        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n        return res;\n    }\n\n    function momentsDifference(base, other) {\n        var res;\n        other = cloneWithOffset(other, base);\n        if (base.isBefore(other)) {\n            res = positiveMomentsDifference(base, other);\n        } else {\n            res = positiveMomentsDifference(other, base);\n            res.milliseconds = -res.milliseconds;\n            res.months = -res.months;\n        }\n\n        return res;\n    }\n\n    function createAdder(direction, name) {\n        return function (val, period) {\n            var dur, tmp;\n            //invert the arguments, but complain about it\n            if (period !== null && !isNaN(+period)) {\n                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');\n                tmp = val; val = period; period = tmp;\n            }\n\n            val = typeof val === 'string' ? +val : val;\n            dur = create__createDuration(val, period);\n            add_subtract__addSubtract(this, dur, direction);\n            return this;\n        };\n    }\n\n    function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) {\n        var milliseconds = duration._milliseconds,\n            days = duration._days,\n            months = duration._months;\n        updateOffset = updateOffset == null ? true : updateOffset;\n\n        if (milliseconds) {\n            mom._d.setTime(+mom._d + milliseconds * isAdding);\n        }\n        if (days) {\n            get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding);\n        }\n        if (months) {\n            setMonth(mom, get_set__get(mom, 'Month') + months * isAdding);\n        }\n        if (updateOffset) {\n            utils_hooks__hooks.updateOffset(mom, days || months);\n        }\n    }\n\n    var add_subtract__add      = createAdder(1, 'add');\n    var add_subtract__subtract = createAdder(-1, 'subtract');\n\n    function moment_calendar__calendar (time) {\n        // We want to compare the start of today, vs this.\n        // Getting start-of-today depends on whether we're local/utc/offset or not.\n        var now = time || local__createLocal(),\n            sod = cloneWithOffset(now, this).startOf('day'),\n            diff = this.diff(sod, 'days', true),\n            format = diff < -6 ? 'sameElse' :\n                diff < -1 ? 'lastWeek' :\n                diff < 0 ? 'lastDay' :\n                diff < 1 ? 'sameDay' :\n                diff < 2 ? 'nextDay' :\n                diff < 7 ? 'nextWeek' : 'sameElse';\n        return this.format(this.localeData().calendar(format, this, local__createLocal(now)));\n    }\n\n    function clone () {\n        return new Moment(this);\n    }\n\n    function isAfter (input, units) {\n        var inputMs;\n        units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');\n        if (units === 'millisecond') {\n            input = isMoment(input) ? input : local__createLocal(input);\n            return +this > +input;\n        } else {\n            inputMs = isMoment(input) ? +input : +local__createLocal(input);\n            return inputMs < +this.clone().startOf(units);\n        }\n    }\n\n    function isBefore (input, units) {\n        var inputMs;\n        units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');\n        if (units === 'millisecond') {\n            input = isMoment(input) ? input : local__createLocal(input);\n            return +this < +input;\n        } else {\n            inputMs = isMoment(input) ? +input : +local__createLocal(input);\n            return +this.clone().endOf(units) < inputMs;\n        }\n    }\n\n    function isBetween (from, to, units) {\n        return this.isAfter(from, units) && this.isBefore(to, units);\n    }\n\n    function isSame (input, units) {\n        var inputMs;\n        units = normalizeUnits(units || 'millisecond');\n        if (units === 'millisecond') {\n            input = isMoment(input) ? input : local__createLocal(input);\n            return +this === +input;\n        } else {\n            inputMs = +local__createLocal(input);\n            return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units));\n        }\n    }\n\n    function absFloor (number) {\n        if (number < 0) {\n            return Math.ceil(number);\n        } else {\n            return Math.floor(number);\n        }\n    }\n\n    function diff (input, units, asFloat) {\n        var that = cloneWithOffset(input, this),\n            zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4,\n            delta, output;\n\n        units = normalizeUnits(units);\n\n        if (units === 'year' || units === 'month' || units === 'quarter') {\n            output = monthDiff(this, that);\n            if (units === 'quarter') {\n                output = output / 3;\n            } else if (units === 'year') {\n                output = output / 12;\n            }\n        } else {\n            delta = this - that;\n            output = units === 'second' ? delta / 1e3 : // 1000\n                units === 'minute' ? delta / 6e4 : // 1000 * 60\n                units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\n                units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\n                units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\n                delta;\n        }\n        return asFloat ? output : absFloor(output);\n    }\n\n    function monthDiff (a, b) {\n        // difference in months\n        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n            // b is in (anchor - 1 month, anchor + 1 month)\n            anchor = a.clone().add(wholeMonthDiff, 'months'),\n            anchor2, adjust;\n\n        if (b - anchor < 0) {\n            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor - anchor2);\n        } else {\n            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor2 - anchor);\n        }\n\n        return -(wholeMonthDiff + adjust);\n    }\n\n    utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n\n    function toString () {\n        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n    }\n\n    function moment_format__toISOString () {\n        var m = this.clone().utc();\n        if (0 < m.year() && m.year() <= 9999) {\n            if ('function' === typeof Date.prototype.toISOString) {\n                // native implementation is ~50x faster, use it when we can\n                return this.toDate().toISOString();\n            } else {\n                return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n            }\n        } else {\n            return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n        }\n    }\n\n    function format (inputString) {\n        var output = formatMoment(this, inputString || utils_hooks__hooks.defaultFormat);\n        return this.localeData().postformat(output);\n    }\n\n    function from (time, withoutSuffix) {\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n        return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n    }\n\n    function fromNow (withoutSuffix) {\n        return this.from(local__createLocal(), withoutSuffix);\n    }\n\n    function to (time, withoutSuffix) {\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n        return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n    }\n\n    function toNow (withoutSuffix) {\n        return this.to(local__createLocal(), withoutSuffix);\n    }\n\n    function locale (key) {\n        var newLocaleData;\n\n        if (key === undefined) {\n            return this._locale._abbr;\n        } else {\n            newLocaleData = locale_locales__getLocale(key);\n            if (newLocaleData != null) {\n                this._locale = newLocaleData;\n            }\n            return this;\n        }\n    }\n\n    var lang = deprecate(\n        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n        function (key) {\n            if (key === undefined) {\n                return this.localeData();\n            } else {\n                return this.locale(key);\n            }\n        }\n    );\n\n    function localeData () {\n        return this._locale;\n    }\n\n    function startOf (units) {\n        units = normalizeUnits(units);\n        // the following switch intentionally omits break keywords\n        // to utilize falling through the cases.\n        switch (units) {\n        case 'year':\n            this.month(0);\n            /* falls through */\n        case 'quarter':\n        case 'month':\n            this.date(1);\n            /* falls through */\n        case 'week':\n        case 'isoWeek':\n        case 'day':\n            this.hours(0);\n            /* falls through */\n        case 'hour':\n            this.minutes(0);\n            /* falls through */\n        case 'minute':\n            this.seconds(0);\n            /* falls through */\n        case 'second':\n            this.milliseconds(0);\n        }\n\n        // weeks are a special case\n        if (units === 'week') {\n            this.weekday(0);\n        }\n        if (units === 'isoWeek') {\n            this.isoWeekday(1);\n        }\n\n        // quarters are also special\n        if (units === 'quarter') {\n            this.month(Math.floor(this.month() / 3) * 3);\n        }\n\n        return this;\n    }\n\n    function endOf (units) {\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond') {\n            return this;\n        }\n        return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n    }\n\n    function to_type__valueOf () {\n        return +this._d - ((this._offset || 0) * 60000);\n    }\n\n    function unix () {\n        return Math.floor(+this / 1000);\n    }\n\n    function toDate () {\n        return this._offset ? new Date(+this) : this._d;\n    }\n\n    function toArray () {\n        var m = this;\n        return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n    }\n\n    function moment_valid__isValid () {\n        return valid__isValid(this);\n    }\n\n    function parsingFlags () {\n        return extend({}, getParsingFlags(this));\n    }\n\n    function invalidAt () {\n        return getParsingFlags(this).overflow;\n    }\n\n    addFormatToken(0, ['gg', 2], 0, function () {\n        return this.weekYear() % 100;\n    });\n\n    addFormatToken(0, ['GG', 2], 0, function () {\n        return this.isoWeekYear() % 100;\n    });\n\n    function addWeekYearFormatToken (token, getter) {\n        addFormatToken(0, [token, token.length], 0, getter);\n    }\n\n    addWeekYearFormatToken('gggg',     'weekYear');\n    addWeekYearFormatToken('ggggg',    'weekYear');\n    addWeekYearFormatToken('GGGG',  'isoWeekYear');\n    addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n    // ALIASES\n\n    addUnitAlias('weekYear', 'gg');\n    addUnitAlias('isoWeekYear', 'GG');\n\n    // PARSING\n\n    addRegexToken('G',      matchSigned);\n    addRegexToken('g',      matchSigned);\n    addRegexToken('GG',     match1to2, match2);\n    addRegexToken('gg',     match1to2, match2);\n    addRegexToken('GGGG',   match1to4, match4);\n    addRegexToken('gggg',   match1to4, match4);\n    addRegexToken('GGGGG',  match1to6, match6);\n    addRegexToken('ggggg',  match1to6, match6);\n\n    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n        week[token.substr(0, 2)] = toInt(input);\n    });\n\n    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n        week[token] = utils_hooks__hooks.parseTwoDigitYear(input);\n    });\n\n    // HELPERS\n\n    function weeksInYear(year, dow, doy) {\n        return weekOfYear(local__createLocal([year, 11, 31 + dow - doy]), dow, doy).week;\n    }\n\n    // MOMENTS\n\n    function getSetWeekYear (input) {\n        var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;\n        return input == null ? year : this.add((input - year), 'y');\n    }\n\n    function getSetISOWeekYear (input) {\n        var year = weekOfYear(this, 1, 4).year;\n        return input == null ? year : this.add((input - year), 'y');\n    }\n\n    function getISOWeeksInYear () {\n        return weeksInYear(this.year(), 1, 4);\n    }\n\n    function getWeeksInYear () {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n    }\n\n    addFormatToken('Q', 0, 0, 'quarter');\n\n    // ALIASES\n\n    addUnitAlias('quarter', 'Q');\n\n    // PARSING\n\n    addRegexToken('Q', match1);\n    addParseToken('Q', function (input, array) {\n        array[MONTH] = (toInt(input) - 1) * 3;\n    });\n\n    // MOMENTS\n\n    function getSetQuarter (input) {\n        return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n    }\n\n    addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n    // ALIASES\n\n    addUnitAlias('date', 'D');\n\n    // PARSING\n\n    addRegexToken('D',  match1to2);\n    addRegexToken('DD', match1to2, match2);\n    addRegexToken('Do', function (isStrict, locale) {\n        return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;\n    });\n\n    addParseToken(['D', 'DD'], DATE);\n    addParseToken('Do', function (input, array) {\n        array[DATE] = toInt(input.match(match1to2)[0], 10);\n    });\n\n    // MOMENTS\n\n    var getSetDayOfMonth = makeGetSet('Date', true);\n\n    addFormatToken('d', 0, 'do', 'day');\n\n    addFormatToken('dd', 0, 0, function (format) {\n        return this.localeData().weekdaysMin(this, format);\n    });\n\n    addFormatToken('ddd', 0, 0, function (format) {\n        return this.localeData().weekdaysShort(this, format);\n    });\n\n    addFormatToken('dddd', 0, 0, function (format) {\n        return this.localeData().weekdays(this, format);\n    });\n\n    addFormatToken('e', 0, 0, 'weekday');\n    addFormatToken('E', 0, 0, 'isoWeekday');\n\n    // ALIASES\n\n    addUnitAlias('day', 'd');\n    addUnitAlias('weekday', 'e');\n    addUnitAlias('isoWeekday', 'E');\n\n    // PARSING\n\n    addRegexToken('d',    match1to2);\n    addRegexToken('e',    match1to2);\n    addRegexToken('E',    match1to2);\n    addRegexToken('dd',   matchWord);\n    addRegexToken('ddd',  matchWord);\n    addRegexToken('dddd', matchWord);\n\n    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config) {\n        var weekday = config._locale.weekdaysParse(input);\n        // if we didn't get a weekday name, mark the date as invalid\n        if (weekday != null) {\n            week.d = weekday;\n        } else {\n            getParsingFlags(config).invalidWeekday = input;\n        }\n    });\n\n    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n        week[token] = toInt(input);\n    });\n\n    // HELPERS\n\n    function parseWeekday(input, locale) {\n        if (typeof input === 'string') {\n            if (!isNaN(input)) {\n                input = parseInt(input, 10);\n            }\n            else {\n                input = locale.weekdaysParse(input);\n                if (typeof input !== 'number') {\n                    return null;\n                }\n            }\n        }\n        return input;\n    }\n\n    // LOCALES\n\n    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n    function localeWeekdays (m) {\n        return this._weekdays[m.day()];\n    }\n\n    var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n    function localeWeekdaysShort (m) {\n        return this._weekdaysShort[m.day()];\n    }\n\n    var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n    function localeWeekdaysMin (m) {\n        return this._weekdaysMin[m.day()];\n    }\n\n    function localeWeekdaysParse (weekdayName) {\n        var i, mom, regex;\n\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n        }\n\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n            if (!this._weekdaysParse[i]) {\n                mom = local__createLocal([2000, 1]).day(i);\n                regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (this._weekdaysParse[i].test(weekdayName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function getSetDayOfWeek (input) {\n        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n        if (input != null) {\n            input = parseWeekday(input, this.localeData());\n            return this.add(input - day, 'd');\n        } else {\n            return day;\n        }\n    }\n\n    function getSetLocaleDayOfWeek (input) {\n        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n        return input == null ? weekday : this.add(input - weekday, 'd');\n    }\n\n    function getSetISODayOfWeek (input) {\n        // behaves the same as moment#day except\n        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n        // as a setter, sunday should belong to the previous week.\n        return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);\n    }\n\n    addFormatToken('H', ['HH', 2], 0, 'hour');\n    addFormatToken('h', ['hh', 2], 0, function () {\n        return this.hours() % 12 || 12;\n    });\n\n    function meridiem (token, lowercase) {\n        addFormatToken(token, 0, 0, function () {\n            return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n        });\n    }\n\n    meridiem('a', true);\n    meridiem('A', false);\n\n    // ALIASES\n\n    addUnitAlias('hour', 'h');\n\n    // PARSING\n\n    function matchMeridiem (isStrict, locale) {\n        return locale._meridiemParse;\n    }\n\n    addRegexToken('a',  matchMeridiem);\n    addRegexToken('A',  matchMeridiem);\n    addRegexToken('H',  match1to2);\n    addRegexToken('h',  match1to2);\n    addRegexToken('HH', match1to2, match2);\n    addRegexToken('hh', match1to2, match2);\n\n    addParseToken(['H', 'HH'], HOUR);\n    addParseToken(['a', 'A'], function (input, array, config) {\n        config._isPm = config._locale.isPM(input);\n        config._meridiem = input;\n    });\n    addParseToken(['h', 'hh'], function (input, array, config) {\n        array[HOUR] = toInt(input);\n        getParsingFlags(config).bigHour = true;\n    });\n\n    // LOCALES\n\n    function localeIsPM (input) {\n        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n        // Using charAt should be more compatible.\n        return ((input + '').toLowerCase().charAt(0) === 'p');\n    }\n\n    var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n    function localeMeridiem (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'pm' : 'PM';\n        } else {\n            return isLower ? 'am' : 'AM';\n        }\n    }\n\n\n    // MOMENTS\n\n    // Setting the hour should keep the time, because the user explicitly\n    // specified which hour he wants. So trying to maintain the same hour (in\n    // a new timezone) makes sense. Adding/subtracting hours does not follow\n    // this rule.\n    var getSetHour = makeGetSet('Hours', true);\n\n    addFormatToken('m', ['mm', 2], 0, 'minute');\n\n    // ALIASES\n\n    addUnitAlias('minute', 'm');\n\n    // PARSING\n\n    addRegexToken('m',  match1to2);\n    addRegexToken('mm', match1to2, match2);\n    addParseToken(['m', 'mm'], MINUTE);\n\n    // MOMENTS\n\n    var getSetMinute = makeGetSet('Minutes', false);\n\n    addFormatToken('s', ['ss', 2], 0, 'second');\n\n    // ALIASES\n\n    addUnitAlias('second', 's');\n\n    // PARSING\n\n    addRegexToken('s',  match1to2);\n    addRegexToken('ss', match1to2, match2);\n    addParseToken(['s', 'ss'], SECOND);\n\n    // MOMENTS\n\n    var getSetSecond = makeGetSet('Seconds', false);\n\n    addFormatToken('S', 0, 0, function () {\n        return ~~(this.millisecond() / 100);\n    });\n\n    addFormatToken(0, ['SS', 2], 0, function () {\n        return ~~(this.millisecond() / 10);\n    });\n\n    function millisecond__milliseconds (token) {\n        addFormatToken(0, [token, 3], 0, 'millisecond');\n    }\n\n    millisecond__milliseconds('SSS');\n    millisecond__milliseconds('SSSS');\n\n    // ALIASES\n\n    addUnitAlias('millisecond', 'ms');\n\n    // PARSING\n\n    addRegexToken('S',    match1to3, match1);\n    addRegexToken('SS',   match1to3, match2);\n    addRegexToken('SSS',  match1to3, match3);\n    addRegexToken('SSSS', matchUnsigned);\n    addParseToken(['S', 'SS', 'SSS', 'SSSS'], function (input, array) {\n        array[MILLISECOND] = toInt(('0.' + input) * 1000);\n    });\n\n    // MOMENTS\n\n    var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n    addFormatToken('z',  0, 0, 'zoneAbbr');\n    addFormatToken('zz', 0, 0, 'zoneName');\n\n    // MOMENTS\n\n    function getZoneAbbr () {\n        return this._isUTC ? 'UTC' : '';\n    }\n\n    function getZoneName () {\n        return this._isUTC ? 'Coordinated Universal Time' : '';\n    }\n\n    var momentPrototype__proto = Moment.prototype;\n\n    momentPrototype__proto.add          = add_subtract__add;\n    momentPrototype__proto.calendar     = moment_calendar__calendar;\n    momentPrototype__proto.clone        = clone;\n    momentPrototype__proto.diff         = diff;\n    momentPrototype__proto.endOf        = endOf;\n    momentPrototype__proto.format       = format;\n    momentPrototype__proto.from         = from;\n    momentPrototype__proto.fromNow      = fromNow;\n    momentPrototype__proto.to           = to;\n    momentPrototype__proto.toNow        = toNow;\n    momentPrototype__proto.get          = getSet;\n    momentPrototype__proto.invalidAt    = invalidAt;\n    momentPrototype__proto.isAfter      = isAfter;\n    momentPrototype__proto.isBefore     = isBefore;\n    momentPrototype__proto.isBetween    = isBetween;\n    momentPrototype__proto.isSame       = isSame;\n    momentPrototype__proto.isValid      = moment_valid__isValid;\n    momentPrototype__proto.lang         = lang;\n    momentPrototype__proto.locale       = locale;\n    momentPrototype__proto.localeData   = localeData;\n    momentPrototype__proto.max          = prototypeMax;\n    momentPrototype__proto.min          = prototypeMin;\n    momentPrototype__proto.parsingFlags = parsingFlags;\n    momentPrototype__proto.set          = getSet;\n    momentPrototype__proto.startOf      = startOf;\n    momentPrototype__proto.subtract     = add_subtract__subtract;\n    momentPrototype__proto.toArray      = toArray;\n    momentPrototype__proto.toDate       = toDate;\n    momentPrototype__proto.toISOString  = moment_format__toISOString;\n    momentPrototype__proto.toJSON       = moment_format__toISOString;\n    momentPrototype__proto.toString     = toString;\n    momentPrototype__proto.unix         = unix;\n    momentPrototype__proto.valueOf      = to_type__valueOf;\n\n    // Year\n    momentPrototype__proto.year       = getSetYear;\n    momentPrototype__proto.isLeapYear = getIsLeapYear;\n\n    // Week Year\n    momentPrototype__proto.weekYear    = getSetWeekYear;\n    momentPrototype__proto.isoWeekYear = getSetISOWeekYear;\n\n    // Quarter\n    momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter;\n\n    // Month\n    momentPrototype__proto.month       = getSetMonth;\n    momentPrototype__proto.daysInMonth = getDaysInMonth;\n\n    // Week\n    momentPrototype__proto.week           = momentPrototype__proto.weeks        = getSetWeek;\n    momentPrototype__proto.isoWeek        = momentPrototype__proto.isoWeeks     = getSetISOWeek;\n    momentPrototype__proto.weeksInYear    = getWeeksInYear;\n    momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear;\n\n    // Day\n    momentPrototype__proto.date       = getSetDayOfMonth;\n    momentPrototype__proto.day        = momentPrototype__proto.days             = getSetDayOfWeek;\n    momentPrototype__proto.weekday    = getSetLocaleDayOfWeek;\n    momentPrototype__proto.isoWeekday = getSetISODayOfWeek;\n    momentPrototype__proto.dayOfYear  = getSetDayOfYear;\n\n    // Hour\n    momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour;\n\n    // Minute\n    momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute;\n\n    // Second\n    momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond;\n\n    // Millisecond\n    momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond;\n\n    // Offset\n    momentPrototype__proto.utcOffset            = getSetOffset;\n    momentPrototype__proto.utc                  = setOffsetToUTC;\n    momentPrototype__proto.local                = setOffsetToLocal;\n    momentPrototype__proto.parseZone            = setOffsetToParsedOffset;\n    momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset;\n    momentPrototype__proto.isDST                = isDaylightSavingTime;\n    momentPrototype__proto.isDSTShifted         = isDaylightSavingTimeShifted;\n    momentPrototype__proto.isLocal              = isLocal;\n    momentPrototype__proto.isUtcOffset          = isUtcOffset;\n    momentPrototype__proto.isUtc                = isUtc;\n    momentPrototype__proto.isUTC                = isUtc;\n\n    // Timezone\n    momentPrototype__proto.zoneAbbr = getZoneAbbr;\n    momentPrototype__proto.zoneName = getZoneName;\n\n    // Deprecations\n    momentPrototype__proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n    momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n    momentPrototype__proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n    momentPrototype__proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779', getSetZone);\n\n    var momentPrototype = momentPrototype__proto;\n\n    function moment__createUnix (input) {\n        return local__createLocal(input * 1000);\n    }\n\n    function moment__createInZone () {\n        return local__createLocal.apply(null, arguments).parseZone();\n    }\n\n    var defaultCalendar = {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    };\n\n    function locale_calendar__calendar (key, mom, now) {\n        var output = this._calendar[key];\n        return typeof output === 'function' ? output.call(mom, now) : output;\n    }\n\n    var defaultLongDateFormat = {\n        LTS  : 'h:mm:ss A',\n        LT   : 'h:mm A',\n        L    : 'MM/DD/YYYY',\n        LL   : 'MMMM D, YYYY',\n        LLL  : 'MMMM D, YYYY LT',\n        LLLL : 'dddd, MMMM D, YYYY LT'\n    };\n\n    function longDateFormat (key) {\n        var output = this._longDateFormat[key];\n        if (!output && this._longDateFormat[key.toUpperCase()]) {\n            output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {\n                return val.slice(1);\n            });\n            this._longDateFormat[key] = output;\n        }\n        return output;\n    }\n\n    var defaultInvalidDate = 'Invalid date';\n\n    function invalidDate () {\n        return this._invalidDate;\n    }\n\n    var defaultOrdinal = '%d';\n    var defaultOrdinalParse = /\\d{1,2}/;\n\n    function ordinal (number) {\n        return this._ordinal.replace('%d', number);\n    }\n\n    function preParsePostFormat (string) {\n        return string;\n    }\n\n    var defaultRelativeTime = {\n        future : 'in %s',\n        past   : '%s ago',\n        s  : 'a few seconds',\n        m  : 'a minute',\n        mm : '%d minutes',\n        h  : 'an hour',\n        hh : '%d hours',\n        d  : 'a day',\n        dd : '%d days',\n        M  : 'a month',\n        MM : '%d months',\n        y  : 'a year',\n        yy : '%d years'\n    };\n\n    function relative__relativeTime (number, withoutSuffix, string, isFuture) {\n        var output = this._relativeTime[string];\n        return (typeof output === 'function') ?\n            output(number, withoutSuffix, string, isFuture) :\n            output.replace(/%d/i, number);\n    }\n\n    function pastFuture (diff, output) {\n        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n        return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);\n    }\n\n    function locale_set__set (config) {\n        var prop, i;\n        for (i in config) {\n            prop = config[i];\n            if (typeof prop === 'function') {\n                this[i] = prop;\n            } else {\n                this['_' + i] = prop;\n            }\n        }\n        // Lenient ordinal parsing accepts just a number in addition to\n        // number + (possibly) stuff coming from _ordinalParseLenient.\n        this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\\d{1,2}/).source);\n    }\n\n    var prototype__proto = Locale.prototype;\n\n    prototype__proto._calendar       = defaultCalendar;\n    prototype__proto.calendar        = locale_calendar__calendar;\n    prototype__proto._longDateFormat = defaultLongDateFormat;\n    prototype__proto.longDateFormat  = longDateFormat;\n    prototype__proto._invalidDate    = defaultInvalidDate;\n    prototype__proto.invalidDate     = invalidDate;\n    prototype__proto._ordinal        = defaultOrdinal;\n    prototype__proto.ordinal         = ordinal;\n    prototype__proto._ordinalParse   = defaultOrdinalParse;\n    prototype__proto.preparse        = preParsePostFormat;\n    prototype__proto.postformat      = preParsePostFormat;\n    prototype__proto._relativeTime   = defaultRelativeTime;\n    prototype__proto.relativeTime    = relative__relativeTime;\n    prototype__proto.pastFuture      = pastFuture;\n    prototype__proto.set             = locale_set__set;\n\n    // Month\n    prototype__proto.months       =        localeMonths;\n    prototype__proto._months      = defaultLocaleMonths;\n    prototype__proto.monthsShort  =        localeMonthsShort;\n    prototype__proto._monthsShort = defaultLocaleMonthsShort;\n    prototype__proto.monthsParse  =        localeMonthsParse;\n\n    // Week\n    prototype__proto.week = localeWeek;\n    prototype__proto._week = defaultLocaleWeek;\n    prototype__proto.firstDayOfYear = localeFirstDayOfYear;\n    prototype__proto.firstDayOfWeek = localeFirstDayOfWeek;\n\n    // Day of Week\n    prototype__proto.weekdays       =        localeWeekdays;\n    prototype__proto._weekdays      = defaultLocaleWeekdays;\n    prototype__proto.weekdaysMin    =        localeWeekdaysMin;\n    prototype__proto._weekdaysMin   = defaultLocaleWeekdaysMin;\n    prototype__proto.weekdaysShort  =        localeWeekdaysShort;\n    prototype__proto._weekdaysShort = defaultLocaleWeekdaysShort;\n    prototype__proto.weekdaysParse  =        localeWeekdaysParse;\n\n    // Hours\n    prototype__proto.isPM = localeIsPM;\n    prototype__proto._meridiemParse = defaultLocaleMeridiemParse;\n    prototype__proto.meridiem = localeMeridiem;\n\n    function lists__get (format, index, field, setter) {\n        var locale = locale_locales__getLocale();\n        var utc = create_utc__createUTC().set(setter, index);\n        return locale[field](utc, format);\n    }\n\n    function list (format, index, field, count, setter) {\n        if (typeof format === 'number') {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n\n        if (index != null) {\n            return lists__get(format, index, field, setter);\n        }\n\n        var i;\n        var out = [];\n        for (i = 0; i < count; i++) {\n            out[i] = lists__get(format, i, field, setter);\n        }\n        return out;\n    }\n\n    function lists__listMonths (format, index) {\n        return list(format, index, 'months', 12, 'month');\n    }\n\n    function lists__listMonthsShort (format, index) {\n        return list(format, index, 'monthsShort', 12, 'month');\n    }\n\n    function lists__listWeekdays (format, index) {\n        return list(format, index, 'weekdays', 7, 'day');\n    }\n\n    function lists__listWeekdaysShort (format, index) {\n        return list(format, index, 'weekdaysShort', 7, 'day');\n    }\n\n    function lists__listWeekdaysMin (format, index) {\n        return list(format, index, 'weekdaysMin', 7, 'day');\n    }\n\n    locale_locales__getSetGlobalLocale('en', {\n        ordinalParse: /\\d{1,2}(th|st|nd|rd)/,\n        ordinal : function (number) {\n            var b = number % 10,\n                output = (toInt(number % 100 / 10) === 1) ? 'th' :\n                (b === 1) ? 'st' :\n                (b === 2) ? 'nd' :\n                (b === 3) ? 'rd' : 'th';\n            return number + output;\n        }\n    });\n\n    // Side effect imports\n    utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale);\n    utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale);\n\n    var mathAbs = Math.abs;\n\n    function duration_abs__abs () {\n        var data           = this._data;\n\n        this._milliseconds = mathAbs(this._milliseconds);\n        this._days         = mathAbs(this._days);\n        this._months       = mathAbs(this._months);\n\n        data.milliseconds  = mathAbs(data.milliseconds);\n        data.seconds       = mathAbs(data.seconds);\n        data.minutes       = mathAbs(data.minutes);\n        data.hours         = mathAbs(data.hours);\n        data.months        = mathAbs(data.months);\n        data.years         = mathAbs(data.years);\n\n        return this;\n    }\n\n    function duration_add_subtract__addSubtract (duration, input, value, direction) {\n        var other = create__createDuration(input, value);\n\n        duration._milliseconds += direction * other._milliseconds;\n        duration._days         += direction * other._days;\n        duration._months       += direction * other._months;\n\n        return duration._bubble();\n    }\n\n    // supports only 2.0-style add(1, 's') or add(duration)\n    function duration_add_subtract__add (input, value) {\n        return duration_add_subtract__addSubtract(this, input, value, 1);\n    }\n\n    // supports only 2.0-style subtract(1, 's') or subtract(duration)\n    function duration_add_subtract__subtract (input, value) {\n        return duration_add_subtract__addSubtract(this, input, value, -1);\n    }\n\n    function bubble () {\n        var milliseconds = this._milliseconds;\n        var days         = this._days;\n        var months       = this._months;\n        var data         = this._data;\n        var seconds, minutes, hours, years = 0;\n\n        // The following code bubbles up values, see the tests for\n        // examples of what that means.\n        data.milliseconds = milliseconds % 1000;\n\n        seconds           = absFloor(milliseconds / 1000);\n        data.seconds      = seconds % 60;\n\n        minutes           = absFloor(seconds / 60);\n        data.minutes      = minutes % 60;\n\n        hours             = absFloor(minutes / 60);\n        data.hours        = hours % 24;\n\n        days += absFloor(hours / 24);\n\n        // Accurately convert days to years, assume start from year 0.\n        years = absFloor(daysToYears(days));\n        days -= absFloor(yearsToDays(years));\n\n        // 30 days to a month\n        // TODO (iskren): Use anchor date (like 1st Jan) to compute this.\n        months += absFloor(days / 30);\n        days   %= 30;\n\n        // 12 months -> 1 year\n        years  += absFloor(months / 12);\n        months %= 12;\n\n        data.days   = days;\n        data.months = months;\n        data.years  = years;\n\n        return this;\n    }\n\n    function daysToYears (days) {\n        // 400 years have 146097 days (taking into account leap year rules)\n        return days * 400 / 146097;\n    }\n\n    function yearsToDays (years) {\n        // years * 365 + absFloor(years / 4) -\n        //     absFloor(years / 100) + absFloor(years / 400);\n        return years * 146097 / 400;\n    }\n\n    function as (units) {\n        var days;\n        var months;\n        var milliseconds = this._milliseconds;\n\n        units = normalizeUnits(units);\n\n        if (units === 'month' || units === 'year') {\n            days   = this._days   + milliseconds / 864e5;\n            months = this._months + daysToYears(days) * 12;\n            return units === 'month' ? months : months / 12;\n        } else {\n            // handle milliseconds separately because of floating point math errors (issue #1867)\n            days = this._days + Math.round(yearsToDays(this._months / 12));\n            switch (units) {\n                case 'week'   : return days / 7     + milliseconds / 6048e5;\n                case 'day'    : return days         + milliseconds / 864e5;\n                case 'hour'   : return days * 24    + milliseconds / 36e5;\n                case 'minute' : return days * 1440  + milliseconds / 6e4;\n                case 'second' : return days * 86400 + milliseconds / 1000;\n                // Math.floor prevents floating point math errors here\n                case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n                default: throw new Error('Unknown unit ' + units);\n            }\n        }\n    }\n\n    // TODO: Use this.as('ms')?\n    function duration_as__valueOf () {\n        return (\n            this._milliseconds +\n            this._days * 864e5 +\n            (this._months % 12) * 2592e6 +\n            toInt(this._months / 12) * 31536e6\n        );\n    }\n\n    function makeAs (alias) {\n        return function () {\n            return this.as(alias);\n        };\n    }\n\n    var asMilliseconds = makeAs('ms');\n    var asSeconds      = makeAs('s');\n    var asMinutes      = makeAs('m');\n    var asHours        = makeAs('h');\n    var asDays         = makeAs('d');\n    var asWeeks        = makeAs('w');\n    var asMonths       = makeAs('M');\n    var asYears        = makeAs('y');\n\n    function duration_get__get (units) {\n        units = normalizeUnits(units);\n        return this[units + 's']();\n    }\n\n    function makeGetter(name) {\n        return function () {\n            return this._data[name];\n        };\n    }\n\n    var duration_get__milliseconds = makeGetter('milliseconds');\n    var seconds      = makeGetter('seconds');\n    var minutes      = makeGetter('minutes');\n    var hours        = makeGetter('hours');\n    var days         = makeGetter('days');\n    var months       = makeGetter('months');\n    var years        = makeGetter('years');\n\n    function weeks () {\n        return absFloor(this.days() / 7);\n    }\n\n    var round = Math.round;\n    var thresholds = {\n        s: 45,  // seconds to minute\n        m: 45,  // minutes to hour\n        h: 22,  // hours to day\n        d: 26,  // days to month\n        M: 11   // months to year\n    };\n\n    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n    }\n\n    function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) {\n        var duration = create__createDuration(posNegDuration).abs();\n        var seconds  = round(duration.as('s'));\n        var minutes  = round(duration.as('m'));\n        var hours    = round(duration.as('h'));\n        var days     = round(duration.as('d'));\n        var months   = round(duration.as('M'));\n        var years    = round(duration.as('y'));\n\n        var a = seconds < thresholds.s && ['s', seconds]  ||\n                minutes === 1          && ['m']           ||\n                minutes < thresholds.m && ['mm', minutes] ||\n                hours   === 1          && ['h']           ||\n                hours   < thresholds.h && ['hh', hours]   ||\n                days    === 1          && ['d']           ||\n                days    < thresholds.d && ['dd', days]    ||\n                months  === 1          && ['M']           ||\n                months  < thresholds.M && ['MM', months]  ||\n                years   === 1          && ['y']           || ['yy', years];\n\n        a[2] = withoutSuffix;\n        a[3] = +posNegDuration > 0;\n        a[4] = locale;\n        return substituteTimeAgo.apply(null, a);\n    }\n\n    // This function allows you to set a threshold for relative time strings\n    function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) {\n        if (thresholds[threshold] === undefined) {\n            return false;\n        }\n        if (limit === undefined) {\n            return thresholds[threshold];\n        }\n        thresholds[threshold] = limit;\n        return true;\n    }\n\n    function humanize (withSuffix) {\n        var locale = this.localeData();\n        var output = duration_humanize__relativeTime(this, !withSuffix, locale);\n\n        if (withSuffix) {\n            output = locale.pastFuture(+this, output);\n        }\n\n        return locale.postformat(output);\n    }\n\n    var iso_string__abs = Math.abs;\n\n    function iso_string__toISOString() {\n        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n        var Y = iso_string__abs(this.years());\n        var M = iso_string__abs(this.months());\n        var D = iso_string__abs(this.days());\n        var h = iso_string__abs(this.hours());\n        var m = iso_string__abs(this.minutes());\n        var s = iso_string__abs(this.seconds() + this.milliseconds() / 1000);\n        var total = this.asSeconds();\n\n        if (!total) {\n            // this is the same as C#'s (Noda) and python (isodate)...\n            // but not other JS (goog.date)\n            return 'P0D';\n        }\n\n        return (total < 0 ? '-' : '') +\n            'P' +\n            (Y ? Y + 'Y' : '') +\n            (M ? M + 'M' : '') +\n            (D ? D + 'D' : '') +\n            ((h || m || s) ? 'T' : '') +\n            (h ? h + 'H' : '') +\n            (m ? m + 'M' : '') +\n            (s ? s + 'S' : '');\n    }\n\n    var duration_prototype__proto = Duration.prototype;\n\n    duration_prototype__proto.abs            = duration_abs__abs;\n    duration_prototype__proto.add            = duration_add_subtract__add;\n    duration_prototype__proto.subtract       = duration_add_subtract__subtract;\n    duration_prototype__proto.as             = as;\n    duration_prototype__proto.asMilliseconds = asMilliseconds;\n    duration_prototype__proto.asSeconds      = asSeconds;\n    duration_prototype__proto.asMinutes      = asMinutes;\n    duration_prototype__proto.asHours        = asHours;\n    duration_prototype__proto.asDays         = asDays;\n    duration_prototype__proto.asWeeks        = asWeeks;\n    duration_prototype__proto.asMonths       = asMonths;\n    duration_prototype__proto.asYears        = asYears;\n    duration_prototype__proto.valueOf        = duration_as__valueOf;\n    duration_prototype__proto._bubble        = bubble;\n    duration_prototype__proto.get            = duration_get__get;\n    duration_prototype__proto.milliseconds   = duration_get__milliseconds;\n    duration_prototype__proto.seconds        = seconds;\n    duration_prototype__proto.minutes        = minutes;\n    duration_prototype__proto.hours          = hours;\n    duration_prototype__proto.days           = days;\n    duration_prototype__proto.weeks          = weeks;\n    duration_prototype__proto.months         = months;\n    duration_prototype__proto.years          = years;\n    duration_prototype__proto.humanize       = humanize;\n    duration_prototype__proto.toISOString    = iso_string__toISOString;\n    duration_prototype__proto.toString       = iso_string__toISOString;\n    duration_prototype__proto.toJSON         = iso_string__toISOString;\n    duration_prototype__proto.locale         = locale;\n    duration_prototype__proto.localeData     = localeData;\n\n    // Deprecations\n    duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString);\n    duration_prototype__proto.lang = lang;\n\n    // Side effect imports\n\n    addFormatToken('X', 0, 0, 'unix');\n    addFormatToken('x', 0, 0, 'valueOf');\n\n    // PARSING\n\n    addRegexToken('x', matchSigned);\n    addRegexToken('X', matchTimestamp);\n    addParseToken('X', function (input, array, config) {\n        config._d = new Date(parseFloat(input, 10) * 1000);\n    });\n    addParseToken('x', function (input, array, config) {\n        config._d = new Date(toInt(input));\n    });\n\n    // Side effect imports\n\n\n    utils_hooks__hooks.version = '2.10.3';\n\n    setHookCallback(local__createLocal);\n\n    utils_hooks__hooks.fn                    = momentPrototype;\n    utils_hooks__hooks.min                   = min;\n    utils_hooks__hooks.max                   = max;\n    utils_hooks__hooks.utc                   = create_utc__createUTC;\n    utils_hooks__hooks.unix                  = moment__createUnix;\n    utils_hooks__hooks.months                = lists__listMonths;\n    utils_hooks__hooks.isDate                = isDate;\n    utils_hooks__hooks.locale                = locale_locales__getSetGlobalLocale;\n    utils_hooks__hooks.invalid               = valid__createInvalid;\n    utils_hooks__hooks.duration              = create__createDuration;\n    utils_hooks__hooks.isMoment              = isMoment;\n    utils_hooks__hooks.weekdays              = lists__listWeekdays;\n    utils_hooks__hooks.parseZone             = moment__createInZone;\n    utils_hooks__hooks.localeData            = locale_locales__getLocale;\n    utils_hooks__hooks.isDuration            = isDuration;\n    utils_hooks__hooks.monthsShort           = lists__listMonthsShort;\n    utils_hooks__hooks.weekdaysMin           = lists__listWeekdaysMin;\n    utils_hooks__hooks.defineLocale          = defineLocale;\n    utils_hooks__hooks.weekdaysShort         = lists__listWeekdaysShort;\n    utils_hooks__hooks.normalizeUnits        = normalizeUnits;\n    utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold;\n\n    var _moment = utils_hooks__hooks;\n\n    return _moment;\n\n}));","\nvar options = exports.options = require('./options');\n\nexports.parser = require('./parsers/parser');\nexports.refiner = require('./refiners/refiner');\n\nexports.Parser = exports.parser.Parser;\nexports.Refiner = exports.refiner.Refiner;\nexports.Filter = exports.refiner.Filter;\n\nexports.ParsedResult = require('./result').ParsedResult;\nexports.ParsedComponents = require('./result').ParsedComponents;\n\nvar Chrono = function(option) {\n\n    option = option || exports.options.casualOption();\n\n    this.option = option;\n    this.parsers = new Object(option.parsers);\n    this.refiners = new Object(option.refiners);\n};\n\n\nChrono.prototype.parse = function(text, refDate, opt) {\n\n    refDate = refDate || new Date();\n    opt = opt || {};\n    opt.forwardDate = opt.forwardDate || opt.forwardDate;\n    \n    var allResults = [];\n\n    this.parsers.forEach(function (parser) {\n        var results = parser.execute(text, refDate, opt);\n        allResults = allResults.concat(results);\n    });\n\n    allResults.sort(function(a, b) {\n        return a.index - b.index;\n    });\n\n    this.refiners.forEach(function (refiner) {\n        allResults = refiner.refine(text, allResults, opt);\n    });\n    \n    return allResults;\n};\n\n\nChrono.prototype.parseDate = function(text, refDate, opt) {\n    var results = this.parse(text, refDate, opt);\n    if (results.length > 0) {\n        return results[0].start.date();\n    }\n    return null;\n};\n\nexports.Chrono = Chrono;\nexports.strict = new Chrono( options.strictOption() );\nexports.casual = new Chrono( options.casualOption() );\n\nexports.en = new Chrono( options.mergeOptions([\n    options.en.casual, options.commonPostProcessing]));\n\nexports.en_GB = new Chrono( options.mergeOptions([\n    options.en_GB.casual, options.commonPostProcessing]));\n\nexports.de = new Chrono( options.mergeOptions([\n    options.de.casual, options.en, options.commonPostProcessing]));\n\nexports.es = new Chrono( options.mergeOptions([\n    options.es.casual, options.en, options.commonPostProcessing]));\n\nexports.fr = new Chrono( options.mergeOptions([\n    options.fr.casual, options.en, options.commonPostProcessing]));\n\nexports.ja = new Chrono( options.mergeOptions([ \n    options.ja.casual, options.en, options.commonPostProcessing]));\n\n\nexports.parse = function () {\n    return exports.casual.parse.apply(exports.casual, arguments);\n};\n\nexports.parseDate = function () {\n    return exports.casual.parseDate.apply(exports.casual, arguments);\n};\n\n\n\n\n","var parser = require('./parsers/parser');\nvar refiner = require('./refiners/refiner');\n\n\nexports.mergeOptions = function(options) {\n\n    var addedTypes = {};\n    var mergedOption = {\n        parsers: [],\n        refiners: []\n    };\n\n    options.forEach(function (option) {\n\n        if (option.call) {\n            option = option.call();\n        }\n\n        if (option.parsers) {\n            option.parsers.forEach(function (p) {\n                if (!addedTypes[p.constructor]) {\n                    mergedOption.parsers.push(p);\n                    addedTypes[p.constructor] = true;\n                }\n            });\n        }\n\n        if (option.refiners) {\n            option.refiners.forEach(function (r) {\n                if (!addedTypes[r.constructor]) {\n                    mergedOption.refiners.push(r);\n                    addedTypes[r.constructor] = true;\n                }\n            });\n        }\n    });\n\n    return mergedOption;\n};\n\n\nexports.commonPostProcessing = function() {\n    return {\n        refiners: [\n            // These should be after all other refiners\n            new refiner.ExtractTimezoneOffsetRefiner(),\n            new refiner.ExtractTimezoneAbbrRefiner(),\n            new refiner.UnlikelyFormatFilter()\n        ]\n    }\n};\n\n\n// -------------------------------------------------------------\n\nexports.strictOption = function () {\n    var strictConfig = {\n        strict: true\n    }\n\n    return exports.mergeOptions([\n        exports.en(strictConfig),\n        exports.de(strictConfig),\n        exports.es(strictConfig),\n        exports.fr(strictConfig),\n        exports.ja(strictConfig),\n        exports.zh,\n        exports.commonPostProcessing\n    ]);\n};\n\nexports.casualOption = function () {\n    return exports.mergeOptions([\n        exports.en.casual,\n        // Some German abbriviate overlap with common English\n        exports.de({ strict: true }), \n        exports.es.casual,\n        exports.fr.casual,\n        exports.ja.casual,\n        exports.zh,\n        exports.commonPostProcessing\n    ]);\n};\n\n// -------------------------------------------------------------\n\nexports.de = function(config) {\n    return {\n        parsers: [\n            new parser.DEDeadlineFormatParser(config),\n            new parser.DEMonthNameLittleEndianParser(config),\n            new parser.DEMonthNameParser(config),\n            new parser.DESlashDateFormatParser(config),\n            new parser.DETimeAgoFormatParser(config),\n            new parser.DETimeExpressionParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n            new refiner.DEMergeDateTimeRefiner(),\n            new refiner.DEMergeDateRangeRefiner()\n        ]\n    }\n};\n\nexports.de.casual = function() {\n    var option = exports.de({\n        strict: false\n    });\n    option.parsers.unshift(new parser.DECasualDateParser());\n    option.parsers.unshift(new parser.DEWeekdayParser());\n    return option;\n};\n\n\n\n// -------------------------------------------------------------\n\n\nexports.en = function(config) {\n    return {\n        parsers: [\n            new parser.ENISOFormatParser(config),\n            new parser.ENDeadlineFormatParser(config),\n            new parser.ENMonthNameLittleEndianParser(config),\n            new parser.ENMonthNameMiddleEndianParser(config),\n            new parser.ENMonthNameParser(config),\n            new parser.ENSlashDateFormatParser(config),\n            new parser.ENSlashDateFormatStartWithYearParser(config),\n            new parser.ENSlashMonthFormatParser(config),\n            new parser.ENTimeAgoFormatParser(config),\n            new parser.ENTimeLaterFormatParser(config),\n            new parser.ENTimeExpressionParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n\n            // English\n            new refiner.ENMergeDateTimeRefiner(),\n            new refiner.ENMergeDateRangeRefiner(),\n            new refiner.ENPrioritizeSpecificDateRefiner()\n        ]\n    }\n};\n\nexports.en.casual = function(config) {\n    config = config || {};\n    config.strict = false;\n    var option = exports.en(config);\n\n    // EN\n    option.parsers.unshift(new parser.ENCasualDateParser());\n    option.parsers.unshift(new parser.ENCasualTimeParser());\n    option.parsers.unshift(new parser.ENWeekdayParser());\n    option.parsers.unshift(new parser.ENRelativeDateFormatParser());\n    return option;\n};\n\n\nexports.en_GB = function(config) {\n    config = config || {};\n    config.littleEndian = true;\n    return exports.en(config);\n}\n\nexports.en_GB.casual = function(config) {\n    config = config || {};\n    config.littleEndian = true;\n    return exports.en.casual(config);\n}\n\n// -------------------------------------------------------------\n\nexports.ja = function() {\n    return {\n        parsers: [\n            new parser.JPStandardParser()\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n            new refiner.JPMergeDateRangeRefiner()\n        ]\n    }\n};\n\nexports.ja.casual = function() {\n    var option = exports.ja();\n    option.parsers.unshift(new parser.JPCasualDateParser());\n    return option;\n};\n\n\n// -------------------------------------------------------------\n\n\nexports.es = function(config) {\n    return {\n        parsers: [\n            new parser.ESTimeAgoFormatParser(config),\n            new parser.ESDeadlineFormatParser(config),\n            new parser.ESTimeExpressionParser(config),\n            new parser.ESMonthNameLittleEndianParser(config),\n            new parser.ESSlashDateFormatParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner()\n        ]\n    }\n};\n\nexports.es.casual = function() {\n    var option = exports.es({ \n        strict: false \n    });\n\n    option.parsers.unshift(new parser.ESCasualDateParser());\n    option.parsers.unshift(new parser.ESWeekdayParser());\n    return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.fr = function(config) {\n    return {\n        parsers: [\n            new parser.FRDeadlineFormatParser(config),\n            new parser.FRMonthNameLittleEndianParser(config),\n            new parser.FRSlashDateFormatParser(config),\n            new parser.FRTimeAgoFormatParser(config),\n            new parser.FRTimeExpressionParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n            new refiner.FRMergeDateRangeRefiner(),\n            new refiner.FRMergeDateTimeRefiner()\n        ]\n    }\n};\n\nexports.fr.casual = function() {\n    var option = exports.fr({\n        strict: false\n    });\n\n    option.parsers.unshift(new parser.FRCasualDateParser());\n    option.parsers.unshift(new parser.FRWeekdayParser());\n    option.parsers.unshift(new parser.FRRelativeDateFormatParser());\n    return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.zh = function() {\n    return {\n        parsers: [\n            new parser.ZHHantDateParser(),\n            new parser.ZHHantWeekdayParser(),\n            new parser.ZHHantTimeExpressionParser(),\n            new parser.ZHHantCasualDateParser(),\n            new parser.ZHHantDeadlineFormatParser()\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner()\n        ]\n    }\n};","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp(\n    '(\\\\W|^)(' +\n        'jetzt|' +\n        '(?:heute|diesen)\\\\s*(morgen|vormittag|mittag|nachmittag|abend)|' +\n        '(?:heute|diese)\\\\s*nacht|' +\n        'heute|' +\n        '(?:(?:ü|ue)ber)?morgen(?:\\\\s*(morgen|vormittag|mittag|nachmittag|abend|nacht))?|' +\n        '(?:vor)?gestern(?:\\\\s*(morgen|vormittag|mittag|nachmittag|abend|nacht))?|' +\n        'letzte\\\\s*nacht' +\n    ')(?=\\\\W|$)', 'i');\n\nexports.Parser = function DECasualDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt) {\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n        var lowerText = text.toLowerCase();\n\n        if (/(?:heute|diese)\\s*nacht/.test(lowerText)) {\n            // Normally means this coming midnight\n            result.start.imply('hour', 22);\n            result.start.imply('meridiem', 1);\n        } else if (/^(?:ü|ue)bermorgen/.test(lowerText)) {\n            startMoment.add(refMoment.hour() > 1 ? 2 : 1, 'day');\n        } else if (/^morgen/.test(lowerText)) {\n            // Check not \"Tomorrow\" on late night\n            if (refMoment.hour() > 1) {\n                startMoment.add(1, 'day');\n            }\n        } else if (/^gestern/.test(lowerText)) {\n            startMoment.add(-1, 'day');\n        } else if (/^vorgestern/.test(lowerText)) {\n            startMoment.add(-2, 'day');\n        } else if (/letzte\\s*nacht/.test(lowerText)) {\n            result.start.imply('hour', 0);\n            if (refMoment.hour() > 6) {\n                startMoment.add(-1, 'day');\n            }\n        } else if (lowerText === 'jetzt') {\n          result.start.imply('hour', refMoment.hour());\n          result.start.imply('minute', refMoment.minute());\n          result.start.imply('second', refMoment.second());\n          result.start.imply('millisecond', refMoment.millisecond());\n        }\n\n        var secondMatch = match[3] || match[4] || match[5];\n        if (secondMatch) {\n            switch (secondMatch.toLowerCase()) {\n                case 'morgen':\n                    result.start.imply('hour', 6);\n                    break;\n                case 'vormittag':\n                    result.start.imply('hour', 9);\n                    break;\n                case 'mittag':\n                    result.start.imply('hour', 12);\n                    break;\n                case 'nachmittag':\n                    result.start.imply('hour', 15);\n                    result.start.imply('meridiem', 1);\n                    break;\n                case 'abend':\n                    result.start.imply('hour', 18);\n                    result.start.imply('meridiem', 1);\n                    break;\n                case 'nacht':\n                    result.start.imply('hour', 0);\n                    break;\n            }\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['DECasualDateParser'] = true;\n        return result;\n    }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(in|nach)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|einigen|eine[rm]\\\\s*halben|eine[rm])\\\\s*' +\n    '(sekunden?|min(?:ute)?n?|stunden?|tag(?:en)?|wochen?|monat(?:en)?|jahr(?:en)?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\n    '(in|nach)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|eine(?:r|m)?)\\\\s*' +\n    '(sekunden?|minuten?|stunden?|tag(?:en)?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nexports.Parser = function DEDeadlineFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var num = match[3].toLowerCase();\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === 'einer' || num === 'einem') {\n            num = 1;\n        } else if (num === 'einigen') {\n            num = 3;\n        } else if (/halben/.test(num)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        var date = moment(ref);\n        if (/tag|woche|monat|jahr/i.test(match[4])) {\n\n            if (/tag/i.test(match[4])) {\n                date.add(num, 'd');\n            } else if (/woche/i.test(match[4])) {\n                date.add(num * 7, 'd');\n            } else if (/monat/i.test(match[4])) {\n                date.add(num, 'month');\n            } else if (/jahr/i.test(match[4])) {\n                date.add(num, 'year');\n            }\n\n            result.start.assign('year', date.year());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('day', date.date());\n            return result;\n        }\n\n        if (/stunde/i.test(match[4])) {\n\n            date.add(num, 'hour');\n\n        } else if (/min/i.test(match[4])) {\n\n            date.add(num, 'minute');\n\n        } else if (/sekunde/i.test(match[4])) {\n\n            date.add(num, 'second');\n        }\n\n        result.start.imply('year', date.year());\n        result.start.imply('month', date.month() + 1);\n        result.start.imply('day', date.date());\n        result.start.assign('hour', date.hour());\n        result.start.assign('minute', date.minute());\n        result.start.assign('second', date.second());\n        result.tags['DEDeadlineFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n        '(?:am\\\\s*?)?' +\n        '(?:(Sonntag|Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|So|Mo|Di|Mi|Do|Fr|Sa)\\\\s*,?\\\\s*)?' +\n        '(?:den\\\\s*)?' +\n        '([0-9]{1,2})\\\\.' +\n        '(?:\\\\s*(?:bis(?:\\\\s*(?:am|zum))?|\\\\-|\\\\–|\\\\s)\\\\s*([0-9]{1,2})\\\\.)?\\\\s*' +\n        '(Jan(?:uar|\\\\.)?|Feb(?:ruar|\\\\.)?|Mär(?:z|\\\\.)?|Maerz|Mrz\\\\.?|Apr(?:il|\\\\.)?|Mai|Jun(?:i|\\\\.)?|Jul(?:i|\\\\.)?|Aug(?:ust|\\\\.)?|Sep(?:t|t\\\\.|tember|\\\\.)?|Okt(?:ober|\\\\.)?|Nov(?:ember|\\\\.)?|Dez(?:ember|\\\\.)?)' +\n        '(?:' +\n            ',?\\\\s*([0-9]{1,4}(?![^\\\\s]\\\\d))' +\n            '(\\\\s*[vn]\\\\.?\\\\s*C(?:hr)?\\\\.?)?' +\n        ')?' +\n        '(?=\\\\W|$)', 'i'\n    );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_TO_GROUP = 4;\nvar MONTH_NAME_GROUP = 5;\nvar YEAR_GROUP = 6;\nvar YEAR_BE_GROUP = 7;\n\nexports.Parser = function DEMonthNameLittleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = match[DATE_GROUP];\n        day = parseInt(day);\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            year = parseInt(year);\n\n            if(match[YEAR_BE_GROUP]){\n                if (/v/i.test(match[YEAR_BE_GROUP])) {\n                    // v.Chr.\n                    year = -year;\n                }\n            } else if (year < 100){\n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n            refMoment.year(moment(ref).year());\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as '12 - 13 January 2012'\n        if (match[DATE_TO_GROUP]) {\n            result.end = result.start.clone();\n            result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\n        }\n\n        result.tags['DEMonthNameLittleEndianParser'] = true;\n        return result;\n    };\n}\n","/*\n    \n    The parser for parsing month name and year.\n    \n    EX. \n        - Januar\n        - Januar 2012\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(^|\\\\D\\\\s+|[^\\\\w\\\\s])' +\n    '(Jan\\\\.?|Januar|Feb\\\\.?|Februar|Mär\\\\.?|M(?:ä|ae)rz|Mrz\\\\.?|Apr\\\\.?|April|Mai\\\\.?|Jun\\\\.?|Juni|Jul\\\\.?|Juli|Aug\\\\.?|August|Sep\\\\.?|Sept\\\\.?|September|Okt\\\\.?|Oktober|Nov\\\\.?|November|Dez\\\\.?|Dezember)' + \n    '\\\\s*' +\n    '(?:' +\n        ',?\\\\s*(?:([0-9]{4})(\\\\s*[vn]\\\\.?\\\\s*C(?:hr)?\\\\.?)?|([0-9]{1,4})\\\\s*([vn]\\\\.?\\\\s*C(?:hr)?\\\\.?))' +\n    ')?' +\n    '(?=[^\\\\s\\\\w]|$)', 'i');\n\nvar MONTH_NAME_GROUP = 2;\nvar YEAR_GROUP = 3;\nvar YEAR_BE_GROUP = 4;\nvar YEAR_GROUP2 = 5;\nvar YEAR_BE_GROUP2 = 6;\n\nexports.Parser = function ENMonthNameParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        \n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = 1;\n\n        var year = null;\n        if (match[YEAR_GROUP] || match[YEAR_GROUP2]) {\n            year = match[YEAR_GROUP] || match[YEAR_GROUP2];\n            year = parseInt(year);\n\n            if (match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2]) {\n                if (/v/i.test(match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2])) {\n                    // v.Chr.\n                    year = -year;\n                }\n\n            } else if (year < 100){ \n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n            \n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){  \n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n                refMoment = lastYear;\n            }\n\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        result.tags['DEMonthNameParser'] = true;\n        return result;\n    }\n}\n\n","/*\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\n    - Tuesday 11/3/2015\n    - 11/3/2015\n    - 11/3\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '(?:am\\\\s*?)?' +\n        '((?:sonntag|so|montag|mo|dienstag|di|mittwoch|mi|donnerstag|do|freitag|fr|samstag|sa))' +\n        '\\\\s*\\\\,?\\\\s*' +\n        '(?:den\\\\s*)?' +\n    ')?' +\n    '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n    '(?:' +\n        '[\\\\/\\\\.\\\\-]' +\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n    ')?' +\n    '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = {\n    'sonntag': 0, 'so': 0,\n    'montag': 1, 'mo': 1,\n    'dienstag': 2, 'di': 2,\n    'mittwoch': 3, 'mi': 3,\n    'donnerstag': 4, 'do': 4,\n    'freitag': 5, 'fr': 5,\n    'samstag': 6, 'sa': 6\n};\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\nvar WEEKDAY_GROUP = 2;\nvar DAY_GROUP = 3;\nvar MONTH_GROUP = 4;\nvar YEAR_GROUP = 5;\n\nexports.Parser = function DESlashDateFormatParser(argument) {\n    Parser.apply(this, arguments);\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n            // Long skip, if there is some overlapping like:\n            // XX[/YY/ZZ]\n            // [XX/YY/]ZZ\n            match.index += match[0].length\n            return;\n        }\n\n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        if(text.match(/^\\d\\.\\d$/)) return;\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n        // MM/dd -> OK\n        // MM.dd -> NG\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n        var date = null;\n        var year = match[YEAR_GROUP] || moment(ref).year() + '';\n        var month = match[MONTH_GROUP];\n        var day   = match[DAY_GROUP];\n\n        month = parseInt(month);\n        day  = parseInt(day);\n        year = parseInt(year);\n\n        if (month < 1 || month > 12) return null;\n        if(day < 1 || day > 31) return null;\n\n        if(year < 100){\n            if (year > 50) {\n                year = year + 1900;\n            } else {\n                year = year + 2000;\n            }\n        }\n\n        result.start.assign('day', day);\n        result.start.assign('month', month);\n        result.start.assign('year', year);\n\n        //Day of week\n        if(match[WEEKDAY_GROUP]) {\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n        }\n\n        result.tags['DESlashDateFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('' +\n    '(\\\\W|^)vor\\\\s*' +\n    '(' + util.INTEGER_WORDS_PATTERN + '|[0-9]+|einigen|eine[rm]\\\\s*halben|eine[rm])\\\\s*' +\n    '(sekunden?|min(?:ute)?n?|stunden?|wochen?|tag(?:en)?|monat(?:en)?|jahr(?:en)?)\\\\s*' +\n    '(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n    '(\\\\W|^)vor\\\\s*' +\n    '([0-9]+|eine(?:r|m))\\\\s*' +\n    '(sekunden?|minuten?|stunden?|tag(?:en)?)' +\n    '(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function DETimeAgoFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n        var text = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n        index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var num = match[2].toLowerCase() ;\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === 'einer' || num === 'einem') {\n            num = 1;\n        } else if (num === 'einigen') {\n            num = 3;\n        } else if (/halben/.test(num)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        var date = moment(ref);\n\n        if (/stunde|min|sekunde/i.test(match[3])) {\n            if (/stunde/i.test(match[3])) {\n\n                date.add(-num, 'hour');\n\n            } else if (/min/i.test(match[3])) {\n\n                date.add(-num, 'minute');\n\n            } else if (/sekunde/i.test(match[3])) {\n\n                date.add(-num, 'second');\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.start.assign('second', date.second());\n            result.tags['DETimeAgoFormatParser'] = true;\n            return result;\n        }\n\n        if (/woche/i.test(match[3])) {\n            date.add(-num, 'week');\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.imply('weekday', date.day());\n            return result;\n        }\n\n        if (/tag/i.test(match[3])) {\n            date.add(-num, 'd');\n        }\n\n        if (/monat/i.test(match[3])) {\n            date.add(-num, 'month');\n        }\n\n        if (/jahr/i.test(match[3])) {\n\n            date.add(-num, 'year');\n        }\n\n        result.start.assign('day', date.date());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('year', date.year());\n        return result;\n\n    };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\n    \"(?:(?:um|von)\\\\s*)?\" + \n    \"(\\\\d{1,4}|mittags?|mitternachts?)\" + \n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\:|\\\\：)(\\\\d{2})\" + \n        \")?\" + \n    \")?\" +\n    \"(?:\\\\s*uhr)?\" +\n    \"(?:\\\\s*(morgens|vormittags|mittags|nachmittags|abends|nachts))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" + \n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|bis|\\\\?)\\\\s*\" + \n    \"(\\\\d{1,4})\" +\n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" + \n        \")?\" + \n    \")?\" + \n    \"(?:\\\\s*(morgens|vormittags|mittags|nachmittags|abends|nachts))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP    = 2;\nvar MINUTE_GROUP  = 3;\nvar SECOND_GROUP  = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\n\nexports.Parser = function DETimeExpressionParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return FIRST_REG_PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index + match[1].length;\n        result.text  = match[0].substring(match[1].length);\n        result.tags['DETimeExpressionParser'] = true;\n\n        result.start.imply('day',   refMoment.date());\n        result.start.imply('month', refMoment.month()+1);\n        result.start.imply('year',  refMoment.year());\n        \n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.start.assign('second', second);\n        }\n        \n        // ----- Hours\n        if (/mittags?/i.test(match[HOUR_GROUP])) {\n            meridiem = 1; \n            hour = 12;\n        } else if (/mitternachts?/i.test(match[HOUR_GROUP])) {\n            meridiem = 0; \n            hour = 0;\n        } else {\n            hour = parseInt(match[HOUR_GROUP]);\n        }\n        \n        // ----- Minutes\n        if(match[MINUTE_GROUP] != null){ \n            minute = parseInt(match[MINUTE_GROUP]);\n        } else if(hour > 100) { \n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        } \n        \n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n\n        // ----- AM & PM  \n        if (match[AM_PM_HOUR_GROUP] != null) {\n            if (hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm === 'morgens' || ampm === 'vormittags') {\n                meridiem = 0; \n                if(hour == 12) hour = 0;\n            } else {\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n        } \n\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        } else {\n            if (hour < 12) {\n                result.start.imply('meridiem', 0);\n            } else {\n                result.start.imply('meridiem', 1);\n            }\n        }\n        \n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            // Not accept number only result\n            if (result.text.match(/^\\d+$/)) { \n                return null;\n            }\n            return result;\n        }\n\n\n\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n            return result;\n        }\n\n        if(result.end == null){\n            result.end = new ParsedComponents(null, result.start.date());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[2]);\n        \n        // ----- Minute\n        if (match[MINUTE_GROUP]!= null) {\n            \n            minute = parseInt(match[MINUTE_GROUP]);\n            if(minute >= 60) return result;\n            \n        } else if (hour > 100) {\n\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n        \n        // ----- AM & PM \n        if (match[AM_PM_HOUR_GROUP] != null) {\n\n            if (hour > 12) return null;\n\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm === 'morgens' || ampm === 'vormittags') {\n                meridiem = 0; \n                if(hour == 12) {\n                    hour = 0;\n                    if (!result.end.isCertain('day')) {\n                        result.end.imply('day', result.end.get('day') + 1);\n                    }\n                }\n            } else {\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n            \n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n                    \n                    result.start.imply('meridiem', 0);\n                    \n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n                    \n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12); \n                    }\n                }\n            }\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        } else {\n            var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n            if (startAtPM && result.start.get('hour') > hour) {\n                // 10pm - 1 (am)\n                result.end.imply('meridiem', 0);\n\n            } else if (hour > 12) {\n                result.end.imply('meridiem', 1);\n            }\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n        \n        return result;\n    }\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar DAYS_OFFSET = {\n    'sonntag': 0, 'so': 0,\n    'montag': 1, 'mo': 1,\n    'dienstag': 2, 'di': 2,\n    'mittwoch': 3, 'mi': 3,\n    'donnerstag': 4, 'do': 4,\n    'freitag': 5, 'fr': 5,\n    'samstag': 6, 'sa': 6\n};\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:(?:\\\\,|\\\\(|\\\\（)\\\\s*)?' +\n    '(?:a[mn]\\\\s*?)?' +\n    '(?:(diese[mn]|letzte[mn]|n(?:ä|ae)chste[mn])\\\\s*)?' +\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\）))?' +\n    '(?:\\\\s*(diese|letzte|n(?:ä|ae)chste)\\\\s*woche)?' +\n    '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\nexports.Parser = function DEWeekdayParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n        var offset = DAYS_OFFSET[dayOfWeek];\n        if(offset === undefined) return null;\n\n        var startMoment = moment(ref);\n        var prefix = match[PREFIX_GROUP];\n        var postfix = match[POSTFIX_GROUP];\n\n        var refOffset = startMoment.day();\n        var norm = prefix || postfix;\n        norm = norm || '';\n        norm = norm.toLowerCase();\n        if (/letzte/.test(norm)) {\n            startMoment.day(offset - 7);\n        } else if (/n(?:ä|ae)chste/.test(norm)) {\n            startMoment.day(offset + 7);\n        } else if (/diese/.test(norm)) {\n            if ( opt.forwardDate && refOffset > offset ) {\n                startMoment.day(offset + 7);\n            } else {\n                startMoment.day(offset);\n            }\n        } else {\n            if ( opt.forwardDate && refOffset > offset ) {\n                startMoment.day(offset + 7);\n            } else if (!opt.forwardDate && Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n                startMoment.day(offset - 7);\n            } else if (!opt.forwardDate && Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {\n                startMoment.day(offset + 7);\n            } else {\n                startMoment.day(offset);\n            }\n        }\n\n        result.start.assign('weekday', offset);\n        result.start.imply('day', startMoment.date());\n        result.start.imply('month', startMoment.month() + 1);\n        result.start.imply('year', startMoment.year());\n        return result;\n    }\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)(now|today|tonight|last\\s*night|(?:tomorrow|tmr|yesterday)\\s*|tomorrow|tmr|yesterday)(?=\\W|$)/i;\n\nexports.Parser = function ENCasualDateParser(){\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n        var lowerText = text.toLowerCase();\n\n        if(lowerText == 'tonight'){\n            // Normally means this coming midnight\n            result.start.imply('hour', 22);\n            result.start.imply('meridiem', 1);\n\n        } else if (/^tomorrow|^tmr/.test(lowerText)) {\n\n            // Check not \"Tomorrow\" on late night\n            if(refMoment.hour() > 1) {\n                startMoment.add(1, 'day');\n            }\n\n        } else if (/^yesterday/.test(lowerText)) {\n\n            startMoment.add(-1, 'day');\n\n        } else if(lowerText.match(/last\\s*night/)) {\n\n            result.start.imply('hour', 0);\n            if (refMoment.hour() > 6) {\n                startMoment.add(-1, 'day');\n            }\n\n        } else if (lowerText.match(\"now\")) {\n\n          result.start.assign('hour', refMoment.hour());\n          result.start.assign('minute', refMoment.minute());\n          result.start.assign('second', refMoment.second());\n          result.start.assign('millisecond', refMoment.millisecond());\n\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['ENCasualDateParser'] = true;\n        return result;\n    }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)((this)?\\s*(morning|afternoon|evening|noon))/i;\n\nvar TIME_MATCH = 4;\n\nexports.Parser = function ENCasualTimeParser(){\n\n    Parser.apply(this, arguments);\n\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        if(!match[TIME_MATCH]) TIME_MATCH = 3;\n\n        if (match[TIME_MATCH] == \"afternoon\") {\n\n            result.start.imply('hour', opt['afternoon'] ? opt['afternoon'] : 15);\n\n        } else if (match[TIME_MATCH] == \"evening\") {\n\n            result.start.imply('hour', opt['evening'] ? opt['evening'] : 18);\n\n        } else if (match[TIME_MATCH] == \"morning\") {\n\n            result.start.imply('hour', opt['morning'] ? opt['morning'] : 6);\n\n        } else if (match[TIME_MATCH] == \"noon\") {\n\n            result.start.imply('hour', opt['noon'] ? opt['noon'] : 12);\n        }\n\n        result.tags['ENCasualTimeParser'] = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(within|in)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n    '(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\n    '(within|in)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?)\\\\s*' +\n    '(seconds?|minutes?|hours?|days?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nexports.Parser = function ENDeadlineFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var num = match[3].toLowerCase();\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === 'a' || num === 'an'){\n            num = 1;\n        } else if (num.match(/few/i)){\n            num = 3;\n        } else if (num.match(/half/i)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        var date = moment(ref);\n        if (match[4].match(/day|week|month|year/i)) {\n\n            if (match[4].match(/day/i)) {\n                date.add(num, 'd');\n            } else if (match[4].match(/week/i)) {\n                date.add(num * 7, 'd');\n            } else if (match[4].match(/month/i)) {\n                date.add(num, 'month');\n            } else if (match[4].match(/year/i)) {\n                date.add(num, 'year');\n            }\n\n            result.start.imply('year', date.year());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('day', date.date());\n            return result;\n        }\n\n        if (match[4].match(/hour/i)) {\n\n            date.add(num, 'hour');\n\n        } else if (match[4].match(/min/i)) {\n\n            date.add(num, 'minute');\n\n        } else if (match[4].match(/second/i)) {\n\n            date.add(num, 'second');\n        }\n\n        result.start.imply('year', date.year());\n        result.start.imply('month', date.month() + 1);\n        result.start.imply('day', date.date());\n        result.start.imply('hour', date.hour());\n        result.start.imply('minute', date.minute());\n        result.start.imply('second', date.second());\n        result.tags['ENDeadlineFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n    ISO 8601\n    http://www.w3.org/TR/NOTE-datetime\n    - YYYY-MM-DD\n    - YYYY-MM-DDThh:mmTZD\n    - YYYY-MM-DDThh:mm:ssTZD\n    - YYYY-MM-DDThh:mm:ss.sTZD \n    - TZD = (Z or +hh:mm or -hh:mm)\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' \n            + '([0-9]{4})\\\\-([0-9]{1,2})\\\\-([0-9]{1,2})'\n            + '(?:T' //..\n                + '([0-9]{1,2}):([0-9]{1,2})' // hh:mm\n                + '(?::([0-9]{1,2})(?:\\\\.(\\\\d{1,4}))?)?' // :ss.s\n                + '(?:Z|([+-]\\\\d{2}):?(\\\\d{2})?)?' // TZD (Z or ±hh:mm or ±hhmm or ±hh)\n            + ')?'  //..\n            + '(?=\\\\W|$)', 'i');\n\nvar YEAR_NUMBER_GROUP = 2;\nvar MONTH_NUMBER_GROUP = 3;\nvar DATE_NUMBER_GROUP  = 4;\nvar HOUR_NUMBER_GROUP  = 5;\nvar MINUTE_NUMBER_GROUP = 6;\nvar SECOND_NUMBER_GROUP = 7;\nvar MILLISECOND_NUMBER_GROUP = 8;\nvar TZD_HOUR_OFFSET_GROUP = 9;\nvar TZD_MINUTE_OFFSET_GROUP = 10;\n\nexports.Parser = function ENISOFormatParser(){\n    Parser.apply(this, arguments);\n    \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        })\n        \n        result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));\n        result.start.assign('month', parseInt(match[MONTH_NUMBER_GROUP]));\n        result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));\n\n        if (moment(result.start.get('month')) > 12 || moment(result.start.get('month')) < 1 ||\n            moment(result.start.get('day')) > 31 || moment(result.start.get('day')) < 1) {\n            return null;\n        }\n\n        if (match[HOUR_NUMBER_GROUP] != null) {\n            \n            result.start.assign('hour',\n                    parseInt(match[HOUR_NUMBER_GROUP]));\n            result.start.assign('minute',\n                    parseInt(match[MINUTE_NUMBER_GROUP]));\n\n            if (match[SECOND_NUMBER_GROUP] != null) {\n\n                result.start.assign('second',\n                        parseInt(match[SECOND_NUMBER_GROUP]));\n            }\n\n            if (match[MILLISECOND_NUMBER_GROUP] != null) {\n\n                result.start.assign('millisecond',\n                        parseInt(match[MILLISECOND_NUMBER_GROUP]));\n            }\n\n            if (match[TZD_HOUR_OFFSET_GROUP] == null) {\n\n                result.start.assign('timezoneOffset', 0);\n            } else {\n\n                var minuteOffset = 0;\n                var hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]);\n                if (match[TZD_MINUTE_OFFSET_GROUP] != null)\n                    minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]);\n\n                var offset = hourOffset * 60;\n                if (offset < 0) {\n                    offset -= minuteOffset;\n                } else {\n                    offset += minuteOffset;\n                }\n\n                result.start.assign('timezoneOffset', offset);\n            }\n        }\n        \n        result.tags['ENISOFormatParser'] = true;\n        return result;\n    };\n\n}\n\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n        '(?:on\\\\s*?)?' +\n        '(?:(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun|Mon|Tue|Wed|Thu|Fri|Sat)\\\\s*,?\\\\s*)?' +\n        '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +\n        '(?:\\\\s*' +\n            '(?:to|\\\\-|\\\\–|until|through|till|\\\\s)\\\\s*' +\n            '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +\n        ')?' + \n        '(?:-|\\/|\\\\s*(?:of)?\\\\s*)' +\n        '(Jan(?:uary|\\\\.)?|Feb(?:ruary|\\\\.)?|Mar(?:ch|\\\\.)?|Apr(?:il|\\\\.)?|May|Jun(?:e|\\\\.)?|Jul(?:y|\\\\.)?|Aug(?:ust|\\\\.)?|Sep(?:tember|\\\\.)?|Oct(?:ober|\\\\.)?|Nov(?:ember|\\\\.)?|Dec(?:ember|\\\\.)?)' +\n        '(?:' +\n            '(?:-|\\/|,?\\\\s*)' +\n            '((?:' + \n                '[1-9][0-9]{0,3}\\\\s*(?:BE|AD|BC)|' +\n                '[1-2][0-9]{3}' + \n            ')(?![^\\\\s]\\\\d))' +\n        ')?' +\n        '(?=\\\\W|$)', 'i'\n    );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_NUM_GROUP = 4;\nvar DATE_TO_GROUP = 5;\nvar DATE_TO_NUM_GROUP = 6;\nvar MONTH_NAME_GROUP = 7;\nvar YEAR_GROUP = 8;\n\nexports.Parser = function ENMonthNameLittleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref\n        });\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = match[DATE_NUM_GROUP] ?\n            parseInt(match[DATE_NUM_GROUP]):\n            util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            \n            if (/BE/i.test(year)) {\n                // Buddhist Era\n                year = year.replace(/BE/i, '');\n                year = parseInt(year) - 543;\n            } else if (/BC/i.test(year)){\n                // Before Christ\n                year = year.replace(/BC/i, '');\n                year = -parseInt(year);\n            } else if (/AD/i.test(year)){\n                year = year.replace(/AD/i, '');\n                year = parseInt(year);\n            } else {\n                year = parseInt(year);\n                if (year < 100){\n                    year = year + 2000;\n                }\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n            refMoment.year(moment(ref).year());\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as '12 - 13 January 2012'\n        if (match[DATE_TO_GROUP]) {\n            var endDate = match[DATE_TO_NUM_GROUP] ?\n                parseInt(match[DATE_TO_NUM_GROUP]):\n                util.ORDINAL_WORDS[match[DATE_TO_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n            result.end = result.start.clone();\n            result.end.assign('day', endDate);\n        }\n\n        result.tags['ENMonthNameLittleEndianParser'] = true;\n        return result;\n    };\n};\n","/*\n\n    The parser for parsing US's date format that begin with month's name.\n\n    EX.\n        - January 13\n        - January 13, 2012\n        - January 13 - 15, 2012\n        - Tuesday, January 13, 2012\n\n    Watch out for:\n        - January 12:00\n        - January 12.44\n        - January 1222344\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '(?:on\\\\s*?)?' +\n        '(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun\\\\.?|Mon\\\\.?|Tue\\\\.?|Wed\\\\.?|Thu\\\\.?|Fri\\\\.?|Sat\\\\.?)' +\n    '\\\\s*,?\\\\s*)?' +\n    '(Jan\\\\.?|January|Feb\\\\.?|February|Mar\\\\.?|March|Apr\\\\.?|April|May\\\\.?|Jun\\\\.?|June|Jul\\\\.?|July|Aug\\\\.?|August|Sep\\\\.?|Sept\\\\.?|September|Oct\\\\.?|October|Nov\\\\.?|November|Dec\\\\.?|December)' +\n    '(?:-|\\/|\\\\s*,?\\\\s*)' +\n    '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN +')(?!\\\\s*(?:am|pm))\\\\s*' + '' + \n    '(?:' +\n        '(?:to|\\\\-)\\\\s*' +\n        '(([0-9]{1,2})(?:st|nd|rd|th)?| ' + util.ORDINAL_WORDS_PATTERN + ')\\\\s*' +\n    ')?' +\n    '(?:' +\n        '(?:-|\\/|\\\\s*,?\\\\s*)' +\n        '(?:([0-9]{4})\\\\s*(BE|AD|BC)?|([0-9]{1,4})\\\\s*(AD|BC))\\\\s*' +\n    ')?' +\n    '(?=\\\\W|$)(?!\\\\:\\\\d)', 'i');\n\nvar WEEKDAY_GROUP = 2;\nvar MONTH_NAME_GROUP = 3;\nvar DATE_GROUP = 4;\nvar DATE_NUM_GROUP = 5;\nvar DATE_TO_GROUP = 6;\nvar DATE_TO_NUM_GROUP = 7;\nvar YEAR_GROUP = 8;\nvar YEAR_BE_GROUP = 9;\nvar YEAR_GROUP2 = 10;\nvar YEAR_BE_GROUP2 = 11;\n\nexports.Parser = function ENMonthNameMiddleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n        var day = match[DATE_NUM_GROUP] ?\n            parseInt(match[DATE_NUM_GROUP]) :\n            util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n        var year = null;\n        if (match[YEAR_GROUP] || match[YEAR_GROUP2]) {\n            year = match[YEAR_GROUP] || match[YEAR_GROUP2];\n            year = parseInt(year);\n\n            var yearBE = match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2];\n            if (yearBE) {\n                if (/BE/i.test(yearBE)) {\n                    // Buddhist Era\n                    year = year - 543;\n                } else if (/BC/i.test(yearBE)) {\n                    // Before Christ\n                    year = -year;\n                }\n            } else if (year < 100){\n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as 'January 12 - 13, 2012'\n        if (match[DATE_TO_GROUP]) {\n            var endDate = match[DATE_TO_NUM_GROUP] ?\n                endDate = parseInt(match[DATE_TO_NUM_GROUP]) :\n                util.ORDINAL_WORDS[match[DATE_TO_GROUP].replace('-', ' ').trim().toLowerCase()];\n\n            result.end = result.start.clone();\n            result.end.assign('day', endDate);\n        }\n\n        result.tags['ENMonthNameMiddleEndianParser'] = true;\n        return result;\n    }\n};","/*\n    \n    The parser for parsing month name and year.\n    \n    EX. \n        - January\n        - January 2012\n        - January, 2012\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(^|\\\\D\\\\s+|[^\\\\w\\\\s])' +\n    '(Jan\\\\.?|January|Feb\\\\.?|February|Mar\\\\.?|March|Apr\\\\.?|April|May\\\\.?|Jun\\\\.?|June|Jul\\\\.?|July|Aug\\\\.?|August|Sep\\\\.?|Sept\\\\.?|September|Oct\\\\.?|October|Nov\\\\.?|November|Dec\\\\.?|December)' + \n    '\\\\s*' +\n    '(?:' +\n        '[,-]?\\\\s*([0-9]{4})(\\\\s*BE|AD|BC)?' +\n    ')?' +\n    '(?=[^\\\\s\\\\w]|\\\\s+[^0-9]|\\\\s+$|$)', 'i');\n\nvar MONTH_NAME_GROUP = 2;\nvar YEAR_GROUP = 3;\nvar YEAR_BE_GROUP = 4;\n\nexports.Parser = function ENMonthNameParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        \n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = 1;\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            year = parseInt(year);\n\n            if(match[YEAR_BE_GROUP]){\n                if (match[YEAR_BE_GROUP].match(/BE/)) {\n                    // Buddhist Era\n                    year = year - 543;\n                } else if (match[YEAR_BE_GROUP].match(/BC/)) {\n                    // Before Christ\n                    year = -year;\n                }\n\n            } else if (year < 100){ \n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n            \n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){  \n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n                refMoment = lastYear;\n            }\n\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        result.tags['ENMonthNameParser'] = true;\n        return result;\n    }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(this|next|last|past)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|few|half(?:\\\\s*an?)?)?\\\\s*' +\n    '(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)(?=\\\\s*)' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar MODIFIER_WORD_GROUP = 2;\nvar MULTIPLIER_WORD_GROUP = 3;\nvar RELATIVE_WORD_GROUP = 4;\n\nexports.Parser = function ENRelativeDateFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var modifier = match[MODIFIER_WORD_GROUP].toLowerCase().match(/^next/) ? 1 : -1;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n        result.tags['ENRelativeDateFormatParser'] = true;\n\n        var num = match[MULTIPLIER_WORD_GROUP] === undefined ? '' : match[3].toLowerCase();\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === ''){\n            num = 1;\n        } else if (num.match(/few/i)){\n            num = 3;\n        } else if (num.match(/half/i)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        num *= modifier;\n        var date = moment(ref);\n\n        if (match[MODIFIER_WORD_GROUP].toLowerCase().match(/^this/)) {\n\n            if (match[MULTIPLIER_WORD_GROUP]) {\n                return null;\n            }\n\n            if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {\n                \n                // This week\n                if (match[RELATIVE_WORD_GROUP].match(/week/i)) {\n                    date.add(-date.get('d'), 'd');\n                    result.start.imply('day', date.date());\n                    result.start.imply('month', date.month() + 1);\n                    result.start.imply('year', date.year());\n                } \n                \n                // This month\n                else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {\n                    date.add(-date.date() + 1, 'd');\n                    result.start.imply('day', date.date());\n                    result.start.assign('year', date.year());\n                    result.start.assign('month', date.month() + 1);\n                } \n\n                // This year\n                else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {\n                    date.add(-date.date() + 1, 'd');\n                    date.add(-date.month(), 'month');\n\n                    result.start.imply('day', date.date());\n                    result.start.imply('month', date.month() + 1);\n                    result.start.assign('year', date.year());\n                } \n\n                return result;\n            }\n        }\n        \n        if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {\n\n            if (match[RELATIVE_WORD_GROUP].match(/day/i)) {\n                date.add(num, 'd');\n                result.start.assign('year', date.year());\n                result.start.assign('month', date.month() + 1);\n                result.start.assign('day', date.date());\n            } else if (match[RELATIVE_WORD_GROUP].match(/week/i)) {\n                date.add(num * 7, 'd');\n                // We don't know the exact date for next/last week so we imply\n                // them\n                result.start.imply('day', date.date());\n                result.start.imply('month', date.month() + 1);\n                result.start.imply('year', date.year());\n            } else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {\n                date.add(num, 'month');\n                // We don't know the exact day for next/last month\n                result.start.imply('day', date.date());\n                result.start.assign('year', date.year());\n                result.start.assign('month', date.month() + 1);\n            } else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {\n                date.add(num, 'year');\n                // We don't know the exact day for month on next/last year\n                result.start.imply('day', date.date());\n                result.start.imply('month', date.month() + 1);\n                result.start.assign('year', date.year());\n            }\n\n            return result;\n        }\n\n        if (match[RELATIVE_WORD_GROUP].match(/hour/i)) {\n\n            date.add(num, 'hour');\n            result.start.imply('minute', date.minute());\n            result.start.imply('second', date.second());\n\n        } else if (match[RELATIVE_WORD_GROUP].match(/min/i)) {\n\n            date.add(num, 'minute');\n            result.start.assign('minute', date.minute());\n            result.start.imply('second', date.second());\n\n        } else if (match[RELATIVE_WORD_GROUP].match(/second/i)) {\n\n            date.add(num, 'second');\n            result.start.assign('second', date.second());\n            result.start.assign('minute', date.minute());\n        }\n\n        result.start.assign('hour', date.hour());\n        result.start.assign('year', date.year());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('day', date.date());\n        return result;\n    };\n};\n","/*\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\n    - Tuesday 11/3/2015 \n    - 11/3/2015\n    - 11/3\n\n    By default the paser us \"middle-endien\" format (US English),\n    then fallback to little-endian if failed.\n    - 11/3/2015 = November 3rd, 2015\n    - 23/4/2015 = April 23th, 2015\n\n    If \"littleEndian\" config is set, the parser will try the little-endian first. \n    - 11/3/2015 = March 11th, 2015\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '(?:on\\\\s*?)?' +\n        '((?:sun|mon|tues?|wed(?:nes)?|thu(?:rs?)?|fri|sat(?:ur)?)(?:day)?)' +\n        '\\\\s*\\\\,?\\\\s*' +\n    ')?' +\n    '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n    '(?:' +\n        '[\\\\/\\\\.\\\\-]' +\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n    ')?' +\n    '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = { 'sunday': 0, 'sun': 0, 'monday': 1, 'mon': 1,'tuesday': 2, 'wednesday': 3, 'wed': 3,\n    'thursday': 4, 'thur': 4,'friday': 5, 'fri': 5,'saturday': 6, 'sat': 6,}\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\nvar WEEKDAY_GROUP = 2;\n\n\nvar FIRST_NUMBERS_GROUP = 3;\nvar SECOND_NUMBERS_GROUP = 4;\n\nvar YEAR_GROUP = 5;\n\nexports.Parser = function ENSlashDateFormatParser(config) {\n    Parser.apply(this, arguments);\n    config = config || {};\n    var littleEndian  = config.littleEndian;\n    var MONTH_GROUP = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP;\n    var DAY_GROUP = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP;\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n            // Long skip, if there is some overlapping like:\n            // XX[/YY/ZZ]\n            // [XX/YY/]ZZ\n            match.index += match[0].length\n            return;\n        }\n\n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        if(text.match(/^\\d\\.\\d$/)) return;\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n        // MM/dd -> OK\n        // MM.dd -> NG\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n        var date = null;\n        var year = match[YEAR_GROUP] || moment(ref).year() + '';\n        var month = match[MONTH_GROUP];\n        var day   = match[DAY_GROUP];\n\n        month = parseInt(month);\n        day  = parseInt(day);\n        year = parseInt(year);\n\n        if(month < 1 || month > 12) {\n            if(month > 12) {\n                // dd/mm/yyyy date format if day looks like a month, and month\n                // looks like a day.\n                if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\n                    // unambiguous\n                    var tday = month;\n                    month = day;\n                    day = tday;\n                }\n                else {\n                    // both month and day are <= 12\n                    return null;\n                }\n            }\n        }\n        if(day < 1 || day > 31) return null;\n\n        if(year < 100){\n            if (year > 50) {\n                year = year + 1900;\n            } else {\n                year = year + 2000;\n            }\n        }\n\n        result.start.assign('day', day);\n        result.start.assign('month', month);\n        if (match[YEAR_GROUP]) {\n            result.start.assign('year', year);\n        } else {\n            result.start.imply('year', year);\n        }\n\n        //Day of week\n        if(match[WEEKDAY_GROUP]) {\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n        }\n\n        result.tags['ENSlashDateFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n    Date format with slash \"/\" between numbers like ENSlashDateFormatParser,\n    but this parser expect year before month and date. \n    - YYYY/MM/DD\n    - YYYY-MM-DD\n    - YYYY.MM.DD\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' \n            + '([0-9]{4})[\\\\-\\\\.\\\\/]([0-9]{1,2})[\\\\-\\\\.\\\\/]([0-9]{1,2})'\n            + '(?=\\\\W|$)', 'i');\n\nvar YEAR_NUMBER_GROUP = 2;\nvar MONTH_NUMBER_GROUP = 3;\nvar DATE_NUMBER_GROUP  = 4;\n\nexports.Parser = function ENSlashDateFormatStartWithYearParser(){\n    Parser.apply(this, arguments);\n    \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        })\n        \n        result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));\n        result.start.assign('month', parseInt(match[MONTH_NUMBER_GROUP]));\n        result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));\n\n        if (moment(result.start.get('month')) > 12 || moment(result.start.get('month')) < 1 ||\n            moment(result.start.get('day')) > 31 || moment(result.start.get('day')) < 1) {\n            return null;\n        }\n        \n        result.tags['ENDateFormatParser'] = true;\n        return result;\n    };\n}\n","/*\n    Month/Year date format with slash \"/\" (also \"-\" and \".\") between numbers \n    - 11/05\n    - 06/2005\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(^|[^\\\\d/]\\\\s+|[^\\\\w\\\\s])' +\n    '([0-9]|0[1-9]|1[012])/([0-9]{4})' + \n    '([^\\\\d/]|$)', 'i');\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 4;\n\nvar MONTH_GROUP = 2;\nvar YEAR_GROUP = 3;\n\nexports.Parser = function ENSlashMonthFormatParser(argument) {\n    Parser.apply(this, arguments);\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n        \n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - (1 + match[ENDING_GROUP].length)).trim();\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        var date = null;\n        var year = match[YEAR_GROUP] ;\n        var month = match[MONTH_GROUP];\n        var day   = 1;\n        \n        month = parseInt(month);\n        year = parseInt(year);\n\n        result.start.imply('day', day);\n        result.start.assign('month', month);\n        result.start.assign('year', year);\n\n        result.tags['ENSlashMonthFormatParser'] = true;\n        return result;\n    };\n};\n","var moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('' +\n    '(\\\\W|^)' +\n    '(?:within\\\\s*)?' +\n    '(' + util.TIME_UNIT_PATTERN + ')' +\n    '(?:ago|before|earlier)(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n    '(\\\\W|^)' +\n    '(?:within\\\\s*)?' +\n    '(' + util.TIME_UNIT_STRICT_PATTERN + ')' +\n    'ago(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function ENTimeAgoFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n        var text = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n        index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var fragments = util.extractDateTimeUnitFragments(match[2]);\n        var date = moment(ref);\n\n        for (var key in fragments) {\n            date.add(-fragments[key], key);\n        }\n\n        if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.start.assign('second', date.second());\n            result.tags['ENTimeAgoFormatParser'] = true;\n        } \n        \n        if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {\n            result.start.assign('day', date.date());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('year', date.year());\n        } else {\n            if (fragments['week'] > 0) {\n                result.start.imply('weekday', date.day());\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n        }\n\n        return result;\n    };\n}\n","/*\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\n    \"(?:(?:at|from)\\\\s*)??\" + \n    \"(\\\\d{1,4}|noon|midnight)\" + \n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\:|\\\\：)(\\\\d{2})(?:\\\\.(\\\\d{1,6}))?\" + \n        \")?\" + \n    \")?\" + \n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?|O\\\\W*CLOCK))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" + \n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|to|\\\\?)\\\\s*\" + \n    \"(\\\\d{1,4})\" +\n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})(?:\\\\.(\\\\d{1,6}))?\" + \n        \")?\" + \n    \")?\" + \n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?|O\\\\W*CLOCK))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP    = 2;\nvar MINUTE_GROUP  = 3;\nvar SECOND_GROUP  = 4;\nvar MILLI_SECOND_GROUP  = 5;\nvar AM_PM_HOUR_GROUP = 6;\n\n\nexports.Parser = function ENTimeExpressionParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return FIRST_REG_PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index + match[1].length;\n        result.text  = match[0].substring(match[1].length);\n        result.tags['ENTimeExpressionParser'] = true;\n\n        result.start.imply('day',   refMoment.date());\n        result.start.imply('month', refMoment.month()+1);\n        result.start.imply('year',  refMoment.year());\n        \n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Millisecond\n        if(match[MILLI_SECOND_GROUP] != null){ \n            var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));\n            if(millisecond >= 1000) return null;\n            \n            result.start.assign('millisecond', millisecond);\n        }\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.start.assign('second', second);\n        }\n        \n        // ----- Hours\n        if (match[HOUR_GROUP].toLowerCase() == \"noon\"){\n            meridiem = 1; \n            hour = 12;\n        } else if (match[HOUR_GROUP].toLowerCase() == \"midnight\") {\n            meridiem = 0; \n            hour = 0;\n        } else {\n            hour = parseInt(match[HOUR_GROUP]);\n        }\n        \n        // ----- Minutes\n        if(match[MINUTE_GROUP] != null){ \n            minute = parseInt(match[MINUTE_GROUP]);\n        } else if(hour > 100) { \n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        } \n        \n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n\n        // ----- AM & PM  \n        if(match[AM_PM_HOUR_GROUP] != null) {\n            if(hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if(ampm == \"a\"){\n                meridiem = 0; \n                if(hour == 12) hour = 0;\n            }\n            \n            if(ampm == \"p\"){\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n        } \n\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        } else {\n            if (hour < 12) {\n                result.start.imply('meridiem', 0);\n            } else {\n                result.start.imply('meridiem', 1);\n            }\n        }\n        \n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            // Not accept number only result\n            if (result.text.match(/^\\d+$/)) { \n                return null;\n            }\n            return result;\n        }\n\n\n\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n            return result;\n        }\n\n        if(result.end == null){\n            result.end = new ParsedComponents(null, result.start.date());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Millisecond\n        if(match[MILLI_SECOND_GROUP] != null){ \n            var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));\n            if(millisecond >= 1000) return null;\n            \n            result.end.assign('millisecond', millisecond);\n        }\n        \n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[2]);\n        \n        // ----- Minute\n        if (match[MINUTE_GROUP]!= null) {\n            \n            minute = parseInt(match[MINUTE_GROUP]);\n            if(minute >= 60) return result;\n            \n        } else if (hour > 100) {\n\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n        \n        // ----- AM & PM \n        if (match[AM_PM_HOUR_GROUP] != null){\n\n            if (hour > 12) return null;\n\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if(ampm == \"a\"){\n                meridiem = 0; \n                if(hour == 12) {\n                    hour = 0;\n                    if (!result.end.isCertain('day')) {\n                        result.end.imply('day', result.end.get('day') + 1);\n                    }\n                }\n            }\n            \n            if(ampm == \"p\"){\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n            \n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n                    \n                    result.start.imply('meridiem', 0);\n                    \n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n                    \n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12); \n                    }\n                }\n            }\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        } else {\n            var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n            if (startAtPM && result.start.get('hour') > hour) {\n                // 10pm - 1 (am)\n                result.end.imply('meridiem', 0);\n\n            } else if (hour > 12) {\n                result.end.imply('meridiem', 1);\n            }\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n        \n        return result;\n    }\n}\n","var moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('' +\n    '(\\\\W|^)' +\n    '(' + util.TIME_UNIT_PATTERN + ')' +\n    '(?:later|after|from now|henceforth|forward|out)(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n    '(\\\\W|^)' +\n    '(' + util.TIME_UNIT_STRICT_PATTERN + ')' +\n    '(?:later|from now)(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function ENTimeLaterFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n        var text = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n        index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var fragments = util.extractDateTimeUnitFragments(match[2]);\n        var date = moment(ref);\n        for (var key in fragments) {\n            date.add(fragments[key], key);\n        }\n\n        if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.start.assign('second', date.second());\n            result.tags['ENTimeAgoFormatParser'] = true;\n        } \n        \n        if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {\n            result.start.assign('day', date.date());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('year', date.year());\n        } else {\n            if (fragments['week'] > 0) {\n                result.start.imply('weekday', date.day());\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n        }\n\n        return result;\n    };\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar DAYS_OFFSET = { 'sunday': 0, 'sun': 0, 'monday': 1, 'mon': 1,'tuesday': 2, 'tues':2, 'tue':2, 'wednesday': 3, 'wed': 3,\n    'thursday': 4, 'thurs':4, 'thur': 4, 'thu': 4,'friday': 5, 'fri': 5,'saturday': 6, 'sat': 6};\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:(?:\\\\,|\\\\(|\\\\（)\\\\s*)?' +\n    '(?:on\\\\s*?)?' +\n    '(?:(this|last|past|next)\\\\s*)?' +\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\）))?' +\n    '(?:\\\\s*(this|last|past|next)\\\\s*week)?' +\n    '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\n\nexports.updateParsedComponent = function updateParsedComponent(result, ref, offset, modifier) {\n\n    var startMoment = moment(ref);\n    var startMomentFixed = false;\n    var refOffset = startMoment.day();\n\n    if(modifier == 'last' || modifier == 'past') {\n        startMoment.day(offset - 7);\n        startMomentFixed = true;\n    } else if(modifier == 'next') {\n        startMoment.day(offset + 7);\n        startMomentFixed = true;\n    } else if(modifier == 'this') {\n        startMoment.day(offset);\n    } else {\n        if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n            startMoment.day(offset - 7);\n        } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {\n            startMoment.day(offset + 7);\n        } else {\n            startMoment.day(offset);\n        }\n    }\n\n    result.start.assign('weekday', offset);\n    if (startMomentFixed) {\n        result.start.assign('day', startMoment.date());\n        result.start.assign('month', startMoment.month() + 1);\n        result.start.assign('year', startMoment.year());\n    } else {\n        result.start.imply('day', startMoment.date());\n        result.start.imply('month', startMoment.month() + 1);\n        result.start.imply('year', startMoment.year());\n    }\n\n    return result;\n};\n\n\nexports.Parser = function ENWeekdayParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n        var offset = DAYS_OFFSET[dayOfWeek];\n        if(offset === undefined) {\n            return null;\n        }\n\n        var prefix = match[PREFIX_GROUP];\n        var postfix = match[POSTFIX_GROUP];\n        var norm = prefix || postfix;\n        norm = norm || '';\n        norm = norm.toLowerCase();\n\n        exports.updateParsedComponent(result, ref, offset, norm);\n        result.tags['ENWeekdayParser'] = true;\n\n        return result;\n    }\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\n/*\n  Valid patterns:\n  - esta mañana -> today in the morning\n  - esta tarde -> today in the afternoon/evening\n  - esta noche -> tonight\n  - ayer por la mañana -> yesterday in the morning\n  - ayer por la tarde -> yesterday in the afternoon/evening\n  - ayer por la noche -> yesterday at night\n  - mañana por la mañana -> tomorrow in the morning\n  - mañana por la tarde -> tomorrow in the afternoon/evening\n  - mañana por la noche -> tomorrow at night\n  - anoche -> tomorrow at night\n  - hoy -> today\n  - ayer -> yesterday\n  - mañana -> tomorrow\n */\nvar PATTERN = /(\\W|^)(ahora|esta\\s*(mañana|tarde|noche)|(ayer|mañana)\\s*por\\s*la\\s*(mañana|tarde|noche)|hoy|mañana|ayer|anoche)(?=\\W|$)/i;\n\nexports.Parser = function ESCasualDateParser(){\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n        var lowerText = text.toLowerCase().replace(/\\s+/g, ' ');\n\n        if(lowerText == 'mañana'){\n\n            // Check not \"Tomorrow\" on late night\n            if(refMoment.hour() > 1) {\n                startMoment.add(1, 'day');\n            }\n\n        } else if(lowerText == 'ayer') {\n\n            startMoment.add(-1, 'day');\n        }\n        else if(lowerText == 'anoche') {\n\n            result.start.imply('hour', 0);\n            if (refMoment.hour() > 6) {\n                startMoment.add(-1, 'day');\n            }\n\n        } else if (lowerText.match(\"esta\")) {\n\n            var secondMatch = match[3].toLowerCase();\n            if (secondMatch == \"tarde\") {\n\n                result.start.imply('hour', 18);\n\n            } else if (secondMatch == \"mañana\") {\n\n                result.start.imply('hour', 6);\n\n            } else if (secondMatch == \"noche\") {\n\n              // Normally means this coming midnight\n              result.start.imply('hour', 22);\n              result.start.imply('meridiem', 1);\n\n            }\n        } else if (lowerText.match(/por\\s*la/)) {\n\n            var firstMatch = match[4].toLowerCase();\n            if (firstMatch === 'ayer') {\n\n              startMoment.add(-1, 'day');\n\n            } else if (firstMatch === 'mañana') {\n\n              startMoment.add(1, 'day');\n\n            }\n\n            var secondMatch = match[5].toLowerCase();\n            if (secondMatch == \"tarde\") {\n\n                result.start.imply('hour', 18);\n\n            } else if (secondMatch == \"mañana\") {\n\n                result.start.imply('hour', 9);\n\n            } else if (secondMatch == \"noche\") {\n\n              // Normally means this coming midnight\n              result.start.imply('hour', 22);\n              result.start.imply('meridiem', 1);\n\n            }\n\n        } else if (lowerText.match(\"ahora\")) {\n\n          result.start.imply('hour', refMoment.hour());\n          result.start.imply('minute', refMoment.minute());\n          result.start.imply('second', refMoment.second());\n          result.start.imply('millisecond', refMoment.millisecond());\n\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['ESCasualDateParser'] = true;\n        return result;\n    }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)(dentro\\s*de|en)\\s*([0-9]+|medi[oa]|una?)\\s*(minutos?|horas?|d[ií]as?)\\s*(?=(?:\\W|$))/i;\n\nexports.Parser = function ESDeadlineFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var num = parseInt(match[3]);\n        if (isNaN(num)) {\n          if (match[3].match(/medi/)) {\n            num = 0.5;\n          } else {\n            num = 1;\n          }\n        }\n\n        var date = moment(ref);\n        if (match[4].match(/d[ií]a/)) {\n            date.add(num, 'd');\n\n            result.start.assign('year', date.year());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('day', date.date());\n            return result;\n        }\n\n\n        if (match[4].match(/hora/)) {\n\n            date.add(num, 'hour');\n\n        } else if (match[4].match(/minuto/)) {\n\n            date.add(num, 'minute');\n        }\n\n        result.start.imply('year', date.year());\n        result.start.imply('month', date.month() + 1);\n        result.start.imply('day', date.date());\n        result.start.assign('hour', date.hour());\n        result.start.assign('minute', date.minute());\n        result.tags['ESDeadlineFormatParser'] = true;\n        return result;\n    };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util  = require('../../utils/ES');\n\nvar DAYS_OFFSET = util.WEEKDAY_OFFSET;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n        '(?:(Domingo|Lunes|Martes|Miércoles|Miercoles|Jueves|Viernes|Sábado|Sabado|Dom|Lun|Mar|Mie|Jue|Vie|Sab)\\\\s*,?\\\\s*)?' +\n        '([0-9]{1,2})(?:º|ª|°)?' +\n        '(?:\\\\s*(?:desde|de|\\\\-|\\\\–|al?|hasta|\\\\s)\\\\s*([0-9]{1,2})(?:º|ª|°)?)?\\\\s*(?:de)?\\\\s*' +\n        '(Ene(?:ro|\\\\.)?|Feb(?:rero|\\\\.)?|Mar(?:zo|\\\\.)?|Abr(?:il|\\\\.)?|May(?:o|\\\\.)?|Jun(?:io|\\\\.)?|Jul(?:io|\\\\.)?|Ago(?:sto|\\\\.)?|Sep(?:tiembre|\\\\.)?|Set(?:iembre|\\\\.)?|Oct(?:ubre|\\\\.)?|Nov(?:iembre|\\\\.)?|Dic(?:iembre|\\\\.)?)' +\n        '(?:\\\\s*(?:del?)?(\\\\s*[0-9]{1,4}(?![^\\\\s]\\\\d))(\\\\s*[ad]\\\\.?\\\\s*c\\\\.?|a\\\\.?\\\\s*d\\\\.?)?)?' +\n        '(?=\\\\W|$)', 'i'\n    );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_TO_GROUP = 4;\nvar MONTH_NAME_GROUP = 5;\nvar YEAR_GROUP = 6;\nvar YEAR_BE_GROUP = 7;\n\nexports.Parser = function ESMonthNameLittleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = match[DATE_GROUP];\n        day = parseInt(day);\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            year = parseInt(year);\n\n            if(match[YEAR_BE_GROUP]){\n                if (/a\\.?\\s*c\\.?/i.test(match[YEAR_BE_GROUP])) {\n                    // antes de Cristo\n                    year = -year;\n                }\n            } else if (year < 100){\n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n            refMoment.year(moment(ref).year());\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as '12 - 13 January 2012'\n        if (match[DATE_TO_GROUP]) {\n            result.end = result.start.clone();\n            result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\n        }\n\n        result.tags['ESMonthNameLittleEndianParser'] = true;\n        return result;\n    };\n}\n","/*\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\n    - Martes 3/11/2015\n    - 3/11/2015\n    - 3/11\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '((?:domingo|dom|lunes|lun|martes|mar|mi[ée]rcoles|mie|jueves|jue|viernes|vie|s[áa]bado|sab))' +\n        '\\\\s*\\\\,?\\\\s*' +\n    ')?' +\n    '([0-1]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n    '(?:' +\n        '[\\\\/\\\\.\\\\-]' +\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n    ')?' +\n    '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'lunes': 1, 'lun': 1, 'martes': 2, 'mar': 2, 'miercoles': 3, 'miércoles': 3, 'mie': 3,\n    'jueves': 4, 'jue': 4, 'viernes': 5, 'vier': 5, 'sábado': 6, 'sabado': 6, 'sab': 6,}\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\n// in Spanish we use day/month/year\nvar WEEKDAY_GROUP = 2;\nvar MONTH_GROUP = 4;\nvar DAY_GROUP = 3;\nvar YEAR_GROUP = 5;\n\nexports.Parser = function ESSlashDateFormatParser(argument) {\n    Parser.apply(this, arguments);\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n            // Long skip, if there is some overlapping like:\n            // XX[/YY/ZZ]\n            // [XX/YY/]ZZ\n            match.index += match[0].length\n            return;\n        }\n\n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        if(text.match(/^\\d\\.\\d$/)) return;\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n        // MM/dd -> OK\n        // MM.dd -> NG\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n        var date = null;\n        var year = match[YEAR_GROUP] || moment(ref).year() + '';\n        var month = match[MONTH_GROUP];\n        var day   = match[DAY_GROUP];\n\n        month = parseInt(month);\n        day  = parseInt(day);\n        year = parseInt(year);\n\n        if(month < 1 || month > 12) {\n            if(month > 12) {\n                // dd/mm/yyyy date format if day looks like a month, and month\n                // looks like a day.\n                if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\n                    // unambiguous\n                    var tday = month;\n                    month = day;\n                    day = tday;\n                }\n                else {\n                    // both month and day are <= 12\n                    return null;\n                }\n            }\n        }\n        if(day < 1 || day > 31) return null;\n\n        if(year < 100){\n            if(year > 50){\n                year = year + 1900;\n            }else{\n                year = year + 2000;\n            }\n        }\n\n        result.start.assign('day', day);\n        result.start.assign('month', month);\n        result.start.assign('year', year);\n\n        //Day of week\n        if(match[WEEKDAY_GROUP]) {\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n        }\n\n        result.tags['ESSlashDateFormatParser'] = true;\n        return result;\n    };\n};","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)hace\\s*([0-9]+|medi[oa]|una?)\\s*(minutos?|horas?|semanas?|d[ií]as?|mes(es)?|años?)(?=(?:\\W|$))/i;\n\nexports.Parser = function ESTimeAgoFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    }\n\n    this.extract = function(text, ref, match, opt){\n\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n        var text = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n        index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var num = parseInt(match[2]);\n        if (isNaN(num)) {\n          if (match[2].match(/medi/)) {\n            num = 0.5;\n          } else {\n            num = 1;\n          }\n        }\n\n        var date = moment(ref);\n\n        if (match[3].match(/hora/) || match[3].match(/minuto/)) {\n            if (match[3].match(/hora/)) {\n\n                date.add(-num, 'hour');\n\n            } else if (match[3].match(/minuto/)) {\n\n                date.add(-num, 'minute');\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.tags['ESTimeAgoFormatParser'] = true;\n            return result;\n        }\n\n        if (match[3].match(/semana/)) {\n            date.add(-num, 'week');\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.imply('weekday', date.day());\n            return result;\n        }\n\n        if (match[3].match(/d[ií]a/)) {\n            date.add(-num, 'd');\n        }\n\n        if (match[3].match(/mes/)) {\n            date.add(-num, 'month');\n        }\n\n        if (match[3].match(/año/)) {\n\n            date.add(-num, 'year');\n        }\n\n        result.start.assign('day', date.date());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('year', date.year());\n        return result;\n\n    };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\n    \"(?:(?:a las?|al?|desde|de)\\\\s*)?\" +\n    \"(\\\\d{1,4}|mediod[ií]a|medianoche)\" +\n    \"(?:\" +\n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" +\n        \"(?:\" +\n            \"(?:\\\\:|\\\\：)(\\\\d{2})\" +\n        \")?\" +\n    \")?\" +\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n    \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" +\n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|a(?:\\s*las)?|\\\\?)\\\\s*\" +\n    \"(\\\\d{1,4})\" +\n    \"(?:\" +\n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" +\n        \"(?:\" +\n            \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" +\n        \")?\" +\n    \")?\" +\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n    \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP    = 2;\nvar MINUTE_GROUP  = 3;\nvar SECOND_GROUP  = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\nexports.Parser = function ESTimeExpressionParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return FIRST_REG_PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index + match[1].length;\n        result.text  = match[0].substring(match[1].length);\n        result.tags['ESTimeExpressionParser'] = true;\n\n        result.start.imply('day',   refMoment.date());\n        result.start.imply('month', refMoment.month()+1);\n        result.start.imply('year',  refMoment.year());\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){\n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.start.assign('second', second);\n        }\n\n        // ----- Hours\n        if (match[HOUR_GROUP].toLowerCase().match(/mediod/)){\n            meridiem = 1;\n            hour = 12;\n        } else if (match[HOUR_GROUP].toLowerCase() == \"medianoche\") {\n            meridiem = 0;\n            hour = 0;\n        } else {\n            hour = parseInt(match[HOUR_GROUP]);\n        }\n\n        // ----- Minutes\n        if(match[MINUTE_GROUP] != null){\n            minute = parseInt(match[MINUTE_GROUP]);\n        } else if(hour > 100) {\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if(match[AM_PM_HOUR_GROUP] != null) {\n            if(hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if(ampm == \"a\"){\n                meridiem = 0;\n                if(hour == 12) hour = 0;\n            }\n\n            if(ampm == \"p\"){\n                meridiem = 1;\n                if(hour != 12) hour += 12;\n            }\n        }\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        }\n\n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            // Not accept number only result\n            if (result.text.match(/^\\d+$/)) {\n                return null;\n            }\n            return result;\n        }\n\n\n\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n            return result;\n        }\n\n        if(result.end == null){\n            result.end = new ParsedComponents(null, result.start.date());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){\n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[2]);\n\n        // ----- Minute\n        if (match[MINUTE_GROUP]!= null) {\n\n            minute = parseInt(match[MINUTE_GROUP]);\n            if(minute >= 60) return result;\n\n        } else if (hour > 100) {\n\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if (match[AM_PM_HOUR_GROUP] != null){\n\n            if (hour > 12) return null;\n\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"a\"){\n                meridiem = 0;\n                if(hour == 12) {\n                    hour = 0;\n                    if (!result.end.isCertain('day')) {\n                        result.end.imply('day', result.end.get('day') + 1);\n                    }\n                }\n            }\n\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"p\"){\n                meridiem = 1;\n                if(hour != 12) hour += 12;\n            }\n\n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n\n                    result.start.imply('meridiem', 0);\n\n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n\n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12);\n                    }\n                }\n            }\n\n        } else if(hour >= 12) {\n            meridiem = 1;\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n\n        return result;\n    }\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar updateParsedComponent = require('../EN/ENWeekdayParser').updateParsedComponent;\n\nvar DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'lunes': 1, 'lun': 1, 'martes': 2, 'mar':2, 'miercoles': 3, 'miércoles': 3, 'mie': 3,\n    'jueves': 4, 'jue': 4, 'viernes': 5, 'vier': 5, 'sabado': 6, 'sábado': 6, 'sab': 6,}\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:(?:\\\\,|\\\\(|\\\\（)\\\\s*)?' +\n    '(?:(este|pasado|pr[oó]ximo)\\\\s*)?' +\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\）))?' +\n    '(?:\\\\s*(este|pasado|pr[óo]ximo)\\\\s*week)?' +\n    '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\nexports.Parser = function ESWeekdayParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n        var offset = DAYS_OFFSET[dayOfWeek];\n        if(offset === undefined) return null;\n\n        var modifier = null;\n        var prefix = match[PREFIX_GROUP];\n        var postfix = match[POSTFIX_GROUP];\n        if (prefix || postfix) {\n            var norm = prefix || postfix;\n            norm = norm.toLowerCase();\n\n            if(norm == 'pasado') {\n                modifier = 'this';\n            }\n            else if(norm == 'próximo' || norm == 'proximo') {\n                modifier = 'next';\n            }\n            else if(norm== 'este') {\n                modifier =  'this';\n            }\n        }\n\n        updateParsedComponent(result, ref, offset, modifier);\n        result.tags['ESWeekdayParser'] = true;\n        return result;\n    }\n}\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = /(\\W|^)(maintenant|aujourd'hui|ajd|cette\\s*nuit|la\\s*veille|(demain|hier)(\\s*(matin|soir|aprem|après-midi))?|ce\\s*(matin|soir)|cet\\s*(après-midi|aprem))(?=\\W|$)/i;\r\n\r\nexports.Parser = function FRCasualDateParser(){\r\n\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return PATTERN; }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        var text = match[0].substr(match[1].length);\r\n        var index = match.index + match[1].length;\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref,\r\n        });\r\n\r\n        var refMoment = moment(ref);\r\n        var startMoment = refMoment.clone();\r\n        var lowerText = text.toLowerCase();\r\n\r\n        if(lowerText.match(/demain/)){\r\n            // Check not \"Tomorrow\" on late night\r\n            if(refMoment.hour() > 1) {\r\n                startMoment.add(1, 'day');\r\n            }\r\n        } \r\n\r\n        if(lowerText.match(/hier/)) {\r\n            startMoment.add(-1, 'day');\r\n        }\r\n\r\n        if(lowerText.match(/cette\\s*nuit/)){\r\n            // Normally means this coming midnight\r\n            result.start.imply('hour', 22);\r\n            result.start.imply('meridiem', 1);\r\n\r\n        } else if(lowerText.match(/la\\s*veille/)) {\r\n\r\n            result.start.imply('hour', 0);\r\n            if (refMoment.hour() > 6) {\r\n                startMoment.add(-1, 'day');\r\n            }\r\n\r\n        } else if (lowerText.match(/(après-midi|aprem)/)) {\r\n\r\n            result.start.imply('hour', 14);\r\n\r\n        } else if (lowerText.match(/(soir)/)) {\r\n\r\n            result.start.imply('hour', 18);\r\n\r\n        } else if (lowerText.match(/matin/)) {\r\n\r\n            result.start.imply('hour', 8);\r\n\r\n        }  else if (lowerText.match(\"maintenant\")) {\r\n\r\n          result.start.imply('hour', refMoment.hour());\r\n          result.start.imply('minute', refMoment.minute());\r\n          result.start.imply('second', refMoment.second());\r\n          result.start.imply('millisecond', refMoment.millisecond());\r\n\r\n        }\r\n\r\n        result.start.assign('day', startMoment.date())\r\n        result.start.assign('month', startMoment.month() + 1)\r\n        result.start.assign('year', startMoment.year())\r\n        result.tags['FRCasualDateParser'] = true;\r\n        return result;\r\n    }\r\n}\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar util  = require('../../utils/FR');\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n    '(dans|en)\\\\s*' +\r\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|une?|(?:\\\\s*quelques)?|demi(?:\\\\s*|-?)?)\\\\s*' +\r\n    '(secondes?|min(?:ute)?s?|heures?|jours?|semaines?|mois|années?)\\\\s*' +\r\n    '(?=\\\\W|$)', 'i'\r\n);\r\n\r\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\r\n    '(dans|en)\\\\s*' +\r\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|un?)\\\\s*' +\r\n    '(secondes?|minutes?|heures?|jours?)\\\\s*' +\r\n    '(?=\\\\W|$)', 'i'\r\n);\r\n\r\nexports.Parser = function FRDeadlineFormatParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() {\r\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\r\n    };\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        var index = match.index + match[1].length;\r\n        var text  = match[0];\r\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref\r\n        });\r\n\r\n        var num = match[3];\r\n        if (util.INTEGER_WORDS[num] !== undefined) {\r\n            num = util.INTEGER_WORDS[num];\r\n        } else if (num === 'un' || num === 'une'){\r\n            num = 1;\r\n        } else if (num.match(/quelques?/i)){\r\n            num = 3;\r\n        } else if (num.match(/demi-?/i)) {\r\n            num = 0.5;\r\n        } else {\r\n            num = parseInt(num);\r\n        }\r\n\r\n        var date = moment(ref);\r\n        if (match[4].match(/jour|semaine|mois|année/i)) {\r\n\r\n            if (match[4].match(/jour/)) {\r\n                date.add(num, 'd');\r\n            } else if (match[4].match(/semaine/i)) {\r\n                date.add(num * 7, 'd');\r\n            } else if (match[4].match(/mois/i)) {\r\n                date.add(num, 'month');\r\n            } else if (match[4].match(/année/i)) {\r\n                date.add(num, 'year');\r\n            }\r\n\r\n            result.start.assign('year', date.year());\r\n            result.start.assign('month', date.month() + 1);\r\n            result.start.assign('day', date.date());\r\n            return result;\r\n        }\r\n\r\n        if (match[4].match(/heure/i)) {\r\n\r\n            date.add(num, 'hour');\r\n\r\n        } else if (match[4].match(/min/i)) {\r\n\r\n            date.add(num, 'minutes');\r\n\r\n        } else if (match[4].match(/secondes/i)) {\r\n\r\n            date.add(num, 'second');\r\n        }\r\n\r\n        result.start.imply('year', date.year());\r\n        result.start.imply('month', date.month() + 1);\r\n        result.start.imply('day', date.date());\r\n        result.start.assign('hour', date.hour());\r\n        result.start.assign('minute', date.minute());\r\n        result.start.assign('second', date.second());\r\n        result.tags['FRDeadlineFormatParser'] = true;\r\n        return result;\r\n    };\r\n};\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\n\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar util  = require('../../utils/FR');\r\n\r\nvar DAYS_OFFSET = util.WEEKDAY_OFFSET;\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n        '(?:(Dimanche|Lundi|Mardi|mercredi|Jeudi|Vendredi|Samedi|Dim|Lun|Mar|Mer|Jeu|Ven|Sam)\\\\s*,?\\\\s*)?' +\r\n        '([0-9]{1,2}|1er)' +\r\n        '(?:\\\\s*(?:au|\\\\-|\\\\–|jusqu\\'au?|\\\\s)\\\\s*([0-9]{1,2})(?:er)?)?\\\\s*(?:de)?\\\\s*' +\r\n        '(Jan(?:vier|\\\\.)?|F[ée]v(?:rier|\\\\.)?|Mars|Avr(?:il|\\\\.)?|Mai|Juin|Juil(?:let|\\\\.)?|Ao[uû]t|Sept(?:embre|\\\\.)?|Oct(?:obre|\\\\.)?|Nov(?:embre|\\\\.)?|d[ée]c(?:embre|\\\\.)?)' +\r\n        '(?:\\\\s*(\\\\s*[0-9]{1,4}(?![^\\\\s]\\\\d))(?:\\\\s*(AC|[ap]\\\\.?\\\\s*c(?:h(?:r)?)?\\\\.?\\\\s*n\\\\.?))?)?' +\r\n        '(?=\\\\W|$)', 'i'\r\n    );\r\n\r\nvar WEEKDAY_GROUP = 2;\r\nvar DATE_GROUP = 3;\r\nvar DATE_TO_GROUP = 4;\r\nvar MONTH_NAME_GROUP = 5;\r\nvar YEAR_GROUP = 6;\r\nvar YEAR_BE_GROUP = 7;\r\n\r\nexports.Parser = function FRMonthNameLittleEndianParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return PATTERN; }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        var result = new ParsedResult({\r\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\r\n            index: match.index + match[1].length,\r\n            ref: ref,\r\n        });\r\n\r\n        var month = match[MONTH_NAME_GROUP];\r\n        month = util.MONTH_OFFSET[month.toLowerCase()];\r\n\r\n        var day = match[DATE_GROUP];\r\n        day = parseInt(day);\r\n\r\n        var year = null;\r\n        if (match[YEAR_GROUP]) {\r\n            year = match[YEAR_GROUP];\r\n            year = parseInt(year);\r\n\r\n            if(match[YEAR_BE_GROUP]){\r\n                if (/a/i.test(match[YEAR_BE_GROUP])) {\r\n                    // Ante Christe natum\r\n                    year = -year;\r\n                }\r\n            } else if (year < 100){\r\n\r\n                year = year + 2000;\r\n            }\r\n        }\r\n\r\n        if(year){\r\n            result.start.assign('day', day);\r\n            result.start.assign('month', month);\r\n            result.start.assign('year', year);\r\n        } else {\r\n\r\n            // Find the most appropriated year\r\n            var refMoment = moment(ref);\r\n            refMoment.month(month - 1);\r\n            refMoment.date(day);\r\n            refMoment.year(moment(ref).year());\r\n\r\n            var nextYear = refMoment.clone().add(1, 'y');\r\n            var lastYear = refMoment.clone().add(-1, 'y');\r\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n                refMoment = nextYear;\r\n            }\r\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n                refMoment = lastYear;\r\n            }\r\n\r\n            result.start.assign('day', day);\r\n            result.start.assign('month', month);\r\n            result.start.imply('year', refMoment.year());\r\n        }\r\n\r\n        // Weekday component\r\n        if (match[WEEKDAY_GROUP]) {\r\n            var weekday = match[WEEKDAY_GROUP];\r\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\r\n            result.start.assign('weekday', weekday);\r\n        }\r\n\r\n        // Text can be 'range' value. Such as '12 - 13 janvier 2012'\r\n        if (match[DATE_TO_GROUP]) {\r\n            result.end = result.start.clone();\r\n            result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\r\n        }\r\n\r\n        result.tags['FRMonthNameLittleEndianParser'] = true;\r\n        return result;\r\n    };\r\n}\r\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/FR');\n\n// Force load fr localization data from moment for the locale files to be linkded durning browserify.\n// NOTE: The function moment.defineLocale() also has a side effect that it change global locale\n//  We also need to save and restore the previous locale (see. moment.js, loadLocale)\nvar originalLocale = moment.locale();\nrequire('moment/locale/fr');\nmoment.locale(originalLocale);\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:les?|la|l\\'|du|des?)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|\\\\d+)?\\\\s*' +\n    '(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?)?\\\\s*' +\n    '(secondes?|min(?:ute)?s?|heures?|jours?|semaines?|mois|trimestres?|années?)\\\\s*' +\n    '(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?)?' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar MULTIPLIER_GROUP = 2;\nvar MODIFIER_1_GROUP = 3;\nvar RELATIVE_WORD_GROUP = 4;\nvar MODIFIER_2_GROUP = 5;\n\nexports.Parser = function FRRelativeDateFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        // Multiplier\n        var multiplier = match[MULTIPLIER_GROUP] === undefined ? '1' : match[MULTIPLIER_GROUP];\n        if (util.INTEGER_WORDS[multiplier] !== undefined) {\n            multiplier = util.INTEGER_WORDS[multiplier];\n        } else {\n            multiplier = parseInt(multiplier);\n        }\n\n        // Modifier\n        var modifier = match[MODIFIER_1_GROUP] === undefined ?\n                    (match[MODIFIER_2_GROUP] === undefined ? '' : match[MODIFIER_2_GROUP].toLowerCase())\n                     : match[MODIFIER_1_GROUP].toLowerCase();\n        if(!modifier) {\n            // At least one modifier is mandatory to match this parser\n            return;\n        }\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n        result.tags['FRRelativeDateFormatParser'] = true;\n\n        var modifierFactor;\n        switch(true) {\n            case /prochaine?s?/.test(modifier):\n            case /suivants?/.test(modifier):\n                modifierFactor = 1;\n                break;\n            case /derni[eè]re?s?/.test(modifier):\n            case /pass[ée]e?s?/.test(modifier):\n            case /pr[ée]c[ée]dents?/.test(modifier):\n                modifierFactor = -1;\n                break;\n        }\n\n        var total = multiplier * modifierFactor;\n\n        var dateFrom = moment(ref),\n            dateTo = moment(ref);\n        dateFrom.locale('fr');\n        dateTo.locale('fr');\n        var relative = match[RELATIVE_WORD_GROUP];\n        var startOf;\n        switch(true) {\n            case /secondes?/.test(relative):\n                dateFrom.add(total, 's');\n                dateTo.add(modifierFactor, 's');\n                startOf = 'second';\n                break;\n            case /min(?:ute)?s?/.test(relative):\n                dateFrom.add(total, 'm');\n                dateTo.add(modifierFactor, 'm');\n                startOf = 'minute';\n                break;\n            case /heures?/.test(relative):\n                dateFrom.add(total, 'h');\n                dateTo.add(modifierFactor, 'h');\n                startOf = 'hour';\n                break;\n            case /jours?/.test(relative):\n                dateFrom.add(total, 'd');\n                dateTo.add(modifierFactor, 'd');\n                startOf = 'day';\n                break;\n            case /semaines?/.test(relative):\n                dateFrom.add(total, 'w');\n                dateTo.add(modifierFactor, 'w');\n                startOf = 'week';\n                break;\n            case /mois?/.test(relative):\n                dateFrom.add(total, 'M');\n                dateTo.add(modifierFactor, 'M');\n                startOf = 'month';\n                break;\n            case /trimestres?/.test(relative):\n                dateFrom.add(total, 'Q');\n                dateTo.add(modifierFactor, 'Q');\n                startOf = 'quarter';\n                break;\n            case /années?/.test(relative):\n                dateFrom.add(total, 'y');\n                dateTo.add(modifierFactor, 'y');\n                startOf = 'year';\n                break;\n        }\n\n        // if we go forward, switch the start and end dates\n        if(modifierFactor > 0) {\n            var dateTmp = dateFrom;\n            dateFrom = dateTo;\n            dateTo = dateTmp;\n        }\n\n        // Get start and end of dates\n        dateFrom.startOf(startOf);\n        dateTo.endOf(startOf);\n\n        // Assign results\n        result.start.assign('year', dateFrom.year());\n        result.start.assign('month', dateFrom.month() + 1);\n        result.start.assign('day', dateFrom.date());\n        result.start.assign('minute', dateFrom.minute());\n        result.start.assign('second', dateFrom.second());\n        result.start.assign('hour', dateFrom.hour());\n        result.start.assign('millisecond', dateFrom.millisecond());\n\n        result.end = result.start.clone();\n        result.end.assign('year', dateTo.year());\n        result.end.assign('month', dateTo.month() + 1);\n        result.end.assign('day', dateTo.date());\n        result.end.assign('minute', dateTo.minute());\n        result.end.assign('second', dateTo.second());\n        result.end.assign('hour', dateTo.hour());\n        result.end.assign('millisecond', dateTo.millisecond());\n        return result;\n    };\n};\n","/*\r\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\r\n    - Martes 3/11/2015\r\n    - 3/11/2015\r\n    - 3/11\r\n*/\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n    '(?:' +\r\n        '((?:dimanche|dim|lundi|lun|mardi|mar|mercredi|mer|jeudi|jeu|vendredi|ven|samedi|sam|le))' +\r\n        '\\\\s*\\\\,?\\\\s*' +\r\n    ')?' +\r\n    '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\r\n    '(?:' +\r\n        '[\\\\/\\\\.\\\\-]' +\r\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\r\n    ')?' +\r\n    '(\\\\W|$)', 'i');\r\n\r\nvar DAYS_OFFSET = { 'dimanche': 0, 'dim': 0, 'lundi': 1, 'lun': 1,'mardi': 2, 'mar':2, 'mercredi': 3, 'mer': 3,\r\n    'jeudi': 4, 'jeu':4, 'vendredi': 5, 'ven': 5,'samedi': 6, 'sam': 6};\r\n\r\n\r\nvar OPENNING_GROUP = 1;\r\nvar ENDING_GROUP = 6;\r\n\r\n// In French we use day/month/year\r\nvar WEEKDAY_GROUP = 2;\r\nvar DAY_GROUP = 3;\r\nvar MONTH_GROUP = 4;\r\nvar YEAR_GROUP = 5;\r\nvar YEAR_BE_GROUP = 6;\r\n\r\nexports.Parser = function FRSlashDateFormatParser(argument) {\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function () { return PATTERN; };\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\r\n            // Long skip, if there is some overlapping like:\r\n            // XX[/YY/ZZ]\r\n            // [XX/YY/]ZZ\r\n            match.index += match[0].length\r\n            return;\r\n        }\r\n\r\n        var index = match.index + match[OPENNING_GROUP].length;\r\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\r\n\r\n\r\n        var result = new ParsedResult({\r\n            text: text,\r\n            index: index,\r\n            ref: ref,\r\n        });\r\n\r\n        if(text.match(/^\\d\\.\\d$/)) return;\r\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\r\n\r\n        // MM/dd -> OK\r\n        // MM.dd -> NG\r\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\r\n\r\n        var date = null;\r\n        var month = match[MONTH_GROUP];\r\n        var day   = match[DAY_GROUP];\r\n\r\n        day  = parseInt(day);\r\n        month = parseInt(month);\r\n\r\n        var year = null;\r\n        if (match[YEAR_GROUP]) {\r\n            year = match[YEAR_GROUP];\r\n            year = parseInt(year);\r\n\r\n            if(match[YEAR_BE_GROUP]){\r\n                if (/a/i.test(match[YEAR_BE_GROUP])) {\r\n                    // Ante Christe natum\r\n                    year = -year;\r\n                }\r\n            } else if (year < 100){\r\n\r\n                year = year + 2000;\r\n            }\r\n        }\r\n\r\n        if(month < 1 || month > 12) {\r\n            if(month > 12) {\r\n                // dd/mm/yyyy date format if day looks like a month, and month looks like a day.\r\n                if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\r\n                    // unambiguous\r\n                    var tday = month;\r\n                    month = day;\r\n                    day = tday;\r\n                }\r\n                else {\r\n                    // both month and day are <= 12\r\n                    return null;\r\n                }\r\n            }\r\n        }\r\n\r\n        if(day < 1 || day > 31) return null;\r\n\r\n        if(year){\r\n            result.start.assign('day', day);\r\n            result.start.assign('month', month);\r\n            result.start.assign('year', year);\r\n        } else {\r\n\r\n            // Find the most appropriated year\r\n            var refMoment = moment(ref);\r\n            refMoment.month(month - 1);\r\n            refMoment.date(day);\r\n            refMoment.year(moment(ref).year());\r\n\r\n            var nextYear = refMoment.clone().add(1, 'y');\r\n            var lastYear = refMoment.clone().add(-1, 'y');\r\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n                refMoment = nextYear;\r\n            }\r\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n                refMoment = lastYear;\r\n            }\r\n\r\n            result.start.assign('day', day);\r\n            result.start.assign('month', month);\r\n            result.start.imply('year', refMoment.year());\r\n        }\r\n\r\n        // Day of week\r\n        if(match[WEEKDAY_GROUP]) {\r\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\r\n        }\r\n\r\n        result.tags['FRSlashDateFormatParser'] = true;\r\n        return result;\r\n    };\r\n};","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = /(\\W|^)il y a\\s*([0-9]+|une?)\\s*(minutes?|heures?|semaines?|jours?|mois|années?|ans?)(?=(?:\\W|$))/i;\r\n\r\nexports.Parser = function FRTimeAgoFormatParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() {\r\n        return PATTERN;\r\n    }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\r\n\r\n        var text = match[0];\r\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n        index = match.index + match[1].length;\r\n\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref,\r\n        });\r\n        result.tags['FRTimeAgoFormatParser'] = true;\r\n        \r\n        var num = parseInt(match[2]);\r\n        if (isNaN(num)) {\r\n          if (match[2].match(/demi/)) {\r\n            num = 0.5;\r\n          } else {\r\n            num = 1;\r\n          }\r\n        }\r\n\r\n        var date = moment(ref);\r\n\r\n        if (match[3].match(/heure/) || match[3].match(/minute/)) {\r\n            if (match[3].match(/heure/)) {\r\n\r\n                date.add(-num, 'hour');\r\n\r\n            } else if (match[3].match(/minute/)) {\r\n\r\n                date.add(-num, 'minute');\r\n            }\r\n\r\n            result.start.imply('day', date.date());\r\n            result.start.imply('month', date.month() + 1);\r\n            result.start.imply('year', date.year());\r\n            result.start.assign('hour', date.hour());\r\n            result.start.assign('minute', date.minute());\r\n\r\n            return result;\r\n        }\r\n\r\n        if (match[3].match(/semaine/)) {\r\n            date.add(-num, 'week');\r\n\r\n            result.start.imply('day', date.date());\r\n            result.start.imply('month', date.month() + 1);\r\n            result.start.imply('year', date.year());\r\n            result.start.imply('weekday', date.day());\r\n            return result;\r\n        }\r\n\r\n        if (match[3].match(/jour/)) {\r\n            date.add(-num, 'd');\r\n        }\r\n\r\n        if (match[3].match(/mois/)) {\r\n            date.add(-num, 'month');\r\n        }\r\n\r\n        if (match[3].match(/années?|ans?/)) {\r\n\r\n            date.add(-num, 'year');\r\n        }\r\n\r\n        result.start.assign('day', date.date());\r\n        result.start.assign('month', date.month() + 1);\r\n        result.start.assign('year', date.year());\r\n        return result;\r\n\r\n    };\r\n}\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar ParsedComponents = require('../../result').ParsedComponents;\r\n\r\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\r\n    \"(?:(?:[àa])\\\\s*)?\" +\r\n    \"(\\\\d{1,2}(?:h)?|midi|minuit)\" +\r\n    \"(?:\" +\r\n        \"(?:\\\\.|\\\\:|\\\\：|h)(\\\\d{1,2})(?:m)?\" +\r\n        \"(?:\" +\r\n            \"(?:\\\\:|\\\\：|m)(\\\\d{0,2})(?:s)?\" +\r\n        \")?\" +\r\n    \")?\" +\r\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\r\n    \"(?=\\\\W|$)\", 'i');\r\n\r\n\r\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" +\r\n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|[àa]|\\\\?)\\\\s*\" +\r\n    \"(\\\\d{1,2}(?:h)?)\" +\r\n    \"(?:\" +\r\n        \"(?:\\\\.|\\\\:|\\\\：|h)(\\\\d{1,2})(?:m)?\" +\r\n        \"(?:\" +\r\n            \"(?:\\\\.|\\\\:|\\\\：|m)(\\\\d{1,2})(?:s)?\" +\r\n        \")?\" +\r\n    \")?\" +\r\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\r\n    \"(?=\\\\W|$)\", 'i');\r\n\r\nvar HOUR_GROUP    = 2;\r\nvar MINUTE_GROUP  = 3;\r\nvar SECOND_GROUP  = 4;\r\nvar AM_PM_HOUR_GROUP = 5;\r\n\r\nexports.Parser = function FRTimeExpressionParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return FIRST_REG_PATTERN; }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\r\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\r\n        var refMoment = moment(ref);\r\n        var result = new ParsedResult();\r\n        result.ref = ref;\r\n        result.index = match.index + match[1].length;\r\n        result.text  = match[0].substring(match[1].length);\r\n        result.tags['FRTimeExpressionParser'] = true;\r\n\r\n        result.start.imply('day',   refMoment.date());\r\n        result.start.imply('month', refMoment.month()+1);\r\n        result.start.imply('year',  refMoment.year());\r\n\r\n        var hour = 0;\r\n        var minute = 0;\r\n        var meridiem = -1;\r\n\r\n        // ----- Second\r\n        if(match[SECOND_GROUP] != null){\r\n            var second = parseInt(match[SECOND_GROUP]);\r\n            if(second >= 60) return null;\r\n\r\n            result.start.assign('second', second);\r\n        }\r\n\r\n        // ----- Hours\r\n        if (match[HOUR_GROUP].toLowerCase() == \"midi\"){\r\n            meridiem = 1;\r\n            hour = 12;\r\n        } else if (match[HOUR_GROUP].toLowerCase() == \"minuit\") {\r\n            meridiem = 0;\r\n            hour = 0;\r\n        } else {\r\n            hour = parseInt(match[HOUR_GROUP]);\r\n        }\r\n\r\n        // ----- Minutes\r\n        if(match[MINUTE_GROUP] != null){\r\n            minute = parseInt(match[MINUTE_GROUP]);\r\n        } else if(hour > 100) {\r\n            minute = hour%100;\r\n            hour   = parseInt(hour/100);\r\n        }\r\n\r\n        if(minute >= 60) {\r\n            return null;\r\n        }\r\n\r\n        if(hour > 24) {\r\n            return null;\r\n        }\r\n        if (hour >= 12) {\r\n            meridiem = 1;\r\n        }\r\n\r\n        // ----- AM & PM\r\n        if(match[AM_PM_HOUR_GROUP] != null) {\r\n            if(hour > 12) return null;\r\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\r\n            if(ampm == \"a\"){\r\n                meridiem = 0;\r\n                if(hour == 12) hour = 0;\r\n            }\r\n\r\n            if(ampm == \"p\"){\r\n                meridiem = 1;\r\n                if(hour != 12) hour += 12;\r\n            }\r\n        }\r\n        result.start.assign('hour', hour);\r\n        result.start.assign('minute', minute);\r\n        if (meridiem >= 0) {\r\n            result.start.assign('meridiem', meridiem);\r\n        }\r\n\r\n        // ==============================================================\r\n        //                  Extracting the 'to' chunk\r\n        // ==============================================================\r\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\r\n        if (!match) {\r\n            // Not accept number only result\r\n            if (result.text.match(/^\\d+$/)) {\r\n                return null;\r\n            }\r\n            return result;\r\n        }\r\n\r\n\r\n\r\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\r\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\r\n            return result;\r\n        }\r\n\r\n        if(result.end == null){\r\n            result.end = new ParsedComponents(null, result.start.date());\r\n        }\r\n\r\n        var hour = 0;\r\n        var minute = 0;\r\n        var meridiem = -1;\r\n\r\n        // ----- Second\r\n        if(match[SECOND_GROUP] != null){\r\n            var second = parseInt(match[SECOND_GROUP]);\r\n            if(second >= 60) return null;\r\n\r\n            result.end.assign('second', second);\r\n        }\r\n\r\n        hour = parseInt(match[2]);\r\n\r\n        // ----- Minute\r\n        if (match[MINUTE_GROUP]!= null) {\r\n\r\n            minute = parseInt(match[MINUTE_GROUP]);\r\n            if(minute >= 60) return result;\r\n\r\n        } else if (hour > 100) {\r\n\r\n            minute = hour%100;\r\n            hour   = parseInt(hour/100);\r\n        }\r\n\r\n        if(minute >= 60) {\r\n            return null;\r\n        }\r\n\r\n        if(hour > 24) {\r\n            return null;\r\n        }\r\n        if (hour >= 12) {\r\n            meridiem = 1;\r\n        }\r\n\r\n        // ----- AM & PM\r\n        if (match[AM_PM_HOUR_GROUP] != null){\r\n\r\n            if (hour > 12) return null;\r\n\r\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"a\"){\r\n                meridiem = 0;\r\n                if(hour == 12) {\r\n                    hour = 0;\r\n                    if (!result.end.isCertain('day')) {\r\n                        result.end.imply('day', result.end.get('day') + 1);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"p\"){\r\n                meridiem = 1;\r\n                if(hour != 12) hour += 12;\r\n            }\r\n\r\n            if (!result.start.isCertain('meridiem')) {\r\n                if (meridiem == 0) {\r\n\r\n                    result.start.imply('meridiem', 0);\r\n\r\n                    if (result.start.get('hour') == 12) {\r\n                        result.start.assign('hour', 0);\r\n                    }\r\n\r\n                } else {\r\n\r\n                    result.start.imply('meridiem', 1);\r\n\r\n                    if (result.start.get('hour') != 12) {\r\n                        result.start.assign('hour', result.start.get('hour') + 12);\r\n                    }\r\n                }\r\n            }\r\n\r\n        } else if(hour >= 12) {\r\n            meridiem = 1;\r\n        }\r\n\r\n        result.text = result.text + match[0];\r\n        result.end.assign('hour', hour);\r\n        result.end.assign('minute', minute);\r\n        if (meridiem >= 0) {\r\n            result.end.assign('meridiem', meridiem);\r\n        }\r\n\r\n        if (result.end.date().getTime() < result.start.date().getTime()) {\r\n            result.end.imply('day', result.end.get('day') + 1)\r\n        }\r\n\r\n        return result;\r\n    }\r\n}\r\n","/*\r\n\r\n\r\n*/\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar updateParsedComponent = require('../EN/ENWeekdayParser').updateParsedComponent;\r\n\r\nvar DAYS_OFFSET = { 'dimanche': 0, 'dim': 0, 'lundi': 1, 'lun': 1,'mardi': 2, 'mar':2, 'mercredi': 3, 'mer': 3,\r\n    'jeudi': 4, 'jeu':4, 'vendredi': 5, 'ven': 5,'samedi': 6, 'sam': 6};\r\n\r\nvar PATTERN = new RegExp('(\\\\s|^)' +\r\n    '(?:(?:\\\\,|\\\\(|\\\\（)\\\\s*)?' +\r\n    '(?:(ce)\\\\s*)?' +\r\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\r\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\）))?' +\r\n    '(?:\\\\s*(dernier|prochain)\\\\s*)?' +\r\n    '(?=\\\\W|$)', 'i');\r\n\r\nvar PREFIX_GROUP = 2;\r\nvar WEEKDAY_GROUP = 3;\r\nvar POSTFIX_GROUP = 4;\r\n\r\nexports.Parser = function FRWeekdayParser() {\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return PATTERN; };\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n        var index = match.index + match[1].length;\r\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref\r\n        });\r\n\r\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\r\n        var offset = DAYS_OFFSET[dayOfWeek];\r\n        if(offset === undefined) return null;\r\n\r\n        var modifier = null;\r\n        var prefix = match[PREFIX_GROUP];\r\n        var postfix = match[POSTFIX_GROUP];\r\n        if (prefix || postfix) {\r\n            var norm = prefix || postfix;\r\n            norm = norm.toLowerCase();\r\n\r\n            if(norm == 'dernier') {\r\n                modifier = 'last';\r\n            } else if(norm == 'prochain') {\r\n                modifier = 'next';\r\n            } else if(norm== 'ce') {\r\n                modifier = 'this';\r\n            }\r\n        }\r\n\r\n        updateParsedComponent(result, ref, offset, modifier);\r\n        result.tags['FRWeekdayParser'] = true;\r\n        return result;\r\n    }\r\n};\r\n\r\n","/*\n    \n    \n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i;\n\nexports.Parser = function JPCasualDateParser(){\n    \n    Parser.apply(this, arguments);\n        \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        var index = match.index;\n        var text = match[0];\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n\n        if(text == '今夜' || text == '今夕' || text == '今晩'){\n            // Normally means this coming midnight \n            result.start.imply('hour', 22);\n            result.start.imply('meridiem', 1);\n\n        } else if(text == '明日'){\n\n            // Check not \"Tomorrow\" on late night\n            if(refMoment.hour() > 4) {\n                startMoment.add(1, 'day');\n            }\n\n        } else if(text == '昨日') {\n\n            startMoment.add(-1, 'day');\n\n        } else if (text.match(\"今朝\")) {\n\n            result.start.imply('hour', 6);\n            result.start.imply('meridiem', 0);\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['JPCasualDateParser'] = true;\n        return result;\n    }\n}\n\n","/*\n    \n    \n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util  = require('../../utils/JP'); \nvar PATTERN = /(?:(同|((昭和|平成)?([0-9０-９]{2,4})))年\\s*)?([0-9０-９]{1,2})月\\s*([0-9０-９]{1,2})日/i;\n  \nvar YEAR_GROUP        = 2;\nvar ERA_GROUP         = 3;\nvar YEAR_NUMBER_GROUP = 4;\nvar MONTH_GROUP       = 5;\nvar DAY_GROUP         = 6;\n\nexports.Parser = function JPStandardParser(){\n    Parser.apply(this, arguments);\n    \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n\n        var startMoment = moment(ref);\n        var result = new ParsedResult({\n            text: match[0],\n            index: match.index,\n            ref: ref,\n        });\n        \n        var month = match[MONTH_GROUP];\n        month = util.toHankaku(month);\n        month = parseInt(month);\n\n        var day = match[DAY_GROUP];\n        day = util.toHankaku(day);\n        day = parseInt(day);\n\n        startMoment.set('date', day);\n        startMoment.set('month', month - 1);\n        result.start.assign('day', startMoment.date());\n        result.start.assign('month', startMoment.month() + 1);\n            \n        if (!match[YEAR_GROUP]) {\n            \n            //Find the most appropriated year\n            startMoment.year(moment(ref).year());\n            var nextYear = startMoment.clone().add(1, 'y');\n            var lastYear = startMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(startMoment.diff(moment(ref))) ){  \n                startMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(startMoment.diff(moment(ref))) ){ \n                startMoment = lastYear;\n            }\n\n            result.start.assign('day', startMoment.date());\n            result.start.assign('month', startMoment.month() + 1);\n            result.start.imply('year', startMoment.year());\n\n        } else if (match[YEAR_GROUP].match('同年')) {\n\n            result.start.assign('year', startMoment.year());\n\n        } else {\n            var year = match[YEAR_NUMBER_GROUP];\n            year = util.toHankaku(year);\n            year = parseInt(year);\n\n            if (match[ERA_GROUP] == '平成') {\n                year += 1988;\n            } else if (match[ERA_GROUP] == '昭和') {\n                year += 1925;\n            }\n\n            result.start.assign('year', year);\n        }\n        \n\n        result.tags['JPStandardParser'] = true;\n        return result;\n    };\n\n}\n\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp(\n    '(而家|立(?:刻|即)|即刻)|' +\n    '(今|明|聽|昨|尋|琴)(早|朝|晚)|' +\n    '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n    '(今|明|聽|昨|尋|琴)(?:日|天)' +\n    '(?:[\\\\s|,|，]*)' +\n    '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?', 'i');\n\nvar NOW_GROUP = 1;\nvar DAY_GROUP_1 = 2;\nvar TIME_GROUP_1 = 3;\nvar TIME_GROUP_2 = 4;\nvar DAY_GROUP_3 = 5;\nvar TIME_GROUP_3 = 6;\n\nexports.Parser = function ZHHantCasualDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n        text = match[0];\n        var index = match.index;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n\n        if (match[NOW_GROUP]) {\n            result.start.imply('hour', refMoment.hour());\n            result.start.imply('minute', refMoment.minute());\n            result.start.imply('second', refMoment.second());\n            result.start.imply('millisecond', refMoment.millisecond());\n        } else if (match[DAY_GROUP_1]) {\n            var day1 = match[DAY_GROUP_1];\n            var time1 = match[TIME_GROUP_1];\n\n            if (day1 == '明' || day1 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  startMoment.add(1, 'day');\n              }\n            } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n                startMoment.add(-1, 'day');\n            }\n\n            if (time1 == '早' || time1 == '朝') {\n                result.start.imply('hour', 6);\n            } else if (time1 == '晚') {\n                result.start.imply('hour', 22);\n                result.start.imply('meridiem', 1);\n            }\n\n        } else if (match[TIME_GROUP_2]) {\n            var timeString2 = match[TIME_GROUP_2];\n            var time2 = timeString2[0];\n            if (time2 == '早' || time2 == '朝' || time2 == '上') {\n                result.start.imply('hour', 6);\n            } else if (time2 == '下' || time2 == '晏') {\n                result.start.imply('hour', 15);\n                result.start.imply('meridiem', 1);\n            } else if (time2 == '中') {\n                result.start.imply('hour', 12);\n                result.start.imply('meridiem', 1);\n            } else if (time2 == '夜' || time2 == '晚') {\n                result.start.imply('hour', 22);\n                result.start.imply('meridiem', 1);\n            } else if (time2 == '凌') {\n                result.start.imply('hour', 0);\n            }\n\n        } else if (match[DAY_GROUP_3]) {\n            var day3 = match[DAY_GROUP_3];\n\n            if (day3 == '明' || day3 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  startMoment.add(1, 'day');\n              }\n            } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n                startMoment.add(-1, 'day');\n            }\n\n\n            var timeString3 = match[TIME_GROUP_3];\n            if (timeString3) {\n                var time3 = timeString3[0];\n                if (time3 == '早' || time3 == '朝' || time3 == '上') {\n                    result.start.imply('hour', 6);\n                } else if (time3 == '下' || time3 == '晏') {\n                    result.start.imply('hour', 15);\n                    result.start.imply('meridiem', 1);\n                } else if (time3 == '中') {\n                    result.start.imply('hour', 12);\n                    result.start.imply('meridiem', 1);\n                } else if (time3 == '夜' || time3 == '晚') {\n                    result.start.imply('hour', 22);\n                    result.start.imply('meridiem', 1);\n                } else if (time3 == '凌') {\n                    result.start.imply('hour', 0);\n                }\n            }\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags.ZHHantCasualDateParser = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n    '(\\\\d{2,4}|[' + Object.keys(util.NUMBER).join('') + ']{2,4})?' +\n    '(?:\\\\s*)' +\n    '(?:年)?' +\n    '(?:[\\\\s|,|，]*)' +\n    '(\\\\d{1,2}|[' + Object.keys(util.NUMBER).join('') + ']{1,2})' +\n    '(?:\\\\s*)' +\n    '(?:月)' +\n    '(?:\\\\s*)' +\n    '(\\\\d{1,2}|[' + Object.keys(util.NUMBER).join('') + ']{1,2})?' +\n    '(?:\\\\s*)' +\n    '(?:日|號)?'\n);\n\nvar YEAR_GROUP = 1;\nvar MONTH_GROUP = 2;\nvar DAY_GROUP = 3;\n\nexports.Parser = function ZHHantDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n        var startMoment = moment(ref);\n        var result = new ParsedResult({\n            text: match[0],\n            index: match.index,\n            ref: ref,\n        });\n\n        //Month\n        var month = parseInt(match[MONTH_GROUP]);\n        if (isNaN(month)) month = util.zhStringToNumber(match[MONTH_GROUP]);\n        result.start.assign('month', month);\n\n        //Day\n        if (match[DAY_GROUP]) {\n            var day = parseInt(match[DAY_GROUP]);\n            if (isNaN(day)) day = util.zhStringToNumber(match[DAY_GROUP]);\n            result.start.assign('day', day);\n        } else {\n            result.start.imply('day', startMoment.date());\n        }\n\n        //Year\n        if (match[YEAR_GROUP]) {\n            var year = parseInt(match[YEAR_GROUP]);\n            if (isNaN(year)) year = util.zhStringToYear(match[YEAR_GROUP]);\n            result.start.assign('year', year);\n        } else {\n            result.start.imply('year', startMoment.year());\n        }\n\n        result.tags.ZHHantDateParser = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n    '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+|半|幾)(?:\\\\s*)' +\n    '(?:個)?' +\n    '(秒(?:鐘)?|分鐘|小時|鐘|日|天|星期|禮拜|月|年)' +\n    '(?:(?:之|過)?後|(?:之)?內)', 'i'\n);\n\nvar NUMBER_GROUP = 1;\nvar UNIT_GROUP = 2;\n\nexports.Parser = function ZHHantCasualDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n      var index = match.index;\n      text  = match[0];\n\n      var result = new ParsedResult({\n          index: index,\n          text: text,\n          ref: ref\n      });\n\n      var number = parseInt(match[NUMBER_GROUP]);\n      if (isNaN(number)){\n        number = util.zhStringToNumber(match[NUMBER_GROUP]);\n      }\n\n      if (isNaN(number)){\n        var string = match[NUMBER_GROUP];\n        if (string === '幾'){\n          number = 3;\n        }else if(string === '半'){\n          number = 0.5;\n        }else{\n\n          //just in case\n          return null;\n        }\n      }\n\n      var date = moment(ref);\n      var unit = match[UNIT_GROUP];\n      var unitAbbr = unit[0];\n\n      if (unitAbbr.match(/[日天星禮月年]/)){\n        if(unitAbbr == '日' || unitAbbr == '天'){\n          date.add(number, 'd');\n        }else if(unitAbbr == '星' || unitAbbr == '禮'){\n          date.add(number * 7, 'd');\n        }else if(unitAbbr == '月'){\n          date.add(number, 'month');\n        }else if(unitAbbr == '年'){\n          date.add(number, 'year');\n        }\n\n        result.start.assign('year', date.year());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('day', date.date());\n        return result;\n      }\n\n      if(unitAbbr == '秒'){\n        date.add(number, 'second');\n      }else if(unitAbbr == '分'){\n        date.add(number, 'minute');\n      }else if(unitAbbr == '小' || unitAbbr == '鐘'){\n        date.add(number, 'hour');\n      }\n\n      result.start.imply('year', date.year());\n      result.start.imply('month', date.month() + 1);\n      result.start.imply('day', date.date());\n      result.start.assign('hour', date.hour());\n      result.start.assign('minute', date.minute());\n      result.start.assign('second', date.second());\n      result.tags.ZHHantDeadlineFormatParser = true;\n      return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar patternString1 = '(?:由|從|自)?' +\n    '(?:' +\n    '(今|明|聽|昨|尋|琴)(早|朝|晚)|' +\n    '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n    '(今|明|聽|昨|尋|琴)(?:日|天)' +\n    '(?:[\\\\s,，]*)' +\n    '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +\n    ')?' +\n    '(?:[\\\\s,，]*)' +\n    '(?:(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\\\s*)(?:點|時|:|：)' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:分|:|：)?' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:秒)?)' +\n    '(?:\\\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?';\n\nvar patternString2 = '(?:\\\\s*(?:到|至|\\\\-|\\\\–|\\\\~|\\\\〜)\\\\s*)' +\n    '(?:' +\n    '(今|明|聽|昨|尋|琴)(早|朝|晚)|' +\n    '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n    '(今|明|聽|昨|尋|琴)(?:日|天)' +\n    '(?:[\\\\s,，]*)' +\n    '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +\n    ')?' +\n    '(?:[\\\\s,，]*)' +\n    '(?:(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\\\s*)(?:點|時|:|：)' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:分|:|：)?' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:秒)?)' +\n    '(?:\\\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?';\n\nvar FIRST_REG_PATTERN = new RegExp(patternString1, 'i');\nvar SECOND_REG_PATTERN = new RegExp(patternString2, 'i');\n\nvar DAY_GROUP_1 = 1;\nvar ZH_AM_PM_HOUR_GROUP_1 = 2;\nvar ZH_AM_PM_HOUR_GROUP_2 = 3;\nvar DAY_GROUP_3 = 4;\nvar ZH_AM_PM_HOUR_GROUP_3 = 5;\nvar HOUR_GROUP = 6;\nvar MINUTE_GROUP = 7;\nvar SECOND_GROUP = 8;\nvar AM_PM_HOUR_GROUP = 9;\n\nexports.Parser = function ZHHantTimeExpressionParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return FIRST_REG_PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n\n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index - 1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index;\n        result.text = match[0];\n        result.tags.ZHTimeExpressionParser = true;\n\n        var startMoment = refMoment.clone();\n\n        // ----- Day\n        if (match[DAY_GROUP_1]) {\n            var day1 = match[DAY_GROUP_1];\n            if (day1 == '明' || day1 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  startMoment.add(1, 'day');\n              }\n            } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n                startMoment.add(-1, 'day');\n            }\n            result.start.assign('day', startMoment.date());\n            result.start.assign('month', startMoment.month() + 1);\n            result.start.assign('year', startMoment.year());\n        } else if (match[DAY_GROUP_3]) {\n            var day3 = match[DAY_GROUP_3];\n            if (day3 == '明' || day3 == '聽') {\n                startMoment.add(1, 'day');\n            } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n                startMoment.add(-1, 'day');\n            }\n            result.start.assign('day', startMoment.date());\n            result.start.assign('month', startMoment.month() + 1);\n            result.start.assign('year', startMoment.year());\n        } else {\n            result.start.imply('day', startMoment.date());\n            result.start.imply('month', startMoment.month() + 1);\n            result.start.imply('year', startMoment.year());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if (match[SECOND_GROUP]) {\n            var second = parseInt(match[SECOND_GROUP]);\n            if (isNaN(second)) {\n                second = util.zhStringToNumber(match[SECOND_GROUP]);\n            }\n            if (second >= 60) return null;\n            result.start.assign('second', second);\n        }\n\n        hour = parseInt(match[HOUR_GROUP]);\n        if (isNaN(hour)) {\n            hour = util.zhStringToNumber(match[HOUR_GROUP]);\n        }\n\n        // ----- Minutes\n        if (match[MINUTE_GROUP]) {\n            if (match[MINUTE_GROUP] == '半') {\n                minute = 30;\n            } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {\n                minute = 0;\n            } else {\n                minute = parseInt(match[MINUTE_GROUP]);\n                if (isNaN(minute)) {\n                    minute = util.zhStringToNumber(match[MINUTE_GROUP]);\n                }\n            }\n        } else if (hour > 100) {\n            minute = hour % 100;\n            hour = parseInt(hour / 100);\n        }\n\n        if (minute >= 60) {\n            return null;\n        }\n\n        if (hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if (match[AM_PM_HOUR_GROUP]) {\n            if (hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm == \"a\") {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            }\n\n            if (ampm == \"p\") {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {\n            var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];\n            var zhAMPM1 = zhAMPMString1[0];\n            if (zhAMPM1 == '朝' || zhAMPM1 == '早') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM1 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {\n            var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];\n            var zhAMPM2 = zhAMPMString2[0];\n            if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {\n            var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];\n            var zhAMPM3 = zhAMPMString3[0];\n            if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        }\n\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        } else {\n            if (hour < 12) {\n                result.start.imply('meridiem', 0);\n            } else {\n                result.start.imply('meridiem', 1);\n            }\n        }\n\n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            // Not accept number only result\n            if (result.text.match(/^\\d+$/)) {\n                return null;\n            }\n            return result;\n        }\n\n        var endMoment = startMoment.clone();\n        result.end = new ParsedComponents(null, null);\n\n        // ----- Day\n        if (match[DAY_GROUP_1]) {\n            var day1 = match[DAY_GROUP_1];\n            if (day1 == '明' || day1 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  endMoment.add(1, 'day');\n              }\n            } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n                endMoment.add(-1, 'day');\n            }\n            result.end.assign('day', endMoment.date());\n            result.end.assign('month', endMoment.month() + 1);\n            result.end.assign('year', endMoment.year());\n        } else if (match[DAY_GROUP_3]) {\n            var day3 = match[DAY_GROUP_3];\n            if (day3 == '明' || day3 == '聽') {\n                endMoment.add(1, 'day');\n            } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n                endMoment.add(-1, 'day');\n            }\n            result.end.assign('day', endMoment.date());\n            result.end.assign('month', endMoment.month() + 1);\n            result.end.assign('year', endMoment.year());\n        } else {\n            result.end.imply('day', endMoment.date());\n            result.end.imply('month', endMoment.month() + 1);\n            result.end.imply('year', endMoment.year());\n        }\n\n        hour = 0;\n        minute = 0;\n        meridiem = -1;\n\n        // ----- Second\n        if (match[SECOND_GROUP]) {\n            var second = parseInt(match[SECOND_GROUP]);\n            if (isNaN(second)) {\n                second = util.zhStringToNumber(match[SECOND_GROUP]);\n            }\n\n            if (second >= 60) return null;\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[HOUR_GROUP]);\n        if (isNaN(hour)) {\n            hour = util.zhStringToNumber(match[HOUR_GROUP]);\n        }\n\n        // ----- Minutes\n        if (match[MINUTE_GROUP]) {\n            if (match[MINUTE_GROUP] == '半') {\n                minute = 30;\n            } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {\n                minute = 0;\n            } else {\n                minute = parseInt(match[MINUTE_GROUP]);\n                if (isNaN(minute)) {\n                    minute = util.zhStringToNumber(match[MINUTE_GROUP]);\n                }\n            }\n        } else if (hour > 100) {\n            minute = hour % 100;\n            hour = parseInt(hour / 100);\n        }\n\n        if (minute >= 60) {\n            return null;\n        }\n\n        if (hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if (match[AM_PM_HOUR_GROUP]) {\n            if (hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm == \"a\") {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            }\n\n            if (ampm == \"p\") {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n\n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n\n                    result.start.imply('meridiem', 0);\n\n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n\n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12);\n                    }\n                }\n            }\n\n        } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {\n            var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];\n            var zhAMPM1 = zhAMPMString1[0];\n            if (zhAMPM1 == '朝' || zhAMPM1 == '早') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM1 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {\n            var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];\n            var zhAMPM2 = zhAMPMString2[0];\n            if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {\n            var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];\n            var zhAMPM3 = zhAMPMString3[0];\n            if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        } else {\n            var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n            if (startAtPM && result.start.get('hour') > hour) {\n                // 10pm - 1 (am)\n                result.end.imply('meridiem', 0);\n\n            } else if (hour > 12) {\n                result.end.imply('meridiem', 1);\n            }\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar updateParsedComponent = require('../EN/ENWeekdayParser').updateParsedComponent;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n    '(上|今|下|這|呢)?' +\n    '(?:個)?' +\n    '(?:星期|禮拜)' +\n    '(' + Object.keys(util.WEEKDAY_OFFSET).join('|') + ')'\n);\n\nvar PREFIX_GROUP = 1;\nvar WEEKDAY_GROUP = 2;\n\nexports.Parser = function ZHHantWeekdayParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n        var index = match.index;\n        text = match[0];\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP];\n        var offset = util.WEEKDAY_OFFSET[dayOfWeek];\n        if(offset === undefined) return null;\n\n        var modifier = null;\n        var prefix = match[PREFIX_GROUP];\n\n        if(prefix == '上') {\n            modifier = 'last';\n        } else if(prefix == '下') {\n            modifier = 'next';\n        } else if(prefix == '今' || prefix == '這' || prefix == '呢') {\n            modifier = 'this';\n        }\n\n        updateParsedComponent(result, ref, offset, modifier);\n        result.tags['ZHHantWeekdayParser'] = true;\n        return result;\n    };\n};\n","\nfunction Parser(config) {\n\n    config = config || {};\n    var strictMode = config.strict;\n\n    this.isStrictMode = function() { return (strictMode == true) };\n\n    this.pattern = function() { return /./i; }\n\n    this.extract = function(text, ref, match, opt){ return null; }\n\n    this.execute = function(text, ref, opt) {\n\n        var results = [];\n        var regex = this.pattern();\n\n        var remainingText = text;\n        var match = regex.exec(remainingText);\n\n        while (match) {\n\n            // Calculate match index on the full text;\n            match.index += text.length - remainingText.length;\n\n            var result = this.extract(text, ref, match, opt);\n            if (result) {\n\n                // If success, start from the end of the result\n                remainingText = text.substring(result.index + result.text.length);\n\n                if (!this.isStrictMode() || result.hasPossibleDates()) {\n                    results.push(result);\n                }\n\n            } else {\n                // If fail, move on by 1\n                remainingText = text.substring(match.index + 1);\n            }\n\n            match = regex.exec(remainingText);\n        }\n\n        if (this.refiners) {\n            this.refiners.forEach(function () {\n                results = refiner.refine(results, text, options);\n            });\n        }\n\n        return results;\n    }\n}\n\nexports.Parser = Parser;\n\nexports.ENISOFormatParser = require('./EN/ENISOFormatParser').Parser;\nexports.ENDeadlineFormatParser = require('./EN/ENDeadlineFormatParser').Parser;\nexports.ENRelativeDateFormatParser = require('./EN/ENRelativeDateFormatParser').Parser;\nexports.ENMonthNameLittleEndianParser = require('./EN/ENMonthNameLittleEndianParser').Parser;\nexports.ENMonthNameMiddleEndianParser = require('./EN/ENMonthNameMiddleEndianParser').Parser;\nexports.ENMonthNameParser = require('./EN/ENMonthNameParser').Parser;\nexports.ENSlashDateFormatParser = require('./EN/ENSlashDateFormatParser').Parser;\nexports.ENSlashDateFormatStartWithYearParser = require('./EN/ENSlashDateFormatStartWithYearParser').Parser;\nexports.ENSlashMonthFormatParser = require('./EN/ENSlashMonthFormatParser').Parser;\nexports.ENTimeAgoFormatParser = require('./EN/ENTimeAgoFormatParser').Parser;\nexports.ENTimeExpressionParser = require('./EN/ENTimeExpressionParser').Parser;\nexports.ENTimeLaterFormatParser = require('./EN/ENTimeLaterFormatParser').Parser;\nexports.ENWeekdayParser = require('./EN/ENWeekdayParser').Parser;\nexports.ENCasualDateParser = require('./EN/ENCasualDateParser').Parser;\nexports.ENCasualTimeParser = require('./EN/ENCasualTimeParser').Parser;\n\nexports.JPStandardParser = require('./JP/JPStandardParser').Parser;\nexports.JPCasualDateParser = require('./JP/JPCasualDateParser').Parser;\n\nexports.ESCasualDateParser = require('./ES/ESCasualDateParser').Parser;\nexports.ESDeadlineFormatParser = require('./ES/ESDeadlineFormatParser').Parser;\nexports.ESTimeAgoFormatParser = require('./ES/ESTimeAgoFormatParser').Parser;\nexports.ESTimeExpressionParser = require('./ES/ESTimeExpressionParser').Parser;\nexports.ESWeekdayParser = require('./ES/ESWeekdayParser').Parser;\nexports.ESMonthNameLittleEndianParser = require('./ES/ESMonthNameLittleEndianParser').Parser;\nexports.ESSlashDateFormatParser = require('./ES/ESSlashDateFormatParser').Parser;\n\nexports.FRCasualDateParser = require('./FR/FRCasualDateParser').Parser;\nexports.FRDeadlineFormatParser = require('./FR/FRDeadlineFormatParser').Parser;\nexports.FRMonthNameLittleEndianParser = require('./FR/FRMonthNameLittleEndianParser').Parser;\nexports.FRSlashDateFormatParser = require('./FR/FRSlashDateFormatParser').Parser;\nexports.FRTimeAgoFormatParser = require('./FR/FRTimeAgoFormatParser').Parser;\nexports.FRTimeExpressionParser = require('./FR/FRTimeExpressionParser').Parser;\nexports.FRWeekdayParser = require('./FR/FRWeekdayParser').Parser;\nexports.FRRelativeDateFormatParser = require('./FR/FRRelativeDateFormatParser').Parser;\n\nexports.ZHHantDateParser = require('./ZH-Hant/ZHHantDateParser').Parser;\nexports.ZHHantWeekdayParser = require('./ZH-Hant/ZHHantWeekdayParser').Parser;\nexports.ZHHantTimeExpressionParser = require('./ZH-Hant/ZHHantTimeExpressionParser').Parser;\nexports.ZHHantCasualDateParser = require('./ZH-Hant/ZHHantCasualDateParser').Parser;\nexports.ZHHantDeadlineFormatParser = require('./ZH-Hant/ZHHantDeadlineFormatParser').Parser;\n\nexports.DEDeadlineFormatParser = require('./DE/DEDeadlineFormatParser').Parser;\nexports.DEMonthNameLittleEndianParser = require('./DE/DEMonthNameLittleEndianParser').Parser;\nexports.DEMonthNameParser = require('./DE/DEMonthNameParser').Parser;\nexports.DESlashDateFormatParser = require('./DE/DESlashDateFormatParser').Parser;\nexports.DETimeAgoFormatParser = require('./DE/DETimeAgoFormatParser').Parser;\nexports.DETimeExpressionParser = require('./DE/DETimeExpressionParser').Parser;\nexports.DEWeekdayParser = require('./DE/DEWeekdayParser').Parser;\nexports.DECasualDateParser = require('./DE/DECasualDateParser').Parser;\n","/*\n  \n*/\nvar ENMergeDateRangeRefiner = require('../EN/ENMergeDateRangeRefiner').Refiner;\n\nexports.Refiner = function DEMergeDateRangeRefiner() {\n    ENMergeDateRangeRefiner.call(this);\n\n    this.pattern = function () {\n        return /^\\s*(bis(?:\\s*(?:am|zum))?|\\-)\\s*$/i\n    };\n};\n","/*\n    \n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\nvar mergeDateTimeComponent = require('../EN/ENMergeDateTimeRefiner').mergeDateTimeComponent;\nvar isDateOnly = require('../EN/ENMergeDateTimeRefiner').isDateOnly;\nvar isTimeOnly = require('../EN/ENMergeDateTimeRefiner').isTimeOnly;\n\nvar PATTERN = new RegExp(\"^\\\\s*(T|um|am|,|-)?\\\\s*$\");\n\nfunction isAbleToMerge(text, prevResult, curResult) {\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\n    return textBetween.match(PATTERN);\n}\n\nfunction mergeResult(text, dateResult, timeResult){\n\n    var beginDate = dateResult.start;\n    var beginTime = timeResult.start;    \n    var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\n\n    if (dateResult.end != null || timeResult.end != null) {\n        \n        var endDate   = dateResult.end == null ? dateResult.start : dateResult.end;            \n        var endTime   = timeResult.end == null ? timeResult.start : timeResult.end;\n        var endDateTime = mergeDateTimeComponent(endDate, endTime);\n        \n        if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\n            // Ex. 9pm - 1am\n            if (endDateTime.isCertain('day')) {\n                endDateTime.assign('day', endDateTime.get('day') + 1);\n            } else {\n                endDateTime.imply('day', endDateTime.get('day') + 1);\n            }\n        }\n\n        dateResult.end = endDateTime;\n    }\n\n    dateResult.start = beginDateTime;    \n\n    var startIndex = Math.min(dateResult.index, timeResult.index);\n    var endIndex = Math.max(\n            dateResult.index + dateResult.text.length, \n            timeResult.index + timeResult.text.length);\n    \n    dateResult.index = startIndex;\n    dateResult.text  = text.substring(startIndex, endIndex);\n\n    for (var tag in timeResult.tags) {\n        dateResult.tags[tag] = true;\n    }\n    dateResult.tags['DEMergeDateAndTimeRefiner'] = true;\n    return dateResult;\n}\n\nexports.Refiner = function DEMergeDateTimeRefiner() {\n    Refiner.call(this);\n\n\n    this.refine = function(text, results, opt) { \n\n        if (results.length < 2) return results;\n\n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n\n        for (var i = 1; i < results.length; i++) {\n\n            currResult = results[i];\n            prevResult = results[i-1];\n            \n            if (isDateOnly(prevResult) && isTimeOnly(currResult) \n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, prevResult, currResult);\n                currResult = null;\n                i += 1;\n                \n            } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, currResult, prevResult);\n                currResult = null;\n                i += 1;\n            }\n            \n            mergedResult.push(prevResult);\n        }\n\n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n        return mergedResult;\n    }\n}","/*\n  \n*/\nvar Refiner = require('../refiner').Refiner;\n\nexports.Refiner = function ENMergeDateRangeRefiner() {\n    Refiner.call(this);\n\n    this.pattern = function () { return /^\\s*(to|\\-)\\s*$/i };\n\n    this.refine = function(text, results, opt) {\n\n        if (results.length < 2) return results;\n        \n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n        \n        for (var i=1; i<results.length; i++){\n            \n            currResult = results[i];\n            prevResult = results[i-1];\n            \n            if (!prevResult.end && !currResult.end \n                && this.isAbleToMerge(text, prevResult, currResult)) {\n              \n                prevResult = this.mergeResult(text, prevResult, currResult);\n                currResult = null;\n                i += 1;\n            }\n            \n            mergedResult.push(prevResult);\n        }\n        \n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n\n        return mergedResult;\n    };\n\n    this.isAbleToMerge = function(text, result1, result2) {\n        var begin = result1.index + result1.text.length;\n        var end   = result2.index;\n        var textBetween = text.substring(begin,end);\n\n        return textBetween.match(this.pattern());\n    };\n\n    this.isWeekdayResult = function (result) {\n        return result.start.isCertain('weekday') && !result.start.isCertain('day');\n    };\n\n    this.mergeResult = function(text, fromResult, toResult) {\n\n        if (!this.isWeekdayResult(fromResult) && !this.isWeekdayResult(toResult)) {\n            \n            var timeKeys = {'hour': true, 'minute': true, 'second': true};\n\n            for (var key in toResult.start.knownValues) {\n                if (!fromResult.start.isCertain(key)) {\n                    fromResult.start.assign(key, toResult.start.get(key));\n                }\n            }\n\n            for (var key in fromResult.start.knownValues) {\n                if (!toResult.start.isCertain(key)) {\n                    toResult.start.assign(key, fromResult.start.get(key));\n                }\n            }\n        }\n\n        if (fromResult.start.date().getTime() > toResult.start.date().getTime()) {\n            \n            var fromMoment = fromResult.start.moment();\n            var toMoment = toResult.start.moment();\n\n            if (this.isWeekdayResult(fromResult) && fromMoment.clone().add(-7, 'days').isBefore(toMoment)) {\n                fromMoment = fromMoment.add(-7, 'days');\n                fromResult.start.imply('day', fromMoment.date());\n                fromResult.start.imply('month', fromMoment.month() + 1);\n                fromResult.start.imply('year', fromMoment.year());\n            } else if (this.isWeekdayResult(toResult) && toMoment.clone().add(7, 'days').isAfter(fromMoment)) {\n                toMoment = toMoment.add(7, 'days');\n                toResult.start.imply('day', toMoment.date());\n                toResult.start.imply('month', toMoment.month() + 1);\n                toResult.start.imply('year', toMoment.year());\n            } else {\n                var tmp = toResult;\n                toResult = fromResult;\n                fromResult = tmp;\n            }\n        }\n        \n        fromResult.end = toResult.start;\n\n        \n\n        for (var tag in toResult.tags) {\n            fromResult.tags[tag] = true;\n        }\n\n            \n        var startIndex = Math.min(fromResult.index, toResult.index);\n        var endIndex = Math.max(\n            fromResult.index + fromResult.text.length, \n            toResult.index + toResult.text.length);\n            \n        fromResult.index = startIndex;\n        fromResult.text  = text.substring(startIndex, endIndex);\n        fromResult.tags[this.constructor.name] = true;\n        return fromResult;\n    }\n};\n\n","/*\n    \n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\nvar PATTERN = new RegExp(\"^\\\\s*(T|at|after|before|on|of|,|-)?\\\\s*$\");\n\nvar isDateOnly = exports.isDateOnly = function(result) {\n    return !result.start.isCertain('hour');\n}\n    \nvar isTimeOnly = exports.isTimeOnly = function(result) {\n    return !result.start.isCertain('month') && !result.start.isCertain('weekday');\n}\n\nvar isAbleToMerge = exports.isAbleToMerge = function(text, prevResult, curResult) {\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\n    return textBetween.match(PATTERN);\n}\n\nvar mergeDateTimeComponent = exports.mergeDateTimeComponent = function(dateComponent, timeComponent) {\n    var dateTimeComponent = dateComponent.clone();\n\n    if (timeComponent.isCertain('hour')) {\n        dateTimeComponent.assign('hour', timeComponent.get('hour'));\n        dateTimeComponent.assign('minute', timeComponent.get('minute'));\n\n        if (timeComponent.isCertain('second')) {\n            dateTimeComponent.assign('second', timeComponent.get('second'));\n\n            if (timeComponent.isCertain('millisecond')) {\n                dateTimeComponent.assign('millisecond', timeComponent.get('millisecond'));\n            } else {\n                dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n            }\n        } else {\n            dateTimeComponent.imply('second', timeComponent.get('second'));\n            dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n        }\n        \n    } else {\n        dateTimeComponent.imply('hour', timeComponent.get('hour'));\n        dateTimeComponent.imply('minute', timeComponent.get('minute'));\n        dateTimeComponent.imply('second', timeComponent.get('second'));\n        dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n    }\n\n    if (timeComponent.isCertain('meridiem')) {\n        dateTimeComponent.assign('meridiem', timeComponent.get('meridiem'));\n    } else if (\n        timeComponent.get('meridiem') !== undefined &&\n        dateTimeComponent.get('meridiem') === undefined\n    ) {\n        dateTimeComponent.imply('meridiem', timeComponent.get('meridiem'));\n    }\n\n    if (dateTimeComponent.get('meridiem') == 1 && dateTimeComponent.get('hour') < 12) {\n        if (timeComponent.isCertain('hour')) {\n            dateTimeComponent.assign('hour', dateTimeComponent.get('hour') + 12);\n        } else {\n            dateTimeComponent.imply('hour', dateTimeComponent.get('hour') + 12);\n        }\n    }\n\n    return dateTimeComponent;\n}\n\n\nfunction mergeResult(text, dateResult, timeResult){\n\n    var beginDate = dateResult.start;\n    var beginTime = timeResult.start;\n    var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\n    \n    if (dateResult.end != null || timeResult.end != null) {\n        \n        var endDate   = dateResult.end == null ? dateResult.start : dateResult.end;            \n        var endTime   = timeResult.end == null ? timeResult.start : timeResult.end;\n        var endDateTime = mergeDateTimeComponent(endDate, endTime);\n        \n        if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\n            // Ex. 9pm - 1am\n            if (endDateTime.isCertain('day')) {\n                endDateTime.assign('day', endDateTime.get('day') + 1);\n            } else {\n                endDateTime.imply('day', endDateTime.get('day') + 1);\n            }\n        }\n\n        dateResult.end = endDateTime;\n    }\n\n    dateResult.start = beginDateTime;    \n\n    var startIndex = Math.min(dateResult.index, timeResult.index);\n    var endIndex = Math.max(\n            dateResult.index + dateResult.text.length, \n            timeResult.index + timeResult.text.length);\n    \n    dateResult.index = startIndex;\n    dateResult.text  = text.substring(startIndex, endIndex);\n\n    for (var tag in timeResult.tags) {\n        dateResult.tags[tag] = true;\n    }\n    dateResult.tags['ENMergeDateAndTimeRefiner'] = true;\n    return dateResult;\n}\n\nexports.Refiner = function ENMergeDateTimeRefiner() {\n    Refiner.call(this);\n\n\n    this.refine = function(text, results, opt) { \n\n        if (results.length < 2) return results;\n\n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n\n        for (var i = 1; i < results.length; i++) {\n\n            currResult = results[i];\n            prevResult = results[i-1];\n            \n            if (isDateOnly(prevResult) && isTimeOnly(currResult) \n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, prevResult, currResult);\n                currResult = results[i + 1];\n                i += 1;\n                \n            } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, currResult, prevResult);\n                currResult = results[i + 1];\n                i += 1;\n            }\n            \n            mergedResult.push(prevResult);\n        }\n\n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n        return mergedResult;\n    }\n}","/*\n\n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\n\nvar PATTERN = new RegExp(\"^\\\\s*(at|after|before|on|,|-|\\\\(|\\\\))?\\\\s*$\");\n\nfunction isMoreSpecific(prevResult, currResult) {\n    var moreSpecific = false;\n\n    if (prevResult.start.isCertain('year')) {\n        if (!currResult.start.isCertain('year')) {\n            moreSpecific = true;\n        } else {\n            if (prevResult.start.isCertain('month')) {\n                if (!currResult.start.isCertain('month')) {\n                    moreSpecific = true;\n                } else {\n                    if (prevResult.start.isCertain('day') && !currResult.start.isCertain('day')) {\n                        moreSpecific = true;\n                    }\n                }\n            }\n        }\n    }\n\n    return moreSpecific;\n}\n\n\nfunction isAbleToMerge(text, prevResult, currResult) {\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, currResult.index);\n\n    // Only accepts merge if one of them comes from casual relative date\n    var includesRelativeResult = (prevResult.tags['ENRelativeDateFormatParser'] || currResult.tags['ENRelativeDateFormatParser']);\n\n    // We assume they refer to the same date if all date fields are implied\n    var referToSameDate = !prevResult.start.isCertain('day') && !prevResult.start.isCertain('month') && !prevResult.start.isCertain('year');\n\n    // If both years are certain, that determines if they refer to the same date\n    // but with one more specific than the other\n    if (prevResult.start.isCertain('year') && currResult.start.isCertain('year'))\n        referToSameDate = (prevResult.start.get('year') === currResult.start.get('year'));\n\n    // We now test with the next level (month) if they refer to the same date\n    if (prevResult.start.isCertain('month') && currResult.start.isCertain('month'))\n        referToSameDate = (prevResult.start.get('month') === currResult.start.get('month')) && referToSameDate;\n\n    return includesRelativeResult && textBetween.match(PATTERN) && referToSameDate;\n}\n\nfunction mergeResult(text, specificResult, nonSpecificResult){\n\n    var specificDate = specificResult.start;\n    var nonSpecificDate = nonSpecificResult.start;\n\n    var startIndex = Math.min(specificResult.index, nonSpecificResult.index);\n    var endIndex = Math.max(\n            specificResult.index + specificResult.text.length,\n            nonSpecificResult.index + nonSpecificResult.text.length);\n\n    specificResult.index = startIndex;\n    specificResult.text  = text.substring(startIndex, endIndex);\n\n    for (var tag in nonSpecificResult.tags) {\n        specificResult.tags[tag] = true;\n    }\n    specificResult.tags['ENPrioritizeSpecificDateRefiner'] = true;\n    return specificResult;\n}\n\nexports.Refiner = function ENPrioritizeSpecificDateRefiner() {\n    Refiner.call(this);\n\n    this.refine = function(text, results, opt) {\n\n        if (results.length < 2) return results;\n\n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n\n        for (var i = 1; i < results.length; i++) {\n\n            currResult = results[i];\n            prevResult = results[i-1];\n\n            if (isMoreSpecific(prevResult, currResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n\n                prevResult = mergeResult(text, prevResult, currResult);\n                currResult = null;\n                i += 1;\n\n            } else if (isMoreSpecific(currResult, prevResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n\n                prevResult = mergeResult(text, currResult, prevResult);\n                currResult = null;\n                i += 1;\n            }\n\n            mergedResult.push(prevResult);\n        }\n\n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n        return mergedResult;\n    }\n}\n","/*\n\n*/\nvar Refiner = require('./refiner').Refiner;\n\n// Map ABBR -> Offset in minute\nvar TIMEZONE_ABBR_MAP = {};\nvar TIMEZONE_NAME_PATTERN = new RegExp(\"^\\\\s*\\\\(?([A-Z]{2,4})\\\\)?(?=\\\\W|$)\", 'i');\n\nexports.Refiner = function ExtractTimezoneAbbrRefiner() {\n\tRefiner.call(this);\n\n\tthis.refine = function(text, results, opt) {\n\n\t\tresults.forEach(function(result) {\n\n            if (!result.tags['ENTimeExpressionParser'] && !result.tags['ZHTimeExpressionParser'] && !result.tags['FRTimeExpressionParser'] && !result.tags['DETimeExpressionParser']) {\n                return;\n            }\n\n            var match = TIMEZONE_NAME_PATTERN.exec(text.substring(result.index + result.text.length));\n            if (match) {\n                var timezoneAbbr = match[1].toUpperCase();\n                if (TIMEZONE_ABBR_MAP[timezoneAbbr] === undefined) {\n                    return;\n                }\n\n                var timezoneOffset = TIMEZONE_ABBR_MAP[timezoneAbbr];\n                if (!result.start.isCertain('timezoneOffset')) {\n                    result.start.assign('timezoneOffset', timezoneOffset);\n                }\n\n                if (result.end != null && !result.end.isCertain('timezoneOffset')) {\n                    result.end.assign('timezoneOffset', timezoneOffset);\n                }\n\n                result.text += match[0];\n                result.tags['ExtractTimezoneAbbrRefiner'] = true;\n            }\n\t\t});\n\n        return results;\n\t}\n}\n\n// TODO: Move this to some configuration\nTIMEZONE_ABBR_MAP = {\"ACDT\":630,\"ACST\":570,\"ADT\":-180,\"AEDT\":660,\"AEST\":600,\"AFT\":270,\"AKDT\":-480,\"AKST\":-540,\"ALMT\":360,\"AMST\":-180,\"AMT\":-240,\"ANAST\":720,\"ANAT\":720,\"AQTT\":300,\"ART\":-180,\"AST\":-240,\"AWDT\":540,\"AWST\":480,\"AZOST\":0,\"AZOT\":-60,\"AZST\":300,\"AZT\":240,\"BNT\":480,\"BOT\":-240,\"BRST\":-120,\"BRT\":-180,\"BST\":60,\"BTT\":360,\"CAST\":480,\"CAT\":120,\"CCT\":390,\"CDT\":-300,\"CEST\":120,\"CET\":60,\"CHADT\":825,\"CHAST\":765,\"CKT\":-600,\"CLST\":-180,\"CLT\":-240,\"COT\":-300,\"CST\":-360,\"CVT\":-60,\"CXT\":420,\"ChST\":600,\"DAVT\":420,\"EASST\":-300,\"EAST\":-360,\"EAT\":180,\"ECT\":-300,\"EDT\":-240,\"EEST\":180,\"EET\":120,\"EGST\":0,\"EGT\":-60,\"EST\":-300,\"ET\":-300,\"FJST\":780,\"FJT\":720,\"FKST\":-180,\"FKT\":-240,\"FNT\":-120,\"GALT\":-360,\"GAMT\":-540,\"GET\":240,\"GFT\":-180,\"GILT\":720,\"GMT\":0,\"GST\":240,\"GYT\":-240,\"HAA\":-180,\"HAC\":-300,\"HADT\":-540,\"HAE\":-240,\"HAP\":-420,\"HAR\":-360,\"HAST\":-600,\"HAT\":-90,\"HAY\":-480,\"HKT\":480,\"HLV\":-210,\"HNA\":-240,\"HNC\":-360,\"HNE\":-300,\"HNP\":-480,\"HNR\":-420,\"HNT\":-150,\"HNY\":-540,\"HOVT\":420,\"ICT\":420,\"IDT\":180,\"IOT\":360,\"IRDT\":270,\"IRKST\":540,\"IRKT\":540,\"IRST\":210,\"IST\":60,\"JST\":540,\"KGT\":360,\"KRAST\":480,\"KRAT\":480,\"KST\":540,\"KUYT\":240,\"LHDT\":660,\"LHST\":630,\"LINT\":840,\"MAGST\":720,\"MAGT\":720,\"MART\":-510,\"MAWT\":300,\"MDT\":-360,\"MESZ\":120,\"MEZ\":60,\"MHT\":720,\"MMT\":390,\"MSD\":240,\"MSK\":240,\"MST\":-420,\"MUT\":240,\"MVT\":300,\"MYT\":480,\"NCT\":660,\"NDT\":-90,\"NFT\":690,\"NOVST\":420,\"NOVT\":360,\"NPT\":345,\"NST\":-150,\"NUT\":-660,\"NZDT\":780,\"NZST\":720,\"OMSST\":420,\"OMST\":420,\"PDT\":-420,\"PET\":-300,\"PETST\":720,\"PETT\":720,\"PGT\":600,\"PHOT\":780,\"PHT\":480,\"PKT\":300,\"PMDT\":-120,\"PMST\":-180,\"PONT\":660,\"PST\":-480,\"PT\":-480,\"PWT\":540,\"PYST\":-180,\"PYT\":-240,\"RET\":240,\"SAMT\":240,\"SAST\":120,\"SBT\":660,\"SCT\":240,\"SGT\":480,\"SRT\":-180,\"SST\":-660,\"TAHT\":-600,\"TFT\":300,\"TJT\":300,\"TKT\":780,\"TLT\":540,\"TMT\":300,\"TVT\":720,\"ULAT\":480,\"UTC\":0,\"UYST\":-120,\"UYT\":-180,\"UZT\":300,\"VET\":-210,\"VLAST\":660,\"VLAT\":660,\"VUT\":660,\"WAST\":120,\"WAT\":60,\"WEST\":60,\"WESZ\":60,\"WET\":0,\"WEZ\":0,\"WFT\":720,\"WGST\":-120,\"WGT\":-180,\"WIB\":420,\"WIT\":540,\"WITA\":480,\"WST\":780,\"WT\":0,\"YAKST\":600,\"YAKT\":600,\"YAPT\":600,\"YEKST\":360,\"YEKT\":360}\n","/*\n  \n*/\nvar Refiner = require('./refiner').Refiner;\n\n\nvar TIMEZONE_OFFSET_PATTERN = new RegExp(\"^\\\\s*(GMT|UTC)?(\\\\+|\\\\-)(\\\\d{1,2}):?(\\\\d{2})\", 'i');\nvar TIMEZONE_OFFSET_SIGN_GROUP = 2;\nvar TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 3;\nvar TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 4;\n\nexports.Refiner = function ExtractTimezoneOffsetRefiner() {\n    Refiner.call(this);\n\n    this.refine = function(text, results, opt) {\n\n        results.forEach(function(result) {\n\n            if (result.start.isCertain('timezoneOffset')) {\n                return;\n            }\n\n            var match = TIMEZONE_OFFSET_PATTERN.exec(text.substring(result.index + result.text.length));\n            if (!match) {\n                return;\n            }\n\n            var hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]);\n            var minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP]);\n            var timezoneOffset = hourOffset * 60 + minuteOffset;\n            if (match[TIMEZONE_OFFSET_SIGN_GROUP] === '-') {\n                timezoneOffset = -timezoneOffset;\n            }\n\n            if (result.end != null) {\n                result.end.assign('timezoneOffset', timezoneOffset);\n            }\n\n            result.start.assign('timezoneOffset', timezoneOffset);\n            result.text += match[0];\n            result.tags['ExtractTimezoneOffsetRefiner'] = true;\n        });\n\n        return results;\n    }\n}\n","/*\r\n  \r\n*/\r\nvar Refiner = require('../refiner').Refiner;\r\n\r\nexports.Refiner = function FRMergeDateRangeRefiner() {\r\n    Refiner.call(this);\r\n\r\n    this.pattern = function () { return /^\\s*(à|a|\\-)\\s*$/i };\r\n\r\n    this.refine = function(text, results, opt) {\r\n\r\n        if (results.length < 2) return results;\r\n        \r\n        var mergedResult = [];\r\n        var currResult = null;\r\n        var prevResult = null;\r\n        \r\n        for (var i=1; i<results.length; i++){\r\n            \r\n            currResult = results[i];\r\n            prevResult = results[i-1];\r\n            \r\n            if (!prevResult.end && !currResult.end \r\n                && this.isAbleToMerge(text, prevResult, currResult)) {\r\n              \r\n                prevResult = this.mergeResult(text, prevResult, currResult);\r\n                currResult = null;\r\n                i += 1;\r\n            }\r\n            \r\n            mergedResult.push(prevResult);\r\n        }\r\n        \r\n        if (currResult != null) {\r\n            mergedResult.push(currResult);\r\n        }\r\n\r\n\r\n        return mergedResult;\r\n    };\r\n\r\n    this.isAbleToMerge = function(text, result1, result2) {\r\n        var begin = result1.index + result1.text.length;\r\n        var end   = result2.index;\r\n        var textBetween = text.substring(begin,end);\r\n\r\n        return textBetween.match(this.pattern());\r\n    };\r\n\r\n    this.isWeekdayResult = function (result) {\r\n        return result.start.isCertain('weekday') && !result.start.isCertain('day');\r\n    };\r\n\r\n    this.mergeResult = function(text, fromResult, toResult) {\r\n\r\n        if (!this.isWeekdayResult(fromResult) && !this.isWeekdayResult(toResult)) {\r\n\r\n            for (var key in toResult.start.knownValues) {\r\n                if (!fromResult.start.isCertain(key)) {\r\n                    fromResult.start.assign(key, toResult.start.get(key));\r\n                }\r\n            }\r\n\r\n            for (var key in fromResult.start.knownValues) {\r\n                if (!toResult.start.isCertain(key)) {\r\n                    toResult.start.assign(key, fromResult.start.get(key));\r\n                }\r\n            }\r\n        }\r\n\r\n        if (fromResult.start.date().getTime() > toResult.start.date()) {\r\n            var tmp = toResult;\r\n            toResult = fromResult;\r\n            fromResult = tmp;\r\n        }\r\n        \r\n        fromResult.end = toResult.start;\r\n\r\n        \r\n\r\n        for (var tag in toResult.tags) {\r\n            fromResult.tags[tag] = true;\r\n        }\r\n\r\n            \r\n        var startIndex = Math.min(fromResult.index, toResult.index);\r\n        var endIndex = Math.max(\r\n            fromResult.index + fromResult.text.length, \r\n            toResult.index + toResult.text.length);\r\n            \r\n        fromResult.index = startIndex;\r\n        fromResult.text  = text.substring(startIndex, endIndex);\r\n        fromResult.tags[this.constructor.name] = true;\r\n        return fromResult;\r\n    }\r\n};\r\n\r\n","/*\r\n    \r\n*/\r\nvar ParsedComponents = require('../../result').ParsedComponents;\r\nvar Refiner = require('../refiner').Refiner;\r\nvar mergeDateTimeComponent = require('../EN/ENMergeDateTimeRefiner').mergeDateTimeComponent;\r\n\r\nvar PATTERN = new RegExp(\"^\\\\s*(T|à|a|vers|de|,|-)?\\\\s*$\");\r\n\r\nfunction isDateOnly(result) {\r\n    return !result.start.isCertain('hour') || result.tags['FRCasualDateParser'];\r\n}\r\n    \r\nfunction isTimeOnly(result) {\r\n    return !result.start.isCertain('month') && !result.start.isCertain('weekday');\r\n}\r\n\r\n\r\nfunction isAbleToMerge(text, prevResult, curResult) {\r\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\r\n    return textBetween.match(PATTERN);\r\n}\r\n\r\nfunction mergeResult(text, dateResult, timeResult){\r\n\r\n    var beginDate = dateResult.start;\r\n    var beginTime = timeResult.start;\r\n    var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\r\n\r\n    if (dateResult.end != null || timeResult.end != null) {\r\n        \r\n        var endDate   = dateResult.end == null ? dateResult.start : dateResult.end;            \r\n        var endTime   = timeResult.end == null ? timeResult.start : timeResult.end;\r\n        var endDateTime = mergeDateTimeComponent(endDate, endTime);\r\n        \r\n        if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\r\n            // Ex. 9pm - 1am\r\n            if (endDateTime.isCertain('day')) {\r\n                endDateTime.assign('day', endDateTime.get('day') + 1);\r\n            } else {\r\n                endDateTime.imply('day', endDateTime.get('day') + 1);\r\n            }\r\n        }\r\n\r\n        dateResult.end = endDateTime;\r\n    }\r\n\r\n    dateResult.start = beginDateTime;    \r\n\r\n    var startIndex = Math.min(dateResult.index, timeResult.index);\r\n    var endIndex = Math.max(\r\n            dateResult.index + dateResult.text.length, \r\n            timeResult.index + timeResult.text.length);\r\n    \r\n    dateResult.index = startIndex;\r\n    dateResult.text  = text.substring(startIndex, endIndex);\r\n\r\n    for (var tag in timeResult.tags) {\r\n        dateResult.tags[tag] = true;\r\n    }\r\n    dateResult.tags['FRMergeDateAndTimeRefiner'] = true;\r\n    return dateResult;\r\n}\r\n\r\nexports.Refiner = function FRMergeDateTimeRefiner() {\r\n    Refiner.call(this);\r\n\r\n\r\n    this.refine = function(text, results, opt) { \r\n\r\n        if (results.length < 2) return results;\r\n\r\n        var mergedResult = [];\r\n        var currResult = null;\r\n        var prevResult = null;\r\n\r\n        for (var i = 1; i < results.length; i++) {\r\n\r\n            currResult = results[i];\r\n            prevResult = results[i-1];\r\n            \r\n            if (isDateOnly(prevResult) && isTimeOnly(currResult) \r\n                    && isAbleToMerge(text, prevResult, currResult)) {\r\n                \r\n                prevResult = mergeResult(text, prevResult, currResult);\r\n                currResult = null;\r\n                i += 1;\r\n                \r\n            } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\r\n                    && isAbleToMerge(text, prevResult, currResult)) {\r\n                \r\n                prevResult = mergeResult(text, currResult, prevResult);\r\n                currResult = null;\r\n                i += 1;\r\n            }\r\n            \r\n            mergedResult.push(prevResult);\r\n        }\r\n\r\n        if (currResult != null) {\r\n            mergedResult.push(currResult);\r\n        }\r\n\r\n        return mergedResult;\r\n    }\r\n}","/*\n    Enforce 'forwardDate' option to on the results. When there are missing component,\n    e.g. \"March 12-13 (without year)\" or \"Thursday\", the refiner will try to adjust the result\n    into the future instead of the past.\n*/\nvar moment = require('moment');\nvar Refiner = require('./refiner').Refiner;\n\nexports.Refiner = function ForwardDateRefiner() {\n    Refiner.call(this);\n\n    this.refine = function(text, results, opt) {\n\n        if (!opt['forwardDate']) {\n            return results;\n        }\n\n        results.forEach(function(result) {\n\n            var refMoment = moment(result.ref);\n\n            if (result.start.isCertain('day') && result.start.isCertain('month') &&\n                !result.start.isCertain('year') &&\n                refMoment.isAfter(result.start.moment())\n            ) {\n                // Adjust year into the future\n                for (var i=0; i < 3 && refMoment.isAfter(result.start.moment()); i++) {\n                    result.start.imply('year', result.start.get('year') + 1);\n\n                    if (result.end && !result.end.isCertain('year')) {\n                        result.end.imply('year', result.end.get('year') + 1);\n                    }\n                }\n\n                result.tags['ExtractTimezoneOffsetRefiner'] = true;\n            }\n\n            if (!result.start.isCertain('day') && !result.start.isCertain('month') && !result.start.isCertain('year') &&\n                result.start.isCertain('weekday') &&\n                refMoment.isAfter(result.start.moment())\n            ) {\n                // Adjust date to the coming week\n                if (refMoment.day() > result.start.get('weekday')) {\n                    refMoment.day(result.start.get('weekday') + 7);\n                } else {\n                    refMoment.day(result.start.get('weekday'));\n                }\n\n                result.start.imply('day', refMoment.date());\n                result.start.imply('month', refMoment.month() + 1);\n                result.start.imply('year', refMoment.year());\n                result.tags['ExtractTimezoneOffsetRefiner'] = true;\n            }\n        });\n\n        return results;\n    }\n};\n","/*\n  \n*/\nvar ENMergeDateRangeRefiner = require('../EN/ENMergeDateRangeRefiner').Refiner;\n\nexports.Refiner = function JPMergeDateRangeRefiner() {\n    ENMergeDateRangeRefiner.call(this);\n\n    this.pattern = function () { return /^\\s*(から|ー)\\s*$/i };\n}\n\n","/*\n  \n*/\nvar Refiner = require('./refiner').Refiner;\n\nexports.Refiner = function OverlapRemovalRefiner() {\n\tRefiner.call(this);\n\t\n\n\tthis.refine = function(text, results, opt) { \n\n        if (results.length < 2) return results;\n        \n        var filteredResults = [];\n        var prevResult = results[0];\n        \n        for (var i=1; i<results.length; i++){\n            \n            var result = results[i];\n            \n            // If overlap, compare the length and discard the shorter one\n            if (result.index < prevResult.index + prevResult.text.length) {\n\n                if (result.text.length > prevResult.text.length){\n                    prevResult = result;\n                }\n                \n            } else {\n                filteredResults.push(prevResult);\n                prevResult = result;\n            }\n        }\n        \n        // The last one\n        if (prevResult != null) {\n            filteredResults.push(prevResult);\n        }\n\n        return filteredResults;\n    }\n}","/*\n  \n*/\nvar Filter = require('./refiner').Filter;\n\nexports.Refiner = function UnlikelyFormatFilter() {\n    Filter.call(this);\n    \n\n    this.isValid = function(text, result, opt) { \n\n        if (result.text.replace(' ','').match(/^\\d*(\\.\\d*)?$/)) {\n            return false;\n        }\n\n        return true; \n    }\n}","\nexports.Refiner = function Refiner() { \n\n    this.refine = function(text, results, opt) { return results; };\n}\n\nexports.Filter = function Filter() { \n    \n    exports.Refiner.call(this);\n\n    this.isValid = function(text, result, opt) { return true; }\n    this.refine = function(text, results, opt) { \n\n        var filteredResult = [];\n        for (var i=0; i < results.length; i++) {\n\n            var result = results[i];\n            if (this.isValid(text, result, opt)) {\n                filteredResult.push(result);\n            }\n        }\n\n        return filteredResult;\n    }\n}\n\n\n// Common refiners\nexports.OverlapRemovalRefiner = require('./OverlapRemovalRefiner').Refiner;\nexports.ExtractTimezoneOffsetRefiner = require('./ExtractTimezoneOffsetRefiner').Refiner;\nexports.ExtractTimezoneAbbrRefiner = require('./ExtractTimezoneAbbrRefiner').Refiner;\nexports.ForwardDateRefiner = require('./ForwardDateRefiner').Refiner;\nexports.UnlikelyFormatFilter = require('./UnlikelyFormatFilter').Refiner;\n\n// EN refiners\nexports.ENMergeDateTimeRefiner = require('./EN/ENMergeDateTimeRefiner').Refiner;\nexports.ENMergeDateRangeRefiner = require('./EN/ENMergeDateRangeRefiner').Refiner;\nexports.ENPrioritizeSpecificDateRefiner = require('./EN/ENPrioritizeSpecificDateRefiner').Refiner;\n\n// JP refiners\nexports.JPMergeDateRangeRefiner = require('./JP/JPMergeDateRangeRefiner').Refiner;\n\n// FR refiners\nexports.FRMergeDateRangeRefiner = require('./FR/FRMergeDateRangeRefiner').Refiner;\nexports.FRMergeDateTimeRefiner = require('./FR/FRMergeDateTimeRefiner').Refiner;\n\n// DE refiners\nexports.DEMergeDateRangeRefiner = require('./DE/DEMergeDateRangeRefiner').Refiner;\nexports.DEMergeDateTimeRefiner = require('./DE/DEMergeDateTimeRefiner').Refiner;\n","var moment = require('moment');\n\nfunction ParsedResult(result){\n    result = result || {};\n\n    this.ref   = result.ref;\n    this.index = result.index;\n    this.text  = result.text;\n    this.tags  = result.tags || {};\n\n    this.start = new ParsedComponents(result.start, result.ref)\n    if(result.end){\n        this.end = new ParsedComponents(result.end, result.ref)\n    }\n}\n\nParsedResult.prototype.clone = function() {\n    var result = new ParsedResult(this);\n    result.tags = JSON.parse(JSON.stringify(this.tags));\n    result.start = this.start.clone();\n    if (this.end) {\n        result.end = this.end.clone();\n    }\n}\n\nParsedResult.prototype.hasPossibleDates = function() {\n    return this.start.isPossibleDate() && (!this.end || this.end.isPossibleDate());\n}\n\n\nfunction ParsedComponents (components, ref){\n\n    this.knownValues = {};\n    this.impliedValues = {};\n\n    if (components) {\n        for (key in components) {\n            this.knownValues[key] = components[key];\n        }\n    }\n\n    if (ref) {\n        ref = moment(ref);\n        this.imply('day', ref.date())\n        this.imply('month', ref.month() + 1)\n        this.imply('year', ref.year())\n    }\n    \n\n    this.imply('hour', 12);\n    this.imply('minute', 0);\n    this.imply('second', 0);\n    this.imply('millisecond', 0);\n}\n\nParsedComponents.prototype.clone = function () {\n    var component = new ParsedComponents();\n    component.knownValues = JSON.parse(JSON.stringify(this.knownValues));\n    component.impliedValues = JSON.parse(JSON.stringify(this.impliedValues));\n    return component;\n};\n\nParsedComponents.prototype.get = function(component, value) {\n    if (component in this.knownValues) return this.knownValues[component];\n    if (component in this.impliedValues) return this.impliedValues[component];\n};\n\nParsedComponents.prototype.assign = function(component, value) {\n    this.knownValues[component] = value;\n    delete this.impliedValues[component];\n};\n\nParsedComponents.prototype.imply = function(component, value) {\n    if (component in this.knownValues) return;\n    this.impliedValues[component] = value;\n};\n\nParsedComponents.prototype.isCertain = function(component) {\n    return component in this.knownValues;\n};\n\nParsedComponents.prototype.isPossibleDate = function() {\n    var dateMoment = this.moment();\n    if (this.isCertain('timezoneOffset')) {\n        dateMoment.utcOffset(this.get('timezoneOffset'))\n    }\n\n    if (dateMoment.get('year') != this.get('year')) return false;\n    if (dateMoment.get('month') != this.get('month')-1) return false;\n    if (dateMoment.get('date') != this.get('day')) return false;\n    if (dateMoment.get('hour') != this.get('hour')) return false;\n    if (dateMoment.get('minute') != this.get('minute')) return false;\n\n    return true;\n};\n\nParsedComponents.prototype.date = function() {\n    var dateMoment = this.moment();\n    return dateMoment.toDate();\n};\n\nParsedComponents.prototype.moment = function() {\n    var dateMoment = moment();\n\n    dateMoment.set('year', this.get('year'));\n    dateMoment.set('month', this.get('month')-1);\n    dateMoment.set('date', this.get('day'));\n    dateMoment.set('hour', this.get('hour'));\n    dateMoment.set('minute', this.get('minute'));\n    dateMoment.set('second', this.get('second'));\n    dateMoment.set('millisecond', this.get('millisecond'));\n\n    // Javascript Date Object return minus timezone offset\n    var currentTimezoneOffset = dateMoment.utcOffset();\n    var targetTimezoneOffset = this.get('timezoneOffset') !== undefined ? \n        this.get('timezoneOffset') : currentTimezoneOffset;\n\n    var adjustTimezoneOffset = targetTimezoneOffset - currentTimezoneOffset;\n    dateMoment.add(-adjustTimezoneOffset, 'minutes');\n\n    return dateMoment;\n};\n\n\n\nexports.ParsedComponents = ParsedComponents;\nexports.ParsedResult = ParsedResult;\n","exports.WEEKDAY_OFFSET = { \n    'sonntag': 0, \n    'so': 0, \n    'montag': 1, \n    'mo': 1,\n    'dienstag': 2, \n    'di':2, \n    'mittwoch': 3, \n    'mi': 3, \n    'donnerstag': 4, \n    'do': 4, \n    'freitag': 5, \n    'fr': 5,\n    'samstag': 6, \n    'sa': 6\n};\n    \nexports.MONTH_OFFSET = { \n    'januar': 1,\n    'jan': 1,\n    'jan.': 1,\n    'februar': 2,\n    'feb': 2,\n    'feb.': 2,\n    'märz': 3,\n    'maerz': 3,\n    'mär': 3,\n    'mär.': 3,\n    'mrz': 3,\n    'mrz.': 3,\n    'april': 4,\n    'apr': 4,\n    'apr.': 4,\n    'mai': 5,\n    'juni': 6,\n    'jun': 6,\n    'jun.': 6,\n    'juli': 7,\n    'jul': 7,\n    'jul.': 7,\n    'august': 8,\n    'aug': 8,\n    'aug.': 8,\n    'september': 9,\n    'sep': 9,\n    'sep.': 9,\n    'sept': 9,\n    'sept.': 9,\n    'oktober': 10,\n    'okt': 10,\n    'okt.': 10,\n    'november': 11,\n    'nov': 11,\n    'nov.': 11,\n    'dezember': 12,\n    'dez': 12,\n    'dez.': 12\n};\n\nexports.INTEGER_WORDS_PATTERN = '(?:eins|zwei|drei|vier|fünf|fuenf|sechs|sieben|acht|neun|zehn|elf|zwölf|zwoelf)';\nexports.INTEGER_WORDS = {\n    'eins' : 1,\n    'zwei' : 2,\n    'drei' : 3,\n    'vier' : 4,\n    'fünf' : 5,\n    'fuenf': 5,\n    'sechs' : 6,\n    'sieben' : 7,\n    'acht' : 8,\n    'neun' : 9,\n    'zehn' : 10,\n    'elf' : 11,\n    'zwölf' : 12,\n    'zwoelf' : 12\n};\n","exports.WEEKDAY_OFFSET = { \n    'sunday': 0, \n    'sun': 0, \n    'monday': 1, \n    'mon': 1,\n    'tuesday': 2, \n    'tue':2, \n    'wednesday': 3, \n    'wed': 3, \n    'thursday': 4, \n    'thur': 4, \n    'thu': 4,\n    'friday': 5, \n    'fri': 5,\n    'saturday': 6, \n    'sat': 6\n};\n    \nexports.MONTH_OFFSET = { \n    'january': 1,\n    'jan': 1,\n    'jan.': 1,\n    'february': 2,\n    'feb': 2,\n    'feb.': 2,\n    'march': 3,\n    'mar': 3,\n    'mar.': 3,\n    'april': 4,\n    'apr': 4,\n    'apr.': 4,\n    'may': 5,\n    'june': 6,\n    'jun': 6,\n    'jun.': 6,\n    'july': 7,\n    'jul': 7,\n    'jul.': 7,\n    'august': 8,\n    'aug': 8,\n    'aug.': 8,\n    'september': 9,\n    'sep': 9,\n    'sep.': 9,\n    'sept': 9,\n    'sept.': 9,\n    'october': 10,\n    'oct': 10,\n    'oct.': 10,\n    'november': 11,\n    'nov': 11,\n    'nov.': 11,\n    'december': 12,\n    'dec': 12,\n    'dec.': 12\n};\n\nexports.INTEGER_WORDS = {\n    'one' : 1,\n    'two' : 2,\n    'three' : 3,\n    'four' : 4,\n    'five' : 5,\n    'six' : 6,\n    'seven' : 7,\n    'eight' : 8,\n    'nine' : 9,\n    'ten' : 10,\n    'eleven' : 11,\n    'twelve' : 12\n};\nexports.INTEGER_WORDS_PATTERN = '(?:' \n    + Object.keys(exports.INTEGER_WORDS).join('|') \n    +')';\n\nexports.ORDINAL_WORDS = {\n    'first' : 1,\n    'second': 2,\n    'third': 3,\n    'fourth': 4,\n    'fifth': 5,\n    'sixth': 6,\n    'seventh': 7,\n    'eighth': 8,\n    'ninth': 9,\n    'tenth': 10,\n    'eleventh': 11,\n    'twelfth': 12,\n    'thirteenth': 13,\n    'fourteenth': 14,\n    'fifteenth': 15,\n    'sixteenth': 16,\n    'seventeenth': 17,\n    'eighteenth': 18,\n    'nineteenth': 19,\n    'twentieth': 20,\n    'twenty first': 21,\n    'twenty second': 22,\n    'twenty third': 23,\n    'twenty fourth': 24,\n    'twenty fifth': 25,\n    'twenty sixth': 26,\n    'twenty seventh': 27,\n    'twenty eighth': 28,\n    'twenty ninth': 29,\n    'thirtieth': 30,\n    'thirty first': 31\n};\nexports.ORDINAL_WORDS_PATTERN = '(?:' \n    + Object.keys(exports.ORDINAL_WORDS).join('|').replace(/ /g, '[ -]') \n    + ')';\n\nvar TIME_UNIT = \n    '(' + exports.INTEGER_WORDS_PATTERN + '|[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n    '(sec(?:onds?)?|min(?:ute)?s?|hours?|weeks?|days?|months?|years?)\\\\s*';\n\nvar TIME_UNIT_STRICT = \n    '([0-9]+|an?)\\\\s*' +\n    '(seconds?|minutes?|hours?|days?)\\\\s*';\n\nvar PATTERN_TIME_UNIT = new RegExp(TIME_UNIT, 'i');\n\nexports.TIME_UNIT_PATTERN = '(?:' + TIME_UNIT + ')+';\nexports.TIME_UNIT_STRICT_PATTERN = '(?:' + TIME_UNIT_STRICT + ')+';\n\nexports.extractDateTimeUnitFragments = function (timeunitText) {\n    var fragments = {};\n    var remainingText = timeunitText;\n    var match = PATTERN_TIME_UNIT.exec(remainingText);\n    while (match) {\n        collectDateTimeFragment(match, fragments);\n        remainingText = remainingText.substring(match[0].length);\n        match = PATTERN_TIME_UNIT.exec(remainingText);\n    }\n    return fragments;\n};\n\nfunction collectDateTimeFragment(match, fragments) {\n    var num = match[1].toLowerCase() ;\n    if (exports.INTEGER_WORDS[num] !== undefined) {\n        num = exports.INTEGER_WORDS[num];\n    } else if(num === 'a' || num === 'an'){\n        num = 1;\n    } else if (num.match(/few/)) {\n        num = 3;\n    } else if (num.match(/half/)) {\n        num = 0.5;\n    } else {\n        num = parseInt(num);\n    }\n\n    if (match[2].match(/hour/i)) {\n        fragments['hour'] = num;\n    } else if (match[2].match(/min/i)) {\n        fragments['minute'] = num;\n    } else if (match[2].match(/sec/i)) {\n        fragments['second'] = num;\n    } else if (match[2].match(/week/i)) {\n        fragments['week'] = num;\n    } else if (match[2].match(/day/i)) {\n        fragments['d'] = num;\n    } else if (match[2].match(/month/i)) {\n        fragments['month'] = num;\n    } else if (match[2].match(/year/i)) {\n        fragments['year'] = num;\n    }\n\n    return fragments;\n}","exports.WEEKDAY_OFFSET = {\n    'domingo': 0,\n    'dom': 0,\n    'lunes': 1,\n    'lun': 1,\n    'martes': 2,\n    'mar':2,\n    'miércoles': 3,\n    'miercoles': 3,\n    'mie': 3,\n    'jueves': 4,\n    'jue': 4,\n    'viernes': 5,\n    'vie': 5,\n    'sábado': 6,\n    'sabado': 6,\n    'sab': 6,}\n\nexports.MONTH_OFFSET = {\n    'enero': 1,\n    'ene': 1,\n    'ene.': 1,\n    'febrero': 2,\n    'feb': 2,\n    'feb.': 2,\n    'marzo': 3,\n    'mar': 3,\n    'mar.': 3,\n    'abril': 4,\n    'abr': 4,\n    'abr.': 4,\n    'mayo': 5,\n    'may': 5,\n    'may.': 5,\n    'junio': 6,\n    'jun': 6,\n    'jun.': 6,\n    'julio': 7,\n    'jul': 7,\n    'jul.': 7,\n    'agosto': 8,\n    'ago': 8,\n    'ago.': 8,\n    'septiembre': 9,\n    'sep': 9,\n    'sept': 9,\n    'sep.': 9,\n    'sept.': 9,\n    'octubre': 10,\n    'oct': 10,\n    'oct.': 10,\n    'noviembre': 11,\n    'nov': 11,\n    'nov.': 11,\n    'diciembre': 12,\n    'dic': 12,\n    'dic.': 12,\n}\n","exports.WEEKDAY_OFFSET = { \r\n    'dimanche': 0, \r\n    'dim': 0, \r\n    'lundi': 1, \r\n    'lun': 1,\r\n    'mardi': 2, \r\n    'mar':2, \r\n    'mercredi': 3, \r\n    'mer': 3, \r\n    'jeudi': 4, \r\n    'jeu': 4, \r\n    'vendredi': 5, \r\n    'ven': 5,\r\n    'samedi': 6, \r\n    'sam': 6\r\n};\r\n    \r\nexports.MONTH_OFFSET = { \r\n    'janvier': 1,\r\n    'jan': 1,\r\n    'jan.': 1,\r\n    'février': 2,\r\n    'fév': 2,\r\n    'fév.': 2,\r\n    'fevrier': 2,\r\n    'fev': 2,\r\n    'fev.': 2,\r\n    'mars': 3,\r\n    'mar': 3,\r\n    'mar.': 3,\r\n    'avril': 4,\r\n    'avr': 4,\r\n    'avr.': 4,\r\n    'mai': 5,\r\n    'juin': 6,\r\n    'jun': 6,\r\n    'juillet': 7,\r\n    'jul': 7,\r\n    'jul.': 7,\r\n    'août': 8,\r\n    'aout': 8,\r\n    'septembre': 9,\r\n    'sep': 9,\r\n    'sep.': 9,\r\n    'sept': 9,\r\n    'sept.': 9,\r\n    'octobre': 10,\r\n    'oct': 10,\r\n    'oct.': 10,\r\n    'novembre': 11,\r\n    'nov': 11,\r\n    'nov.': 11,\r\n    'décembre': 12,\r\n    'decembre': 12,\r\n    'dec': 12,\r\n    'dec.': 12\r\n};\r\n\r\nexports.INTEGER_WORDS_PATTERN = '(?:un|deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize)';\r\nexports.INTEGER_WORDS = {\r\n    'un' : 1,\r\n    'deux' : 2,\r\n    'trois' : 3,\r\n    'quatre' : 4,\r\n    'cinq' : 5,\r\n    'six' : 6,\r\n    'sept' : 7,\r\n    'huit' : 8,\r\n    'neuf' : 9,\r\n    'dix' : 10,\r\n    'onze' : 11,\r\n    'douze' : 12,\r\n    'treize' : 13,\r\n};\r\n","\n\n/**\n * to-hankaku.js\n * convert to ascii code strings.\n *\n * @version 1.0.1\n * @author think49\n * @url https://gist.github.com/964592\n * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)\n */\n \nexports.toHankaku = (function (String, fromCharCode) {\n \n    function toHankaku (string) {\n        return String(string).replace(/\\u2019/g, '\\u0027').replace(/\\u201D/g, '\\u0022').replace(/\\u3000/g, '\\u0020').replace(/\\uFFE5/g, '\\u00A5').replace(/[\\uFF01\\uFF03-\\uFF06\\uFF08\\uFF09\\uFF0C-\\uFF19\\uFF1C-\\uFF1F\\uFF21-\\uFF3B\\uFF3D\\uFF3F\\uFF41-\\uFF5B\\uFF5D\\uFF5E]/g, alphaNum);\n    }\n \n    function alphaNum (token) {\n        return fromCharCode(token.charCodeAt(0) - 65248);\n    }\n \n    return toHankaku;\n})(String, String.fromCharCode);\n\n/**\n * to-zenkaku.js\n * convert to multi byte strings.\n *\n * @version 1.0.2\n * @author think49\n * @url https://gist.github.com/964592\n * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)\n */\nexports.toZenkaku = (function (String, fromCharCode) {\n \n    function toZenkaku (string) {\n        return String(string).replace(/\\u0020/g, '\\u3000').replace(/\\u0022/g, '\\u201D').replace(/\\u0027/g, '\\u2019').replace(/\\u00A5/g, '\\uFFE5').replace(/[!#-&(),-9\\u003C-?A-[\\u005D_a-{}~]/g, alphaNum);\n    }\n \n    function alphaNum (token) {\n        return fromCharCode(token.charCodeAt(0) + 65248);\n    }\n \n    return toZenkaku;\n})(String, String.fromCharCode);","var NUMBER ={\n  '零':0,\n  '一':1,\n  '二':2,\n  '兩':2,\n  '三':3,\n  '四':4,\n  '五':5,\n  '六':6,\n  '七':7,\n  '八':8,\n  '九':9,\n  '十':10,\n  '廿':20,\n  '卅':30,\n};\n\nvar WEEKDAY_OFFSET ={\n  '天':0,\n  '日':0,\n  '一':1,\n  '二':2,\n  '三':3,\n  '四':4,\n  '五':5,\n  '六':6,\n};\n\nexports.NUMBER = NUMBER;\nexports.WEEKDAY_OFFSET = WEEKDAY_OFFSET;\n\nexports.zhStringToNumber=function(text){\n  var number = 0;\n  for(var i=0; i<text.length ;i++){\n    var char = text[i];\n    if(char === '十'){\n      number = number=== 0 ? NUMBER[char] : (number * NUMBER[char]);\n    }else{\n      number += NUMBER[char];\n    }\n  }\n  return number;\n};\n\nexports.zhStringToYear=function(text){\n  var string = '';\n  for(var i=0; i<text.length ;i++){\n    var char = text[i];\n    string = string + NUMBER[char];\n  }\n  return parseInt(string);\n};\n"]}