ezii-os 1.1.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (621) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +11 -3
  3. data/Gemfile.lock +34 -17
  4. data/Procfile +1 -0
  5. data/app/assets/stylesheets/address_searches.scss +3 -0
  6. data/app/assets/stylesheets/application.css +6 -0
  7. data/app/assets/stylesheets/banal/documents.scss +3 -0
  8. data/app/assets/stylesheets/banal/employees.scss +3 -0
  9. data/app/assets/stylesheets/banal/links.scss +3 -0
  10. data/app/assets/stylesheets/banal/metadata.scss +3 -0
  11. data/app/assets/stylesheets/banal/related_objects.scss +3 -0
  12. data/app/assets/stylesheets/banal_complexes.scss +3 -0
  13. data/app/assets/stylesheets/comments.scss +3 -0
  14. data/app/assets/stylesheets/employees.scss +3 -0
  15. data/app/controllers/address_searches_controller.rb +76 -0
  16. data/app/controllers/banal/brainstorms_controller.rb +22 -2
  17. data/app/controllers/banal/documents_controller.rb +90 -0
  18. data/app/controllers/banal/employees_controller.rb +74 -0
  19. data/app/controllers/banal/links_controller.rb +82 -0
  20. data/app/controllers/banal/metadata_controller.rb +74 -0
  21. data/app/controllers/banal/projects_controller.rb +1 -1
  22. data/app/controllers/banal/related_objects_controller.rb +74 -0
  23. data/app/controllers/banal_complexes_controller.rb +74 -0
  24. data/app/controllers/comments_controller.rb +90 -0
  25. data/app/controllers/concerns/banal/related_object_creation_and_linking.rb +11 -0
  26. data/app/controllers/employees_controller.rb +74 -0
  27. data/app/helpers/address_searches_helper.rb +2 -0
  28. data/app/helpers/banal/documents_helper.rb +2 -0
  29. data/app/helpers/banal/employees_helper.rb +2 -0
  30. data/app/helpers/banal/links_helper.rb +2 -0
  31. data/app/helpers/banal/metadata_helper.rb +2 -0
  32. data/app/helpers/banal/related_objects_helper.rb +2 -0
  33. data/app/helpers/banal_complexes_helper.rb +2 -0
  34. data/app/helpers/comments_helper.rb +2 -0
  35. data/app/helpers/employees_helper.rb +2 -0
  36. data/app/javascript/packs/application.js +5 -0
  37. data/app/models/address_search.rb +2 -0
  38. data/app/models/banal/brainstorm.rb +3 -0
  39. data/app/models/banal/document.rb +4 -0
  40. data/app/models/banal/employee.rb +2 -0
  41. data/app/models/banal/link.rb +4 -0
  42. data/app/models/banal/metadatum.rb +2 -0
  43. data/app/models/banal/project.rb +5 -3
  44. data/app/models/banal/related_object.rb +5 -0
  45. data/app/models/banal_complex.rb +3 -0
  46. data/app/models/banal_dropbox_api.rb +8 -0
  47. data/app/models/comment.rb +4 -0
  48. data/app/models/employee.rb +2 -0
  49. data/app/models/ezii_os_path.rb +8 -0
  50. data/app/views/address_searches/_address_search.json.jbuilder +2 -0
  51. data/app/views/address_searches/_form.html.erb +27 -0
  52. data/app/views/address_searches/edit.html.erb +6 -0
  53. data/app/views/address_searches/index.html.erb +29 -0
  54. data/app/views/address_searches/index.json.jbuilder +1 -0
  55. data/app/views/address_searches/new.html.erb +5 -0
  56. data/app/views/address_searches/show.html.erb +18 -0
  57. data/app/views/address_searches/show.json.jbuilder +1 -0
  58. data/app/views/application/_navbar.html.erb +10 -0
  59. data/app/views/banal/brainstorms/_comment.html.erb +35 -0
  60. data/app/views/banal/brainstorms/_comments.html.erb +3 -0
  61. data/app/views/banal/brainstorms/_form.html.erb +0 -5
  62. data/app/views/banal/brainstorms/index.html.erb +29 -6
  63. data/app/views/banal/documents/_banal_document.json.jbuilder +2 -0
  64. data/app/views/banal/documents/_form.html.erb +61 -0
  65. data/app/views/banal/documents/edit.html.erb +6 -0
  66. data/app/views/banal/documents/index.html.erb +31 -0
  67. data/app/views/banal/documents/index.json.jbuilder +1 -0
  68. data/app/views/banal/documents/new.html.erb +32 -0
  69. data/app/views/banal/documents/show.html.erb +19 -0
  70. data/app/views/banal/documents/show.json.jbuilder +1 -0
  71. data/app/views/banal/employees/_banal_employee.json.jbuilder +2 -0
  72. data/app/views/banal/employees/_form.html.erb +77 -0
  73. data/app/views/banal/employees/edit.html.erb +6 -0
  74. data/app/views/banal/employees/index.html.erb +49 -0
  75. data/app/views/banal/employees/index.json.jbuilder +1 -0
  76. data/app/views/banal/employees/new.html.erb +5 -0
  77. data/app/views/banal/employees/show.html.erb +64 -0
  78. data/app/views/banal/employees/show.json.jbuilder +1 -0
  79. data/app/views/banal/links/_banal_link.json.jbuilder +2 -0
  80. data/app/views/banal/links/_form.html.erb +47 -0
  81. data/app/views/banal/links/edit.html.erb +6 -0
  82. data/app/views/banal/links/index.html.erb +31 -0
  83. data/app/views/banal/links/index.json.jbuilder +1 -0
  84. data/app/views/banal/links/new.html.erb +5 -0
  85. data/app/views/banal/links/show.html.erb +19 -0
  86. data/app/views/banal/links/show.json.jbuilder +1 -0
  87. data/app/views/banal/metadata/_banal_metadatum.json.jbuilder +2 -0
  88. data/app/views/banal/metadata/_form.html.erb +32 -0
  89. data/app/views/banal/metadata/edit.html.erb +6 -0
  90. data/app/views/banal/metadata/index.html.erb +31 -0
  91. data/app/views/banal/metadata/index.json.jbuilder +1 -0
  92. data/app/views/banal/metadata/new.html.erb +5 -0
  93. data/app/views/banal/metadata/show.html.erb +19 -0
  94. data/app/views/banal/metadata/show.json.jbuilder +1 -0
  95. data/app/views/banal/projects/_banal_project.json.jbuilder +1 -1
  96. data/app/views/banal/projects/_form.html.erb +40 -0
  97. data/app/views/banal/projects/index.html.erb +18 -4
  98. data/app/views/banal/projects/show.html.erb +65 -3
  99. data/app/views/banal/related_objects/_banal_related_object.json.jbuilder +2 -0
  100. data/app/views/banal/related_objects/_form.html.erb +27 -0
  101. data/app/views/banal/related_objects/_hidden_fields.html.erb +2 -0
  102. data/app/views/banal/related_objects/edit.html.erb +6 -0
  103. data/app/views/banal/related_objects/index.html.erb +29 -0
  104. data/app/views/banal/related_objects/index.json.jbuilder +1 -0
  105. data/app/views/banal/related_objects/new.html.erb +5 -0
  106. data/app/views/banal/related_objects/show.html.erb +14 -0
  107. data/app/views/banal/related_objects/show.json.jbuilder +1 -0
  108. data/app/views/banal_complexes/_banal_complex.json.jbuilder +2 -0
  109. data/app/views/banal_complexes/_form.html.erb +27 -0
  110. data/app/views/banal_complexes/edit.html.erb +6 -0
  111. data/app/views/banal_complexes/index.html.erb +42 -0
  112. data/app/views/banal_complexes/index.json.jbuilder +1 -0
  113. data/app/views/banal_complexes/new.html.erb +5 -0
  114. data/app/views/banal_complexes/show.html.erb +14 -0
  115. data/app/views/banal_complexes/show.json.jbuilder +1 -0
  116. data/app/views/comments/_comment.json.jbuilder +2 -0
  117. data/app/views/comments/_form.html.erb +32 -0
  118. data/app/views/comments/edit.html.erb +6 -0
  119. data/app/views/comments/index.html.erb +31 -0
  120. data/app/views/comments/index.json.jbuilder +1 -0
  121. data/app/views/comments/new.html.erb +5 -0
  122. data/app/views/comments/show.html.erb +19 -0
  123. data/app/views/comments/show.json.jbuilder +1 -0
  124. data/app/views/directories/show.html.erb +17 -3
  125. data/app/views/employees/_employee.json.jbuilder +2 -0
  126. data/app/views/employees/_form.html.erb +77 -0
  127. data/app/views/employees/edit.html.erb +6 -0
  128. data/app/views/employees/index.html.erb +49 -0
  129. data/app/views/employees/index.json.jbuilder +1 -0
  130. data/app/views/employees/new.html.erb +5 -0
  131. data/app/views/employees/show.html.erb +64 -0
  132. data/app/views/employees/show.json.jbuilder +1 -0
  133. data/app/views/layouts/application.html.erb +87 -5
  134. data/banal-data-science.bash +4 -0
  135. data/config/database.yml +3 -24
  136. data/config/routes.rb +24 -1
  137. data/db/development.sqlite3 +0 -0
  138. data/db/migrate/20190913073109_create_banal_projects.rb +17 -0
  139. data/db/migrate/20190913073110_create_banal_metadata.rb +11 -0
  140. data/db/migrate/20190913073111_create_banal_related_objects.rb +10 -0
  141. data/db/migrate/20190913143313_create_banal_documents.rb +11 -0
  142. data/db/migrate/20190913143326_create_banal_links.rb +11 -0
  143. data/db/migrate/20190915110713_add_dropbox_file_id_to_banal_documents.rb +5 -0
  144. data/db/migrate/20190915195312_add_deleted_at_to_banal_brainstorms.rb +6 -0
  145. data/db/migrate/20190915205450_create_employees.rb +20 -0
  146. data/db/migrate/20190915205629_create_banal_employees.rb +20 -0
  147. data/db/migrate/20190916094440_create_address_searches.rb +10 -0
  148. data/db/migrate/20190918222028_create_comments.rb +12 -0
  149. data/db/migrate/20190919164900_create_banal_complexes.rb +11 -0
  150. data/db/schema.rb +137 -7
  151. data/ezii-os-2.0.0.gem +0 -0
  152. data/ezii-os.gemspec +3 -4
  153. data/latest.dump +0 -0
  154. data/log/development.log +22199 -0
  155. data/node_modules/chart.js/LICENSE.md +9 -0
  156. data/node_modules/chart.js/README.md +32 -0
  157. data/node_modules/chart.js/bower.json +16 -0
  158. data/node_modules/chart.js/composer.json +26 -0
  159. data/node_modules/chart.js/dist/Chart.bundle.js +19288 -0
  160. data/node_modules/chart.js/dist/Chart.bundle.min.js +7 -0
  161. data/node_modules/chart.js/dist/Chart.css +47 -0
  162. data/node_modules/chart.js/dist/Chart.js +14680 -0
  163. data/node_modules/chart.js/dist/Chart.min.css +1 -0
  164. data/node_modules/chart.js/dist/Chart.min.js +7 -0
  165. data/node_modules/chart.js/package.json +69 -0
  166. data/node_modules/chartjs-color/CHANGELOG.md +35 -0
  167. data/node_modules/chartjs-color/LICENSE +21 -0
  168. data/node_modules/chartjs-color/README.md +126 -0
  169. data/node_modules/chartjs-color/index.js +485 -0
  170. data/node_modules/chartjs-color/node_modules/color-convert/CHANGELOG.md +4 -0
  171. data/node_modules/chartjs-color/node_modules/color-convert/LICENSE +21 -0
  172. data/node_modules/chartjs-color/node_modules/color-convert/README.md +57 -0
  173. data/node_modules/chartjs-color/node_modules/color-convert/component.json +9 -0
  174. data/node_modules/chartjs-color/node_modules/color-convert/conversions.js +698 -0
  175. data/node_modules/chartjs-color/node_modules/color-convert/index.js +92 -0
  176. data/node_modules/chartjs-color/node_modules/color-convert/package.json +20 -0
  177. data/node_modules/chartjs-color/node_modules/color-convert/test/basic.js +187 -0
  178. data/node_modules/chartjs-color/node_modules/color-convert/test/speed.js +23 -0
  179. data/node_modules/chartjs-color/package.json +49 -0
  180. data/node_modules/chartjs-color-string/CHANGELOG.md +11 -0
  181. data/node_modules/chartjs-color-string/LICENSE +21 -0
  182. data/node_modules/chartjs-color-string/README.md +46 -0
  183. data/node_modules/chartjs-color-string/color-string.js +237 -0
  184. data/node_modules/chartjs-color-string/package.json +24 -0
  185. data/node_modules/chartjs-color-string/test/basic.js +110 -0
  186. data/node_modules/chartkick/CHANGELOG.md +215 -0
  187. data/node_modules/chartkick/LICENSE.txt +22 -0
  188. data/node_modules/chartkick/README.md +537 -0
  189. data/node_modules/chartkick/dist/chartkick.esm.js +2286 -0
  190. data/node_modules/chartkick/dist/chartkick.js +2294 -0
  191. data/node_modules/chartkick/dist/chartkick.min.js +1 -0
  192. data/node_modules/chartkick/package.json +34 -0
  193. data/node_modules/{color-string → color-convert}/node_modules/color-name/LICENSE +0 -0
  194. data/node_modules/{color-string → color-convert}/node_modules/color-name/README.md +0 -0
  195. data/node_modules/{color-string → color-convert}/node_modules/color-name/index.js +0 -0
  196. data/node_modules/{color-string → color-convert}/node_modules/color-name/package.json +25 -28
  197. data/node_modules/{color-name → color-convert/node_modules/color-name}/test.js +0 -0
  198. data/node_modules/color-name/package.json +28 -25
  199. data/node_modules/moment/CHANGELOG.md +895 -0
  200. data/node_modules/moment/LICENSE +22 -0
  201. data/node_modules/moment/README.md +65 -0
  202. data/node_modules/moment/ender.js +1 -0
  203. data/node_modules/moment/locale/af.js +72 -0
  204. data/node_modules/moment/locale/ar-dz.js +58 -0
  205. data/node_modules/moment/locale/ar-kw.js +58 -0
  206. data/node_modules/moment/locale/ar-ly.js +121 -0
  207. data/node_modules/moment/locale/ar-ma.js +58 -0
  208. data/node_modules/moment/locale/ar-sa.js +103 -0
  209. data/node_modules/moment/locale/ar-tn.js +58 -0
  210. data/node_modules/moment/locale/ar.js +134 -0
  211. data/node_modules/moment/locale/az.js +104 -0
  212. data/node_modules/moment/locale/be.js +131 -0
  213. data/node_modules/moment/locale/bg.js +89 -0
  214. data/node_modules/moment/locale/bm.js +57 -0
  215. data/node_modules/moment/locale/bn.js +118 -0
  216. data/node_modules/moment/locale/bo.js +118 -0
  217. data/node_modules/moment/locale/br.js +107 -0
  218. data/node_modules/moment/locale/bs.js +150 -0
  219. data/node_modules/moment/locale/ca.js +87 -0
  220. data/node_modules/moment/locale/cs.js +171 -0
  221. data/node_modules/moment/locale/cv.js +62 -0
  222. data/node_modules/moment/locale/cy.js +79 -0
  223. data/node_modules/moment/locale/da.js +59 -0
  224. data/node_modules/moment/locale/de-at.js +75 -0
  225. data/node_modules/moment/locale/de-ch.js +75 -0
  226. data/node_modules/moment/locale/de.js +75 -0
  227. data/node_modules/moment/locale/dv.js +98 -0
  228. data/node_modules/moment/locale/el.js +99 -0
  229. data/node_modules/moment/locale/en-SG.js +66 -0
  230. data/node_modules/moment/locale/en-au.js +66 -0
  231. data/node_modules/moment/locale/en-ca.js +62 -0
  232. data/node_modules/moment/locale/en-gb.js +66 -0
  233. data/node_modules/moment/locale/en-ie.js +66 -0
  234. data/node_modules/moment/locale/en-il.js +61 -0
  235. data/node_modules/moment/locale/en-nz.js +66 -0
  236. data/node_modules/moment/locale/eo.js +70 -0
  237. data/node_modules/moment/locale/es-do.js +91 -0
  238. data/node_modules/moment/locale/es-us.js +91 -0
  239. data/node_modules/moment/locale/es.js +91 -0
  240. data/node_modules/moment/locale/et.js +79 -0
  241. data/node_modules/moment/locale/eu.js +65 -0
  242. data/node_modules/moment/locale/fa.js +105 -0
  243. data/node_modules/moment/locale/fi.js +108 -0
  244. data/node_modules/moment/locale/fo.js +59 -0
  245. data/node_modules/moment/locale/fr-ca.js +73 -0
  246. data/node_modules/moment/locale/fr-ch.js +77 -0
  247. data/node_modules/moment/locale/fr.js +82 -0
  248. data/node_modules/moment/locale/fy.js +74 -0
  249. data/node_modules/moment/locale/ga.js +76 -0
  250. data/node_modules/moment/locale/gd.js +75 -0
  251. data/node_modules/moment/locale/gl.js +76 -0
  252. data/node_modules/moment/locale/gom-latn.js +122 -0
  253. data/node_modules/moment/locale/gu.js +123 -0
  254. data/node_modules/moment/locale/he.js +96 -0
  255. data/node_modules/moment/locale/hi.js +123 -0
  256. data/node_modules/moment/locale/hr.js +153 -0
  257. data/node_modules/moment/locale/hu.js +109 -0
  258. data/node_modules/moment/locale/hy-am.js +94 -0
  259. data/node_modules/moment/locale/id.js +81 -0
  260. data/node_modules/moment/locale/is.js +131 -0
  261. data/node_modules/moment/locale/it-ch.js +68 -0
  262. data/node_modules/moment/locale/it.js +68 -0
  263. data/node_modules/moment/locale/ja.js +91 -0
  264. data/node_modules/moment/locale/jv.js +81 -0
  265. data/node_modules/moment/locale/ka.js +88 -0
  266. data/node_modules/moment/locale/kk.js +86 -0
  267. data/node_modules/moment/locale/km.js +109 -0
  268. data/node_modules/moment/locale/kn.js +125 -0
  269. data/node_modules/moment/locale/ko.js +80 -0
  270. data/node_modules/moment/locale/ku.js +118 -0
  271. data/node_modules/moment/locale/ky.js +86 -0
  272. data/node_modules/moment/locale/lb.js +135 -0
  273. data/node_modules/moment/locale/lo.js +69 -0
  274. data/node_modules/moment/locale/lt.js +117 -0
  275. data/node_modules/moment/locale/lv.js +96 -0
  276. data/node_modules/moment/locale/me.js +111 -0
  277. data/node_modules/moment/locale/mi.js +63 -0
  278. data/node_modules/moment/locale/mk.js +89 -0
  279. data/node_modules/moment/locale/ml.js +80 -0
  280. data/node_modules/moment/locale/mn.js +103 -0
  281. data/node_modules/moment/locale/mr.js +159 -0
  282. data/node_modules/moment/locale/ms-my.js +81 -0
  283. data/node_modules/moment/locale/ms.js +81 -0
  284. data/node_modules/moment/locale/mt.js +59 -0
  285. data/node_modules/moment/locale/my.js +92 -0
  286. data/node_modules/moment/locale/nb.js +61 -0
  287. data/node_modules/moment/locale/ne.js +122 -0
  288. data/node_modules/moment/locale/nl-be.js +86 -0
  289. data/node_modules/moment/locale/nl.js +86 -0
  290. data/node_modules/moment/locale/nn.js +59 -0
  291. data/node_modules/moment/locale/pa-in.js +123 -0
  292. data/node_modules/moment/locale/pl.js +125 -0
  293. data/node_modules/moment/locale/pt-br.js +60 -0
  294. data/node_modules/moment/locale/pt.js +64 -0
  295. data/node_modules/moment/locale/ro.js +74 -0
  296. data/node_modules/moment/locale/ru.js +181 -0
  297. data/node_modules/moment/locale/sd.js +97 -0
  298. data/node_modules/moment/locale/se.js +59 -0
  299. data/node_modules/moment/locale/si.js +70 -0
  300. data/node_modules/moment/locale/sk.js +155 -0
  301. data/node_modules/moment/locale/sl.js +172 -0
  302. data/node_modules/moment/locale/sq.js +67 -0
  303. data/node_modules/moment/locale/sr-cyrl.js +110 -0
  304. data/node_modules/moment/locale/sr.js +110 -0
  305. data/node_modules/moment/locale/ss.js +87 -0
  306. data/node_modules/moment/locale/sv.js +68 -0
  307. data/node_modules/moment/locale/sw.js +58 -0
  308. data/node_modules/moment/locale/ta.js +128 -0
  309. data/node_modules/moment/locale/te.js +88 -0
  310. data/node_modules/moment/locale/tet.js +66 -0
  311. data/node_modules/moment/locale/tg.js +115 -0
  312. data/node_modules/moment/locale/th.js +66 -0
  313. data/node_modules/moment/locale/tl-ph.js +61 -0
  314. data/node_modules/moment/locale/tlh.js +121 -0
  315. data/node_modules/moment/locale/tr.js +93 -0
  316. data/node_modules/moment/locale/tzl.js +90 -0
  317. data/node_modules/moment/locale/tzm-latn.js +57 -0
  318. data/node_modules/moment/locale/tzm.js +57 -0
  319. data/node_modules/moment/locale/ug-cn.js +118 -0
  320. data/node_modules/moment/locale/uk.js +153 -0
  321. data/node_modules/moment/locale/ur.js +97 -0
  322. data/node_modules/moment/locale/uz-latn.js +57 -0
  323. data/node_modules/moment/locale/uz.js +57 -0
  324. data/node_modules/moment/locale/vi.js +78 -0
  325. data/node_modules/moment/locale/x-pseudo.js +67 -0
  326. data/node_modules/moment/locale/yo.js +59 -0
  327. data/node_modules/moment/locale/zh-cn.js +109 -0
  328. data/node_modules/moment/locale/zh-hk.js +102 -0
  329. data/node_modules/moment/locale/zh-tw.js +102 -0
  330. data/node_modules/moment/min/locales.js +10178 -0
  331. data/node_modules/moment/min/locales.min.js +1 -0
  332. data/node_modules/moment/min/moment-with-locales.js +14765 -0
  333. data/node_modules/moment/min/moment-with-locales.min.js +1 -0
  334. data/node_modules/moment/min/moment.min.js +1 -0
  335. data/node_modules/moment/moment.d.ts +736 -0
  336. data/node_modules/moment/moment.js +4602 -0
  337. data/node_modules/moment/package.js +11 -0
  338. data/node_modules/moment/package.json +99 -0
  339. data/node_modules/moment/src/lib/create/check-overflow.js +34 -0
  340. data/node_modules/moment/src/lib/create/date-from-array.js +35 -0
  341. data/node_modules/moment/src/lib/create/from-anything.js +110 -0
  342. data/node_modules/moment/src/lib/create/from-array.js +147 -0
  343. data/node_modules/moment/src/lib/create/from-object.js +16 -0
  344. data/node_modules/moment/src/lib/create/from-string-and-array.js +50 -0
  345. data/node_modules/moment/src/lib/create/from-string-and-format.js +113 -0
  346. data/node_modules/moment/src/lib/create/from-string.js +230 -0
  347. data/node_modules/moment/src/lib/create/local.js +5 -0
  348. data/node_modules/moment/src/lib/create/parsing-flags.js +26 -0
  349. data/node_modules/moment/src/lib/create/utc.js +5 -0
  350. data/node_modules/moment/src/lib/create/valid.js +50 -0
  351. data/node_modules/moment/src/lib/duration/abs.js +18 -0
  352. data/node_modules/moment/src/lib/duration/add-subtract.js +21 -0
  353. data/node_modules/moment/src/lib/duration/as.js +66 -0
  354. data/node_modules/moment/src/lib/duration/bubble.js +61 -0
  355. data/node_modules/moment/src/lib/duration/clone.js +6 -0
  356. data/node_modules/moment/src/lib/duration/constructor.js +44 -0
  357. data/node_modules/moment/src/lib/duration/create.js +122 -0
  358. data/node_modules/moment/src/lib/duration/duration.js +16 -0
  359. data/node_modules/moment/src/lib/duration/get.js +25 -0
  360. data/node_modules/moment/src/lib/duration/humanize.js +85 -0
  361. data/node_modules/moment/src/lib/duration/iso-string.js +64 -0
  362. data/node_modules/moment/src/lib/duration/prototype.js +53 -0
  363. data/node_modules/moment/src/lib/duration/valid.js +36 -0
  364. data/node_modules/moment/src/lib/format/format.js +92 -0
  365. data/node_modules/moment/src/lib/locale/base-config.js +44 -0
  366. data/node_modules/moment/src/lib/locale/calendar.js +15 -0
  367. data/node_modules/moment/src/lib/locale/constructor.js +5 -0
  368. data/node_modules/moment/src/lib/locale/en.js +15 -0
  369. data/node_modules/moment/src/lib/locale/formats.js +23 -0
  370. data/node_modules/moment/src/lib/locale/invalid.js +5 -0
  371. data/node_modules/moment/src/lib/locale/lists.js +93 -0
  372. data/node_modules/moment/src/lib/locale/locale.js +39 -0
  373. data/node_modules/moment/src/lib/locale/locales.js +197 -0
  374. data/node_modules/moment/src/lib/locale/ordinal.js +7 -0
  375. data/node_modules/moment/src/lib/locale/pre-post-format.js +3 -0
  376. data/node_modules/moment/src/lib/locale/prototype.js +69 -0
  377. data/node_modules/moment/src/lib/locale/relative.js +30 -0
  378. data/node_modules/moment/src/lib/locale/set.js +49 -0
  379. data/node_modules/moment/src/lib/moment/add-subtract.js +55 -0
  380. data/node_modules/moment/src/lib/moment/calendar.js +26 -0
  381. data/node_modules/moment/src/lib/moment/clone.js +5 -0
  382. data/node_modules/moment/src/lib/moment/compare.js +63 -0
  383. data/node_modules/moment/src/lib/moment/constructor.js +77 -0
  384. data/node_modules/moment/src/lib/moment/creation-data.js +9 -0
  385. data/node_modules/moment/src/lib/moment/diff.js +58 -0
  386. data/node_modules/moment/src/lib/moment/format.js +62 -0
  387. data/node_modules/moment/src/lib/moment/from.js +17 -0
  388. data/node_modules/moment/src/lib/moment/get-set.js +61 -0
  389. data/node_modules/moment/src/lib/moment/locale.js +34 -0
  390. data/node_modules/moment/src/lib/moment/min-max.js +63 -0
  391. data/node_modules/moment/src/lib/moment/moment.js +28 -0
  392. data/node_modules/moment/src/lib/moment/now.js +3 -0
  393. data/node_modules/moment/src/lib/moment/prototype.js +150 -0
  394. data/node_modules/moment/src/lib/moment/start-end-of.js +128 -0
  395. data/node_modules/moment/src/lib/moment/to-type.js +34 -0
  396. data/node_modules/moment/src/lib/moment/to.js +17 -0
  397. data/node_modules/moment/src/lib/moment/valid.js +15 -0
  398. data/node_modules/moment/src/lib/parse/regex.js +54 -0
  399. data/node_modules/moment/src/lib/parse/token.js +33 -0
  400. data/node_modules/moment/src/lib/units/aliases.js +30 -0
  401. data/node_modules/moment/src/lib/units/constants.js +9 -0
  402. data/node_modules/moment/src/lib/units/day-of-month.js +39 -0
  403. data/node_modules/moment/src/lib/units/day-of-week.js +367 -0
  404. data/node_modules/moment/src/lib/units/day-of-year.js +36 -0
  405. data/node_modules/moment/src/lib/units/hour.js +144 -0
  406. data/node_modules/moment/src/lib/units/millisecond.js +69 -0
  407. data/node_modules/moment/src/lib/units/minute.js +29 -0
  408. data/node_modules/moment/src/lib/units/month.js +290 -0
  409. data/node_modules/moment/src/lib/units/offset.js +235 -0
  410. data/node_modules/moment/src/lib/units/priorities.js +16 -0
  411. data/node_modules/moment/src/lib/units/quarter.js +32 -0
  412. data/node_modules/moment/src/lib/units/second.js +29 -0
  413. data/node_modules/moment/src/lib/units/timestamp.js +20 -0
  414. data/node_modules/moment/src/lib/units/timezone.js +16 -0
  415. data/node_modules/moment/src/lib/units/units.js +20 -0
  416. data/node_modules/moment/src/lib/units/week-calendar-utils.js +65 -0
  417. data/node_modules/moment/src/lib/units/week-year.js +107 -0
  418. data/node_modules/moment/src/lib/units/week.js +67 -0
  419. data/node_modules/moment/src/lib/units/year.js +75 -0
  420. data/node_modules/moment/src/lib/utils/abs-ceil.js +7 -0
  421. data/node_modules/moment/src/lib/utils/abs-floor.js +8 -0
  422. data/node_modules/moment/src/lib/utils/abs-round.js +7 -0
  423. data/node_modules/moment/src/lib/utils/compare-arrays.js +16 -0
  424. data/node_modules/moment/src/lib/utils/defaults.js +10 -0
  425. data/node_modules/moment/src/lib/utils/deprecate.js +55 -0
  426. data/node_modules/moment/src/lib/utils/extend.js +19 -0
  427. data/node_modules/moment/src/lib/utils/has-own-prop.js +3 -0
  428. data/node_modules/moment/src/lib/utils/hooks.js +13 -0
  429. data/node_modules/moment/src/lib/utils/index-of.js +18 -0
  430. data/node_modules/moment/src/lib/utils/is-array.js +3 -0
  431. data/node_modules/moment/src/lib/utils/is-date.js +3 -0
  432. data/node_modules/moment/src/lib/utils/is-function.js +3 -0
  433. data/node_modules/moment/src/lib/utils/is-number.js +3 -0
  434. data/node_modules/moment/src/lib/utils/is-object-empty.js +13 -0
  435. data/node_modules/moment/src/lib/utils/is-object.js +5 -0
  436. data/node_modules/moment/src/lib/utils/is-undefined.js +3 -0
  437. data/node_modules/moment/src/lib/utils/keys.js +19 -0
  438. data/node_modules/moment/src/lib/utils/map.js +7 -0
  439. data/node_modules/moment/src/lib/utils/mod.js +3 -0
  440. data/node_modules/moment/src/lib/utils/some.js +19 -0
  441. data/node_modules/moment/src/lib/utils/to-int.js +12 -0
  442. data/node_modules/moment/src/lib/utils/zero-fill.js +7 -0
  443. data/node_modules/moment/src/locale/af.js +64 -0
  444. data/node_modules/moment/src/locale/ar-dz.js +51 -0
  445. data/node_modules/moment/src/locale/ar-kw.js +50 -0
  446. data/node_modules/moment/src/locale/ar-ly.js +113 -0
  447. data/node_modules/moment/src/locale/ar-ma.js +52 -0
  448. data/node_modules/moment/src/locale/ar-sa.js +96 -0
  449. data/node_modules/moment/src/locale/ar-tn.js +51 -0
  450. data/node_modules/moment/src/locale/ar.js +128 -0
  451. data/node_modules/moment/src/locale/az.js +97 -0
  452. data/node_modules/moment/src/locale/be.js +126 -0
  453. data/node_modules/moment/src/locale/bg.js +82 -0
  454. data/node_modules/moment/src/locale/bm.js +50 -0
  455. data/node_modules/moment/src/locale/bn.js +110 -0
  456. data/node_modules/moment/src/locale/bo.js +111 -0
  457. data/node_modules/moment/src/locale/br.js +100 -0
  458. data/node_modules/moment/src/locale/bs.js +143 -0
  459. data/node_modules/moment/src/locale/ca.js +80 -0
  460. data/node_modules/moment/src/locale/cs.js +164 -0
  461. data/node_modules/moment/src/locale/cv.js +54 -0
  462. data/node_modules/moment/src/locale/cy.js +73 -0
  463. data/node_modules/moment/src/locale/da.js +51 -0
  464. data/node_modules/moment/src/locale/de-at.js +70 -0
  465. data/node_modules/moment/src/locale/de-ch.js +69 -0
  466. data/node_modules/moment/src/locale/de.js +69 -0
  467. data/node_modules/moment/src/locale/dv.js +90 -0
  468. data/node_modules/moment/src/locale/el.js +89 -0
  469. data/node_modules/moment/src/locale/en-SG.js +59 -0
  470. data/node_modules/moment/src/locale/en-au.js +58 -0
  471. data/node_modules/moment/src/locale/en-ca.js +54 -0
  472. data/node_modules/moment/src/locale/en-gb.js +59 -0
  473. data/node_modules/moment/src/locale/en-ie.js +59 -0
  474. data/node_modules/moment/src/locale/en-il.js +54 -0
  475. data/node_modules/moment/src/locale/en-nz.js +58 -0
  476. data/node_modules/moment/src/locale/eo.js +65 -0
  477. data/node_modules/moment/src/locale/es-do.js +83 -0
  478. data/node_modules/moment/src/locale/es-us.js +84 -0
  479. data/node_modules/moment/src/locale/es.js +83 -0
  480. data/node_modules/moment/src/locale/et.js +73 -0
  481. data/node_modules/moment/src/locale/eu.js +58 -0
  482. data/node_modules/moment/src/locale/fa.js +98 -0
  483. data/node_modules/moment/src/locale/fi.js +101 -0
  484. data/node_modules/moment/src/locale/fo.js +53 -0
  485. data/node_modules/moment/src/locale/fr-ca.js +66 -0
  486. data/node_modules/moment/src/locale/fr-ch.js +70 -0
  487. data/node_modules/moment/src/locale/fr.js +75 -0
  488. data/node_modules/moment/src/locale/fy.js +67 -0
  489. data/node_modules/moment/src/locale/ga.js +68 -0
  490. data/node_modules/moment/src/locale/gd.js +68 -0
  491. data/node_modules/moment/src/locale/gl.js +69 -0
  492. data/node_modules/moment/src/locale/gom-latn.js +114 -0
  493. data/node_modules/moment/src/locale/gu.js +115 -0
  494. data/node_modules/moment/src/locale/he.js +91 -0
  495. data/node_modules/moment/src/locale/hi.js +116 -0
  496. data/node_modules/moment/src/locale/hr.js +145 -0
  497. data/node_modules/moment/src/locale/hu.js +103 -0
  498. data/node_modules/moment/src/locale/hy-am.js +87 -0
  499. data/node_modules/moment/src/locale/id.js +74 -0
  500. data/node_modules/moment/src/locale/is.js +124 -0
  501. data/node_modules/moment/src/locale/it-ch.js +61 -0
  502. data/node_modules/moment/src/locale/it.js +62 -0
  503. data/node_modules/moment/src/locale/ja.js +84 -0
  504. data/node_modules/moment/src/locale/jv.js +74 -0
  505. data/node_modules/moment/src/locale/ka.js +81 -0
  506. data/node_modules/moment/src/locale/kk.js +78 -0
  507. data/node_modules/moment/src/locale/km.js +101 -0
  508. data/node_modules/moment/src/locale/kn.js +117 -0
  509. data/node_modules/moment/src/locale/ko.js +74 -0
  510. data/node_modules/moment/src/locale/ku.js +110 -0
  511. data/node_modules/moment/src/locale/ky.js +79 -0
  512. data/node_modules/moment/src/locale/lb.js +129 -0
  513. data/node_modules/moment/src/locale/lo.js +62 -0
  514. data/node_modules/moment/src/locale/lt.js +110 -0
  515. data/node_modules/moment/src/locale/lv.js +90 -0
  516. data/node_modules/moment/src/locale/me.js +103 -0
  517. data/node_modules/moment/src/locale/mi.js +55 -0
  518. data/node_modules/moment/src/locale/mk.js +82 -0
  519. data/node_modules/moment/src/locale/ml.js +73 -0
  520. data/node_modules/moment/src/locale/mn.js +96 -0
  521. data/node_modules/moment/src/locale/mr.js +153 -0
  522. data/node_modules/moment/src/locale/ms-my.js +75 -0
  523. data/node_modules/moment/src/locale/ms.js +74 -0
  524. data/node_modules/moment/src/locale/mt.js +51 -0
  525. data/node_modules/moment/src/locale/my.js +87 -0
  526. data/node_modules/moment/src/locale/nb.js +55 -0
  527. data/node_modules/moment/src/locale/ne.js +115 -0
  528. data/node_modules/moment/src/locale/nl-be.js +80 -0
  529. data/node_modules/moment/src/locale/nl.js +80 -0
  530. data/node_modules/moment/src/locale/nn.js +52 -0
  531. data/node_modules/moment/src/locale/pa-in.js +116 -0
  532. data/node_modules/moment/src/locale/pl.js +117 -0
  533. data/node_modules/moment/src/locale/pt-br.js +53 -0
  534. data/node_modules/moment/src/locale/pt.js +57 -0
  535. data/node_modules/moment/src/locale/ro.js +68 -0
  536. data/node_modules/moment/src/locale/ru.js +175 -0
  537. data/node_modules/moment/src/locale/sd.js +89 -0
  538. data/node_modules/moment/src/locale/se.js +52 -0
  539. data/node_modules/moment/src/locale/si.js +62 -0
  540. data/node_modules/moment/src/locale/sk.js +149 -0
  541. data/node_modules/moment/src/locale/sl.js +164 -0
  542. data/node_modules/moment/src/locale/sq.js +62 -0
  543. data/node_modules/moment/src/locale/sr-cyrl.js +102 -0
  544. data/node_modules/moment/src/locale/sr.js +102 -0
  545. data/node_modules/moment/src/locale/ss.js +81 -0
  546. data/node_modules/moment/src/locale/sv.js +61 -0
  547. data/node_modules/moment/src/locale/sw.js +51 -0
  548. data/node_modules/moment/src/locale/ta.js +121 -0
  549. data/node_modules/moment/src/locale/te.js +80 -0
  550. data/node_modules/moment/src/locale/tet.js +60 -0
  551. data/node_modules/moment/src/locale/tg.js +107 -0
  552. data/node_modules/moment/src/locale/th.js +58 -0
  553. data/node_modules/moment/src/locale/tl-ph.js +54 -0
  554. data/node_modules/moment/src/locale/tlh.js +113 -0
  555. data/node_modules/moment/src/locale/tr.js +90 -0
  556. data/node_modules/moment/src/locale/tzl.js +84 -0
  557. data/node_modules/moment/src/locale/tzm-latn.js +50 -0
  558. data/node_modules/moment/src/locale/tzm.js +50 -0
  559. data/node_modules/moment/src/locale/ug-cn.js +110 -0
  560. data/node_modules/moment/src/locale/uk.js +146 -0
  561. data/node_modules/moment/src/locale/ur.js +90 -0
  562. data/node_modules/moment/src/locale/uz-latn.js +50 -0
  563. data/node_modules/moment/src/locale/uz.js +50 -0
  564. data/node_modules/moment/src/locale/vi.js +71 -0
  565. data/node_modules/moment/src/locale/x-pseudo.js +59 -0
  566. data/node_modules/moment/src/locale/yo.js +51 -0
  567. data/node_modules/moment/src/locale/zh-cn.js +102 -0
  568. data/node_modules/moment/src/locale/zh-hk.js +96 -0
  569. data/node_modules/moment/src/locale/zh-tw.js +95 -0
  570. data/node_modules/moment/src/moment.js +95 -0
  571. data/package.json +2 -0
  572. data/public/packs/js/application-0619dab0850a6efc7438.js +38148 -0
  573. data/public/packs/js/application-0619dab0850a6efc7438.js.map +1 -0
  574. data/public/packs/js/application-20352c48a8043c0951ac.js +38148 -0
  575. data/public/packs/js/application-20352c48a8043c0951ac.js.map +1 -0
  576. data/public/packs/js/application-c5495aaaa9c6e6b908e8.js +38148 -0
  577. data/public/packs/js/application-c5495aaaa9c6e6b908e8.js.map +1 -0
  578. data/public/packs/manifest.json +4 -4
  579. data/random.rb +1 -0
  580. data/test/controllers/address_searches_controller_test.rb +48 -0
  581. data/test/controllers/banal/documents_controller_test.rb +48 -0
  582. data/test/controllers/banal/employees_controller_test.rb +48 -0
  583. data/test/controllers/banal/links_controller_test.rb +48 -0
  584. data/test/controllers/banal/metadata_controller_test.rb +48 -0
  585. data/test/controllers/banal/projects_controller_test.rb +2 -2
  586. data/test/controllers/banal/related_objects_controller_test.rb +48 -0
  587. data/test/controllers/banal_complexes_controller_test.rb +48 -0
  588. data/test/controllers/comments_controller_test.rb +48 -0
  589. data/test/controllers/employees_controller_test.rb +48 -0
  590. data/test/fixtures/address_searches.yml +9 -0
  591. data/test/fixtures/banal/documents.yml +11 -0
  592. data/test/fixtures/banal/employees.yml +29 -0
  593. data/test/fixtures/banal/links.yml +11 -0
  594. data/test/fixtures/banal/metadata.yml +11 -0
  595. data/test/fixtures/banal/projects.yml +16 -0
  596. data/test/fixtures/banal/related_objects.yml +9 -0
  597. data/test/fixtures/banal_complexes.yml +9 -0
  598. data/test/fixtures/comments.yml +11 -0
  599. data/test/fixtures/employees.yml +29 -0
  600. data/test/models/address_search_test.rb +7 -0
  601. data/test/models/banal/document_test.rb +7 -0
  602. data/test/models/banal/employee_test.rb +7 -0
  603. data/test/models/banal/link_test.rb +7 -0
  604. data/test/models/banal/metadatum_test.rb +7 -0
  605. data/test/models/banal/related_object_test.rb +7 -0
  606. data/test/models/banal_complex_test.rb +7 -0
  607. data/test/models/comment_test.rb +7 -0
  608. data/test/models/employee_test.rb +7 -0
  609. data/test/system/address_searches_test.rb +45 -0
  610. data/test/system/banal/documents_test.rb +47 -0
  611. data/test/system/banal/employees_test.rb +65 -0
  612. data/test/system/banal/links_test.rb +47 -0
  613. data/test/system/banal/metadata_test.rb +47 -0
  614. data/test/system/banal/projects_test.rb +16 -0
  615. data/test/system/banal/related_objects_test.rb +45 -0
  616. data/test/system/banal_complexes_test.rb +45 -0
  617. data/test/system/comments_test.rb +47 -0
  618. data/test/system/employees_test.rb +65 -0
  619. data/yarn.lock +38 -0
  620. metadata +587 -8
  621. data/db/migrate/20190912173649_create_banal_projects.rb +0 -9
@@ -0,0 +1,4602 @@
1
+ //! moment.js
2
+
3
+ ;(function (global, factory) {
4
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
5
+ typeof define === 'function' && define.amd ? define(factory) :
6
+ global.moment = factory()
7
+ }(this, (function () { 'use strict';
8
+
9
+ var hookCallback;
10
+
11
+ function hooks () {
12
+ return hookCallback.apply(null, arguments);
13
+ }
14
+
15
+ // This is done to register the method called with moment()
16
+ // without creating circular dependencies.
17
+ function setHookCallback (callback) {
18
+ hookCallback = callback;
19
+ }
20
+
21
+ function isArray(input) {
22
+ return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
23
+ }
24
+
25
+ function isObject(input) {
26
+ // IE8 will treat undefined and null as object if it wasn't for
27
+ // input != null
28
+ return input != null && Object.prototype.toString.call(input) === '[object Object]';
29
+ }
30
+
31
+ function isObjectEmpty(obj) {
32
+ if (Object.getOwnPropertyNames) {
33
+ return (Object.getOwnPropertyNames(obj).length === 0);
34
+ } else {
35
+ var k;
36
+ for (k in obj) {
37
+ if (obj.hasOwnProperty(k)) {
38
+ return false;
39
+ }
40
+ }
41
+ return true;
42
+ }
43
+ }
44
+
45
+ function isUndefined(input) {
46
+ return input === void 0;
47
+ }
48
+
49
+ function isNumber(input) {
50
+ return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
51
+ }
52
+
53
+ function isDate(input) {
54
+ return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
55
+ }
56
+
57
+ function map(arr, fn) {
58
+ var res = [], i;
59
+ for (i = 0; i < arr.length; ++i) {
60
+ res.push(fn(arr[i], i));
61
+ }
62
+ return res;
63
+ }
64
+
65
+ function hasOwnProp(a, b) {
66
+ return Object.prototype.hasOwnProperty.call(a, b);
67
+ }
68
+
69
+ function extend(a, b) {
70
+ for (var i in b) {
71
+ if (hasOwnProp(b, i)) {
72
+ a[i] = b[i];
73
+ }
74
+ }
75
+
76
+ if (hasOwnProp(b, 'toString')) {
77
+ a.toString = b.toString;
78
+ }
79
+
80
+ if (hasOwnProp(b, 'valueOf')) {
81
+ a.valueOf = b.valueOf;
82
+ }
83
+
84
+ return a;
85
+ }
86
+
87
+ function createUTC (input, format, locale, strict) {
88
+ return createLocalOrUTC(input, format, locale, strict, true).utc();
89
+ }
90
+
91
+ function defaultParsingFlags() {
92
+ // We need to deep clone this object.
93
+ return {
94
+ empty : false,
95
+ unusedTokens : [],
96
+ unusedInput : [],
97
+ overflow : -2,
98
+ charsLeftOver : 0,
99
+ nullInput : false,
100
+ invalidMonth : null,
101
+ invalidFormat : false,
102
+ userInvalidated : false,
103
+ iso : false,
104
+ parsedDateParts : [],
105
+ meridiem : null,
106
+ rfc2822 : false,
107
+ weekdayMismatch : false
108
+ };
109
+ }
110
+
111
+ function getParsingFlags(m) {
112
+ if (m._pf == null) {
113
+ m._pf = defaultParsingFlags();
114
+ }
115
+ return m._pf;
116
+ }
117
+
118
+ var some;
119
+ if (Array.prototype.some) {
120
+ some = Array.prototype.some;
121
+ } else {
122
+ some = function (fun) {
123
+ var t = Object(this);
124
+ var len = t.length >>> 0;
125
+
126
+ for (var i = 0; i < len; i++) {
127
+ if (i in t && fun.call(this, t[i], i, t)) {
128
+ return true;
129
+ }
130
+ }
131
+
132
+ return false;
133
+ };
134
+ }
135
+
136
+ function isValid(m) {
137
+ if (m._isValid == null) {
138
+ var flags = getParsingFlags(m);
139
+ var parsedParts = some.call(flags.parsedDateParts, function (i) {
140
+ return i != null;
141
+ });
142
+ var isNowValid = !isNaN(m._d.getTime()) &&
143
+ flags.overflow < 0 &&
144
+ !flags.empty &&
145
+ !flags.invalidMonth &&
146
+ !flags.invalidWeekday &&
147
+ !flags.weekdayMismatch &&
148
+ !flags.nullInput &&
149
+ !flags.invalidFormat &&
150
+ !flags.userInvalidated &&
151
+ (!flags.meridiem || (flags.meridiem && parsedParts));
152
+
153
+ if (m._strict) {
154
+ isNowValid = isNowValid &&
155
+ flags.charsLeftOver === 0 &&
156
+ flags.unusedTokens.length === 0 &&
157
+ flags.bigHour === undefined;
158
+ }
159
+
160
+ if (Object.isFrozen == null || !Object.isFrozen(m)) {
161
+ m._isValid = isNowValid;
162
+ }
163
+ else {
164
+ return isNowValid;
165
+ }
166
+ }
167
+ return m._isValid;
168
+ }
169
+
170
+ function createInvalid (flags) {
171
+ var m = createUTC(NaN);
172
+ if (flags != null) {
173
+ extend(getParsingFlags(m), flags);
174
+ }
175
+ else {
176
+ getParsingFlags(m).userInvalidated = true;
177
+ }
178
+
179
+ return m;
180
+ }
181
+
182
+ // Plugins that add properties should also add the key here (null value),
183
+ // so we can properly clone ourselves.
184
+ var momentProperties = hooks.momentProperties = [];
185
+
186
+ function copyConfig(to, from) {
187
+ var i, prop, val;
188
+
189
+ if (!isUndefined(from._isAMomentObject)) {
190
+ to._isAMomentObject = from._isAMomentObject;
191
+ }
192
+ if (!isUndefined(from._i)) {
193
+ to._i = from._i;
194
+ }
195
+ if (!isUndefined(from._f)) {
196
+ to._f = from._f;
197
+ }
198
+ if (!isUndefined(from._l)) {
199
+ to._l = from._l;
200
+ }
201
+ if (!isUndefined(from._strict)) {
202
+ to._strict = from._strict;
203
+ }
204
+ if (!isUndefined(from._tzm)) {
205
+ to._tzm = from._tzm;
206
+ }
207
+ if (!isUndefined(from._isUTC)) {
208
+ to._isUTC = from._isUTC;
209
+ }
210
+ if (!isUndefined(from._offset)) {
211
+ to._offset = from._offset;
212
+ }
213
+ if (!isUndefined(from._pf)) {
214
+ to._pf = getParsingFlags(from);
215
+ }
216
+ if (!isUndefined(from._locale)) {
217
+ to._locale = from._locale;
218
+ }
219
+
220
+ if (momentProperties.length > 0) {
221
+ for (i = 0; i < momentProperties.length; i++) {
222
+ prop = momentProperties[i];
223
+ val = from[prop];
224
+ if (!isUndefined(val)) {
225
+ to[prop] = val;
226
+ }
227
+ }
228
+ }
229
+
230
+ return to;
231
+ }
232
+
233
+ var updateInProgress = false;
234
+
235
+ // Moment prototype object
236
+ function Moment(config) {
237
+ copyConfig(this, config);
238
+ this._d = new Date(config._d != null ? config._d.getTime() : NaN);
239
+ if (!this.isValid()) {
240
+ this._d = new Date(NaN);
241
+ }
242
+ // Prevent infinite loop in case updateOffset creates new moment
243
+ // objects.
244
+ if (updateInProgress === false) {
245
+ updateInProgress = true;
246
+ hooks.updateOffset(this);
247
+ updateInProgress = false;
248
+ }
249
+ }
250
+
251
+ function isMoment (obj) {
252
+ return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
253
+ }
254
+
255
+ function absFloor (number) {
256
+ if (number < 0) {
257
+ // -0 -> 0
258
+ return Math.ceil(number) || 0;
259
+ } else {
260
+ return Math.floor(number);
261
+ }
262
+ }
263
+
264
+ function toInt(argumentForCoercion) {
265
+ var coercedNumber = +argumentForCoercion,
266
+ value = 0;
267
+
268
+ if (coercedNumber !== 0 && isFinite(coercedNumber)) {
269
+ value = absFloor(coercedNumber);
270
+ }
271
+
272
+ return value;
273
+ }
274
+
275
+ // compare two arrays, return the number of differences
276
+ function compareArrays(array1, array2, dontConvert) {
277
+ var len = Math.min(array1.length, array2.length),
278
+ lengthDiff = Math.abs(array1.length - array2.length),
279
+ diffs = 0,
280
+ i;
281
+ for (i = 0; i < len; i++) {
282
+ if ((dontConvert && array1[i] !== array2[i]) ||
283
+ (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
284
+ diffs++;
285
+ }
286
+ }
287
+ return diffs + lengthDiff;
288
+ }
289
+
290
+ function warn(msg) {
291
+ if (hooks.suppressDeprecationWarnings === false &&
292
+ (typeof console !== 'undefined') && console.warn) {
293
+ console.warn('Deprecation warning: ' + msg);
294
+ }
295
+ }
296
+
297
+ function deprecate(msg, fn) {
298
+ var firstTime = true;
299
+
300
+ return extend(function () {
301
+ if (hooks.deprecationHandler != null) {
302
+ hooks.deprecationHandler(null, msg);
303
+ }
304
+ if (firstTime) {
305
+ var args = [];
306
+ var arg;
307
+ for (var i = 0; i < arguments.length; i++) {
308
+ arg = '';
309
+ if (typeof arguments[i] === 'object') {
310
+ arg += '\n[' + i + '] ';
311
+ for (var key in arguments[0]) {
312
+ arg += key + ': ' + arguments[0][key] + ', ';
313
+ }
314
+ arg = arg.slice(0, -2); // Remove trailing comma and space
315
+ } else {
316
+ arg = arguments[i];
317
+ }
318
+ args.push(arg);
319
+ }
320
+ warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
321
+ firstTime = false;
322
+ }
323
+ return fn.apply(this, arguments);
324
+ }, fn);
325
+ }
326
+
327
+ var deprecations = {};
328
+
329
+ function deprecateSimple(name, msg) {
330
+ if (hooks.deprecationHandler != null) {
331
+ hooks.deprecationHandler(name, msg);
332
+ }
333
+ if (!deprecations[name]) {
334
+ warn(msg);
335
+ deprecations[name] = true;
336
+ }
337
+ }
338
+
339
+ hooks.suppressDeprecationWarnings = false;
340
+ hooks.deprecationHandler = null;
341
+
342
+ function isFunction(input) {
343
+ return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
344
+ }
345
+
346
+ function set (config) {
347
+ var prop, i;
348
+ for (i in config) {
349
+ prop = config[i];
350
+ if (isFunction(prop)) {
351
+ this[i] = prop;
352
+ } else {
353
+ this['_' + i] = prop;
354
+ }
355
+ }
356
+ this._config = config;
357
+ // Lenient ordinal parsing accepts just a number in addition to
358
+ // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
359
+ // TODO: Remove "ordinalParse" fallback in next major release.
360
+ this._dayOfMonthOrdinalParseLenient = new RegExp(
361
+ (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
362
+ '|' + (/\d{1,2}/).source);
363
+ }
364
+
365
+ function mergeConfigs(parentConfig, childConfig) {
366
+ var res = extend({}, parentConfig), prop;
367
+ for (prop in childConfig) {
368
+ if (hasOwnProp(childConfig, prop)) {
369
+ if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
370
+ res[prop] = {};
371
+ extend(res[prop], parentConfig[prop]);
372
+ extend(res[prop], childConfig[prop]);
373
+ } else if (childConfig[prop] != null) {
374
+ res[prop] = childConfig[prop];
375
+ } else {
376
+ delete res[prop];
377
+ }
378
+ }
379
+ }
380
+ for (prop in parentConfig) {
381
+ if (hasOwnProp(parentConfig, prop) &&
382
+ !hasOwnProp(childConfig, prop) &&
383
+ isObject(parentConfig[prop])) {
384
+ // make sure changes to properties don't modify parent config
385
+ res[prop] = extend({}, res[prop]);
386
+ }
387
+ }
388
+ return res;
389
+ }
390
+
391
+ function Locale(config) {
392
+ if (config != null) {
393
+ this.set(config);
394
+ }
395
+ }
396
+
397
+ var keys;
398
+
399
+ if (Object.keys) {
400
+ keys = Object.keys;
401
+ } else {
402
+ keys = function (obj) {
403
+ var i, res = [];
404
+ for (i in obj) {
405
+ if (hasOwnProp(obj, i)) {
406
+ res.push(i);
407
+ }
408
+ }
409
+ return res;
410
+ };
411
+ }
412
+
413
+ var defaultCalendar = {
414
+ sameDay : '[Today at] LT',
415
+ nextDay : '[Tomorrow at] LT',
416
+ nextWeek : 'dddd [at] LT',
417
+ lastDay : '[Yesterday at] LT',
418
+ lastWeek : '[Last] dddd [at] LT',
419
+ sameElse : 'L'
420
+ };
421
+
422
+ function calendar (key, mom, now) {
423
+ var output = this._calendar[key] || this._calendar['sameElse'];
424
+ return isFunction(output) ? output.call(mom, now) : output;
425
+ }
426
+
427
+ var defaultLongDateFormat = {
428
+ LTS : 'h:mm:ss A',
429
+ LT : 'h:mm A',
430
+ L : 'MM/DD/YYYY',
431
+ LL : 'MMMM D, YYYY',
432
+ LLL : 'MMMM D, YYYY h:mm A',
433
+ LLLL : 'dddd, MMMM D, YYYY h:mm A'
434
+ };
435
+
436
+ function longDateFormat (key) {
437
+ var format = this._longDateFormat[key],
438
+ formatUpper = this._longDateFormat[key.toUpperCase()];
439
+
440
+ if (format || !formatUpper) {
441
+ return format;
442
+ }
443
+
444
+ this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
445
+ return val.slice(1);
446
+ });
447
+
448
+ return this._longDateFormat[key];
449
+ }
450
+
451
+ var defaultInvalidDate = 'Invalid date';
452
+
453
+ function invalidDate () {
454
+ return this._invalidDate;
455
+ }
456
+
457
+ var defaultOrdinal = '%d';
458
+ var defaultDayOfMonthOrdinalParse = /\d{1,2}/;
459
+
460
+ function ordinal (number) {
461
+ return this._ordinal.replace('%d', number);
462
+ }
463
+
464
+ var defaultRelativeTime = {
465
+ future : 'in %s',
466
+ past : '%s ago',
467
+ s : 'a few seconds',
468
+ ss : '%d seconds',
469
+ m : 'a minute',
470
+ mm : '%d minutes',
471
+ h : 'an hour',
472
+ hh : '%d hours',
473
+ d : 'a day',
474
+ dd : '%d days',
475
+ M : 'a month',
476
+ MM : '%d months',
477
+ y : 'a year',
478
+ yy : '%d years'
479
+ };
480
+
481
+ function relativeTime (number, withoutSuffix, string, isFuture) {
482
+ var output = this._relativeTime[string];
483
+ return (isFunction(output)) ?
484
+ output(number, withoutSuffix, string, isFuture) :
485
+ output.replace(/%d/i, number);
486
+ }
487
+
488
+ function pastFuture (diff, output) {
489
+ var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
490
+ return isFunction(format) ? format(output) : format.replace(/%s/i, output);
491
+ }
492
+
493
+ var aliases = {};
494
+
495
+ function addUnitAlias (unit, shorthand) {
496
+ var lowerCase = unit.toLowerCase();
497
+ aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
498
+ }
499
+
500
+ function normalizeUnits(units) {
501
+ return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
502
+ }
503
+
504
+ function normalizeObjectUnits(inputObject) {
505
+ var normalizedInput = {},
506
+ normalizedProp,
507
+ prop;
508
+
509
+ for (prop in inputObject) {
510
+ if (hasOwnProp(inputObject, prop)) {
511
+ normalizedProp = normalizeUnits(prop);
512
+ if (normalizedProp) {
513
+ normalizedInput[normalizedProp] = inputObject[prop];
514
+ }
515
+ }
516
+ }
517
+
518
+ return normalizedInput;
519
+ }
520
+
521
+ var priorities = {};
522
+
523
+ function addUnitPriority(unit, priority) {
524
+ priorities[unit] = priority;
525
+ }
526
+
527
+ function getPrioritizedUnits(unitsObj) {
528
+ var units = [];
529
+ for (var u in unitsObj) {
530
+ units.push({unit: u, priority: priorities[u]});
531
+ }
532
+ units.sort(function (a, b) {
533
+ return a.priority - b.priority;
534
+ });
535
+ return units;
536
+ }
537
+
538
+ function zeroFill(number, targetLength, forceSign) {
539
+ var absNumber = '' + Math.abs(number),
540
+ zerosToFill = targetLength - absNumber.length,
541
+ sign = number >= 0;
542
+ return (sign ? (forceSign ? '+' : '') : '-') +
543
+ Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
544
+ }
545
+
546
+ var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
547
+
548
+ var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
549
+
550
+ var formatFunctions = {};
551
+
552
+ var formatTokenFunctions = {};
553
+
554
+ // token: 'M'
555
+ // padded: ['MM', 2]
556
+ // ordinal: 'Mo'
557
+ // callback: function () { this.month() + 1 }
558
+ function addFormatToken (token, padded, ordinal, callback) {
559
+ var func = callback;
560
+ if (typeof callback === 'string') {
561
+ func = function () {
562
+ return this[callback]();
563
+ };
564
+ }
565
+ if (token) {
566
+ formatTokenFunctions[token] = func;
567
+ }
568
+ if (padded) {
569
+ formatTokenFunctions[padded[0]] = function () {
570
+ return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
571
+ };
572
+ }
573
+ if (ordinal) {
574
+ formatTokenFunctions[ordinal] = function () {
575
+ return this.localeData().ordinal(func.apply(this, arguments), token);
576
+ };
577
+ }
578
+ }
579
+
580
+ function removeFormattingTokens(input) {
581
+ if (input.match(/\[[\s\S]/)) {
582
+ return input.replace(/^\[|\]$/g, '');
583
+ }
584
+ return input.replace(/\\/g, '');
585
+ }
586
+
587
+ function makeFormatFunction(format) {
588
+ var array = format.match(formattingTokens), i, length;
589
+
590
+ for (i = 0, length = array.length; i < length; i++) {
591
+ if (formatTokenFunctions[array[i]]) {
592
+ array[i] = formatTokenFunctions[array[i]];
593
+ } else {
594
+ array[i] = removeFormattingTokens(array[i]);
595
+ }
596
+ }
597
+
598
+ return function (mom) {
599
+ var output = '', i;
600
+ for (i = 0; i < length; i++) {
601
+ output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];
602
+ }
603
+ return output;
604
+ };
605
+ }
606
+
607
+ // format date using native date object
608
+ function formatMoment(m, format) {
609
+ if (!m.isValid()) {
610
+ return m.localeData().invalidDate();
611
+ }
612
+
613
+ format = expandFormat(format, m.localeData());
614
+ formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
615
+
616
+ return formatFunctions[format](m);
617
+ }
618
+
619
+ function expandFormat(format, locale) {
620
+ var i = 5;
621
+
622
+ function replaceLongDateFormatTokens(input) {
623
+ return locale.longDateFormat(input) || input;
624
+ }
625
+
626
+ localFormattingTokens.lastIndex = 0;
627
+ while (i >= 0 && localFormattingTokens.test(format)) {
628
+ format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
629
+ localFormattingTokens.lastIndex = 0;
630
+ i -= 1;
631
+ }
632
+
633
+ return format;
634
+ }
635
+
636
+ var match1 = /\d/; // 0 - 9
637
+ var match2 = /\d\d/; // 00 - 99
638
+ var match3 = /\d{3}/; // 000 - 999
639
+ var match4 = /\d{4}/; // 0000 - 9999
640
+ var match6 = /[+-]?\d{6}/; // -999999 - 999999
641
+ var match1to2 = /\d\d?/; // 0 - 99
642
+ var match3to4 = /\d\d\d\d?/; // 999 - 9999
643
+ var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999
644
+ var match1to3 = /\d{1,3}/; // 0 - 999
645
+ var match1to4 = /\d{1,4}/; // 0 - 9999
646
+ var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999
647
+
648
+ var matchUnsigned = /\d+/; // 0 - inf
649
+ var matchSigned = /[+-]?\d+/; // -inf - inf
650
+
651
+ var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
652
+ var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z
653
+
654
+ var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
655
+
656
+ // any word (or two) characters or numbers including two/three word month in arabic.
657
+ // includes scottish gaelic two word and hyphenated months
658
+ var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;
659
+
660
+ var regexes = {};
661
+
662
+ function addRegexToken (token, regex, strictRegex) {
663
+ regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
664
+ return (isStrict && strictRegex) ? strictRegex : regex;
665
+ };
666
+ }
667
+
668
+ function getParseRegexForToken (token, config) {
669
+ if (!hasOwnProp(regexes, token)) {
670
+ return new RegExp(unescapeFormat(token));
671
+ }
672
+
673
+ return regexes[token](config._strict, config._locale);
674
+ }
675
+
676
+ // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
677
+ function unescapeFormat(s) {
678
+ return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
679
+ return p1 || p2 || p3 || p4;
680
+ }));
681
+ }
682
+
683
+ function regexEscape(s) {
684
+ return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
685
+ }
686
+
687
+ var tokens = {};
688
+
689
+ function addParseToken (token, callback) {
690
+ var i, func = callback;
691
+ if (typeof token === 'string') {
692
+ token = [token];
693
+ }
694
+ if (isNumber(callback)) {
695
+ func = function (input, array) {
696
+ array[callback] = toInt(input);
697
+ };
698
+ }
699
+ for (i = 0; i < token.length; i++) {
700
+ tokens[token[i]] = func;
701
+ }
702
+ }
703
+
704
+ function addWeekParseToken (token, callback) {
705
+ addParseToken(token, function (input, array, config, token) {
706
+ config._w = config._w || {};
707
+ callback(input, config._w, config, token);
708
+ });
709
+ }
710
+
711
+ function addTimeToArrayFromToken(token, input, config) {
712
+ if (input != null && hasOwnProp(tokens, token)) {
713
+ tokens[token](input, config._a, config, token);
714
+ }
715
+ }
716
+
717
+ var YEAR = 0;
718
+ var MONTH = 1;
719
+ var DATE = 2;
720
+ var HOUR = 3;
721
+ var MINUTE = 4;
722
+ var SECOND = 5;
723
+ var MILLISECOND = 6;
724
+ var WEEK = 7;
725
+ var WEEKDAY = 8;
726
+
727
+ // FORMATTING
728
+
729
+ addFormatToken('Y', 0, 0, function () {
730
+ var y = this.year();
731
+ return y <= 9999 ? '' + y : '+' + y;
732
+ });
733
+
734
+ addFormatToken(0, ['YY', 2], 0, function () {
735
+ return this.year() % 100;
736
+ });
737
+
738
+ addFormatToken(0, ['YYYY', 4], 0, 'year');
739
+ addFormatToken(0, ['YYYYY', 5], 0, 'year');
740
+ addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
741
+
742
+ // ALIASES
743
+
744
+ addUnitAlias('year', 'y');
745
+
746
+ // PRIORITIES
747
+
748
+ addUnitPriority('year', 1);
749
+
750
+ // PARSING
751
+
752
+ addRegexToken('Y', matchSigned);
753
+ addRegexToken('YY', match1to2, match2);
754
+ addRegexToken('YYYY', match1to4, match4);
755
+ addRegexToken('YYYYY', match1to6, match6);
756
+ addRegexToken('YYYYYY', match1to6, match6);
757
+
758
+ addParseToken(['YYYYY', 'YYYYYY'], YEAR);
759
+ addParseToken('YYYY', function (input, array) {
760
+ array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
761
+ });
762
+ addParseToken('YY', function (input, array) {
763
+ array[YEAR] = hooks.parseTwoDigitYear(input);
764
+ });
765
+ addParseToken('Y', function (input, array) {
766
+ array[YEAR] = parseInt(input, 10);
767
+ });
768
+
769
+ // HELPERS
770
+
771
+ function daysInYear(year) {
772
+ return isLeapYear(year) ? 366 : 365;
773
+ }
774
+
775
+ function isLeapYear(year) {
776
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
777
+ }
778
+
779
+ // HOOKS
780
+
781
+ hooks.parseTwoDigitYear = function (input) {
782
+ return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
783
+ };
784
+
785
+ // MOMENTS
786
+
787
+ var getSetYear = makeGetSet('FullYear', true);
788
+
789
+ function getIsLeapYear () {
790
+ return isLeapYear(this.year());
791
+ }
792
+
793
+ function makeGetSet (unit, keepTime) {
794
+ return function (value) {
795
+ if (value != null) {
796
+ set$1(this, unit, value);
797
+ hooks.updateOffset(this, keepTime);
798
+ return this;
799
+ } else {
800
+ return get(this, unit);
801
+ }
802
+ };
803
+ }
804
+
805
+ function get (mom, unit) {
806
+ return mom.isValid() ?
807
+ mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
808
+ }
809
+
810
+ function set$1 (mom, unit, value) {
811
+ if (mom.isValid() && !isNaN(value)) {
812
+ if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {
813
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));
814
+ }
815
+ else {
816
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
817
+ }
818
+ }
819
+ }
820
+
821
+ // MOMENTS
822
+
823
+ function stringGet (units) {
824
+ units = normalizeUnits(units);
825
+ if (isFunction(this[units])) {
826
+ return this[units]();
827
+ }
828
+ return this;
829
+ }
830
+
831
+
832
+ function stringSet (units, value) {
833
+ if (typeof units === 'object') {
834
+ units = normalizeObjectUnits(units);
835
+ var prioritized = getPrioritizedUnits(units);
836
+ for (var i = 0; i < prioritized.length; i++) {
837
+ this[prioritized[i].unit](units[prioritized[i].unit]);
838
+ }
839
+ } else {
840
+ units = normalizeUnits(units);
841
+ if (isFunction(this[units])) {
842
+ return this[units](value);
843
+ }
844
+ }
845
+ return this;
846
+ }
847
+
848
+ function mod(n, x) {
849
+ return ((n % x) + x) % x;
850
+ }
851
+
852
+ var indexOf;
853
+
854
+ if (Array.prototype.indexOf) {
855
+ indexOf = Array.prototype.indexOf;
856
+ } else {
857
+ indexOf = function (o) {
858
+ // I know
859
+ var i;
860
+ for (i = 0; i < this.length; ++i) {
861
+ if (this[i] === o) {
862
+ return i;
863
+ }
864
+ }
865
+ return -1;
866
+ };
867
+ }
868
+
869
+ function daysInMonth(year, month) {
870
+ if (isNaN(year) || isNaN(month)) {
871
+ return NaN;
872
+ }
873
+ var modMonth = mod(month, 12);
874
+ year += (month - modMonth) / 12;
875
+ return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);
876
+ }
877
+
878
+ // FORMATTING
879
+
880
+ addFormatToken('M', ['MM', 2], 'Mo', function () {
881
+ return this.month() + 1;
882
+ });
883
+
884
+ addFormatToken('MMM', 0, 0, function (format) {
885
+ return this.localeData().monthsShort(this, format);
886
+ });
887
+
888
+ addFormatToken('MMMM', 0, 0, function (format) {
889
+ return this.localeData().months(this, format);
890
+ });
891
+
892
+ // ALIASES
893
+
894
+ addUnitAlias('month', 'M');
895
+
896
+ // PRIORITY
897
+
898
+ addUnitPriority('month', 8);
899
+
900
+ // PARSING
901
+
902
+ addRegexToken('M', match1to2);
903
+ addRegexToken('MM', match1to2, match2);
904
+ addRegexToken('MMM', function (isStrict, locale) {
905
+ return locale.monthsShortRegex(isStrict);
906
+ });
907
+ addRegexToken('MMMM', function (isStrict, locale) {
908
+ return locale.monthsRegex(isStrict);
909
+ });
910
+
911
+ addParseToken(['M', 'MM'], function (input, array) {
912
+ array[MONTH] = toInt(input) - 1;
913
+ });
914
+
915
+ addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
916
+ var month = config._locale.monthsParse(input, token, config._strict);
917
+ // if we didn't find a month name, mark the date as invalid.
918
+ if (month != null) {
919
+ array[MONTH] = month;
920
+ } else {
921
+ getParsingFlags(config).invalidMonth = input;
922
+ }
923
+ });
924
+
925
+ // LOCALES
926
+
927
+ var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
928
+ var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
929
+ function localeMonths (m, format) {
930
+ if (!m) {
931
+ return isArray(this._months) ? this._months :
932
+ this._months['standalone'];
933
+ }
934
+ return isArray(this._months) ? this._months[m.month()] :
935
+ this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
936
+ }
937
+
938
+ var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
939
+ function localeMonthsShort (m, format) {
940
+ if (!m) {
941
+ return isArray(this._monthsShort) ? this._monthsShort :
942
+ this._monthsShort['standalone'];
943
+ }
944
+ return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
945
+ this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
946
+ }
947
+
948
+ function handleStrictParse(monthName, format, strict) {
949
+ var i, ii, mom, llc = monthName.toLocaleLowerCase();
950
+ if (!this._monthsParse) {
951
+ // this is not used
952
+ this._monthsParse = [];
953
+ this._longMonthsParse = [];
954
+ this._shortMonthsParse = [];
955
+ for (i = 0; i < 12; ++i) {
956
+ mom = createUTC([2000, i]);
957
+ this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
958
+ this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
959
+ }
960
+ }
961
+
962
+ if (strict) {
963
+ if (format === 'MMM') {
964
+ ii = indexOf.call(this._shortMonthsParse, llc);
965
+ return ii !== -1 ? ii : null;
966
+ } else {
967
+ ii = indexOf.call(this._longMonthsParse, llc);
968
+ return ii !== -1 ? ii : null;
969
+ }
970
+ } else {
971
+ if (format === 'MMM') {
972
+ ii = indexOf.call(this._shortMonthsParse, llc);
973
+ if (ii !== -1) {
974
+ return ii;
975
+ }
976
+ ii = indexOf.call(this._longMonthsParse, llc);
977
+ return ii !== -1 ? ii : null;
978
+ } else {
979
+ ii = indexOf.call(this._longMonthsParse, llc);
980
+ if (ii !== -1) {
981
+ return ii;
982
+ }
983
+ ii = indexOf.call(this._shortMonthsParse, llc);
984
+ return ii !== -1 ? ii : null;
985
+ }
986
+ }
987
+ }
988
+
989
+ function localeMonthsParse (monthName, format, strict) {
990
+ var i, mom, regex;
991
+
992
+ if (this._monthsParseExact) {
993
+ return handleStrictParse.call(this, monthName, format, strict);
994
+ }
995
+
996
+ if (!this._monthsParse) {
997
+ this._monthsParse = [];
998
+ this._longMonthsParse = [];
999
+ this._shortMonthsParse = [];
1000
+ }
1001
+
1002
+ // TODO: add sorting
1003
+ // Sorting makes sure if one month (or abbr) is a prefix of another
1004
+ // see sorting in computeMonthsParse
1005
+ for (i = 0; i < 12; i++) {
1006
+ // make the regex if we don't have it already
1007
+ mom = createUTC([2000, i]);
1008
+ if (strict && !this._longMonthsParse[i]) {
1009
+ this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
1010
+ this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
1011
+ }
1012
+ if (!strict && !this._monthsParse[i]) {
1013
+ regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
1014
+ this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
1015
+ }
1016
+ // test the regex
1017
+ if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
1018
+ return i;
1019
+ } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
1020
+ return i;
1021
+ } else if (!strict && this._monthsParse[i].test(monthName)) {
1022
+ return i;
1023
+ }
1024
+ }
1025
+ }
1026
+
1027
+ // MOMENTS
1028
+
1029
+ function setMonth (mom, value) {
1030
+ var dayOfMonth;
1031
+
1032
+ if (!mom.isValid()) {
1033
+ // No op
1034
+ return mom;
1035
+ }
1036
+
1037
+ if (typeof value === 'string') {
1038
+ if (/^\d+$/.test(value)) {
1039
+ value = toInt(value);
1040
+ } else {
1041
+ value = mom.localeData().monthsParse(value);
1042
+ // TODO: Another silent failure?
1043
+ if (!isNumber(value)) {
1044
+ return mom;
1045
+ }
1046
+ }
1047
+ }
1048
+
1049
+ dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
1050
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
1051
+ return mom;
1052
+ }
1053
+
1054
+ function getSetMonth (value) {
1055
+ if (value != null) {
1056
+ setMonth(this, value);
1057
+ hooks.updateOffset(this, true);
1058
+ return this;
1059
+ } else {
1060
+ return get(this, 'Month');
1061
+ }
1062
+ }
1063
+
1064
+ function getDaysInMonth () {
1065
+ return daysInMonth(this.year(), this.month());
1066
+ }
1067
+
1068
+ var defaultMonthsShortRegex = matchWord;
1069
+ function monthsShortRegex (isStrict) {
1070
+ if (this._monthsParseExact) {
1071
+ if (!hasOwnProp(this, '_monthsRegex')) {
1072
+ computeMonthsParse.call(this);
1073
+ }
1074
+ if (isStrict) {
1075
+ return this._monthsShortStrictRegex;
1076
+ } else {
1077
+ return this._monthsShortRegex;
1078
+ }
1079
+ } else {
1080
+ if (!hasOwnProp(this, '_monthsShortRegex')) {
1081
+ this._monthsShortRegex = defaultMonthsShortRegex;
1082
+ }
1083
+ return this._monthsShortStrictRegex && isStrict ?
1084
+ this._monthsShortStrictRegex : this._monthsShortRegex;
1085
+ }
1086
+ }
1087
+
1088
+ var defaultMonthsRegex = matchWord;
1089
+ function monthsRegex (isStrict) {
1090
+ if (this._monthsParseExact) {
1091
+ if (!hasOwnProp(this, '_monthsRegex')) {
1092
+ computeMonthsParse.call(this);
1093
+ }
1094
+ if (isStrict) {
1095
+ return this._monthsStrictRegex;
1096
+ } else {
1097
+ return this._monthsRegex;
1098
+ }
1099
+ } else {
1100
+ if (!hasOwnProp(this, '_monthsRegex')) {
1101
+ this._monthsRegex = defaultMonthsRegex;
1102
+ }
1103
+ return this._monthsStrictRegex && isStrict ?
1104
+ this._monthsStrictRegex : this._monthsRegex;
1105
+ }
1106
+ }
1107
+
1108
+ function computeMonthsParse () {
1109
+ function cmpLenRev(a, b) {
1110
+ return b.length - a.length;
1111
+ }
1112
+
1113
+ var shortPieces = [], longPieces = [], mixedPieces = [],
1114
+ i, mom;
1115
+ for (i = 0; i < 12; i++) {
1116
+ // make the regex if we don't have it already
1117
+ mom = createUTC([2000, i]);
1118
+ shortPieces.push(this.monthsShort(mom, ''));
1119
+ longPieces.push(this.months(mom, ''));
1120
+ mixedPieces.push(this.months(mom, ''));
1121
+ mixedPieces.push(this.monthsShort(mom, ''));
1122
+ }
1123
+ // Sorting makes sure if one month (or abbr) is a prefix of another it
1124
+ // will match the longer piece.
1125
+ shortPieces.sort(cmpLenRev);
1126
+ longPieces.sort(cmpLenRev);
1127
+ mixedPieces.sort(cmpLenRev);
1128
+ for (i = 0; i < 12; i++) {
1129
+ shortPieces[i] = regexEscape(shortPieces[i]);
1130
+ longPieces[i] = regexEscape(longPieces[i]);
1131
+ }
1132
+ for (i = 0; i < 24; i++) {
1133
+ mixedPieces[i] = regexEscape(mixedPieces[i]);
1134
+ }
1135
+
1136
+ this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
1137
+ this._monthsShortRegex = this._monthsRegex;
1138
+ this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
1139
+ this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
1140
+ }
1141
+
1142
+ function createDate (y, m, d, h, M, s, ms) {
1143
+ // can't just apply() to create a date:
1144
+ // https://stackoverflow.com/q/181348
1145
+ var date;
1146
+ // the date constructor remaps years 0-99 to 1900-1999
1147
+ if (y < 100 && y >= 0) {
1148
+ // preserve leap years using a full 400 year cycle, then reset
1149
+ date = new Date(y + 400, m, d, h, M, s, ms);
1150
+ if (isFinite(date.getFullYear())) {
1151
+ date.setFullYear(y);
1152
+ }
1153
+ } else {
1154
+ date = new Date(y, m, d, h, M, s, ms);
1155
+ }
1156
+
1157
+ return date;
1158
+ }
1159
+
1160
+ function createUTCDate (y) {
1161
+ var date;
1162
+ // the Date.UTC function remaps years 0-99 to 1900-1999
1163
+ if (y < 100 && y >= 0) {
1164
+ var args = Array.prototype.slice.call(arguments);
1165
+ // preserve leap years using a full 400 year cycle, then reset
1166
+ args[0] = y + 400;
1167
+ date = new Date(Date.UTC.apply(null, args));
1168
+ if (isFinite(date.getUTCFullYear())) {
1169
+ date.setUTCFullYear(y);
1170
+ }
1171
+ } else {
1172
+ date = new Date(Date.UTC.apply(null, arguments));
1173
+ }
1174
+
1175
+ return date;
1176
+ }
1177
+
1178
+ // start-of-first-week - start-of-year
1179
+ function firstWeekOffset(year, dow, doy) {
1180
+ var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
1181
+ fwd = 7 + dow - doy,
1182
+ // first-week day local weekday -- which local weekday is fwd
1183
+ fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
1184
+
1185
+ return -fwdlw + fwd - 1;
1186
+ }
1187
+
1188
+ // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
1189
+ function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
1190
+ var localWeekday = (7 + weekday - dow) % 7,
1191
+ weekOffset = firstWeekOffset(year, dow, doy),
1192
+ dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
1193
+ resYear, resDayOfYear;
1194
+
1195
+ if (dayOfYear <= 0) {
1196
+ resYear = year - 1;
1197
+ resDayOfYear = daysInYear(resYear) + dayOfYear;
1198
+ } else if (dayOfYear > daysInYear(year)) {
1199
+ resYear = year + 1;
1200
+ resDayOfYear = dayOfYear - daysInYear(year);
1201
+ } else {
1202
+ resYear = year;
1203
+ resDayOfYear = dayOfYear;
1204
+ }
1205
+
1206
+ return {
1207
+ year: resYear,
1208
+ dayOfYear: resDayOfYear
1209
+ };
1210
+ }
1211
+
1212
+ function weekOfYear(mom, dow, doy) {
1213
+ var weekOffset = firstWeekOffset(mom.year(), dow, doy),
1214
+ week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
1215
+ resWeek, resYear;
1216
+
1217
+ if (week < 1) {
1218
+ resYear = mom.year() - 1;
1219
+ resWeek = week + weeksInYear(resYear, dow, doy);
1220
+ } else if (week > weeksInYear(mom.year(), dow, doy)) {
1221
+ resWeek = week - weeksInYear(mom.year(), dow, doy);
1222
+ resYear = mom.year() + 1;
1223
+ } else {
1224
+ resYear = mom.year();
1225
+ resWeek = week;
1226
+ }
1227
+
1228
+ return {
1229
+ week: resWeek,
1230
+ year: resYear
1231
+ };
1232
+ }
1233
+
1234
+ function weeksInYear(year, dow, doy) {
1235
+ var weekOffset = firstWeekOffset(year, dow, doy),
1236
+ weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
1237
+ return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
1238
+ }
1239
+
1240
+ // FORMATTING
1241
+
1242
+ addFormatToken('w', ['ww', 2], 'wo', 'week');
1243
+ addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
1244
+
1245
+ // ALIASES
1246
+
1247
+ addUnitAlias('week', 'w');
1248
+ addUnitAlias('isoWeek', 'W');
1249
+
1250
+ // PRIORITIES
1251
+
1252
+ addUnitPriority('week', 5);
1253
+ addUnitPriority('isoWeek', 5);
1254
+
1255
+ // PARSING
1256
+
1257
+ addRegexToken('w', match1to2);
1258
+ addRegexToken('ww', match1to2, match2);
1259
+ addRegexToken('W', match1to2);
1260
+ addRegexToken('WW', match1to2, match2);
1261
+
1262
+ addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
1263
+ week[token.substr(0, 1)] = toInt(input);
1264
+ });
1265
+
1266
+ // HELPERS
1267
+
1268
+ // LOCALES
1269
+
1270
+ function localeWeek (mom) {
1271
+ return weekOfYear(mom, this._week.dow, this._week.doy).week;
1272
+ }
1273
+
1274
+ var defaultLocaleWeek = {
1275
+ dow : 0, // Sunday is the first day of the week.
1276
+ doy : 6 // The week that contains Jan 6th is the first week of the year.
1277
+ };
1278
+
1279
+ function localeFirstDayOfWeek () {
1280
+ return this._week.dow;
1281
+ }
1282
+
1283
+ function localeFirstDayOfYear () {
1284
+ return this._week.doy;
1285
+ }
1286
+
1287
+ // MOMENTS
1288
+
1289
+ function getSetWeek (input) {
1290
+ var week = this.localeData().week(this);
1291
+ return input == null ? week : this.add((input - week) * 7, 'd');
1292
+ }
1293
+
1294
+ function getSetISOWeek (input) {
1295
+ var week = weekOfYear(this, 1, 4).week;
1296
+ return input == null ? week : this.add((input - week) * 7, 'd');
1297
+ }
1298
+
1299
+ // FORMATTING
1300
+
1301
+ addFormatToken('d', 0, 'do', 'day');
1302
+
1303
+ addFormatToken('dd', 0, 0, function (format) {
1304
+ return this.localeData().weekdaysMin(this, format);
1305
+ });
1306
+
1307
+ addFormatToken('ddd', 0, 0, function (format) {
1308
+ return this.localeData().weekdaysShort(this, format);
1309
+ });
1310
+
1311
+ addFormatToken('dddd', 0, 0, function (format) {
1312
+ return this.localeData().weekdays(this, format);
1313
+ });
1314
+
1315
+ addFormatToken('e', 0, 0, 'weekday');
1316
+ addFormatToken('E', 0, 0, 'isoWeekday');
1317
+
1318
+ // ALIASES
1319
+
1320
+ addUnitAlias('day', 'd');
1321
+ addUnitAlias('weekday', 'e');
1322
+ addUnitAlias('isoWeekday', 'E');
1323
+
1324
+ // PRIORITY
1325
+ addUnitPriority('day', 11);
1326
+ addUnitPriority('weekday', 11);
1327
+ addUnitPriority('isoWeekday', 11);
1328
+
1329
+ // PARSING
1330
+
1331
+ addRegexToken('d', match1to2);
1332
+ addRegexToken('e', match1to2);
1333
+ addRegexToken('E', match1to2);
1334
+ addRegexToken('dd', function (isStrict, locale) {
1335
+ return locale.weekdaysMinRegex(isStrict);
1336
+ });
1337
+ addRegexToken('ddd', function (isStrict, locale) {
1338
+ return locale.weekdaysShortRegex(isStrict);
1339
+ });
1340
+ addRegexToken('dddd', function (isStrict, locale) {
1341
+ return locale.weekdaysRegex(isStrict);
1342
+ });
1343
+
1344
+ addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
1345
+ var weekday = config._locale.weekdaysParse(input, token, config._strict);
1346
+ // if we didn't get a weekday name, mark the date as invalid
1347
+ if (weekday != null) {
1348
+ week.d = weekday;
1349
+ } else {
1350
+ getParsingFlags(config).invalidWeekday = input;
1351
+ }
1352
+ });
1353
+
1354
+ addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
1355
+ week[token] = toInt(input);
1356
+ });
1357
+
1358
+ // HELPERS
1359
+
1360
+ function parseWeekday(input, locale) {
1361
+ if (typeof input !== 'string') {
1362
+ return input;
1363
+ }
1364
+
1365
+ if (!isNaN(input)) {
1366
+ return parseInt(input, 10);
1367
+ }
1368
+
1369
+ input = locale.weekdaysParse(input);
1370
+ if (typeof input === 'number') {
1371
+ return input;
1372
+ }
1373
+
1374
+ return null;
1375
+ }
1376
+
1377
+ function parseIsoWeekday(input, locale) {
1378
+ if (typeof input === 'string') {
1379
+ return locale.weekdaysParse(input) % 7 || 7;
1380
+ }
1381
+ return isNaN(input) ? null : input;
1382
+ }
1383
+
1384
+ // LOCALES
1385
+ function shiftWeekdays (ws, n) {
1386
+ return ws.slice(n, 7).concat(ws.slice(0, n));
1387
+ }
1388
+
1389
+ var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
1390
+ function localeWeekdays (m, format) {
1391
+ var weekdays = isArray(this._weekdays) ? this._weekdays :
1392
+ this._weekdays[(m && m !== true && this._weekdays.isFormat.test(format)) ? 'format' : 'standalone'];
1393
+ return (m === true) ? shiftWeekdays(weekdays, this._week.dow)
1394
+ : (m) ? weekdays[m.day()] : weekdays;
1395
+ }
1396
+
1397
+ var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
1398
+ function localeWeekdaysShort (m) {
1399
+ return (m === true) ? shiftWeekdays(this._weekdaysShort, this._week.dow)
1400
+ : (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
1401
+ }
1402
+
1403
+ var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
1404
+ function localeWeekdaysMin (m) {
1405
+ return (m === true) ? shiftWeekdays(this._weekdaysMin, this._week.dow)
1406
+ : (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
1407
+ }
1408
+
1409
+ function handleStrictParse$1(weekdayName, format, strict) {
1410
+ var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
1411
+ if (!this._weekdaysParse) {
1412
+ this._weekdaysParse = [];
1413
+ this._shortWeekdaysParse = [];
1414
+ this._minWeekdaysParse = [];
1415
+
1416
+ for (i = 0; i < 7; ++i) {
1417
+ mom = createUTC([2000, 1]).day(i);
1418
+ this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
1419
+ this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
1420
+ this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
1421
+ }
1422
+ }
1423
+
1424
+ if (strict) {
1425
+ if (format === 'dddd') {
1426
+ ii = indexOf.call(this._weekdaysParse, llc);
1427
+ return ii !== -1 ? ii : null;
1428
+ } else if (format === 'ddd') {
1429
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
1430
+ return ii !== -1 ? ii : null;
1431
+ } else {
1432
+ ii = indexOf.call(this._minWeekdaysParse, llc);
1433
+ return ii !== -1 ? ii : null;
1434
+ }
1435
+ } else {
1436
+ if (format === 'dddd') {
1437
+ ii = indexOf.call(this._weekdaysParse, llc);
1438
+ if (ii !== -1) {
1439
+ return ii;
1440
+ }
1441
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
1442
+ if (ii !== -1) {
1443
+ return ii;
1444
+ }
1445
+ ii = indexOf.call(this._minWeekdaysParse, llc);
1446
+ return ii !== -1 ? ii : null;
1447
+ } else if (format === 'ddd') {
1448
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
1449
+ if (ii !== -1) {
1450
+ return ii;
1451
+ }
1452
+ ii = indexOf.call(this._weekdaysParse, llc);
1453
+ if (ii !== -1) {
1454
+ return ii;
1455
+ }
1456
+ ii = indexOf.call(this._minWeekdaysParse, llc);
1457
+ return ii !== -1 ? ii : null;
1458
+ } else {
1459
+ ii = indexOf.call(this._minWeekdaysParse, llc);
1460
+ if (ii !== -1) {
1461
+ return ii;
1462
+ }
1463
+ ii = indexOf.call(this._weekdaysParse, llc);
1464
+ if (ii !== -1) {
1465
+ return ii;
1466
+ }
1467
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
1468
+ return ii !== -1 ? ii : null;
1469
+ }
1470
+ }
1471
+ }
1472
+
1473
+ function localeWeekdaysParse (weekdayName, format, strict) {
1474
+ var i, mom, regex;
1475
+
1476
+ if (this._weekdaysParseExact) {
1477
+ return handleStrictParse$1.call(this, weekdayName, format, strict);
1478
+ }
1479
+
1480
+ if (!this._weekdaysParse) {
1481
+ this._weekdaysParse = [];
1482
+ this._minWeekdaysParse = [];
1483
+ this._shortWeekdaysParse = [];
1484
+ this._fullWeekdaysParse = [];
1485
+ }
1486
+
1487
+ for (i = 0; i < 7; i++) {
1488
+ // make the regex if we don't have it already
1489
+
1490
+ mom = createUTC([2000, 1]).day(i);
1491
+ if (strict && !this._fullWeekdaysParse[i]) {
1492
+ this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');
1493
+ this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');
1494
+ this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');
1495
+ }
1496
+ if (!this._weekdaysParse[i]) {
1497
+ regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
1498
+ this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
1499
+ }
1500
+ // test the regex
1501
+ if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
1502
+ return i;
1503
+ } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
1504
+ return i;
1505
+ } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
1506
+ return i;
1507
+ } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
1508
+ return i;
1509
+ }
1510
+ }
1511
+ }
1512
+
1513
+ // MOMENTS
1514
+
1515
+ function getSetDayOfWeek (input) {
1516
+ if (!this.isValid()) {
1517
+ return input != null ? this : NaN;
1518
+ }
1519
+ var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
1520
+ if (input != null) {
1521
+ input = parseWeekday(input, this.localeData());
1522
+ return this.add(input - day, 'd');
1523
+ } else {
1524
+ return day;
1525
+ }
1526
+ }
1527
+
1528
+ function getSetLocaleDayOfWeek (input) {
1529
+ if (!this.isValid()) {
1530
+ return input != null ? this : NaN;
1531
+ }
1532
+ var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
1533
+ return input == null ? weekday : this.add(input - weekday, 'd');
1534
+ }
1535
+
1536
+ function getSetISODayOfWeek (input) {
1537
+ if (!this.isValid()) {
1538
+ return input != null ? this : NaN;
1539
+ }
1540
+
1541
+ // behaves the same as moment#day except
1542
+ // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
1543
+ // as a setter, sunday should belong to the previous week.
1544
+
1545
+ if (input != null) {
1546
+ var weekday = parseIsoWeekday(input, this.localeData());
1547
+ return this.day(this.day() % 7 ? weekday : weekday - 7);
1548
+ } else {
1549
+ return this.day() || 7;
1550
+ }
1551
+ }
1552
+
1553
+ var defaultWeekdaysRegex = matchWord;
1554
+ function weekdaysRegex (isStrict) {
1555
+ if (this._weekdaysParseExact) {
1556
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
1557
+ computeWeekdaysParse.call(this);
1558
+ }
1559
+ if (isStrict) {
1560
+ return this._weekdaysStrictRegex;
1561
+ } else {
1562
+ return this._weekdaysRegex;
1563
+ }
1564
+ } else {
1565
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
1566
+ this._weekdaysRegex = defaultWeekdaysRegex;
1567
+ }
1568
+ return this._weekdaysStrictRegex && isStrict ?
1569
+ this._weekdaysStrictRegex : this._weekdaysRegex;
1570
+ }
1571
+ }
1572
+
1573
+ var defaultWeekdaysShortRegex = matchWord;
1574
+ function weekdaysShortRegex (isStrict) {
1575
+ if (this._weekdaysParseExact) {
1576
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
1577
+ computeWeekdaysParse.call(this);
1578
+ }
1579
+ if (isStrict) {
1580
+ return this._weekdaysShortStrictRegex;
1581
+ } else {
1582
+ return this._weekdaysShortRegex;
1583
+ }
1584
+ } else {
1585
+ if (!hasOwnProp(this, '_weekdaysShortRegex')) {
1586
+ this._weekdaysShortRegex = defaultWeekdaysShortRegex;
1587
+ }
1588
+ return this._weekdaysShortStrictRegex && isStrict ?
1589
+ this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
1590
+ }
1591
+ }
1592
+
1593
+ var defaultWeekdaysMinRegex = matchWord;
1594
+ function weekdaysMinRegex (isStrict) {
1595
+ if (this._weekdaysParseExact) {
1596
+ if (!hasOwnProp(this, '_weekdaysRegex')) {
1597
+ computeWeekdaysParse.call(this);
1598
+ }
1599
+ if (isStrict) {
1600
+ return this._weekdaysMinStrictRegex;
1601
+ } else {
1602
+ return this._weekdaysMinRegex;
1603
+ }
1604
+ } else {
1605
+ if (!hasOwnProp(this, '_weekdaysMinRegex')) {
1606
+ this._weekdaysMinRegex = defaultWeekdaysMinRegex;
1607
+ }
1608
+ return this._weekdaysMinStrictRegex && isStrict ?
1609
+ this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
1610
+ }
1611
+ }
1612
+
1613
+
1614
+ function computeWeekdaysParse () {
1615
+ function cmpLenRev(a, b) {
1616
+ return b.length - a.length;
1617
+ }
1618
+
1619
+ var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
1620
+ i, mom, minp, shortp, longp;
1621
+ for (i = 0; i < 7; i++) {
1622
+ // make the regex if we don't have it already
1623
+ mom = createUTC([2000, 1]).day(i);
1624
+ minp = this.weekdaysMin(mom, '');
1625
+ shortp = this.weekdaysShort(mom, '');
1626
+ longp = this.weekdays(mom, '');
1627
+ minPieces.push(minp);
1628
+ shortPieces.push(shortp);
1629
+ longPieces.push(longp);
1630
+ mixedPieces.push(minp);
1631
+ mixedPieces.push(shortp);
1632
+ mixedPieces.push(longp);
1633
+ }
1634
+ // Sorting makes sure if one weekday (or abbr) is a prefix of another it
1635
+ // will match the longer piece.
1636
+ minPieces.sort(cmpLenRev);
1637
+ shortPieces.sort(cmpLenRev);
1638
+ longPieces.sort(cmpLenRev);
1639
+ mixedPieces.sort(cmpLenRev);
1640
+ for (i = 0; i < 7; i++) {
1641
+ shortPieces[i] = regexEscape(shortPieces[i]);
1642
+ longPieces[i] = regexEscape(longPieces[i]);
1643
+ mixedPieces[i] = regexEscape(mixedPieces[i]);
1644
+ }
1645
+
1646
+ this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
1647
+ this._weekdaysShortRegex = this._weekdaysRegex;
1648
+ this._weekdaysMinRegex = this._weekdaysRegex;
1649
+
1650
+ this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
1651
+ this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
1652
+ this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
1653
+ }
1654
+
1655
+ // FORMATTING
1656
+
1657
+ function hFormat() {
1658
+ return this.hours() % 12 || 12;
1659
+ }
1660
+
1661
+ function kFormat() {
1662
+ return this.hours() || 24;
1663
+ }
1664
+
1665
+ addFormatToken('H', ['HH', 2], 0, 'hour');
1666
+ addFormatToken('h', ['hh', 2], 0, hFormat);
1667
+ addFormatToken('k', ['kk', 2], 0, kFormat);
1668
+
1669
+ addFormatToken('hmm', 0, 0, function () {
1670
+ return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
1671
+ });
1672
+
1673
+ addFormatToken('hmmss', 0, 0, function () {
1674
+ return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
1675
+ zeroFill(this.seconds(), 2);
1676
+ });
1677
+
1678
+ addFormatToken('Hmm', 0, 0, function () {
1679
+ return '' + this.hours() + zeroFill(this.minutes(), 2);
1680
+ });
1681
+
1682
+ addFormatToken('Hmmss', 0, 0, function () {
1683
+ return '' + this.hours() + zeroFill(this.minutes(), 2) +
1684
+ zeroFill(this.seconds(), 2);
1685
+ });
1686
+
1687
+ function meridiem (token, lowercase) {
1688
+ addFormatToken(token, 0, 0, function () {
1689
+ return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
1690
+ });
1691
+ }
1692
+
1693
+ meridiem('a', true);
1694
+ meridiem('A', false);
1695
+
1696
+ // ALIASES
1697
+
1698
+ addUnitAlias('hour', 'h');
1699
+
1700
+ // PRIORITY
1701
+ addUnitPriority('hour', 13);
1702
+
1703
+ // PARSING
1704
+
1705
+ function matchMeridiem (isStrict, locale) {
1706
+ return locale._meridiemParse;
1707
+ }
1708
+
1709
+ addRegexToken('a', matchMeridiem);
1710
+ addRegexToken('A', matchMeridiem);
1711
+ addRegexToken('H', match1to2);
1712
+ addRegexToken('h', match1to2);
1713
+ addRegexToken('k', match1to2);
1714
+ addRegexToken('HH', match1to2, match2);
1715
+ addRegexToken('hh', match1to2, match2);
1716
+ addRegexToken('kk', match1to2, match2);
1717
+
1718
+ addRegexToken('hmm', match3to4);
1719
+ addRegexToken('hmmss', match5to6);
1720
+ addRegexToken('Hmm', match3to4);
1721
+ addRegexToken('Hmmss', match5to6);
1722
+
1723
+ addParseToken(['H', 'HH'], HOUR);
1724
+ addParseToken(['k', 'kk'], function (input, array, config) {
1725
+ var kInput = toInt(input);
1726
+ array[HOUR] = kInput === 24 ? 0 : kInput;
1727
+ });
1728
+ addParseToken(['a', 'A'], function (input, array, config) {
1729
+ config._isPm = config._locale.isPM(input);
1730
+ config._meridiem = input;
1731
+ });
1732
+ addParseToken(['h', 'hh'], function (input, array, config) {
1733
+ array[HOUR] = toInt(input);
1734
+ getParsingFlags(config).bigHour = true;
1735
+ });
1736
+ addParseToken('hmm', function (input, array, config) {
1737
+ var pos = input.length - 2;
1738
+ array[HOUR] = toInt(input.substr(0, pos));
1739
+ array[MINUTE] = toInt(input.substr(pos));
1740
+ getParsingFlags(config).bigHour = true;
1741
+ });
1742
+ addParseToken('hmmss', function (input, array, config) {
1743
+ var pos1 = input.length - 4;
1744
+ var pos2 = input.length - 2;
1745
+ array[HOUR] = toInt(input.substr(0, pos1));
1746
+ array[MINUTE] = toInt(input.substr(pos1, 2));
1747
+ array[SECOND] = toInt(input.substr(pos2));
1748
+ getParsingFlags(config).bigHour = true;
1749
+ });
1750
+ addParseToken('Hmm', function (input, array, config) {
1751
+ var pos = input.length - 2;
1752
+ array[HOUR] = toInt(input.substr(0, pos));
1753
+ array[MINUTE] = toInt(input.substr(pos));
1754
+ });
1755
+ addParseToken('Hmmss', function (input, array, config) {
1756
+ var pos1 = input.length - 4;
1757
+ var pos2 = input.length - 2;
1758
+ array[HOUR] = toInt(input.substr(0, pos1));
1759
+ array[MINUTE] = toInt(input.substr(pos1, 2));
1760
+ array[SECOND] = toInt(input.substr(pos2));
1761
+ });
1762
+
1763
+ // LOCALES
1764
+
1765
+ function localeIsPM (input) {
1766
+ // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
1767
+ // Using charAt should be more compatible.
1768
+ return ((input + '').toLowerCase().charAt(0) === 'p');
1769
+ }
1770
+
1771
+ var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
1772
+ function localeMeridiem (hours, minutes, isLower) {
1773
+ if (hours > 11) {
1774
+ return isLower ? 'pm' : 'PM';
1775
+ } else {
1776
+ return isLower ? 'am' : 'AM';
1777
+ }
1778
+ }
1779
+
1780
+
1781
+ // MOMENTS
1782
+
1783
+ // Setting the hour should keep the time, because the user explicitly
1784
+ // specified which hour they want. So trying to maintain the same hour (in
1785
+ // a new timezone) makes sense. Adding/subtracting hours does not follow
1786
+ // this rule.
1787
+ var getSetHour = makeGetSet('Hours', true);
1788
+
1789
+ var baseConfig = {
1790
+ calendar: defaultCalendar,
1791
+ longDateFormat: defaultLongDateFormat,
1792
+ invalidDate: defaultInvalidDate,
1793
+ ordinal: defaultOrdinal,
1794
+ dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
1795
+ relativeTime: defaultRelativeTime,
1796
+
1797
+ months: defaultLocaleMonths,
1798
+ monthsShort: defaultLocaleMonthsShort,
1799
+
1800
+ week: defaultLocaleWeek,
1801
+
1802
+ weekdays: defaultLocaleWeekdays,
1803
+ weekdaysMin: defaultLocaleWeekdaysMin,
1804
+ weekdaysShort: defaultLocaleWeekdaysShort,
1805
+
1806
+ meridiemParse: defaultLocaleMeridiemParse
1807
+ };
1808
+
1809
+ // internal storage for locale config files
1810
+ var locales = {};
1811
+ var localeFamilies = {};
1812
+ var globalLocale;
1813
+
1814
+ function normalizeLocale(key) {
1815
+ return key ? key.toLowerCase().replace('_', '-') : key;
1816
+ }
1817
+
1818
+ // pick the locale from the array
1819
+ // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
1820
+ // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
1821
+ function chooseLocale(names) {
1822
+ var i = 0, j, next, locale, split;
1823
+
1824
+ while (i < names.length) {
1825
+ split = normalizeLocale(names[i]).split('-');
1826
+ j = split.length;
1827
+ next = normalizeLocale(names[i + 1]);
1828
+ next = next ? next.split('-') : null;
1829
+ while (j > 0) {
1830
+ locale = loadLocale(split.slice(0, j).join('-'));
1831
+ if (locale) {
1832
+ return locale;
1833
+ }
1834
+ if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
1835
+ //the next array item is better than a shallower substring of this one
1836
+ break;
1837
+ }
1838
+ j--;
1839
+ }
1840
+ i++;
1841
+ }
1842
+ return globalLocale;
1843
+ }
1844
+
1845
+ function loadLocale(name) {
1846
+ var oldLocale = null;
1847
+ // TODO: Find a better way to register and load all the locales in Node
1848
+ if (!locales[name] && (typeof module !== 'undefined') &&
1849
+ module && module.exports) {
1850
+ try {
1851
+ oldLocale = globalLocale._abbr;
1852
+ var aliasedRequire = require;
1853
+ aliasedRequire('./locale/' + name);
1854
+ getSetGlobalLocale(oldLocale);
1855
+ } catch (e) {}
1856
+ }
1857
+ return locales[name];
1858
+ }
1859
+
1860
+ // This function will load locale and then set the global locale. If
1861
+ // no arguments are passed in, it will simply return the current global
1862
+ // locale key.
1863
+ function getSetGlobalLocale (key, values) {
1864
+ var data;
1865
+ if (key) {
1866
+ if (isUndefined(values)) {
1867
+ data = getLocale(key);
1868
+ }
1869
+ else {
1870
+ data = defineLocale(key, values);
1871
+ }
1872
+
1873
+ if (data) {
1874
+ // moment.duration._locale = moment._locale = data;
1875
+ globalLocale = data;
1876
+ }
1877
+ else {
1878
+ if ((typeof console !== 'undefined') && console.warn) {
1879
+ //warn user if arguments are passed but the locale could not be set
1880
+ console.warn('Locale ' + key + ' not found. Did you forget to load it?');
1881
+ }
1882
+ }
1883
+ }
1884
+
1885
+ return globalLocale._abbr;
1886
+ }
1887
+
1888
+ function defineLocale (name, config) {
1889
+ if (config !== null) {
1890
+ var locale, parentConfig = baseConfig;
1891
+ config.abbr = name;
1892
+ if (locales[name] != null) {
1893
+ deprecateSimple('defineLocaleOverride',
1894
+ 'use moment.updateLocale(localeName, config) to change ' +
1895
+ 'an existing locale. moment.defineLocale(localeName, ' +
1896
+ 'config) should only be used for creating a new locale ' +
1897
+ 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
1898
+ parentConfig = locales[name]._config;
1899
+ } else if (config.parentLocale != null) {
1900
+ if (locales[config.parentLocale] != null) {
1901
+ parentConfig = locales[config.parentLocale]._config;
1902
+ } else {
1903
+ locale = loadLocale(config.parentLocale);
1904
+ if (locale != null) {
1905
+ parentConfig = locale._config;
1906
+ } else {
1907
+ if (!localeFamilies[config.parentLocale]) {
1908
+ localeFamilies[config.parentLocale] = [];
1909
+ }
1910
+ localeFamilies[config.parentLocale].push({
1911
+ name: name,
1912
+ config: config
1913
+ });
1914
+ return null;
1915
+ }
1916
+ }
1917
+ }
1918
+ locales[name] = new Locale(mergeConfigs(parentConfig, config));
1919
+
1920
+ if (localeFamilies[name]) {
1921
+ localeFamilies[name].forEach(function (x) {
1922
+ defineLocale(x.name, x.config);
1923
+ });
1924
+ }
1925
+
1926
+ // backwards compat for now: also set the locale
1927
+ // make sure we set the locale AFTER all child locales have been
1928
+ // created, so we won't end up with the child locale set.
1929
+ getSetGlobalLocale(name);
1930
+
1931
+
1932
+ return locales[name];
1933
+ } else {
1934
+ // useful for testing
1935
+ delete locales[name];
1936
+ return null;
1937
+ }
1938
+ }
1939
+
1940
+ function updateLocale(name, config) {
1941
+ if (config != null) {
1942
+ var locale, tmpLocale, parentConfig = baseConfig;
1943
+ // MERGE
1944
+ tmpLocale = loadLocale(name);
1945
+ if (tmpLocale != null) {
1946
+ parentConfig = tmpLocale._config;
1947
+ }
1948
+ config = mergeConfigs(parentConfig, config);
1949
+ locale = new Locale(config);
1950
+ locale.parentLocale = locales[name];
1951
+ locales[name] = locale;
1952
+
1953
+ // backwards compat for now: also set the locale
1954
+ getSetGlobalLocale(name);
1955
+ } else {
1956
+ // pass null for config to unupdate, useful for tests
1957
+ if (locales[name] != null) {
1958
+ if (locales[name].parentLocale != null) {
1959
+ locales[name] = locales[name].parentLocale;
1960
+ } else if (locales[name] != null) {
1961
+ delete locales[name];
1962
+ }
1963
+ }
1964
+ }
1965
+ return locales[name];
1966
+ }
1967
+
1968
+ // returns locale data
1969
+ function getLocale (key) {
1970
+ var locale;
1971
+
1972
+ if (key && key._locale && key._locale._abbr) {
1973
+ key = key._locale._abbr;
1974
+ }
1975
+
1976
+ if (!key) {
1977
+ return globalLocale;
1978
+ }
1979
+
1980
+ if (!isArray(key)) {
1981
+ //short-circuit everything else
1982
+ locale = loadLocale(key);
1983
+ if (locale) {
1984
+ return locale;
1985
+ }
1986
+ key = [key];
1987
+ }
1988
+
1989
+ return chooseLocale(key);
1990
+ }
1991
+
1992
+ function listLocales() {
1993
+ return keys(locales);
1994
+ }
1995
+
1996
+ function checkOverflow (m) {
1997
+ var overflow;
1998
+ var a = m._a;
1999
+
2000
+ if (a && getParsingFlags(m).overflow === -2) {
2001
+ overflow =
2002
+ a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :
2003
+ a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
2004
+ a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
2005
+ a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :
2006
+ a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :
2007
+ a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
2008
+ -1;
2009
+
2010
+ if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
2011
+ overflow = DATE;
2012
+ }
2013
+ if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
2014
+ overflow = WEEK;
2015
+ }
2016
+ if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
2017
+ overflow = WEEKDAY;
2018
+ }
2019
+
2020
+ getParsingFlags(m).overflow = overflow;
2021
+ }
2022
+
2023
+ return m;
2024
+ }
2025
+
2026
+ // Pick the first defined of two or three arguments.
2027
+ function defaults(a, b, c) {
2028
+ if (a != null) {
2029
+ return a;
2030
+ }
2031
+ if (b != null) {
2032
+ return b;
2033
+ }
2034
+ return c;
2035
+ }
2036
+
2037
+ function currentDateArray(config) {
2038
+ // hooks is actually the exported moment object
2039
+ var nowValue = new Date(hooks.now());
2040
+ if (config._useUTC) {
2041
+ return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
2042
+ }
2043
+ return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
2044
+ }
2045
+
2046
+ // convert an array to a date.
2047
+ // the array should mirror the parameters below
2048
+ // note: all values past the year are optional and will default to the lowest possible value.
2049
+ // [year, month, day , hour, minute, second, millisecond]
2050
+ function configFromArray (config) {
2051
+ var i, date, input = [], currentDate, expectedWeekday, yearToUse;
2052
+
2053
+ if (config._d) {
2054
+ return;
2055
+ }
2056
+
2057
+ currentDate = currentDateArray(config);
2058
+
2059
+ //compute day of the year from weeks and weekdays
2060
+ if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
2061
+ dayOfYearFromWeekInfo(config);
2062
+ }
2063
+
2064
+ //if the day of the year is set, figure out what it is
2065
+ if (config._dayOfYear != null) {
2066
+ yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
2067
+
2068
+ if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {
2069
+ getParsingFlags(config)._overflowDayOfYear = true;
2070
+ }
2071
+
2072
+ date = createUTCDate(yearToUse, 0, config._dayOfYear);
2073
+ config._a[MONTH] = date.getUTCMonth();
2074
+ config._a[DATE] = date.getUTCDate();
2075
+ }
2076
+
2077
+ // Default to current date.
2078
+ // * if no year, month, day of month are given, default to today
2079
+ // * if day of month is given, default month and year
2080
+ // * if month is given, default only year
2081
+ // * if year is given, don't default anything
2082
+ for (i = 0; i < 3 && config._a[i] == null; ++i) {
2083
+ config._a[i] = input[i] = currentDate[i];
2084
+ }
2085
+
2086
+ // Zero out whatever was not defaulted, including time
2087
+ for (; i < 7; i++) {
2088
+ config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
2089
+ }
2090
+
2091
+ // Check for 24:00:00.000
2092
+ if (config._a[HOUR] === 24 &&
2093
+ config._a[MINUTE] === 0 &&
2094
+ config._a[SECOND] === 0 &&
2095
+ config._a[MILLISECOND] === 0) {
2096
+ config._nextDay = true;
2097
+ config._a[HOUR] = 0;
2098
+ }
2099
+
2100
+ config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
2101
+ expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();
2102
+
2103
+ // Apply timezone offset from input. The actual utcOffset can be changed
2104
+ // with parseZone.
2105
+ if (config._tzm != null) {
2106
+ config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
2107
+ }
2108
+
2109
+ if (config._nextDay) {
2110
+ config._a[HOUR] = 24;
2111
+ }
2112
+
2113
+ // check for mismatching day of week
2114
+ if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {
2115
+ getParsingFlags(config).weekdayMismatch = true;
2116
+ }
2117
+ }
2118
+
2119
+ function dayOfYearFromWeekInfo(config) {
2120
+ var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
2121
+
2122
+ w = config._w;
2123
+ if (w.GG != null || w.W != null || w.E != null) {
2124
+ dow = 1;
2125
+ doy = 4;
2126
+
2127
+ // TODO: We need to take the current isoWeekYear, but that depends on
2128
+ // how we interpret now (local, utc, fixed offset). So create
2129
+ // a now version of current config (take local/utc/offset flags, and
2130
+ // create now).
2131
+ weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
2132
+ week = defaults(w.W, 1);
2133
+ weekday = defaults(w.E, 1);
2134
+ if (weekday < 1 || weekday > 7) {
2135
+ weekdayOverflow = true;
2136
+ }
2137
+ } else {
2138
+ dow = config._locale._week.dow;
2139
+ doy = config._locale._week.doy;
2140
+
2141
+ var curWeek = weekOfYear(createLocal(), dow, doy);
2142
+
2143
+ weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
2144
+
2145
+ // Default to current week.
2146
+ week = defaults(w.w, curWeek.week);
2147
+
2148
+ if (w.d != null) {
2149
+ // weekday -- low day numbers are considered next week
2150
+ weekday = w.d;
2151
+ if (weekday < 0 || weekday > 6) {
2152
+ weekdayOverflow = true;
2153
+ }
2154
+ } else if (w.e != null) {
2155
+ // local weekday -- counting starts from beginning of week
2156
+ weekday = w.e + dow;
2157
+ if (w.e < 0 || w.e > 6) {
2158
+ weekdayOverflow = true;
2159
+ }
2160
+ } else {
2161
+ // default to beginning of week
2162
+ weekday = dow;
2163
+ }
2164
+ }
2165
+ if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
2166
+ getParsingFlags(config)._overflowWeeks = true;
2167
+ } else if (weekdayOverflow != null) {
2168
+ getParsingFlags(config)._overflowWeekday = true;
2169
+ } else {
2170
+ temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
2171
+ config._a[YEAR] = temp.year;
2172
+ config._dayOfYear = temp.dayOfYear;
2173
+ }
2174
+ }
2175
+
2176
+ // iso 8601 regex
2177
+ // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
2178
+ var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
2179
+ var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
2180
+
2181
+ var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
2182
+
2183
+ var isoDates = [
2184
+ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
2185
+ ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
2186
+ ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
2187
+ ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
2188
+ ['YYYY-DDD', /\d{4}-\d{3}/],
2189
+ ['YYYY-MM', /\d{4}-\d\d/, false],
2190
+ ['YYYYYYMMDD', /[+-]\d{10}/],
2191
+ ['YYYYMMDD', /\d{8}/],
2192
+ // YYYYMM is NOT allowed by the standard
2193
+ ['GGGG[W]WWE', /\d{4}W\d{3}/],
2194
+ ['GGGG[W]WW', /\d{4}W\d{2}/, false],
2195
+ ['YYYYDDD', /\d{7}/]
2196
+ ];
2197
+
2198
+ // iso time formats and regexes
2199
+ var isoTimes = [
2200
+ ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
2201
+ ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
2202
+ ['HH:mm:ss', /\d\d:\d\d:\d\d/],
2203
+ ['HH:mm', /\d\d:\d\d/],
2204
+ ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
2205
+ ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
2206
+ ['HHmmss', /\d\d\d\d\d\d/],
2207
+ ['HHmm', /\d\d\d\d/],
2208
+ ['HH', /\d\d/]
2209
+ ];
2210
+
2211
+ var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
2212
+
2213
+ // date from iso format
2214
+ function configFromISO(config) {
2215
+ var i, l,
2216
+ string = config._i,
2217
+ match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
2218
+ allowTime, dateFormat, timeFormat, tzFormat;
2219
+
2220
+ if (match) {
2221
+ getParsingFlags(config).iso = true;
2222
+
2223
+ for (i = 0, l = isoDates.length; i < l; i++) {
2224
+ if (isoDates[i][1].exec(match[1])) {
2225
+ dateFormat = isoDates[i][0];
2226
+ allowTime = isoDates[i][2] !== false;
2227
+ break;
2228
+ }
2229
+ }
2230
+ if (dateFormat == null) {
2231
+ config._isValid = false;
2232
+ return;
2233
+ }
2234
+ if (match[3]) {
2235
+ for (i = 0, l = isoTimes.length; i < l; i++) {
2236
+ if (isoTimes[i][1].exec(match[3])) {
2237
+ // match[2] should be 'T' or space
2238
+ timeFormat = (match[2] || ' ') + isoTimes[i][0];
2239
+ break;
2240
+ }
2241
+ }
2242
+ if (timeFormat == null) {
2243
+ config._isValid = false;
2244
+ return;
2245
+ }
2246
+ }
2247
+ if (!allowTime && timeFormat != null) {
2248
+ config._isValid = false;
2249
+ return;
2250
+ }
2251
+ if (match[4]) {
2252
+ if (tzRegex.exec(match[4])) {
2253
+ tzFormat = 'Z';
2254
+ } else {
2255
+ config._isValid = false;
2256
+ return;
2257
+ }
2258
+ }
2259
+ config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
2260
+ configFromStringAndFormat(config);
2261
+ } else {
2262
+ config._isValid = false;
2263
+ }
2264
+ }
2265
+
2266
+ // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
2267
+ var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;
2268
+
2269
+ function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {
2270
+ var result = [
2271
+ untruncateYear(yearStr),
2272
+ defaultLocaleMonthsShort.indexOf(monthStr),
2273
+ parseInt(dayStr, 10),
2274
+ parseInt(hourStr, 10),
2275
+ parseInt(minuteStr, 10)
2276
+ ];
2277
+
2278
+ if (secondStr) {
2279
+ result.push(parseInt(secondStr, 10));
2280
+ }
2281
+
2282
+ return result;
2283
+ }
2284
+
2285
+ function untruncateYear(yearStr) {
2286
+ var year = parseInt(yearStr, 10);
2287
+ if (year <= 49) {
2288
+ return 2000 + year;
2289
+ } else if (year <= 999) {
2290
+ return 1900 + year;
2291
+ }
2292
+ return year;
2293
+ }
2294
+
2295
+ function preprocessRFC2822(s) {
2296
+ // Remove comments and folding whitespace and replace multiple-spaces with a single space
2297
+ return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, '');
2298
+ }
2299
+
2300
+ function checkWeekday(weekdayStr, parsedInput, config) {
2301
+ if (weekdayStr) {
2302
+ // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.
2303
+ var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
2304
+ weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();
2305
+ if (weekdayProvided !== weekdayActual) {
2306
+ getParsingFlags(config).weekdayMismatch = true;
2307
+ config._isValid = false;
2308
+ return false;
2309
+ }
2310
+ }
2311
+ return true;
2312
+ }
2313
+
2314
+ var obsOffsets = {
2315
+ UT: 0,
2316
+ GMT: 0,
2317
+ EDT: -4 * 60,
2318
+ EST: -5 * 60,
2319
+ CDT: -5 * 60,
2320
+ CST: -6 * 60,
2321
+ MDT: -6 * 60,
2322
+ MST: -7 * 60,
2323
+ PDT: -7 * 60,
2324
+ PST: -8 * 60
2325
+ };
2326
+
2327
+ function calculateOffset(obsOffset, militaryOffset, numOffset) {
2328
+ if (obsOffset) {
2329
+ return obsOffsets[obsOffset];
2330
+ } else if (militaryOffset) {
2331
+ // the only allowed military tz is Z
2332
+ return 0;
2333
+ } else {
2334
+ var hm = parseInt(numOffset, 10);
2335
+ var m = hm % 100, h = (hm - m) / 100;
2336
+ return h * 60 + m;
2337
+ }
2338
+ }
2339
+
2340
+ // date and time from ref 2822 format
2341
+ function configFromRFC2822(config) {
2342
+ var match = rfc2822.exec(preprocessRFC2822(config._i));
2343
+ if (match) {
2344
+ var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);
2345
+ if (!checkWeekday(match[1], parsedArray, config)) {
2346
+ return;
2347
+ }
2348
+
2349
+ config._a = parsedArray;
2350
+ config._tzm = calculateOffset(match[8], match[9], match[10]);
2351
+
2352
+ config._d = createUTCDate.apply(null, config._a);
2353
+ config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
2354
+
2355
+ getParsingFlags(config).rfc2822 = true;
2356
+ } else {
2357
+ config._isValid = false;
2358
+ }
2359
+ }
2360
+
2361
+ // date from iso format or fallback
2362
+ function configFromString(config) {
2363
+ var matched = aspNetJsonRegex.exec(config._i);
2364
+
2365
+ if (matched !== null) {
2366
+ config._d = new Date(+matched[1]);
2367
+ return;
2368
+ }
2369
+
2370
+ configFromISO(config);
2371
+ if (config._isValid === false) {
2372
+ delete config._isValid;
2373
+ } else {
2374
+ return;
2375
+ }
2376
+
2377
+ configFromRFC2822(config);
2378
+ if (config._isValid === false) {
2379
+ delete config._isValid;
2380
+ } else {
2381
+ return;
2382
+ }
2383
+
2384
+ // Final attempt, use Input Fallback
2385
+ hooks.createFromInputFallback(config);
2386
+ }
2387
+
2388
+ hooks.createFromInputFallback = deprecate(
2389
+ 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
2390
+ 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
2391
+ 'discouraged and will be removed in an upcoming major release. Please refer to ' +
2392
+ 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
2393
+ function (config) {
2394
+ config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
2395
+ }
2396
+ );
2397
+
2398
+ // constant that refers to the ISO standard
2399
+ hooks.ISO_8601 = function () {};
2400
+
2401
+ // constant that refers to the RFC 2822 form
2402
+ hooks.RFC_2822 = function () {};
2403
+
2404
+ // date from string and format string
2405
+ function configFromStringAndFormat(config) {
2406
+ // TODO: Move this to another part of the creation flow to prevent circular deps
2407
+ if (config._f === hooks.ISO_8601) {
2408
+ configFromISO(config);
2409
+ return;
2410
+ }
2411
+ if (config._f === hooks.RFC_2822) {
2412
+ configFromRFC2822(config);
2413
+ return;
2414
+ }
2415
+ config._a = [];
2416
+ getParsingFlags(config).empty = true;
2417
+
2418
+ // This array is used to make a Date, either with `new Date` or `Date.UTC`
2419
+ var string = '' + config._i,
2420
+ i, parsedInput, tokens, token, skipped,
2421
+ stringLength = string.length,
2422
+ totalParsedInputLength = 0;
2423
+
2424
+ tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
2425
+
2426
+ for (i = 0; i < tokens.length; i++) {
2427
+ token = tokens[i];
2428
+ parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
2429
+ // console.log('token', token, 'parsedInput', parsedInput,
2430
+ // 'regex', getParseRegexForToken(token, config));
2431
+ if (parsedInput) {
2432
+ skipped = string.substr(0, string.indexOf(parsedInput));
2433
+ if (skipped.length > 0) {
2434
+ getParsingFlags(config).unusedInput.push(skipped);
2435
+ }
2436
+ string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
2437
+ totalParsedInputLength += parsedInput.length;
2438
+ }
2439
+ // don't parse if it's not a known token
2440
+ if (formatTokenFunctions[token]) {
2441
+ if (parsedInput) {
2442
+ getParsingFlags(config).empty = false;
2443
+ }
2444
+ else {
2445
+ getParsingFlags(config).unusedTokens.push(token);
2446
+ }
2447
+ addTimeToArrayFromToken(token, parsedInput, config);
2448
+ }
2449
+ else if (config._strict && !parsedInput) {
2450
+ getParsingFlags(config).unusedTokens.push(token);
2451
+ }
2452
+ }
2453
+
2454
+ // add remaining unparsed input length to the string
2455
+ getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
2456
+ if (string.length > 0) {
2457
+ getParsingFlags(config).unusedInput.push(string);
2458
+ }
2459
+
2460
+ // clear _12h flag if hour is <= 12
2461
+ if (config._a[HOUR] <= 12 &&
2462
+ getParsingFlags(config).bigHour === true &&
2463
+ config._a[HOUR] > 0) {
2464
+ getParsingFlags(config).bigHour = undefined;
2465
+ }
2466
+
2467
+ getParsingFlags(config).parsedDateParts = config._a.slice(0);
2468
+ getParsingFlags(config).meridiem = config._meridiem;
2469
+ // handle meridiem
2470
+ config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
2471
+
2472
+ configFromArray(config);
2473
+ checkOverflow(config);
2474
+ }
2475
+
2476
+
2477
+ function meridiemFixWrap (locale, hour, meridiem) {
2478
+ var isPm;
2479
+
2480
+ if (meridiem == null) {
2481
+ // nothing to do
2482
+ return hour;
2483
+ }
2484
+ if (locale.meridiemHour != null) {
2485
+ return locale.meridiemHour(hour, meridiem);
2486
+ } else if (locale.isPM != null) {
2487
+ // Fallback
2488
+ isPm = locale.isPM(meridiem);
2489
+ if (isPm && hour < 12) {
2490
+ hour += 12;
2491
+ }
2492
+ if (!isPm && hour === 12) {
2493
+ hour = 0;
2494
+ }
2495
+ return hour;
2496
+ } else {
2497
+ // this is not supposed to happen
2498
+ return hour;
2499
+ }
2500
+ }
2501
+
2502
+ // date from string and array of format strings
2503
+ function configFromStringAndArray(config) {
2504
+ var tempConfig,
2505
+ bestMoment,
2506
+
2507
+ scoreToBeat,
2508
+ i,
2509
+ currentScore;
2510
+
2511
+ if (config._f.length === 0) {
2512
+ getParsingFlags(config).invalidFormat = true;
2513
+ config._d = new Date(NaN);
2514
+ return;
2515
+ }
2516
+
2517
+ for (i = 0; i < config._f.length; i++) {
2518
+ currentScore = 0;
2519
+ tempConfig = copyConfig({}, config);
2520
+ if (config._useUTC != null) {
2521
+ tempConfig._useUTC = config._useUTC;
2522
+ }
2523
+ tempConfig._f = config._f[i];
2524
+ configFromStringAndFormat(tempConfig);
2525
+
2526
+ if (!isValid(tempConfig)) {
2527
+ continue;
2528
+ }
2529
+
2530
+ // if there is any input that was not parsed add a penalty for that format
2531
+ currentScore += getParsingFlags(tempConfig).charsLeftOver;
2532
+
2533
+ //or tokens
2534
+ currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
2535
+
2536
+ getParsingFlags(tempConfig).score = currentScore;
2537
+
2538
+ if (scoreToBeat == null || currentScore < scoreToBeat) {
2539
+ scoreToBeat = currentScore;
2540
+ bestMoment = tempConfig;
2541
+ }
2542
+ }
2543
+
2544
+ extend(config, bestMoment || tempConfig);
2545
+ }
2546
+
2547
+ function configFromObject(config) {
2548
+ if (config._d) {
2549
+ return;
2550
+ }
2551
+
2552
+ var i = normalizeObjectUnits(config._i);
2553
+ config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
2554
+ return obj && parseInt(obj, 10);
2555
+ });
2556
+
2557
+ configFromArray(config);
2558
+ }
2559
+
2560
+ function createFromConfig (config) {
2561
+ var res = new Moment(checkOverflow(prepareConfig(config)));
2562
+ if (res._nextDay) {
2563
+ // Adding is smart enough around DST
2564
+ res.add(1, 'd');
2565
+ res._nextDay = undefined;
2566
+ }
2567
+
2568
+ return res;
2569
+ }
2570
+
2571
+ function prepareConfig (config) {
2572
+ var input = config._i,
2573
+ format = config._f;
2574
+
2575
+ config._locale = config._locale || getLocale(config._l);
2576
+
2577
+ if (input === null || (format === undefined && input === '')) {
2578
+ return createInvalid({nullInput: true});
2579
+ }
2580
+
2581
+ if (typeof input === 'string') {
2582
+ config._i = input = config._locale.preparse(input);
2583
+ }
2584
+
2585
+ if (isMoment(input)) {
2586
+ return new Moment(checkOverflow(input));
2587
+ } else if (isDate(input)) {
2588
+ config._d = input;
2589
+ } else if (isArray(format)) {
2590
+ configFromStringAndArray(config);
2591
+ } else if (format) {
2592
+ configFromStringAndFormat(config);
2593
+ } else {
2594
+ configFromInput(config);
2595
+ }
2596
+
2597
+ if (!isValid(config)) {
2598
+ config._d = null;
2599
+ }
2600
+
2601
+ return config;
2602
+ }
2603
+
2604
+ function configFromInput(config) {
2605
+ var input = config._i;
2606
+ if (isUndefined(input)) {
2607
+ config._d = new Date(hooks.now());
2608
+ } else if (isDate(input)) {
2609
+ config._d = new Date(input.valueOf());
2610
+ } else if (typeof input === 'string') {
2611
+ configFromString(config);
2612
+ } else if (isArray(input)) {
2613
+ config._a = map(input.slice(0), function (obj) {
2614
+ return parseInt(obj, 10);
2615
+ });
2616
+ configFromArray(config);
2617
+ } else if (isObject(input)) {
2618
+ configFromObject(config);
2619
+ } else if (isNumber(input)) {
2620
+ // from milliseconds
2621
+ config._d = new Date(input);
2622
+ } else {
2623
+ hooks.createFromInputFallback(config);
2624
+ }
2625
+ }
2626
+
2627
+ function createLocalOrUTC (input, format, locale, strict, isUTC) {
2628
+ var c = {};
2629
+
2630
+ if (locale === true || locale === false) {
2631
+ strict = locale;
2632
+ locale = undefined;
2633
+ }
2634
+
2635
+ if ((isObject(input) && isObjectEmpty(input)) ||
2636
+ (isArray(input) && input.length === 0)) {
2637
+ input = undefined;
2638
+ }
2639
+ // object construction must be done this way.
2640
+ // https://github.com/moment/moment/issues/1423
2641
+ c._isAMomentObject = true;
2642
+ c._useUTC = c._isUTC = isUTC;
2643
+ c._l = locale;
2644
+ c._i = input;
2645
+ c._f = format;
2646
+ c._strict = strict;
2647
+
2648
+ return createFromConfig(c);
2649
+ }
2650
+
2651
+ function createLocal (input, format, locale, strict) {
2652
+ return createLocalOrUTC(input, format, locale, strict, false);
2653
+ }
2654
+
2655
+ var prototypeMin = deprecate(
2656
+ 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
2657
+ function () {
2658
+ var other = createLocal.apply(null, arguments);
2659
+ if (this.isValid() && other.isValid()) {
2660
+ return other < this ? this : other;
2661
+ } else {
2662
+ return createInvalid();
2663
+ }
2664
+ }
2665
+ );
2666
+
2667
+ var prototypeMax = deprecate(
2668
+ 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
2669
+ function () {
2670
+ var other = createLocal.apply(null, arguments);
2671
+ if (this.isValid() && other.isValid()) {
2672
+ return other > this ? this : other;
2673
+ } else {
2674
+ return createInvalid();
2675
+ }
2676
+ }
2677
+ );
2678
+
2679
+ // Pick a moment m from moments so that m[fn](other) is true for all
2680
+ // other. This relies on the function fn to be transitive.
2681
+ //
2682
+ // moments should either be an array of moment objects or an array, whose
2683
+ // first element is an array of moment objects.
2684
+ function pickBy(fn, moments) {
2685
+ var res, i;
2686
+ if (moments.length === 1 && isArray(moments[0])) {
2687
+ moments = moments[0];
2688
+ }
2689
+ if (!moments.length) {
2690
+ return createLocal();
2691
+ }
2692
+ res = moments[0];
2693
+ for (i = 1; i < moments.length; ++i) {
2694
+ if (!moments[i].isValid() || moments[i][fn](res)) {
2695
+ res = moments[i];
2696
+ }
2697
+ }
2698
+ return res;
2699
+ }
2700
+
2701
+ // TODO: Use [].sort instead?
2702
+ function min () {
2703
+ var args = [].slice.call(arguments, 0);
2704
+
2705
+ return pickBy('isBefore', args);
2706
+ }
2707
+
2708
+ function max () {
2709
+ var args = [].slice.call(arguments, 0);
2710
+
2711
+ return pickBy('isAfter', args);
2712
+ }
2713
+
2714
+ var now = function () {
2715
+ return Date.now ? Date.now() : +(new Date());
2716
+ };
2717
+
2718
+ var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];
2719
+
2720
+ function isDurationValid(m) {
2721
+ for (var key in m) {
2722
+ if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {
2723
+ return false;
2724
+ }
2725
+ }
2726
+
2727
+ var unitHasDecimal = false;
2728
+ for (var i = 0; i < ordering.length; ++i) {
2729
+ if (m[ordering[i]]) {
2730
+ if (unitHasDecimal) {
2731
+ return false; // only allow non-integers for smallest unit
2732
+ }
2733
+ if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
2734
+ unitHasDecimal = true;
2735
+ }
2736
+ }
2737
+ }
2738
+
2739
+ return true;
2740
+ }
2741
+
2742
+ function isValid$1() {
2743
+ return this._isValid;
2744
+ }
2745
+
2746
+ function createInvalid$1() {
2747
+ return createDuration(NaN);
2748
+ }
2749
+
2750
+ function Duration (duration) {
2751
+ var normalizedInput = normalizeObjectUnits(duration),
2752
+ years = normalizedInput.year || 0,
2753
+ quarters = normalizedInput.quarter || 0,
2754
+ months = normalizedInput.month || 0,
2755
+ weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
2756
+ days = normalizedInput.day || 0,
2757
+ hours = normalizedInput.hour || 0,
2758
+ minutes = normalizedInput.minute || 0,
2759
+ seconds = normalizedInput.second || 0,
2760
+ milliseconds = normalizedInput.millisecond || 0;
2761
+
2762
+ this._isValid = isDurationValid(normalizedInput);
2763
+
2764
+ // representation for dateAddRemove
2765
+ this._milliseconds = +milliseconds +
2766
+ seconds * 1e3 + // 1000
2767
+ minutes * 6e4 + // 1000 * 60
2768
+ hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
2769
+ // Because of dateAddRemove treats 24 hours as different from a
2770
+ // day when working around DST, we need to store them separately
2771
+ this._days = +days +
2772
+ weeks * 7;
2773
+ // It is impossible to translate months into days without knowing
2774
+ // which months you are are talking about, so we have to store
2775
+ // it separately.
2776
+ this._months = +months +
2777
+ quarters * 3 +
2778
+ years * 12;
2779
+
2780
+ this._data = {};
2781
+
2782
+ this._locale = getLocale();
2783
+
2784
+ this._bubble();
2785
+ }
2786
+
2787
+ function isDuration (obj) {
2788
+ return obj instanceof Duration;
2789
+ }
2790
+
2791
+ function absRound (number) {
2792
+ if (number < 0) {
2793
+ return Math.round(-1 * number) * -1;
2794
+ } else {
2795
+ return Math.round(number);
2796
+ }
2797
+ }
2798
+
2799
+ // FORMATTING
2800
+
2801
+ function offset (token, separator) {
2802
+ addFormatToken(token, 0, 0, function () {
2803
+ var offset = this.utcOffset();
2804
+ var sign = '+';
2805
+ if (offset < 0) {
2806
+ offset = -offset;
2807
+ sign = '-';
2808
+ }
2809
+ return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
2810
+ });
2811
+ }
2812
+
2813
+ offset('Z', ':');
2814
+ offset('ZZ', '');
2815
+
2816
+ // PARSING
2817
+
2818
+ addRegexToken('Z', matchShortOffset);
2819
+ addRegexToken('ZZ', matchShortOffset);
2820
+ addParseToken(['Z', 'ZZ'], function (input, array, config) {
2821
+ config._useUTC = true;
2822
+ config._tzm = offsetFromString(matchShortOffset, input);
2823
+ });
2824
+
2825
+ // HELPERS
2826
+
2827
+ // timezone chunker
2828
+ // '+10:00' > ['10', '00']
2829
+ // '-1530' > ['-15', '30']
2830
+ var chunkOffset = /([\+\-]|\d\d)/gi;
2831
+
2832
+ function offsetFromString(matcher, string) {
2833
+ var matches = (string || '').match(matcher);
2834
+
2835
+ if (matches === null) {
2836
+ return null;
2837
+ }
2838
+
2839
+ var chunk = matches[matches.length - 1] || [];
2840
+ var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
2841
+ var minutes = +(parts[1] * 60) + toInt(parts[2]);
2842
+
2843
+ return minutes === 0 ?
2844
+ 0 :
2845
+ parts[0] === '+' ? minutes : -minutes;
2846
+ }
2847
+
2848
+ // Return a moment from input, that is local/utc/zone equivalent to model.
2849
+ function cloneWithOffset(input, model) {
2850
+ var res, diff;
2851
+ if (model._isUTC) {
2852
+ res = model.clone();
2853
+ diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
2854
+ // Use low-level api, because this fn is low-level api.
2855
+ res._d.setTime(res._d.valueOf() + diff);
2856
+ hooks.updateOffset(res, false);
2857
+ return res;
2858
+ } else {
2859
+ return createLocal(input).local();
2860
+ }
2861
+ }
2862
+
2863
+ function getDateOffset (m) {
2864
+ // On Firefox.24 Date#getTimezoneOffset returns a floating point.
2865
+ // https://github.com/moment/moment/pull/1871
2866
+ return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
2867
+ }
2868
+
2869
+ // HOOKS
2870
+
2871
+ // This function will be called whenever a moment is mutated.
2872
+ // It is intended to keep the offset in sync with the timezone.
2873
+ hooks.updateOffset = function () {};
2874
+
2875
+ // MOMENTS
2876
+
2877
+ // keepLocalTime = true means only change the timezone, without
2878
+ // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
2879
+ // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
2880
+ // +0200, so we adjust the time as needed, to be valid.
2881
+ //
2882
+ // Keeping the time actually adds/subtracts (one hour)
2883
+ // from the actual represented time. That is why we call updateOffset
2884
+ // a second time. In case it wants us to change the offset again
2885
+ // _changeInProgress == true case, then we have to adjust, because
2886
+ // there is no such time in the given timezone.
2887
+ function getSetOffset (input, keepLocalTime, keepMinutes) {
2888
+ var offset = this._offset || 0,
2889
+ localAdjust;
2890
+ if (!this.isValid()) {
2891
+ return input != null ? this : NaN;
2892
+ }
2893
+ if (input != null) {
2894
+ if (typeof input === 'string') {
2895
+ input = offsetFromString(matchShortOffset, input);
2896
+ if (input === null) {
2897
+ return this;
2898
+ }
2899
+ } else if (Math.abs(input) < 16 && !keepMinutes) {
2900
+ input = input * 60;
2901
+ }
2902
+ if (!this._isUTC && keepLocalTime) {
2903
+ localAdjust = getDateOffset(this);
2904
+ }
2905
+ this._offset = input;
2906
+ this._isUTC = true;
2907
+ if (localAdjust != null) {
2908
+ this.add(localAdjust, 'm');
2909
+ }
2910
+ if (offset !== input) {
2911
+ if (!keepLocalTime || this._changeInProgress) {
2912
+ addSubtract(this, createDuration(input - offset, 'm'), 1, false);
2913
+ } else if (!this._changeInProgress) {
2914
+ this._changeInProgress = true;
2915
+ hooks.updateOffset(this, true);
2916
+ this._changeInProgress = null;
2917
+ }
2918
+ }
2919
+ return this;
2920
+ } else {
2921
+ return this._isUTC ? offset : getDateOffset(this);
2922
+ }
2923
+ }
2924
+
2925
+ function getSetZone (input, keepLocalTime) {
2926
+ if (input != null) {
2927
+ if (typeof input !== 'string') {
2928
+ input = -input;
2929
+ }
2930
+
2931
+ this.utcOffset(input, keepLocalTime);
2932
+
2933
+ return this;
2934
+ } else {
2935
+ return -this.utcOffset();
2936
+ }
2937
+ }
2938
+
2939
+ function setOffsetToUTC (keepLocalTime) {
2940
+ return this.utcOffset(0, keepLocalTime);
2941
+ }
2942
+
2943
+ function setOffsetToLocal (keepLocalTime) {
2944
+ if (this._isUTC) {
2945
+ this.utcOffset(0, keepLocalTime);
2946
+ this._isUTC = false;
2947
+
2948
+ if (keepLocalTime) {
2949
+ this.subtract(getDateOffset(this), 'm');
2950
+ }
2951
+ }
2952
+ return this;
2953
+ }
2954
+
2955
+ function setOffsetToParsedOffset () {
2956
+ if (this._tzm != null) {
2957
+ this.utcOffset(this._tzm, false, true);
2958
+ } else if (typeof this._i === 'string') {
2959
+ var tZone = offsetFromString(matchOffset, this._i);
2960
+ if (tZone != null) {
2961
+ this.utcOffset(tZone);
2962
+ }
2963
+ else {
2964
+ this.utcOffset(0, true);
2965
+ }
2966
+ }
2967
+ return this;
2968
+ }
2969
+
2970
+ function hasAlignedHourOffset (input) {
2971
+ if (!this.isValid()) {
2972
+ return false;
2973
+ }
2974
+ input = input ? createLocal(input).utcOffset() : 0;
2975
+
2976
+ return (this.utcOffset() - input) % 60 === 0;
2977
+ }
2978
+
2979
+ function isDaylightSavingTime () {
2980
+ return (
2981
+ this.utcOffset() > this.clone().month(0).utcOffset() ||
2982
+ this.utcOffset() > this.clone().month(5).utcOffset()
2983
+ );
2984
+ }
2985
+
2986
+ function isDaylightSavingTimeShifted () {
2987
+ if (!isUndefined(this._isDSTShifted)) {
2988
+ return this._isDSTShifted;
2989
+ }
2990
+
2991
+ var c = {};
2992
+
2993
+ copyConfig(c, this);
2994
+ c = prepareConfig(c);
2995
+
2996
+ if (c._a) {
2997
+ var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
2998
+ this._isDSTShifted = this.isValid() &&
2999
+ compareArrays(c._a, other.toArray()) > 0;
3000
+ } else {
3001
+ this._isDSTShifted = false;
3002
+ }
3003
+
3004
+ return this._isDSTShifted;
3005
+ }
3006
+
3007
+ function isLocal () {
3008
+ return this.isValid() ? !this._isUTC : false;
3009
+ }
3010
+
3011
+ function isUtcOffset () {
3012
+ return this.isValid() ? this._isUTC : false;
3013
+ }
3014
+
3015
+ function isUtc () {
3016
+ return this.isValid() ? this._isUTC && this._offset === 0 : false;
3017
+ }
3018
+
3019
+ // ASP.NET json date format regex
3020
+ var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
3021
+
3022
+ // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
3023
+ // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
3024
+ // and further modified to allow for strings containing both week and day
3025
+ var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
3026
+
3027
+ function createDuration (input, key) {
3028
+ var duration = input,
3029
+ // matching against regexp is expensive, do it on demand
3030
+ match = null,
3031
+ sign,
3032
+ ret,
3033
+ diffRes;
3034
+
3035
+ if (isDuration(input)) {
3036
+ duration = {
3037
+ ms : input._milliseconds,
3038
+ d : input._days,
3039
+ M : input._months
3040
+ };
3041
+ } else if (isNumber(input)) {
3042
+ duration = {};
3043
+ if (key) {
3044
+ duration[key] = input;
3045
+ } else {
3046
+ duration.milliseconds = input;
3047
+ }
3048
+ } else if (!!(match = aspNetRegex.exec(input))) {
3049
+ sign = (match[1] === '-') ? -1 : 1;
3050
+ duration = {
3051
+ y : 0,
3052
+ d : toInt(match[DATE]) * sign,
3053
+ h : toInt(match[HOUR]) * sign,
3054
+ m : toInt(match[MINUTE]) * sign,
3055
+ s : toInt(match[SECOND]) * sign,
3056
+ ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
3057
+ };
3058
+ } else if (!!(match = isoRegex.exec(input))) {
3059
+ sign = (match[1] === '-') ? -1 : 1;
3060
+ duration = {
3061
+ y : parseIso(match[2], sign),
3062
+ M : parseIso(match[3], sign),
3063
+ w : parseIso(match[4], sign),
3064
+ d : parseIso(match[5], sign),
3065
+ h : parseIso(match[6], sign),
3066
+ m : parseIso(match[7], sign),
3067
+ s : parseIso(match[8], sign)
3068
+ };
3069
+ } else if (duration == null) {// checks for null or undefined
3070
+ duration = {};
3071
+ } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
3072
+ diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));
3073
+
3074
+ duration = {};
3075
+ duration.ms = diffRes.milliseconds;
3076
+ duration.M = diffRes.months;
3077
+ }
3078
+
3079
+ ret = new Duration(duration);
3080
+
3081
+ if (isDuration(input) && hasOwnProp(input, '_locale')) {
3082
+ ret._locale = input._locale;
3083
+ }
3084
+
3085
+ return ret;
3086
+ }
3087
+
3088
+ createDuration.fn = Duration.prototype;
3089
+ createDuration.invalid = createInvalid$1;
3090
+
3091
+ function parseIso (inp, sign) {
3092
+ // We'd normally use ~~inp for this, but unfortunately it also
3093
+ // converts floats to ints.
3094
+ // inp may be undefined, so careful calling replace on it.
3095
+ var res = inp && parseFloat(inp.replace(',', '.'));
3096
+ // apply sign while we're at it
3097
+ return (isNaN(res) ? 0 : res) * sign;
3098
+ }
3099
+
3100
+ function positiveMomentsDifference(base, other) {
3101
+ var res = {};
3102
+
3103
+ res.months = other.month() - base.month() +
3104
+ (other.year() - base.year()) * 12;
3105
+ if (base.clone().add(res.months, 'M').isAfter(other)) {
3106
+ --res.months;
3107
+ }
3108
+
3109
+ res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
3110
+
3111
+ return res;
3112
+ }
3113
+
3114
+ function momentsDifference(base, other) {
3115
+ var res;
3116
+ if (!(base.isValid() && other.isValid())) {
3117
+ return {milliseconds: 0, months: 0};
3118
+ }
3119
+
3120
+ other = cloneWithOffset(other, base);
3121
+ if (base.isBefore(other)) {
3122
+ res = positiveMomentsDifference(base, other);
3123
+ } else {
3124
+ res = positiveMomentsDifference(other, base);
3125
+ res.milliseconds = -res.milliseconds;
3126
+ res.months = -res.months;
3127
+ }
3128
+
3129
+ return res;
3130
+ }
3131
+
3132
+ // TODO: remove 'name' arg after deprecation is removed
3133
+ function createAdder(direction, name) {
3134
+ return function (val, period) {
3135
+ var dur, tmp;
3136
+ //invert the arguments, but complain about it
3137
+ if (period !== null && !isNaN(+period)) {
3138
+ deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
3139
+ 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
3140
+ tmp = val; val = period; period = tmp;
3141
+ }
3142
+
3143
+ val = typeof val === 'string' ? +val : val;
3144
+ dur = createDuration(val, period);
3145
+ addSubtract(this, dur, direction);
3146
+ return this;
3147
+ };
3148
+ }
3149
+
3150
+ function addSubtract (mom, duration, isAdding, updateOffset) {
3151
+ var milliseconds = duration._milliseconds,
3152
+ days = absRound(duration._days),
3153
+ months = absRound(duration._months);
3154
+
3155
+ if (!mom.isValid()) {
3156
+ // No op
3157
+ return;
3158
+ }
3159
+
3160
+ updateOffset = updateOffset == null ? true : updateOffset;
3161
+
3162
+ if (months) {
3163
+ setMonth(mom, get(mom, 'Month') + months * isAdding);
3164
+ }
3165
+ if (days) {
3166
+ set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
3167
+ }
3168
+ if (milliseconds) {
3169
+ mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
3170
+ }
3171
+ if (updateOffset) {
3172
+ hooks.updateOffset(mom, days || months);
3173
+ }
3174
+ }
3175
+
3176
+ var add = createAdder(1, 'add');
3177
+ var subtract = createAdder(-1, 'subtract');
3178
+
3179
+ function getCalendarFormat(myMoment, now) {
3180
+ var diff = myMoment.diff(now, 'days', true);
3181
+ return diff < -6 ? 'sameElse' :
3182
+ diff < -1 ? 'lastWeek' :
3183
+ diff < 0 ? 'lastDay' :
3184
+ diff < 1 ? 'sameDay' :
3185
+ diff < 2 ? 'nextDay' :
3186
+ diff < 7 ? 'nextWeek' : 'sameElse';
3187
+ }
3188
+
3189
+ function calendar$1 (time, formats) {
3190
+ // We want to compare the start of today, vs this.
3191
+ // Getting start-of-today depends on whether we're local/utc/offset or not.
3192
+ var now = time || createLocal(),
3193
+ sod = cloneWithOffset(now, this).startOf('day'),
3194
+ format = hooks.calendarFormat(this, sod) || 'sameElse';
3195
+
3196
+ var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);
3197
+
3198
+ return this.format(output || this.localeData().calendar(format, this, createLocal(now)));
3199
+ }
3200
+
3201
+ function clone () {
3202
+ return new Moment(this);
3203
+ }
3204
+
3205
+ function isAfter (input, units) {
3206
+ var localInput = isMoment(input) ? input : createLocal(input);
3207
+ if (!(this.isValid() && localInput.isValid())) {
3208
+ return false;
3209
+ }
3210
+ units = normalizeUnits(units) || 'millisecond';
3211
+ if (units === 'millisecond') {
3212
+ return this.valueOf() > localInput.valueOf();
3213
+ } else {
3214
+ return localInput.valueOf() < this.clone().startOf(units).valueOf();
3215
+ }
3216
+ }
3217
+
3218
+ function isBefore (input, units) {
3219
+ var localInput = isMoment(input) ? input : createLocal(input);
3220
+ if (!(this.isValid() && localInput.isValid())) {
3221
+ return false;
3222
+ }
3223
+ units = normalizeUnits(units) || 'millisecond';
3224
+ if (units === 'millisecond') {
3225
+ return this.valueOf() < localInput.valueOf();
3226
+ } else {
3227
+ return this.clone().endOf(units).valueOf() < localInput.valueOf();
3228
+ }
3229
+ }
3230
+
3231
+ function isBetween (from, to, units, inclusivity) {
3232
+ var localFrom = isMoment(from) ? from : createLocal(from),
3233
+ localTo = isMoment(to) ? to : createLocal(to);
3234
+ if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
3235
+ return false;
3236
+ }
3237
+ inclusivity = inclusivity || '()';
3238
+ return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) &&
3239
+ (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units));
3240
+ }
3241
+
3242
+ function isSame (input, units) {
3243
+ var localInput = isMoment(input) ? input : createLocal(input),
3244
+ inputMs;
3245
+ if (!(this.isValid() && localInput.isValid())) {
3246
+ return false;
3247
+ }
3248
+ units = normalizeUnits(units) || 'millisecond';
3249
+ if (units === 'millisecond') {
3250
+ return this.valueOf() === localInput.valueOf();
3251
+ } else {
3252
+ inputMs = localInput.valueOf();
3253
+ return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
3254
+ }
3255
+ }
3256
+
3257
+ function isSameOrAfter (input, units) {
3258
+ return this.isSame(input, units) || this.isAfter(input, units);
3259
+ }
3260
+
3261
+ function isSameOrBefore (input, units) {
3262
+ return this.isSame(input, units) || this.isBefore(input, units);
3263
+ }
3264
+
3265
+ function diff (input, units, asFloat) {
3266
+ var that,
3267
+ zoneDelta,
3268
+ output;
3269
+
3270
+ if (!this.isValid()) {
3271
+ return NaN;
3272
+ }
3273
+
3274
+ that = cloneWithOffset(input, this);
3275
+
3276
+ if (!that.isValid()) {
3277
+ return NaN;
3278
+ }
3279
+
3280
+ zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
3281
+
3282
+ units = normalizeUnits(units);
3283
+
3284
+ switch (units) {
3285
+ case 'year': output = monthDiff(this, that) / 12; break;
3286
+ case 'month': output = monthDiff(this, that); break;
3287
+ case 'quarter': output = monthDiff(this, that) / 3; break;
3288
+ case 'second': output = (this - that) / 1e3; break; // 1000
3289
+ case 'minute': output = (this - that) / 6e4; break; // 1000 * 60
3290
+ case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60
3291
+ case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst
3292
+ case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst
3293
+ default: output = this - that;
3294
+ }
3295
+
3296
+ return asFloat ? output : absFloor(output);
3297
+ }
3298
+
3299
+ function monthDiff (a, b) {
3300
+ // difference in months
3301
+ var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
3302
+ // b is in (anchor - 1 month, anchor + 1 month)
3303
+ anchor = a.clone().add(wholeMonthDiff, 'months'),
3304
+ anchor2, adjust;
3305
+
3306
+ if (b - anchor < 0) {
3307
+ anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
3308
+ // linear across the month
3309
+ adjust = (b - anchor) / (anchor - anchor2);
3310
+ } else {
3311
+ anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
3312
+ // linear across the month
3313
+ adjust = (b - anchor) / (anchor2 - anchor);
3314
+ }
3315
+
3316
+ //check for negative zero, return zero if negative zero
3317
+ return -(wholeMonthDiff + adjust) || 0;
3318
+ }
3319
+
3320
+ hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
3321
+ hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
3322
+
3323
+ function toString () {
3324
+ return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
3325
+ }
3326
+
3327
+ function toISOString(keepOffset) {
3328
+ if (!this.isValid()) {
3329
+ return null;
3330
+ }
3331
+ var utc = keepOffset !== true;
3332
+ var m = utc ? this.clone().utc() : this;
3333
+ if (m.year() < 0 || m.year() > 9999) {
3334
+ return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');
3335
+ }
3336
+ if (isFunction(Date.prototype.toISOString)) {
3337
+ // native implementation is ~50x faster, use it when we can
3338
+ if (utc) {
3339
+ return this.toDate().toISOString();
3340
+ } else {
3341
+ return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));
3342
+ }
3343
+ }
3344
+ return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');
3345
+ }
3346
+
3347
+ /**
3348
+ * Return a human readable representation of a moment that can
3349
+ * also be evaluated to get a new moment which is the same
3350
+ *
3351
+ * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
3352
+ */
3353
+ function inspect () {
3354
+ if (!this.isValid()) {
3355
+ return 'moment.invalid(/* ' + this._i + ' */)';
3356
+ }
3357
+ var func = 'moment';
3358
+ var zone = '';
3359
+ if (!this.isLocal()) {
3360
+ func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
3361
+ zone = 'Z';
3362
+ }
3363
+ var prefix = '[' + func + '("]';
3364
+ var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
3365
+ var datetime = '-MM-DD[T]HH:mm:ss.SSS';
3366
+ var suffix = zone + '[")]';
3367
+
3368
+ return this.format(prefix + year + datetime + suffix);
3369
+ }
3370
+
3371
+ function format (inputString) {
3372
+ if (!inputString) {
3373
+ inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
3374
+ }
3375
+ var output = formatMoment(this, inputString);
3376
+ return this.localeData().postformat(output);
3377
+ }
3378
+
3379
+ function from (time, withoutSuffix) {
3380
+ if (this.isValid() &&
3381
+ ((isMoment(time) && time.isValid()) ||
3382
+ createLocal(time).isValid())) {
3383
+ return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
3384
+ } else {
3385
+ return this.localeData().invalidDate();
3386
+ }
3387
+ }
3388
+
3389
+ function fromNow (withoutSuffix) {
3390
+ return this.from(createLocal(), withoutSuffix);
3391
+ }
3392
+
3393
+ function to (time, withoutSuffix) {
3394
+ if (this.isValid() &&
3395
+ ((isMoment(time) && time.isValid()) ||
3396
+ createLocal(time).isValid())) {
3397
+ return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
3398
+ } else {
3399
+ return this.localeData().invalidDate();
3400
+ }
3401
+ }
3402
+
3403
+ function toNow (withoutSuffix) {
3404
+ return this.to(createLocal(), withoutSuffix);
3405
+ }
3406
+
3407
+ // If passed a locale key, it will set the locale for this
3408
+ // instance. Otherwise, it will return the locale configuration
3409
+ // variables for this instance.
3410
+ function locale (key) {
3411
+ var newLocaleData;
3412
+
3413
+ if (key === undefined) {
3414
+ return this._locale._abbr;
3415
+ } else {
3416
+ newLocaleData = getLocale(key);
3417
+ if (newLocaleData != null) {
3418
+ this._locale = newLocaleData;
3419
+ }
3420
+ return this;
3421
+ }
3422
+ }
3423
+
3424
+ var lang = deprecate(
3425
+ 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
3426
+ function (key) {
3427
+ if (key === undefined) {
3428
+ return this.localeData();
3429
+ } else {
3430
+ return this.locale(key);
3431
+ }
3432
+ }
3433
+ );
3434
+
3435
+ function localeData () {
3436
+ return this._locale;
3437
+ }
3438
+
3439
+ var MS_PER_SECOND = 1000;
3440
+ var MS_PER_MINUTE = 60 * MS_PER_SECOND;
3441
+ var MS_PER_HOUR = 60 * MS_PER_MINUTE;
3442
+ var MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;
3443
+
3444
+ // actual modulo - handles negative numbers (for dates before 1970):
3445
+ function mod$1(dividend, divisor) {
3446
+ return (dividend % divisor + divisor) % divisor;
3447
+ }
3448
+
3449
+ function localStartOfDate(y, m, d) {
3450
+ // the date constructor remaps years 0-99 to 1900-1999
3451
+ if (y < 100 && y >= 0) {
3452
+ // preserve leap years using a full 400 year cycle, then reset
3453
+ return new Date(y + 400, m, d) - MS_PER_400_YEARS;
3454
+ } else {
3455
+ return new Date(y, m, d).valueOf();
3456
+ }
3457
+ }
3458
+
3459
+ function utcStartOfDate(y, m, d) {
3460
+ // Date.UTC remaps years 0-99 to 1900-1999
3461
+ if (y < 100 && y >= 0) {
3462
+ // preserve leap years using a full 400 year cycle, then reset
3463
+ return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
3464
+ } else {
3465
+ return Date.UTC(y, m, d);
3466
+ }
3467
+ }
3468
+
3469
+ function startOf (units) {
3470
+ var time;
3471
+ units = normalizeUnits(units);
3472
+ if (units === undefined || units === 'millisecond' || !this.isValid()) {
3473
+ return this;
3474
+ }
3475
+
3476
+ var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
3477
+
3478
+ switch (units) {
3479
+ case 'year':
3480
+ time = startOfDate(this.year(), 0, 1);
3481
+ break;
3482
+ case 'quarter':
3483
+ time = startOfDate(this.year(), this.month() - this.month() % 3, 1);
3484
+ break;
3485
+ case 'month':
3486
+ time = startOfDate(this.year(), this.month(), 1);
3487
+ break;
3488
+ case 'week':
3489
+ time = startOfDate(this.year(), this.month(), this.date() - this.weekday());
3490
+ break;
3491
+ case 'isoWeek':
3492
+ time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1));
3493
+ break;
3494
+ case 'day':
3495
+ case 'date':
3496
+ time = startOfDate(this.year(), this.month(), this.date());
3497
+ break;
3498
+ case 'hour':
3499
+ time = this._d.valueOf();
3500
+ time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR);
3501
+ break;
3502
+ case 'minute':
3503
+ time = this._d.valueOf();
3504
+ time -= mod$1(time, MS_PER_MINUTE);
3505
+ break;
3506
+ case 'second':
3507
+ time = this._d.valueOf();
3508
+ time -= mod$1(time, MS_PER_SECOND);
3509
+ break;
3510
+ }
3511
+
3512
+ this._d.setTime(time);
3513
+ hooks.updateOffset(this, true);
3514
+ return this;
3515
+ }
3516
+
3517
+ function endOf (units) {
3518
+ var time;
3519
+ units = normalizeUnits(units);
3520
+ if (units === undefined || units === 'millisecond' || !this.isValid()) {
3521
+ return this;
3522
+ }
3523
+
3524
+ var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
3525
+
3526
+ switch (units) {
3527
+ case 'year':
3528
+ time = startOfDate(this.year() + 1, 0, 1) - 1;
3529
+ break;
3530
+ case 'quarter':
3531
+ time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1;
3532
+ break;
3533
+ case 'month':
3534
+ time = startOfDate(this.year(), this.month() + 1, 1) - 1;
3535
+ break;
3536
+ case 'week':
3537
+ time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1;
3538
+ break;
3539
+ case 'isoWeek':
3540
+ time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1;
3541
+ break;
3542
+ case 'day':
3543
+ case 'date':
3544
+ time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
3545
+ break;
3546
+ case 'hour':
3547
+ time = this._d.valueOf();
3548
+ time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1;
3549
+ break;
3550
+ case 'minute':
3551
+ time = this._d.valueOf();
3552
+ time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;
3553
+ break;
3554
+ case 'second':
3555
+ time = this._d.valueOf();
3556
+ time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;
3557
+ break;
3558
+ }
3559
+
3560
+ this._d.setTime(time);
3561
+ hooks.updateOffset(this, true);
3562
+ return this;
3563
+ }
3564
+
3565
+ function valueOf () {
3566
+ return this._d.valueOf() - ((this._offset || 0) * 60000);
3567
+ }
3568
+
3569
+ function unix () {
3570
+ return Math.floor(this.valueOf() / 1000);
3571
+ }
3572
+
3573
+ function toDate () {
3574
+ return new Date(this.valueOf());
3575
+ }
3576
+
3577
+ function toArray () {
3578
+ var m = this;
3579
+ return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
3580
+ }
3581
+
3582
+ function toObject () {
3583
+ var m = this;
3584
+ return {
3585
+ years: m.year(),
3586
+ months: m.month(),
3587
+ date: m.date(),
3588
+ hours: m.hours(),
3589
+ minutes: m.minutes(),
3590
+ seconds: m.seconds(),
3591
+ milliseconds: m.milliseconds()
3592
+ };
3593
+ }
3594
+
3595
+ function toJSON () {
3596
+ // new Date(NaN).toJSON() === null
3597
+ return this.isValid() ? this.toISOString() : null;
3598
+ }
3599
+
3600
+ function isValid$2 () {
3601
+ return isValid(this);
3602
+ }
3603
+
3604
+ function parsingFlags () {
3605
+ return extend({}, getParsingFlags(this));
3606
+ }
3607
+
3608
+ function invalidAt () {
3609
+ return getParsingFlags(this).overflow;
3610
+ }
3611
+
3612
+ function creationData() {
3613
+ return {
3614
+ input: this._i,
3615
+ format: this._f,
3616
+ locale: this._locale,
3617
+ isUTC: this._isUTC,
3618
+ strict: this._strict
3619
+ };
3620
+ }
3621
+
3622
+ // FORMATTING
3623
+
3624
+ addFormatToken(0, ['gg', 2], 0, function () {
3625
+ return this.weekYear() % 100;
3626
+ });
3627
+
3628
+ addFormatToken(0, ['GG', 2], 0, function () {
3629
+ return this.isoWeekYear() % 100;
3630
+ });
3631
+
3632
+ function addWeekYearFormatToken (token, getter) {
3633
+ addFormatToken(0, [token, token.length], 0, getter);
3634
+ }
3635
+
3636
+ addWeekYearFormatToken('gggg', 'weekYear');
3637
+ addWeekYearFormatToken('ggggg', 'weekYear');
3638
+ addWeekYearFormatToken('GGGG', 'isoWeekYear');
3639
+ addWeekYearFormatToken('GGGGG', 'isoWeekYear');
3640
+
3641
+ // ALIASES
3642
+
3643
+ addUnitAlias('weekYear', 'gg');
3644
+ addUnitAlias('isoWeekYear', 'GG');
3645
+
3646
+ // PRIORITY
3647
+
3648
+ addUnitPriority('weekYear', 1);
3649
+ addUnitPriority('isoWeekYear', 1);
3650
+
3651
+
3652
+ // PARSING
3653
+
3654
+ addRegexToken('G', matchSigned);
3655
+ addRegexToken('g', matchSigned);
3656
+ addRegexToken('GG', match1to2, match2);
3657
+ addRegexToken('gg', match1to2, match2);
3658
+ addRegexToken('GGGG', match1to4, match4);
3659
+ addRegexToken('gggg', match1to4, match4);
3660
+ addRegexToken('GGGGG', match1to6, match6);
3661
+ addRegexToken('ggggg', match1to6, match6);
3662
+
3663
+ addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
3664
+ week[token.substr(0, 2)] = toInt(input);
3665
+ });
3666
+
3667
+ addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
3668
+ week[token] = hooks.parseTwoDigitYear(input);
3669
+ });
3670
+
3671
+ // MOMENTS
3672
+
3673
+ function getSetWeekYear (input) {
3674
+ return getSetWeekYearHelper.call(this,
3675
+ input,
3676
+ this.week(),
3677
+ this.weekday(),
3678
+ this.localeData()._week.dow,
3679
+ this.localeData()._week.doy);
3680
+ }
3681
+
3682
+ function getSetISOWeekYear (input) {
3683
+ return getSetWeekYearHelper.call(this,
3684
+ input, this.isoWeek(), this.isoWeekday(), 1, 4);
3685
+ }
3686
+
3687
+ function getISOWeeksInYear () {
3688
+ return weeksInYear(this.year(), 1, 4);
3689
+ }
3690
+
3691
+ function getWeeksInYear () {
3692
+ var weekInfo = this.localeData()._week;
3693
+ return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
3694
+ }
3695
+
3696
+ function getSetWeekYearHelper(input, week, weekday, dow, doy) {
3697
+ var weeksTarget;
3698
+ if (input == null) {
3699
+ return weekOfYear(this, dow, doy).year;
3700
+ } else {
3701
+ weeksTarget = weeksInYear(input, dow, doy);
3702
+ if (week > weeksTarget) {
3703
+ week = weeksTarget;
3704
+ }
3705
+ return setWeekAll.call(this, input, week, weekday, dow, doy);
3706
+ }
3707
+ }
3708
+
3709
+ function setWeekAll(weekYear, week, weekday, dow, doy) {
3710
+ var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
3711
+ date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
3712
+
3713
+ this.year(date.getUTCFullYear());
3714
+ this.month(date.getUTCMonth());
3715
+ this.date(date.getUTCDate());
3716
+ return this;
3717
+ }
3718
+
3719
+ // FORMATTING
3720
+
3721
+ addFormatToken('Q', 0, 'Qo', 'quarter');
3722
+
3723
+ // ALIASES
3724
+
3725
+ addUnitAlias('quarter', 'Q');
3726
+
3727
+ // PRIORITY
3728
+
3729
+ addUnitPriority('quarter', 7);
3730
+
3731
+ // PARSING
3732
+
3733
+ addRegexToken('Q', match1);
3734
+ addParseToken('Q', function (input, array) {
3735
+ array[MONTH] = (toInt(input) - 1) * 3;
3736
+ });
3737
+
3738
+ // MOMENTS
3739
+
3740
+ function getSetQuarter (input) {
3741
+ return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
3742
+ }
3743
+
3744
+ // FORMATTING
3745
+
3746
+ addFormatToken('D', ['DD', 2], 'Do', 'date');
3747
+
3748
+ // ALIASES
3749
+
3750
+ addUnitAlias('date', 'D');
3751
+
3752
+ // PRIORITY
3753
+ addUnitPriority('date', 9);
3754
+
3755
+ // PARSING
3756
+
3757
+ addRegexToken('D', match1to2);
3758
+ addRegexToken('DD', match1to2, match2);
3759
+ addRegexToken('Do', function (isStrict, locale) {
3760
+ // TODO: Remove "ordinalParse" fallback in next major release.
3761
+ return isStrict ?
3762
+ (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :
3763
+ locale._dayOfMonthOrdinalParseLenient;
3764
+ });
3765
+
3766
+ addParseToken(['D', 'DD'], DATE);
3767
+ addParseToken('Do', function (input, array) {
3768
+ array[DATE] = toInt(input.match(match1to2)[0]);
3769
+ });
3770
+
3771
+ // MOMENTS
3772
+
3773
+ var getSetDayOfMonth = makeGetSet('Date', true);
3774
+
3775
+ // FORMATTING
3776
+
3777
+ addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
3778
+
3779
+ // ALIASES
3780
+
3781
+ addUnitAlias('dayOfYear', 'DDD');
3782
+
3783
+ // PRIORITY
3784
+ addUnitPriority('dayOfYear', 4);
3785
+
3786
+ // PARSING
3787
+
3788
+ addRegexToken('DDD', match1to3);
3789
+ addRegexToken('DDDD', match3);
3790
+ addParseToken(['DDD', 'DDDD'], function (input, array, config) {
3791
+ config._dayOfYear = toInt(input);
3792
+ });
3793
+
3794
+ // HELPERS
3795
+
3796
+ // MOMENTS
3797
+
3798
+ function getSetDayOfYear (input) {
3799
+ var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
3800
+ return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
3801
+ }
3802
+
3803
+ // FORMATTING
3804
+
3805
+ addFormatToken('m', ['mm', 2], 0, 'minute');
3806
+
3807
+ // ALIASES
3808
+
3809
+ addUnitAlias('minute', 'm');
3810
+
3811
+ // PRIORITY
3812
+
3813
+ addUnitPriority('minute', 14);
3814
+
3815
+ // PARSING
3816
+
3817
+ addRegexToken('m', match1to2);
3818
+ addRegexToken('mm', match1to2, match2);
3819
+ addParseToken(['m', 'mm'], MINUTE);
3820
+
3821
+ // MOMENTS
3822
+
3823
+ var getSetMinute = makeGetSet('Minutes', false);
3824
+
3825
+ // FORMATTING
3826
+
3827
+ addFormatToken('s', ['ss', 2], 0, 'second');
3828
+
3829
+ // ALIASES
3830
+
3831
+ addUnitAlias('second', 's');
3832
+
3833
+ // PRIORITY
3834
+
3835
+ addUnitPriority('second', 15);
3836
+
3837
+ // PARSING
3838
+
3839
+ addRegexToken('s', match1to2);
3840
+ addRegexToken('ss', match1to2, match2);
3841
+ addParseToken(['s', 'ss'], SECOND);
3842
+
3843
+ // MOMENTS
3844
+
3845
+ var getSetSecond = makeGetSet('Seconds', false);
3846
+
3847
+ // FORMATTING
3848
+
3849
+ addFormatToken('S', 0, 0, function () {
3850
+ return ~~(this.millisecond() / 100);
3851
+ });
3852
+
3853
+ addFormatToken(0, ['SS', 2], 0, function () {
3854
+ return ~~(this.millisecond() / 10);
3855
+ });
3856
+
3857
+ addFormatToken(0, ['SSS', 3], 0, 'millisecond');
3858
+ addFormatToken(0, ['SSSS', 4], 0, function () {
3859
+ return this.millisecond() * 10;
3860
+ });
3861
+ addFormatToken(0, ['SSSSS', 5], 0, function () {
3862
+ return this.millisecond() * 100;
3863
+ });
3864
+ addFormatToken(0, ['SSSSSS', 6], 0, function () {
3865
+ return this.millisecond() * 1000;
3866
+ });
3867
+ addFormatToken(0, ['SSSSSSS', 7], 0, function () {
3868
+ return this.millisecond() * 10000;
3869
+ });
3870
+ addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
3871
+ return this.millisecond() * 100000;
3872
+ });
3873
+ addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
3874
+ return this.millisecond() * 1000000;
3875
+ });
3876
+
3877
+
3878
+ // ALIASES
3879
+
3880
+ addUnitAlias('millisecond', 'ms');
3881
+
3882
+ // PRIORITY
3883
+
3884
+ addUnitPriority('millisecond', 16);
3885
+
3886
+ // PARSING
3887
+
3888
+ addRegexToken('S', match1to3, match1);
3889
+ addRegexToken('SS', match1to3, match2);
3890
+ addRegexToken('SSS', match1to3, match3);
3891
+
3892
+ var token;
3893
+ for (token = 'SSSS'; token.length <= 9; token += 'S') {
3894
+ addRegexToken(token, matchUnsigned);
3895
+ }
3896
+
3897
+ function parseMs(input, array) {
3898
+ array[MILLISECOND] = toInt(('0.' + input) * 1000);
3899
+ }
3900
+
3901
+ for (token = 'S'; token.length <= 9; token += 'S') {
3902
+ addParseToken(token, parseMs);
3903
+ }
3904
+ // MOMENTS
3905
+
3906
+ var getSetMillisecond = makeGetSet('Milliseconds', false);
3907
+
3908
+ // FORMATTING
3909
+
3910
+ addFormatToken('z', 0, 0, 'zoneAbbr');
3911
+ addFormatToken('zz', 0, 0, 'zoneName');
3912
+
3913
+ // MOMENTS
3914
+
3915
+ function getZoneAbbr () {
3916
+ return this._isUTC ? 'UTC' : '';
3917
+ }
3918
+
3919
+ function getZoneName () {
3920
+ return this._isUTC ? 'Coordinated Universal Time' : '';
3921
+ }
3922
+
3923
+ var proto = Moment.prototype;
3924
+
3925
+ proto.add = add;
3926
+ proto.calendar = calendar$1;
3927
+ proto.clone = clone;
3928
+ proto.diff = diff;
3929
+ proto.endOf = endOf;
3930
+ proto.format = format;
3931
+ proto.from = from;
3932
+ proto.fromNow = fromNow;
3933
+ proto.to = to;
3934
+ proto.toNow = toNow;
3935
+ proto.get = stringGet;
3936
+ proto.invalidAt = invalidAt;
3937
+ proto.isAfter = isAfter;
3938
+ proto.isBefore = isBefore;
3939
+ proto.isBetween = isBetween;
3940
+ proto.isSame = isSame;
3941
+ proto.isSameOrAfter = isSameOrAfter;
3942
+ proto.isSameOrBefore = isSameOrBefore;
3943
+ proto.isValid = isValid$2;
3944
+ proto.lang = lang;
3945
+ proto.locale = locale;
3946
+ proto.localeData = localeData;
3947
+ proto.max = prototypeMax;
3948
+ proto.min = prototypeMin;
3949
+ proto.parsingFlags = parsingFlags;
3950
+ proto.set = stringSet;
3951
+ proto.startOf = startOf;
3952
+ proto.subtract = subtract;
3953
+ proto.toArray = toArray;
3954
+ proto.toObject = toObject;
3955
+ proto.toDate = toDate;
3956
+ proto.toISOString = toISOString;
3957
+ proto.inspect = inspect;
3958
+ proto.toJSON = toJSON;
3959
+ proto.toString = toString;
3960
+ proto.unix = unix;
3961
+ proto.valueOf = valueOf;
3962
+ proto.creationData = creationData;
3963
+ proto.year = getSetYear;
3964
+ proto.isLeapYear = getIsLeapYear;
3965
+ proto.weekYear = getSetWeekYear;
3966
+ proto.isoWeekYear = getSetISOWeekYear;
3967
+ proto.quarter = proto.quarters = getSetQuarter;
3968
+ proto.month = getSetMonth;
3969
+ proto.daysInMonth = getDaysInMonth;
3970
+ proto.week = proto.weeks = getSetWeek;
3971
+ proto.isoWeek = proto.isoWeeks = getSetISOWeek;
3972
+ proto.weeksInYear = getWeeksInYear;
3973
+ proto.isoWeeksInYear = getISOWeeksInYear;
3974
+ proto.date = getSetDayOfMonth;
3975
+ proto.day = proto.days = getSetDayOfWeek;
3976
+ proto.weekday = getSetLocaleDayOfWeek;
3977
+ proto.isoWeekday = getSetISODayOfWeek;
3978
+ proto.dayOfYear = getSetDayOfYear;
3979
+ proto.hour = proto.hours = getSetHour;
3980
+ proto.minute = proto.minutes = getSetMinute;
3981
+ proto.second = proto.seconds = getSetSecond;
3982
+ proto.millisecond = proto.milliseconds = getSetMillisecond;
3983
+ proto.utcOffset = getSetOffset;
3984
+ proto.utc = setOffsetToUTC;
3985
+ proto.local = setOffsetToLocal;
3986
+ proto.parseZone = setOffsetToParsedOffset;
3987
+ proto.hasAlignedHourOffset = hasAlignedHourOffset;
3988
+ proto.isDST = isDaylightSavingTime;
3989
+ proto.isLocal = isLocal;
3990
+ proto.isUtcOffset = isUtcOffset;
3991
+ proto.isUtc = isUtc;
3992
+ proto.isUTC = isUtc;
3993
+ proto.zoneAbbr = getZoneAbbr;
3994
+ proto.zoneName = getZoneName;
3995
+ proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
3996
+ proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
3997
+ proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);
3998
+ proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
3999
+ proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);
4000
+
4001
+ function createUnix (input) {
4002
+ return createLocal(input * 1000);
4003
+ }
4004
+
4005
+ function createInZone () {
4006
+ return createLocal.apply(null, arguments).parseZone();
4007
+ }
4008
+
4009
+ function preParsePostFormat (string) {
4010
+ return string;
4011
+ }
4012
+
4013
+ var proto$1 = Locale.prototype;
4014
+
4015
+ proto$1.calendar = calendar;
4016
+ proto$1.longDateFormat = longDateFormat;
4017
+ proto$1.invalidDate = invalidDate;
4018
+ proto$1.ordinal = ordinal;
4019
+ proto$1.preparse = preParsePostFormat;
4020
+ proto$1.postformat = preParsePostFormat;
4021
+ proto$1.relativeTime = relativeTime;
4022
+ proto$1.pastFuture = pastFuture;
4023
+ proto$1.set = set;
4024
+
4025
+ proto$1.months = localeMonths;
4026
+ proto$1.monthsShort = localeMonthsShort;
4027
+ proto$1.monthsParse = localeMonthsParse;
4028
+ proto$1.monthsRegex = monthsRegex;
4029
+ proto$1.monthsShortRegex = monthsShortRegex;
4030
+ proto$1.week = localeWeek;
4031
+ proto$1.firstDayOfYear = localeFirstDayOfYear;
4032
+ proto$1.firstDayOfWeek = localeFirstDayOfWeek;
4033
+
4034
+ proto$1.weekdays = localeWeekdays;
4035
+ proto$1.weekdaysMin = localeWeekdaysMin;
4036
+ proto$1.weekdaysShort = localeWeekdaysShort;
4037
+ proto$1.weekdaysParse = localeWeekdaysParse;
4038
+
4039
+ proto$1.weekdaysRegex = weekdaysRegex;
4040
+ proto$1.weekdaysShortRegex = weekdaysShortRegex;
4041
+ proto$1.weekdaysMinRegex = weekdaysMinRegex;
4042
+
4043
+ proto$1.isPM = localeIsPM;
4044
+ proto$1.meridiem = localeMeridiem;
4045
+
4046
+ function get$1 (format, index, field, setter) {
4047
+ var locale = getLocale();
4048
+ var utc = createUTC().set(setter, index);
4049
+ return locale[field](utc, format);
4050
+ }
4051
+
4052
+ function listMonthsImpl (format, index, field) {
4053
+ if (isNumber(format)) {
4054
+ index = format;
4055
+ format = undefined;
4056
+ }
4057
+
4058
+ format = format || '';
4059
+
4060
+ if (index != null) {
4061
+ return get$1(format, index, field, 'month');
4062
+ }
4063
+
4064
+ var i;
4065
+ var out = [];
4066
+ for (i = 0; i < 12; i++) {
4067
+ out[i] = get$1(format, i, field, 'month');
4068
+ }
4069
+ return out;
4070
+ }
4071
+
4072
+ // ()
4073
+ // (5)
4074
+ // (fmt, 5)
4075
+ // (fmt)
4076
+ // (true)
4077
+ // (true, 5)
4078
+ // (true, fmt, 5)
4079
+ // (true, fmt)
4080
+ function listWeekdaysImpl (localeSorted, format, index, field) {
4081
+ if (typeof localeSorted === 'boolean') {
4082
+ if (isNumber(format)) {
4083
+ index = format;
4084
+ format = undefined;
4085
+ }
4086
+
4087
+ format = format || '';
4088
+ } else {
4089
+ format = localeSorted;
4090
+ index = format;
4091
+ localeSorted = false;
4092
+
4093
+ if (isNumber(format)) {
4094
+ index = format;
4095
+ format = undefined;
4096
+ }
4097
+
4098
+ format = format || '';
4099
+ }
4100
+
4101
+ var locale = getLocale(),
4102
+ shift = localeSorted ? locale._week.dow : 0;
4103
+
4104
+ if (index != null) {
4105
+ return get$1(format, (index + shift) % 7, field, 'day');
4106
+ }
4107
+
4108
+ var i;
4109
+ var out = [];
4110
+ for (i = 0; i < 7; i++) {
4111
+ out[i] = get$1(format, (i + shift) % 7, field, 'day');
4112
+ }
4113
+ return out;
4114
+ }
4115
+
4116
+ function listMonths (format, index) {
4117
+ return listMonthsImpl(format, index, 'months');
4118
+ }
4119
+
4120
+ function listMonthsShort (format, index) {
4121
+ return listMonthsImpl(format, index, 'monthsShort');
4122
+ }
4123
+
4124
+ function listWeekdays (localeSorted, format, index) {
4125
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
4126
+ }
4127
+
4128
+ function listWeekdaysShort (localeSorted, format, index) {
4129
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
4130
+ }
4131
+
4132
+ function listWeekdaysMin (localeSorted, format, index) {
4133
+ return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
4134
+ }
4135
+
4136
+ getSetGlobalLocale('en', {
4137
+ dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
4138
+ ordinal : function (number) {
4139
+ var b = number % 10,
4140
+ output = (toInt(number % 100 / 10) === 1) ? 'th' :
4141
+ (b === 1) ? 'st' :
4142
+ (b === 2) ? 'nd' :
4143
+ (b === 3) ? 'rd' : 'th';
4144
+ return number + output;
4145
+ }
4146
+ });
4147
+
4148
+ // Side effect imports
4149
+
4150
+ hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);
4151
+ hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);
4152
+
4153
+ var mathAbs = Math.abs;
4154
+
4155
+ function abs () {
4156
+ var data = this._data;
4157
+
4158
+ this._milliseconds = mathAbs(this._milliseconds);
4159
+ this._days = mathAbs(this._days);
4160
+ this._months = mathAbs(this._months);
4161
+
4162
+ data.milliseconds = mathAbs(data.milliseconds);
4163
+ data.seconds = mathAbs(data.seconds);
4164
+ data.minutes = mathAbs(data.minutes);
4165
+ data.hours = mathAbs(data.hours);
4166
+ data.months = mathAbs(data.months);
4167
+ data.years = mathAbs(data.years);
4168
+
4169
+ return this;
4170
+ }
4171
+
4172
+ function addSubtract$1 (duration, input, value, direction) {
4173
+ var other = createDuration(input, value);
4174
+
4175
+ duration._milliseconds += direction * other._milliseconds;
4176
+ duration._days += direction * other._days;
4177
+ duration._months += direction * other._months;
4178
+
4179
+ return duration._bubble();
4180
+ }
4181
+
4182
+ // supports only 2.0-style add(1, 's') or add(duration)
4183
+ function add$1 (input, value) {
4184
+ return addSubtract$1(this, input, value, 1);
4185
+ }
4186
+
4187
+ // supports only 2.0-style subtract(1, 's') or subtract(duration)
4188
+ function subtract$1 (input, value) {
4189
+ return addSubtract$1(this, input, value, -1);
4190
+ }
4191
+
4192
+ function absCeil (number) {
4193
+ if (number < 0) {
4194
+ return Math.floor(number);
4195
+ } else {
4196
+ return Math.ceil(number);
4197
+ }
4198
+ }
4199
+
4200
+ function bubble () {
4201
+ var milliseconds = this._milliseconds;
4202
+ var days = this._days;
4203
+ var months = this._months;
4204
+ var data = this._data;
4205
+ var seconds, minutes, hours, years, monthsFromDays;
4206
+
4207
+ // if we have a mix of positive and negative values, bubble down first
4208
+ // check: https://github.com/moment/moment/issues/2166
4209
+ if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
4210
+ (milliseconds <= 0 && days <= 0 && months <= 0))) {
4211
+ milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
4212
+ days = 0;
4213
+ months = 0;
4214
+ }
4215
+
4216
+ // The following code bubbles up values, see the tests for
4217
+ // examples of what that means.
4218
+ data.milliseconds = milliseconds % 1000;
4219
+
4220
+ seconds = absFloor(milliseconds / 1000);
4221
+ data.seconds = seconds % 60;
4222
+
4223
+ minutes = absFloor(seconds / 60);
4224
+ data.minutes = minutes % 60;
4225
+
4226
+ hours = absFloor(minutes / 60);
4227
+ data.hours = hours % 24;
4228
+
4229
+ days += absFloor(hours / 24);
4230
+
4231
+ // convert days to months
4232
+ monthsFromDays = absFloor(daysToMonths(days));
4233
+ months += monthsFromDays;
4234
+ days -= absCeil(monthsToDays(monthsFromDays));
4235
+
4236
+ // 12 months -> 1 year
4237
+ years = absFloor(months / 12);
4238
+ months %= 12;
4239
+
4240
+ data.days = days;
4241
+ data.months = months;
4242
+ data.years = years;
4243
+
4244
+ return this;
4245
+ }
4246
+
4247
+ function daysToMonths (days) {
4248
+ // 400 years have 146097 days (taking into account leap year rules)
4249
+ // 400 years have 12 months === 4800
4250
+ return days * 4800 / 146097;
4251
+ }
4252
+
4253
+ function monthsToDays (months) {
4254
+ // the reverse of daysToMonths
4255
+ return months * 146097 / 4800;
4256
+ }
4257
+
4258
+ function as (units) {
4259
+ if (!this.isValid()) {
4260
+ return NaN;
4261
+ }
4262
+ var days;
4263
+ var months;
4264
+ var milliseconds = this._milliseconds;
4265
+
4266
+ units = normalizeUnits(units);
4267
+
4268
+ if (units === 'month' || units === 'quarter' || units === 'year') {
4269
+ days = this._days + milliseconds / 864e5;
4270
+ months = this._months + daysToMonths(days);
4271
+ switch (units) {
4272
+ case 'month': return months;
4273
+ case 'quarter': return months / 3;
4274
+ case 'year': return months / 12;
4275
+ }
4276
+ } else {
4277
+ // handle milliseconds separately because of floating point math errors (issue #1867)
4278
+ days = this._days + Math.round(monthsToDays(this._months));
4279
+ switch (units) {
4280
+ case 'week' : return days / 7 + milliseconds / 6048e5;
4281
+ case 'day' : return days + milliseconds / 864e5;
4282
+ case 'hour' : return days * 24 + milliseconds / 36e5;
4283
+ case 'minute' : return days * 1440 + milliseconds / 6e4;
4284
+ case 'second' : return days * 86400 + milliseconds / 1000;
4285
+ // Math.floor prevents floating point math errors here
4286
+ case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
4287
+ default: throw new Error('Unknown unit ' + units);
4288
+ }
4289
+ }
4290
+ }
4291
+
4292
+ // TODO: Use this.as('ms')?
4293
+ function valueOf$1 () {
4294
+ if (!this.isValid()) {
4295
+ return NaN;
4296
+ }
4297
+ return (
4298
+ this._milliseconds +
4299
+ this._days * 864e5 +
4300
+ (this._months % 12) * 2592e6 +
4301
+ toInt(this._months / 12) * 31536e6
4302
+ );
4303
+ }
4304
+
4305
+ function makeAs (alias) {
4306
+ return function () {
4307
+ return this.as(alias);
4308
+ };
4309
+ }
4310
+
4311
+ var asMilliseconds = makeAs('ms');
4312
+ var asSeconds = makeAs('s');
4313
+ var asMinutes = makeAs('m');
4314
+ var asHours = makeAs('h');
4315
+ var asDays = makeAs('d');
4316
+ var asWeeks = makeAs('w');
4317
+ var asMonths = makeAs('M');
4318
+ var asQuarters = makeAs('Q');
4319
+ var asYears = makeAs('y');
4320
+
4321
+ function clone$1 () {
4322
+ return createDuration(this);
4323
+ }
4324
+
4325
+ function get$2 (units) {
4326
+ units = normalizeUnits(units);
4327
+ return this.isValid() ? this[units + 's']() : NaN;
4328
+ }
4329
+
4330
+ function makeGetter(name) {
4331
+ return function () {
4332
+ return this.isValid() ? this._data[name] : NaN;
4333
+ };
4334
+ }
4335
+
4336
+ var milliseconds = makeGetter('milliseconds');
4337
+ var seconds = makeGetter('seconds');
4338
+ var minutes = makeGetter('minutes');
4339
+ var hours = makeGetter('hours');
4340
+ var days = makeGetter('days');
4341
+ var months = makeGetter('months');
4342
+ var years = makeGetter('years');
4343
+
4344
+ function weeks () {
4345
+ return absFloor(this.days() / 7);
4346
+ }
4347
+
4348
+ var round = Math.round;
4349
+ var thresholds = {
4350
+ ss: 44, // a few seconds to seconds
4351
+ s : 45, // seconds to minute
4352
+ m : 45, // minutes to hour
4353
+ h : 22, // hours to day
4354
+ d : 26, // days to month
4355
+ M : 11 // months to year
4356
+ };
4357
+
4358
+ // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
4359
+ function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
4360
+ return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
4361
+ }
4362
+
4363
+ function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
4364
+ var duration = createDuration(posNegDuration).abs();
4365
+ var seconds = round(duration.as('s'));
4366
+ var minutes = round(duration.as('m'));
4367
+ var hours = round(duration.as('h'));
4368
+ var days = round(duration.as('d'));
4369
+ var months = round(duration.as('M'));
4370
+ var years = round(duration.as('y'));
4371
+
4372
+ var a = seconds <= thresholds.ss && ['s', seconds] ||
4373
+ seconds < thresholds.s && ['ss', seconds] ||
4374
+ minutes <= 1 && ['m'] ||
4375
+ minutes < thresholds.m && ['mm', minutes] ||
4376
+ hours <= 1 && ['h'] ||
4377
+ hours < thresholds.h && ['hh', hours] ||
4378
+ days <= 1 && ['d'] ||
4379
+ days < thresholds.d && ['dd', days] ||
4380
+ months <= 1 && ['M'] ||
4381
+ months < thresholds.M && ['MM', months] ||
4382
+ years <= 1 && ['y'] || ['yy', years];
4383
+
4384
+ a[2] = withoutSuffix;
4385
+ a[3] = +posNegDuration > 0;
4386
+ a[4] = locale;
4387
+ return substituteTimeAgo.apply(null, a);
4388
+ }
4389
+
4390
+ // This function allows you to set the rounding function for relative time strings
4391
+ function getSetRelativeTimeRounding (roundingFunction) {
4392
+ if (roundingFunction === undefined) {
4393
+ return round;
4394
+ }
4395
+ if (typeof(roundingFunction) === 'function') {
4396
+ round = roundingFunction;
4397
+ return true;
4398
+ }
4399
+ return false;
4400
+ }
4401
+
4402
+ // This function allows you to set a threshold for relative time strings
4403
+ function getSetRelativeTimeThreshold (threshold, limit) {
4404
+ if (thresholds[threshold] === undefined) {
4405
+ return false;
4406
+ }
4407
+ if (limit === undefined) {
4408
+ return thresholds[threshold];
4409
+ }
4410
+ thresholds[threshold] = limit;
4411
+ if (threshold === 's') {
4412
+ thresholds.ss = limit - 1;
4413
+ }
4414
+ return true;
4415
+ }
4416
+
4417
+ function humanize (withSuffix) {
4418
+ if (!this.isValid()) {
4419
+ return this.localeData().invalidDate();
4420
+ }
4421
+
4422
+ var locale = this.localeData();
4423
+ var output = relativeTime$1(this, !withSuffix, locale);
4424
+
4425
+ if (withSuffix) {
4426
+ output = locale.pastFuture(+this, output);
4427
+ }
4428
+
4429
+ return locale.postformat(output);
4430
+ }
4431
+
4432
+ var abs$1 = Math.abs;
4433
+
4434
+ function sign(x) {
4435
+ return ((x > 0) - (x < 0)) || +x;
4436
+ }
4437
+
4438
+ function toISOString$1() {
4439
+ // for ISO strings we do not use the normal bubbling rules:
4440
+ // * milliseconds bubble up until they become hours
4441
+ // * days do not bubble at all
4442
+ // * months bubble up until they become years
4443
+ // This is because there is no context-free conversion between hours and days
4444
+ // (think of clock changes)
4445
+ // and also not between days and months (28-31 days per month)
4446
+ if (!this.isValid()) {
4447
+ return this.localeData().invalidDate();
4448
+ }
4449
+
4450
+ var seconds = abs$1(this._milliseconds) / 1000;
4451
+ var days = abs$1(this._days);
4452
+ var months = abs$1(this._months);
4453
+ var minutes, hours, years;
4454
+
4455
+ // 3600 seconds -> 60 minutes -> 1 hour
4456
+ minutes = absFloor(seconds / 60);
4457
+ hours = absFloor(minutes / 60);
4458
+ seconds %= 60;
4459
+ minutes %= 60;
4460
+
4461
+ // 12 months -> 1 year
4462
+ years = absFloor(months / 12);
4463
+ months %= 12;
4464
+
4465
+
4466
+ // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
4467
+ var Y = years;
4468
+ var M = months;
4469
+ var D = days;
4470
+ var h = hours;
4471
+ var m = minutes;
4472
+ var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
4473
+ var total = this.asSeconds();
4474
+
4475
+ if (!total) {
4476
+ // this is the same as C#'s (Noda) and python (isodate)...
4477
+ // but not other JS (goog.date)
4478
+ return 'P0D';
4479
+ }
4480
+
4481
+ var totalSign = total < 0 ? '-' : '';
4482
+ var ymSign = sign(this._months) !== sign(total) ? '-' : '';
4483
+ var daysSign = sign(this._days) !== sign(total) ? '-' : '';
4484
+ var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';
4485
+
4486
+ return totalSign + 'P' +
4487
+ (Y ? ymSign + Y + 'Y' : '') +
4488
+ (M ? ymSign + M + 'M' : '') +
4489
+ (D ? daysSign + D + 'D' : '') +
4490
+ ((h || m || s) ? 'T' : '') +
4491
+ (h ? hmsSign + h + 'H' : '') +
4492
+ (m ? hmsSign + m + 'M' : '') +
4493
+ (s ? hmsSign + s + 'S' : '');
4494
+ }
4495
+
4496
+ var proto$2 = Duration.prototype;
4497
+
4498
+ proto$2.isValid = isValid$1;
4499
+ proto$2.abs = abs;
4500
+ proto$2.add = add$1;
4501
+ proto$2.subtract = subtract$1;
4502
+ proto$2.as = as;
4503
+ proto$2.asMilliseconds = asMilliseconds;
4504
+ proto$2.asSeconds = asSeconds;
4505
+ proto$2.asMinutes = asMinutes;
4506
+ proto$2.asHours = asHours;
4507
+ proto$2.asDays = asDays;
4508
+ proto$2.asWeeks = asWeeks;
4509
+ proto$2.asMonths = asMonths;
4510
+ proto$2.asQuarters = asQuarters;
4511
+ proto$2.asYears = asYears;
4512
+ proto$2.valueOf = valueOf$1;
4513
+ proto$2._bubble = bubble;
4514
+ proto$2.clone = clone$1;
4515
+ proto$2.get = get$2;
4516
+ proto$2.milliseconds = milliseconds;
4517
+ proto$2.seconds = seconds;
4518
+ proto$2.minutes = minutes;
4519
+ proto$2.hours = hours;
4520
+ proto$2.days = days;
4521
+ proto$2.weeks = weeks;
4522
+ proto$2.months = months;
4523
+ proto$2.years = years;
4524
+ proto$2.humanize = humanize;
4525
+ proto$2.toISOString = toISOString$1;
4526
+ proto$2.toString = toISOString$1;
4527
+ proto$2.toJSON = toISOString$1;
4528
+ proto$2.locale = locale;
4529
+ proto$2.localeData = localeData;
4530
+
4531
+ proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);
4532
+ proto$2.lang = lang;
4533
+
4534
+ // Side effect imports
4535
+
4536
+ // FORMATTING
4537
+
4538
+ addFormatToken('X', 0, 0, 'unix');
4539
+ addFormatToken('x', 0, 0, 'valueOf');
4540
+
4541
+ // PARSING
4542
+
4543
+ addRegexToken('x', matchSigned);
4544
+ addRegexToken('X', matchTimestamp);
4545
+ addParseToken('X', function (input, array, config) {
4546
+ config._d = new Date(parseFloat(input, 10) * 1000);
4547
+ });
4548
+ addParseToken('x', function (input, array, config) {
4549
+ config._d = new Date(toInt(input));
4550
+ });
4551
+
4552
+ // Side effect imports
4553
+
4554
+
4555
+ hooks.version = '2.24.0';
4556
+
4557
+ setHookCallback(createLocal);
4558
+
4559
+ hooks.fn = proto;
4560
+ hooks.min = min;
4561
+ hooks.max = max;
4562
+ hooks.now = now;
4563
+ hooks.utc = createUTC;
4564
+ hooks.unix = createUnix;
4565
+ hooks.months = listMonths;
4566
+ hooks.isDate = isDate;
4567
+ hooks.locale = getSetGlobalLocale;
4568
+ hooks.invalid = createInvalid;
4569
+ hooks.duration = createDuration;
4570
+ hooks.isMoment = isMoment;
4571
+ hooks.weekdays = listWeekdays;
4572
+ hooks.parseZone = createInZone;
4573
+ hooks.localeData = getLocale;
4574
+ hooks.isDuration = isDuration;
4575
+ hooks.monthsShort = listMonthsShort;
4576
+ hooks.weekdaysMin = listWeekdaysMin;
4577
+ hooks.defineLocale = defineLocale;
4578
+ hooks.updateLocale = updateLocale;
4579
+ hooks.locales = listLocales;
4580
+ hooks.weekdaysShort = listWeekdaysShort;
4581
+ hooks.normalizeUnits = normalizeUnits;
4582
+ hooks.relativeTimeRounding = getSetRelativeTimeRounding;
4583
+ hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
4584
+ hooks.calendarFormat = getCalendarFormat;
4585
+ hooks.prototype = proto;
4586
+
4587
+ // currently HTML5 input type only supports 24-hour formats
4588
+ hooks.HTML5_FMT = {
4589
+ DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
4590
+ DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
4591
+ DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
4592
+ DATE: 'YYYY-MM-DD', // <input type="date" />
4593
+ TIME: 'HH:mm', // <input type="time" />
4594
+ TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
4595
+ TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
4596
+ WEEK: 'GGGG-[W]WW', // <input type="week" />
4597
+ MONTH: 'YYYY-MM' // <input type="month" />
4598
+ };
4599
+
4600
+ return hooks;
4601
+
4602
+ })));