rambo před 1 rokem
revize
f3bf410b35
100 změnil soubory, kde provedl 9093 přidání a 0 odebrání
  1. 23 0
      App.vue
  2. 19 0
      api/area.js
  3. 31 0
      api/common.js
  4. 11 0
      api/config.js
  5. 19 0
      api/homeActivity.js
  6. 45 0
      api/homeArticle.js
  7. 45 0
      api/homeBargain.js
  8. 34 0
      api/homeBonus.js
  9. 47 0
      api/homeMarketmanage.js
  10. 84 0
      api/homePointsgoods.js
  11. 13 0
      api/homeVoucher.js
  12. 60 0
      api/homecart.js
  13. 92 0
      api/homegoodsdetail.js
  14. 55 0
      api/homeindex.js
  15. 158 0
      api/homesearch.js
  16. 69 0
      api/homestoredetail.js
  17. 99 0
      api/member.js
  18. 97 0
      api/memberAddress.js
  19. 25 0
      api/memberArrivalnotice.js
  20. 63 0
      api/memberBank.js
  21. 36 0
      api/memberBargain.js
  22. 24 0
      api/memberBrowse.js
  23. 80 0
      api/memberBuy.js
  24. 39 0
      api/memberCart.js
  25. 102 0
      api/memberCompliant.js
  26. 13 0
      api/memberConsult.js
  27. 14 0
      api/memberEvaluate.js
  28. 54 0
      api/memberFavorite.js
  29. 25 0
      api/memberFeedback.js
  30. 15 0
      api/memberForget.js
  31. 48 0
      api/memberFriend.js
  32. 79 0
      api/memberInform.js
  33. 65 0
      api/memberInstantMessage.js
  34. 49 0
      api/memberInviter.js
  35. 75 0
      api/memberInvoice.js
  36. 67 0
      api/memberLive.js
  37. 82 0
      api/memberLogin.js
  38. 14 0
      api/memberNotice.js
  39. 96 0
      api/memberOrder.js
  40. 21 0
      api/memberPayment.js
  41. 36 0
      api/memberPoint.js
  42. 84 0
      api/memberPointscart.js
  43. 49 0
      api/memberPointsorder.js
  44. 37 0
      api/memberPredeposit.js
  45. 33 0
      api/memberRecharge.js
  46. 78 0
      api/memberRefund.js
  47. 41 0
      api/memberRegister.js
  48. 60 0
      api/memberReturn.js
  49. 80 0
      api/memberSetting.js
  50. 51 0
      api/memberVoucher.js
  51. 45 0
      api/memberVrBuy.js
  52. 63 0
      api/memberVrOrder.js
  53. 51 0
      api/memberVrRefund.js
  54. 25 0
      api/memberWithdraw.js
  55. 117 0
      api/seller.js
  56. 699 0
      components/thorui/tui-picture-cropper/tui-picture-cropper.vue
  57. 560 0
      components/thorui/tui-picture-cropper/tui-picture-cropper.wxs
  58. 22 0
      main.js
  59. 188 0
      manifest.json
  60. 970 0
      node_modules/moment/CHANGELOG.md
  61. 22 0
      node_modules/moment/LICENSE
  62. 55 0
      node_modules/moment/README.md
  63. 71 0
      node_modules/moment/dist/locale/af.js
  64. 156 0
      node_modules/moment/dist/locale/ar-dz.js
  65. 54 0
      node_modules/moment/dist/locale/ar-kw.js
  66. 171 0
      node_modules/moment/dist/locale/ar-ly.js
  67. 55 0
      node_modules/moment/dist/locale/ar-ma.js
  68. 104 0
      node_modules/moment/dist/locale/ar-sa.js
  69. 54 0
      node_modules/moment/dist/locale/ar-tn.js
  70. 189 0
      node_modules/moment/dist/locale/ar.js
  71. 101 0
      node_modules/moment/dist/locale/az.js
  72. 141 0
      node_modules/moment/dist/locale/be.js
  73. 87 0
      node_modules/moment/dist/locale/bg.js
  74. 52 0
      node_modules/moment/dist/locale/bm.js
  75. 128 0
      node_modules/moment/dist/locale/bn-bd.js
  76. 118 0
      node_modules/moment/dist/locale/bn.js
  77. 122 0
      node_modules/moment/dist/locale/bo.js
  78. 165 0
      node_modules/moment/dist/locale/br.js
  79. 149 0
      node_modules/moment/dist/locale/bs.js
  80. 97 0
      node_modules/moment/dist/locale/ca.js
  81. 171 0
      node_modules/moment/dist/locale/cs.js
  82. 62 0
      node_modules/moment/dist/locale/cv.js
  83. 97 0
      node_modules/moment/dist/locale/cy.js
  84. 53 0
      node_modules/moment/dist/locale/da.js
  85. 79 0
      node_modules/moment/dist/locale/de-at.js
  86. 78 0
      node_modules/moment/dist/locale/de-ch.js
  87. 78 0
      node_modules/moment/dist/locale/de.js
  88. 90 0
      node_modules/moment/dist/locale/dv.js
  89. 104 0
      node_modules/moment/dist/locale/el.js
  90. 68 0
      node_modules/moment/dist/locale/en-au.js
  91. 64 0
      node_modules/moment/dist/locale/en-ca.js
  92. 68 0
      node_modules/moment/dist/locale/en-gb.js
  93. 68 0
      node_modules/moment/dist/locale/en-ie.js
  94. 64 0
      node_modules/moment/dist/locale/en-il.js
  95. 68 0
      node_modules/moment/dist/locale/en-in.js
  96. 68 0
      node_modules/moment/dist/locale/en-nz.js
  97. 68 0
      node_modules/moment/dist/locale/en-sg.js
  98. 68 0
      node_modules/moment/dist/locale/eo.js
  99. 104 0
      node_modules/moment/dist/locale/es-do.js
  100. 106 0
      node_modules/moment/dist/locale/es-mx.js

+ 23 - 0
App.vue

@@ -0,0 +1,23 @@
+<script>
+	export default {
+		onLaunch: function() {
+			console.log('App Launch')
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+<style lang='scss'>
+  /*每个页面公共css */
+  /*  #ifndef  APP-PLUS-NVUE  */
+  @import 'static/style/iconfont/iconfont.css';
+  @import 'static/style/common.scss';
+  @import 'static/style/uni-ui.scss';
+  /*  #endif  */
+</style>
+

+ 19 - 0
api/area.js

@@ -0,0 +1,19 @@
+import { requestApi } from '../util/network'
+
+//
+export const getAreaTree =
+    () =>
+      requestApi(
+        '/Area/area_app',
+        'POST',
+        {
+        }
+      )
+export const getAreaList =
+    () =>
+      requestApi(
+        '/Area/area_list',
+        'POST',
+        {
+        }
+      )

+ 31 - 0
api/common.js

@@ -0,0 +1,31 @@
+import { requestApi } from '../util/network'
+// 获取手机验证码
+export const getSmsCaptcha =
+    (type, phone) =>
+      requestApi(
+        '/Connect/get_sms_captcha',
+        'GET',
+        {
+          'type': type,
+          'phone': phone
+        }
+      )
+// 验证码检测
+export const checkPictureCaptcha =
+    (captcha) =>
+      requestApi(
+        '/Seccode/check',
+        'POST',
+        {
+          'captcha': captcha
+        }
+      )
+export const getWechatShare =
+    (url) =>
+        requestApi(
+            '/index/getWechatShare',
+            'POST',
+            {
+                'url': url
+            }
+        )

+ 11 - 0
api/config.js

@@ -0,0 +1,11 @@
+import { requestApi } from '../util/network'
+
+// 获取系统配置
+export const getConfigList =
+    () =>
+      requestApi(
+        '/index/getConfigList',
+        'POST',
+        {
+        }
+      )

+ 19 - 0
api/homeActivity.js

@@ -0,0 +1,19 @@
+import { requestApi } from '../util/network'
+
+// 获取文章列表
+export const getActivityList =
+    (params) =>
+      requestApi(
+        '/Activity/index',
+        'GET',
+        params
+      )
+
+// 获取文章详情
+export const getActivityDetail =
+    (params) =>
+      requestApi(
+        '/Activity/detail',
+        'GET',
+        params
+      )

+ 45 - 0
api/homeArticle.js

@@ -0,0 +1,45 @@
+import { requestApi } from '../util/network'
+
+// 系统文章
+export const getDocumentInfo =
+  (type) =>
+    requestApi(
+      '/Document/agreement',
+      'GET',
+      {
+        type: type
+      }
+    )
+
+// 获取文章分类
+export const getArticleclassList =
+    () =>
+      requestApi(
+        '/Articleclass/index',
+        'GET',
+        {
+        }
+      )
+
+// 获取文章列表
+export const getArticleList =
+    (params, acId) =>
+      requestApi(
+        '/Article/article_list',
+        'GET',
+        {
+          'ac_id': acId,
+          'page': params.page // 当前第几页
+        }
+      )
+
+// 获取文章详情
+export const getArticleDetail =
+    (articleID) =>
+      requestApi(
+        '/Article/article_show',
+        'GET',
+        {
+          'article_id': articleID
+        }
+      )

+ 45 - 0
api/homeBargain.js

@@ -0,0 +1,45 @@
+import { requestApi } from '../util/network'
+// 获取砍价详情
+export const getBargainInfo =
+    (bargain_id) =>
+      requestApi(
+        '/Bargain/get_info',
+        'POST',
+        {
+          bargain_id: bargain_id
+        }
+      )
+// 获取砍价详情
+export const getBargainOrderInfo =
+    (bargainorder_id, key) =>
+      requestApi(
+        '/Bargain/get_order_info',
+        'POST',
+        {
+          bargainorder_id: bargainorder_id,
+          key: key
+        }
+      )
+// 获取砍价列表
+export const getBargainList =
+    (params) =>
+      requestApi(
+        '/Bargain/get_list',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page
+        }
+      )
+// 获取砍价记录
+export const getBargainLogList =
+    (bargainorder_id, params) =>
+      requestApi(
+        '/Bargain/get_log_list',
+        'POST',
+        {
+          bargainorder_id: bargainorder_id,
+          page: params.page,
+          per_page: params.per_page
+        }
+      )

+ 34 - 0
api/homeBonus.js

@@ -0,0 +1,34 @@
+import { requestApi } from '../util/network'
+// 获取活动红包详情
+export const getBonusDetail =
+    (bonusId) =>
+      requestApi(
+        '/Bonus/detail',
+        'GET',
+        {
+          'bonus_id': bonusId
+        }
+      )
+// 领取红包
+export const receiveBonus =
+    (bonusId) =>
+      requestApi(
+        '/Memberbonus/receive',
+        'GET',
+        {
+          'bonus_id': bonusId
+        },
+        'member'
+      )
+// 领取红包
+export const getReceiveList =
+    (params) =>
+      requestApi(
+        '/Memberbonus/get_receive_list',
+        'GET',
+        {
+          page: params.page,
+          per_page: params.per_page
+        },
+        'member'
+      )

+ 47 - 0
api/homeMarketmanage.js

@@ -0,0 +1,47 @@
+import { requestApi } from '../util/network'
+// 获取营销活动详情
+export const getMarketmanageInfo =
+    (marketmanageId, token) =>
+      requestApi(
+        '/Marketmanage/get_info',
+        'GET',
+        {
+          'marketmanage_id': marketmanageId,
+          'key': token
+        }
+      )
+// 获取营销活动列表
+export const getMarketmanageList =
+    (params,type) =>
+      requestApi(
+        '/Marketmanage/get_list',
+        'GET',
+        {
+          type:type,
+          page: params.page,
+          per_page: params.per_page
+        }
+      )      
+// 新增营销活动参与记录
+export const addMarketmanagelog =
+    (marketmanageId) =>
+      requestApi(
+        '/member_marketmanage/add_log',
+        'POST',
+        {
+          'marketmanage_id': marketmanageId
+        },
+        'member'
+      )
+// 获取营销活动参与记录
+export const getMarketmanagelog =
+    (params) =>
+      requestApi(
+        '/member_marketmanage/get_log',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page
+        },
+        'member'
+      )

+ 84 - 0
api/homePointsgoods.js

@@ -0,0 +1,84 @@
+import { requestApi } from '../util/network'
+// 获取积分兑换商品详情
+export const getPointshop =
+    () =>
+      requestApi(
+        '/Pointshop/index',
+        'POST',
+        {}
+      )
+// 获取积分兑换店铺代金券列表
+export const getPointVoucherList =
+    (params) =>
+      requestApi(
+        '/Pointvoucher/index',
+        'POST',
+        {
+          'page': params.page,
+          'per_page': params.per_page,
+          'client_type': 'wap'
+        }
+      )
+// 积分兑换店铺代金券
+export const exchangePointVoucher =
+    (params) =>
+      requestApi(
+        '/Pointvoucher/voucherexchange_save',
+        'POST',
+        params
+      )
+// 获取积分兑换代金券列表
+export const getPointMallVoucherList =
+    (params) =>
+      requestApi(
+        '/Pointmallvoucher/index',
+        'POST',
+        {
+          'page': params.page,
+          'per_page': params.per_page,
+          'gc_id':params.gc_id,
+          'client_type': 'wap'
+        }
+      )
+// 积分兑换平台代金券
+export const exchangePointMallVoucher =
+    (params) =>
+      requestApi(
+        '/Pointmallvoucher/mallvoucherexchange_save',
+        'POST',
+        params
+      )
+// 获取积分兑换商品列表
+export const getPointsgoodsList =
+    (params) =>
+      requestApi(
+        '/Pointprod/index',
+        'POST',
+        {
+          'page': params.page,
+          'per_page': params.per_page,
+          'client_type': 'wap'
+        }
+      )
+// 获取积分兑换商品详情
+export const getPointsgoodsInfo =
+    (id) =>
+      requestApi(
+        '/Pointprod/pinfo',
+        'POST',
+        {
+          'id': id
+        }
+      )
+// 获取积分兑换商品订单列表
+export const getPointsorderList =
+    (params, id) =>
+      requestApi(
+        '/Pointprod/get_order_list',
+        'POST',
+        {
+          'page': params.page,
+          'per_page': params.per_page,
+          'pgoods_id': id
+        }
+      )

+ 13 - 0
api/homeVoucher.js

@@ -0,0 +1,13 @@
+import { requestApi } from '../util/network'
+
+// 获取代金券列表
+export const getVoucherList =
+    (data) =>
+      requestApi(
+        '/Voucher/voucher_list',
+        'GET',
+        {
+          'page': data.page, // 当前第几页
+          'per_page': data.per_page // 每页多少
+        }
+      )

+ 60 - 0
api/homecart.js

@@ -0,0 +1,60 @@
+import { requestApi } from '../util/network'
+
+// 获取购物车
+export const cartGet =
+() =>
+  requestApi(
+    '/Membercart/cart_list',
+    'POST',
+    {
+    },
+    'member'
+  )
+// 新增购物车
+export const cartAdd =
+    (goodsId, quantity, blId) =>
+      requestApi(
+        '/Membercart/cart_add',
+        'POST',
+        {
+          'bl_id': blId,
+          'goods_id': goodsId,
+          'quantity': quantity
+        },
+        'member'
+      )
+// 删除购物车
+export const cartDelete =
+(cartId) =>
+  requestApi(
+    '/Membercart/cart_del',
+    'POST',
+    {
+      'cart_id': cartId
+    },
+    'member'
+  )
+
+// 购物车更新
+export const cartUpdate =
+(cartId, quantity) =>
+  requestApi(
+    '/Membercart/cart_edit_quantity',
+    'POST',
+    {
+      'cart_id': cartId,
+      'quantity': quantity
+    },
+    'member'
+  )
+
+// 购物车数量
+export const cartQuantity =
+() =>
+  requestApi(
+    '/Membercart/cart_count',
+    'POST',
+    {
+    },
+    'member'
+  )

+ 92 - 0
api/homegoodsdetail.js

@@ -0,0 +1,92 @@
+import { requestApi } from '../util/network'
+
+// 获取商品
+export const getGoodsInfo =
+  (id, token, extra = {}) =>
+    requestApi(
+      '/goods/goods_detail',
+      'GET',
+      Object.assign(
+        {
+          'goods_id': id,
+          'key': token
+        },
+        extra)
+    )
+// 门店列表
+export const getChainList =
+    (data) =>
+      requestApi(
+        '/goods/chain_list',
+        'GET',
+        data
+      )
+// 商品评论
+export const getReviewList =
+    (id, type, per_page, page=1) =>
+      requestApi(
+        '/goods/goods_evaluate',
+        'GET',
+        {
+          'goods_id': id,
+          'type': type,
+          'per_page': per_page,
+          'page': page
+        }
+      )
+// 组合搭配
+export const productAccessoryList =
+    (id) =>
+      requestApi(
+        '/goods/get_bundling',
+        'GET',
+        {
+          'goods_id': id
+        }
+      )
+// 收藏商品
+export const productLike =
+    (id) =>
+      requestApi(
+        '/Memberfavorites/favorites_add',
+        'POST',
+        {
+          'goods_id': id
+        },
+        'member'
+      )
+// 取消收藏
+export const productUnlike =
+    (id) =>
+      requestApi(
+        '/Memberfavorites/favorites_del',
+        'POST',
+        {
+          'fav_id': id
+        },
+        'member'
+      )
+// 获取商品
+export const getGoodsConsult =
+    (params, id) =>
+      requestApi(
+        '/goods/consulting_list',
+        'GET',
+        {
+          'goods_id': id,
+          'page': params.page,
+          'per_page': params.per_page
+        }
+      )
+export const addGoodsConsult =
+    (id, consult_type_id, content, token) =>
+      requestApi(
+        '/goods/save_consult',
+        'POST',
+        {
+          'goods_content': content,
+          'consult_type_id': consult_type_id,
+          'goods_id': id,
+          'key': token
+        }
+      )

+ 55 - 0
api/homeindex.js

@@ -0,0 +1,55 @@
+import { requestApi } from '../util/network'
+
+// 根据ap_id 获取 广告列表
+export const getAppadList =
+  (apId) =>
+    requestApi(
+      '/Index/getAppadList',
+      'POST',
+      {
+        'ap_id': apId
+      }
+    )
+
+// 获取首页需要用到的广告图
+export const homeIndexAdList =
+    () =>
+      requestApi(
+        '/Index/getIndexAdList',
+        'POST',
+        {
+        }
+      )
+
+// 首页商品列表
+export const homeIndexProductList =
+    () =>
+      requestApi(
+        '/Index/getProductList',
+        'POST',
+        {
+        }
+      )
+// 获取可编辑模块
+export const getEditablePageConfigList =
+    (pageId, pagePath = '', itemId = 0, storeId = 0) =>
+      requestApi(
+        '/Index/getEditablePageConfigList',
+        'POST',
+        {
+          editable_page_id: pageId,
+          editable_page_path: pagePath,
+          editable_page_item_id: itemId,
+          store_id: storeId
+        }
+      )
+// 获取猜你喜欢
+export const getGuessLike =
+    (memberId = 0) =>
+      requestApi(
+        '/Index/getGuessLike',
+        'POST',
+        {
+          member_id: memberId
+        }
+      )

+ 158 - 0
api/homesearch.js

@@ -0,0 +1,158 @@
+import { requestApi } from '../util/network'
+
+// 热门关键词
+export const searchKeywordList =
+() =>
+  requestApi(
+    '/Index/search_key_list',
+    'POST',
+    {
+    }
+  )
+
+// 商品搜索
+export const searchGoodsList =
+    (params) =>
+      requestApi(
+        '/Goods/goods_list',
+        'GET',
+        {
+          'keyword': params.keyword ? params.keyword : '', // 关键字 (选填)
+          'b_id': params.b_id ? params.b_id : '', // 所属品牌id (选填)
+          'cate_id': params.cate_id ? params.cate_id : '', // 所属商品分类id (选填)
+          'a_id': params.a_id ? params.a_id : '', // 当前所选属性
+          'price_from': params.price_from ? params.price_from : '',
+          'price_to': params.price_to ? params.price_to : '',
+          'own_shop': params.own_shop ? params.own_shop : '',
+          'gift': params.gift ? params.gift : '',
+          'area_id': params.area_id ? params.area_id : '',
+          'groupbuy': params.groupbuy ? params.groupbuy : '',
+          'xianshi': params.xianshi ? params.xianshi : '',
+          'virtual': params.virtual ? params.virtual : '',
+          'sort_key': params.sort_key ? params.sort_key : '',
+          'sort_order': params.sort_order ? params.sort_order : '',
+          'page': params.page ? params.page : '1' // 当前第几页
+        }
+      )
+// 获取商品属性
+export const getAttribute =
+    (params) =>
+      requestApi(
+        '/Goods/get_attribute',
+        'GET',
+        {
+          'b_id': params.b_id ? params.b_id : '', // 所属品牌id (选填)
+          'cate_id': params.cate_id ? params.cate_id : '', // 所属商品分类id (选填)
+          'a_id': params.a_id ? params.a_id : '' // 当前所选属性
+        }
+      )
+// 获取商品分类
+export const getGoodsclassList = () =>
+  requestApi(
+    '/Goodsclass/index',
+    'POST',
+    {
+
+    }
+  )
+
+// 商品搜索
+export const getStoreList =
+    (brand, category, keyword, lng, lat, sort_key, page, key = '') =>
+      requestApi(
+        '/Store/store_list',
+        'POST',
+        {
+          'brand': brand, // 所属品牌id (选填)
+          'cate_id': category, // 所属店铺分类id (选填)
+          'keyword': keyword, // 关键字 (选填)
+          'longitude': lng,
+          'latitude': lat,
+          'sort_key': sort_key, // 键
+          'page': page, // 当前第几页
+          'key': key
+        }
+      )
+// 商品搜索
+export const getStoreNearbyList =
+    (brand, category, keyword, lng, lat, sort_key, page, key = '') =>
+      requestApi(
+        '/Shopnearby/index',
+        'POST',
+        {
+          'brand': brand, // 所属品牌id (选填)
+          'storeclass_id': category, // 所属店铺分类id (选填)
+          'keyword': keyword, // 关键字 (选填)
+          'longitude': lng,
+          'latitude': lat,
+          'sort_key': sort_key, // 键
+          'page': page, // 当前第几页
+          'key': key
+        }
+      )
+// 门店搜索
+export const getChainList =
+    (data, params) =>
+      requestApi(
+        '/Chain/chain_list',
+        'POST',
+        Object.assign(data, params)
+      )
+// 获取品牌列表
+export const getBrandList =
+    (recommend) =>
+      requestApi(
+        '/Brand/get_list',
+        'POST',
+        {
+          recommend: recommend
+        }
+      )
+
+// 获取拼团列表
+export const getPintuanList =
+    (params) =>
+      requestApi(
+        '/Pintuan/index',
+        'POST',
+        {
+          'page': params.page // 当前第几页
+        }
+      )
+
+// 获取抢购列表 groupbuy_is_vr参数判断是否是虚拟
+export const getGroupbuyList =
+    (params) =>
+      requestApi(
+        '/Groupbuy/index',
+        'POST',
+        params
+      )
+// 获取抢购条件
+export const getGroupbuyFilter =
+    (groupbuy_is_vr) =>
+      requestApi(
+        '/Groupbuy/filter',
+        'POST',
+        {
+          'groupbuy_is_vr': groupbuy_is_vr
+        }
+      )
+
+// 获取预售列表
+export const getPresellList =
+    (params) =>
+        requestApi(
+            '/Presell/index',
+            'POST',
+            params
+        )
+
+// 获取预售时间
+export const getPresellTime =
+    (params) =>
+        requestApi(
+            '/Presell/time_list',
+            'POST',
+            params
+        )

+ 69 - 0
api/homestoredetail.js

@@ -0,0 +1,69 @@
+import { requestApi } from '../util/network'
+
+// 获取当前店铺所有代金券
+export const getStoreVoucher =
+    (storeId) =>
+      requestApi(
+        '/Voucher/voucher_tpl_list',
+        'POST',
+        {
+          'store_id': storeId, // 所属店铺
+          'gettype': 'points'
+        }
+      )
+// 领取取代金券
+export const receiveVoucher =
+    (tid) =>
+      requestApi(
+        '/Membervoucher/voucher_point',
+        'POST',
+        {
+          'tid': tid
+        },
+        'member'
+      )
+// 获取当前店铺信息
+export const getStoreInfo =
+    (storeId, token) =>
+      requestApi(
+        '/Store/store_info',
+        'POST',
+        {
+          'store_id': storeId, // 所属店铺
+          'key': token
+        }
+      )
+// 获取当前店铺地图
+export const getStoreMap =
+    (data) =>
+      requestApi(
+        '/Store/get_store_map',
+        'POST',
+        data
+      )
+// 获取店铺分类
+export const getStoreGoodsClass =
+    (storeId) =>
+      requestApi(
+        '/Store/store_goods_class',
+        'POST',
+        {
+          'store_id': storeId // 所属店铺
+        }
+      )
+// 获取店铺商品
+export const getStoreGoodsList =
+    (params) =>
+      requestApi(
+        '/Store/store_goods',
+        'POST',
+        {
+          'page': params.page,
+          'per_page': params.per_page,
+          'storegc_id': params.gc_id,
+          'keyword': params.keyword,
+          'store_id': params.store_id, // 所属店铺
+          'sort_order': params.sort_order,
+          'sort_key': params.sort_key
+        }
+      )

+ 99 - 0
api/member.js

@@ -0,0 +1,99 @@
+import { requestApi } from '../util/network'
+// 用户退出登录
+export const logout =
+    (username) =>
+      requestApi(
+        '/Logout/index',
+        'POST',
+        {
+          username: username,
+          client: 'wap'
+        },
+        'member'
+      )
+// 获取用户首页信息
+export const getMemberIndex =
+    () =>
+      requestApi(
+        '/Member/index',
+        'POST',
+        {
+        },
+        'member'
+      )
+// 获取用户基本信息
+export const getMemberInfo =
+    () =>
+      requestApi(
+        '/Member/information',
+        'POST',
+        {
+        },
+        'member'
+      )
+// 更新用户基本信息
+export const updateMemberInfo =
+    (memberInfo) =>
+      requestApi(
+        '/Member/edit_information',
+        'POST',
+        {
+          member_nickname: memberInfo.member_nickname,
+          member_qq: memberInfo.member_qq,
+          member_ww: memberInfo.member_ww,
+          member_birthday: memberInfo.member_birthday
+        },
+        'member'
+      )
+// 更新用户头像
+export const uploadMemberAvatar =
+    (file) =>
+      requestApi(
+        '/Member/edit_memberavatar',
+        'POST',
+        file,
+        'member',
+        true
+      )
+export const uploadAuth =
+    (file) =>
+      requestApi(
+        '/Member/edit_auth',
+        'POST',
+        file,
+        'member',
+        true
+      )
+export const dropAuth =
+    (file_name) =>
+      requestApi(
+        '/Member/drop_auth',
+        'POST',
+        {
+          file_name: file_name
+        },
+        'member'
+      )
+export const updateMemberAuth =
+    (memberTruename, memberIdcard, ifConfirm) =>
+      requestApi(
+        '/Member/auth',
+        'POST',
+        {
+          member_truename: memberTruename,
+          member_idcard: memberIdcard,
+          if_confirm: ifConfirm
+        },
+        'member'
+      )
+//获取商品海报      
+export const goodsPoster =
+    (goods_id) =>
+      requestApi(
+        '/Member/goods_poster',
+        'POST',
+        {
+          goods_id: goods_id
+        },
+        'member'
+      )

+ 97 - 0
api/memberAddress.js

@@ -0,0 +1,97 @@
+import { requestApi } from '../util/network'
+// 获取用户地址列表
+export const getAddressList =
+() =>
+  requestApi(
+    '/Memberaddress/address_list',
+    'POST',
+    {
+
+    },
+    'member'
+  )
+// 获取单条用户地址信息
+export const getAddressInfo =
+    (addressId) =>
+      requestApi(
+        '/Memberaddress/address_info',
+        'POST',
+        {
+          'address_id': addressId
+        },
+        'member'
+      )
+// 新增用户收货地址
+export const addAddress =
+    (data) =>
+      requestApi(
+        '/Memberaddress/address_add',
+        'POST',
+        {
+          'address_realname': data.address_realname,
+          'area_id': data.area_id,
+          'city_id': data.city_id,
+          'area_info': data.area_info,
+          'address_detail': data.address_detail,
+          'address_longitude': data.address_longitude,
+          'address_latitude': data.address_latitude,
+          'address_tel_phone': data.address_tel_phone,
+          'address_mob_phone': data.address_mob_phone,
+          'address_is_default': data.address_is_default
+        },
+        'member'
+      )
+// 编辑用户收货地址
+export const editAddress =
+    (data, addressId) =>
+      requestApi(
+        '/Memberaddress/address_edit',
+        'POST',
+        {
+          'address_id': addressId,
+          'address_realname': data.address_realname,
+          'area_id': data.area_id,
+          'city_id': data.city_id,
+          'area_info': data.area_info,
+          'address_detail': data.address_detail,
+          'address_longitude': data.address_longitude,
+          'address_latitude': data.address_latitude,
+          'address_tel_phone': data.address_tel_phone,
+          'address_mob_phone': data.address_mob_phone,
+          'address_is_default': data.address_is_default
+        },
+        'member'
+      )
+// 删除用户收货地址
+export const delAddress =
+    (addressId) =>
+      requestApi(
+        '/Memberaddress/address_del',
+        'POST',
+        {
+          'address_id': addressId
+        },
+        'member'
+      )
+// 获取自提站列表
+export const getChainList =
+    (parmas, areaId) =>
+      requestApi(
+        '/Memberaddress/chain_list',
+        'POST',
+        {
+          'page': parmas.page,
+          'per_page': parmas.per_page,
+          'area_id': areaId
+        },
+        'member'
+      )
+// 添加自提站
+export const addChain =
+    (data) =>
+      requestApi(
+        '/Memberaddress/chain_add',
+        'POST',
+        data,
+        'member'
+      )

+ 25 - 0
api/memberArrivalnotice.js

@@ -0,0 +1,25 @@
+import { requestApi } from '../util/network'
+
+// 获取到货通知列表
+export const getArrivalnoticeList =
+(params) =>
+  requestApi(
+    '/member_arrivalnotice/get_list',
+    'POST',
+    {
+      page: params.page,
+      per_page: params.per_page
+    },
+    'member'
+  )
+// 删除到货通知
+export const delArrivalnotice =
+    (arrivalnotice_id) =>
+      requestApi(
+        '/member_arrivalnotice/del',
+        'POST',
+        {
+          'arrivalnotice_id': arrivalnotice_id
+        },
+        'member'
+      )

+ 63 - 0
api/memberBank.js

@@ -0,0 +1,63 @@
+import { requestApi } from '../util/network'
+// 获取用户提现账户
+export const getBankList =
+() =>
+  requestApi(
+    '/Memberbank/bank_list',
+    'POST',
+    {
+
+    },
+    'member'
+  )
+// 获取单条提现账户
+export const getBankInfo =
+    (memberbankId) =>
+      requestApi(
+        '/Memberbank/bank_info',
+        'POST',
+        {
+          'memberbank_id': memberbankId
+        },
+        'member'
+      )
+// 新增用户提现账户
+export const addBank =
+    (data) =>
+      requestApi(
+        '/Memberbank/bank_add',
+        'POST',
+        {
+          'memberbank_type': data.memberbank_type,
+          'memberbank_truename': data.memberbank_truename,
+          'memberbank_name': data.memberbank_name,
+          'memberbank_no': data.memberbank_no
+        },
+        'member'
+      )
+// 编辑用户提现账户
+export const editBank =
+    (data, memberbankId) =>
+      requestApi(
+        '/Memberbank/bank_edit',
+        'POST',
+        {
+          'memberbank_id': memberbankId,
+          'memberbank_type': data.memberbank_type,
+          'memberbank_truename': data.memberbank_truename,
+          'memberbank_name': data.memberbank_name,
+          'memberbank_no': data.memberbank_no
+        },
+        'member'
+      )
+// 删除用户提现账户
+export const delBank =
+    (memberbankId) =>
+      requestApi(
+        '/Memberbank/bank_del',
+        'POST',
+        {
+          'memberbank_id': memberbankId
+        },
+        'member'
+      )

+ 36 - 0
api/memberBargain.js

@@ -0,0 +1,36 @@
+import { requestApi } from '../util/network'
+
+// 新增砍价
+export const addBargain =
+    (bargain_id) =>
+      requestApi(
+        '/member_bargain/add',
+        'POST',
+        {
+          bargain_id: bargain_id
+        },
+        'member'
+      )
+// 新增砍价记录
+export const addBargainLog =
+    (bargainorder_id) =>
+      requestApi(
+        '/member_bargain/add_log',
+        'POST',
+        {
+          bargainorder_id: bargainorder_id
+        },
+        'member'
+      )
+// 获取砍价列表
+export const getBargainList =
+    (params) =>
+      requestApi(
+        '/member_bargain/get_list',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page
+        },
+        'member'
+      )

+ 24 - 0
api/memberBrowse.js

@@ -0,0 +1,24 @@
+import { requestApi } from '../util/network'
+
+// 获取浏览历史列表
+export const getBrowseList =
+    (params) =>
+        requestApi(
+            '/membergoodsbrowse/browse_list',
+            'POST',
+            {
+                page: params.page,
+                per_page: params.per_page
+            },
+            'member'
+        )
+// 清空浏览历史
+export const clearallBrowse =
+    (arrivalnotice_id) =>
+        requestApi(
+            '/membergoodsbrowse/browse_clearall',
+            'POST',
+            {
+            },
+            'member'
+        )

+ 80 - 0
api/memberBuy.js

@@ -0,0 +1,80 @@
+import { requestApi } from '../util/network'
+export const checkFCode =
+    (goods_id, fcode) =>
+      requestApi(
+        '/memberbuy/check_fcode',
+        'POST',
+        {
+          'goods_id': goods_id,
+          'fcode': fcode
+        },
+        'member'
+      )
+// 获取订单信息
+export const buyStep1 =
+(cart_id, ifcart, pintuan_id, pintuangroup_id, extra = {}) =>
+  requestApi(
+    '/memberbuy/buy_step1',
+    'POST',
+    Object.assign(
+      {
+        'cart_id': cart_id,
+        'ifcart': ifcart,
+        'pintuan_id': pintuan_id,
+        'pintuangroup_id': pintuangroup_id
+      },
+      extra),
+    'member'
+  )
+
+// 下单入库
+export const buyStep2 =
+    (ifcart, cart_id, address_id, vat_hash, offpay_hash, offpay_hash_batch, invoice_id, voucher,mallvoucher, pay_message, pintuan_id, pintuangroup_id, f_code, pay_code, extra = {}) =>
+      requestApi(
+        '/memberbuy/buy_step2',
+        'POST',
+        Object.assign(
+          {
+            'ifcart': ifcart,
+            'cart_id': cart_id,
+            'address_id': address_id,
+            'vat_hash': vat_hash,
+            'offpay_hash': offpay_hash,
+            'offpay_hash_batch': offpay_hash_batch,
+            'pay_name': pay_code,
+            'invoice_id': invoice_id,
+            'voucher': voucher,
+            'mallvoucher':mallvoucher,
+            'pay_message': pay_message,
+            'pintuan_id': pintuan_id,
+            'pintuangroup_id': pintuangroup_id,
+            'fcode': f_code
+          },
+          extra)
+        ,
+        'member'
+      )
+
+// 获取订单支付信息
+export const getOrderpayInfo =
+    (paySn) =>
+      requestApi(
+        '/memberbuy/pay',
+        'POST',
+        {
+          'pay_sn': paySn
+        },
+        'member'
+      )
+// 门店列表
+export const getbuyChainList =
+    (goods_list,area_id) =>
+      requestApi(
+        '/memberbuy/chain_list',
+        'POST',
+        {
+            'goods_list':goods_list,
+            'area_id':area_id
+        },
+        'member'
+      )

+ 39 - 0
api/memberCart.js

@@ -0,0 +1,39 @@
+import { requestApi } from '../util/network'
+// 加入购物车
+export const addCart =
+    (goods_id, quantity) =>
+      requestApi(
+        '/Membercart/cart_add',
+        'POST',
+        {
+          'goods_id': goods_id,
+          'quantity': quantity,
+          'client_type': 'wap'
+        },
+        'member'
+      )
+// 编辑购物车
+export const editCart =
+    (cart_id, quantity) =>
+      requestApi(
+        '/Membercart/cart_edit_quantity',
+        'POST',
+        {
+          'cart_id': cart_id,
+          'quantity': quantity,
+          'client_type': 'wap'
+        },
+        'member'
+      )
+// 删除购物车
+export const delCart =
+    (cart_id) =>
+      requestApi(
+        '/Membercart/cart_del',
+        'POST',
+        {
+          'cart_id': cart_id,
+          'client_type': 'wap'
+        },
+        'member'
+      )

+ 102 - 0
api/memberCompliant.js

@@ -0,0 +1,102 @@
+import { requestApi } from '../util/network'
+// 投诉列表
+export const getComplaintList =
+    (params) =>
+      requestApi(
+        '/membercomplain/index',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page
+        },
+        'member'
+      )
+// 新增投诉
+export const addComplaint =
+(order_id, goods_id, subject, content, pic) =>
+  requestApi(
+    '/membercomplain/complain_save',
+    'POST',
+    {
+      input_order_id: order_id,
+      input_goods_id: goods_id,
+      input_complain_subject: subject,
+      input_complain_content: content,
+      pic_name: pic
+    },
+    'member'
+  )
+// 取消投诉
+export const cancelComplaint =
+    (order_id) =>
+      requestApi(
+        '/membercomplain/complain_cancel',
+        'POST',
+        {
+          complain_id: order_id
+        },
+        'member'
+      )
+// 更新凭证
+export const uploadComplaintPic =
+    (file) =>
+      requestApi(
+        '/membercomplain/upload_pic',
+        'POST',
+        file,
+        'member',
+        true
+      )
+// 获取公共信息
+export const getCommonData =
+    (order_id, goods_id) =>
+      requestApi(
+        '/membercomplain/get_common_data',
+        'POST',
+        {
+          order_id: order_id,
+          goods_id: goods_id
+        },
+        'member'
+      )
+export const getComplaintInfo =
+    (complain_id) =>
+      requestApi(
+        '/membercomplain/complain_show',
+        'POST',
+        {
+          complain_id: complain_id
+        },
+        'member'
+      )
+export const addComplaintTalk =
+    (complain_id, complain_talk) =>
+      requestApi(
+        '/membercomplain/publish_complain_talk',
+        'POST',
+        {
+          complain_id: complain_id,
+          complain_talk: complain_talk
+        },
+        'member'
+      )
+export const getComplaintTalk =
+    (complain_id) =>
+      requestApi(
+        '/membercomplain/get_complain_talk',
+        'POST',
+        {
+          complain_id: complain_id
+        },
+        'member'
+      )
+export const handleComplain =
+    (complain_id) =>
+      requestApi(
+        '/membercomplain/apply_handle',
+        'POST',
+        {
+          input_complain_id: complain_id
+        },
+        'member'
+      )

+ 13 - 0
api/memberConsult.js

@@ -0,0 +1,13 @@
+import { requestApi } from '../util/network'
+// 投诉列表
+export const getConsultList =
+    (params) =>
+      requestApi(
+        '/memberconsult/index',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page
+        },
+        'member'
+      )

+ 14 - 0
api/memberEvaluate.js

@@ -0,0 +1,14 @@
+import { requestApi } from '../util/network'
+
+// 获取用户商品评价列表
+export const getMemberevaluateList =
+    (params) =>
+      requestApi(
+        '/Memberevaluate/get_goodsevallist',
+        'POST',
+        {
+          'page': params.page,
+          'per_page': params.per_page
+        },
+        'member'
+      )

+ 54 - 0
api/memberFavorite.js

@@ -0,0 +1,54 @@
+import { requestApi } from '../util/network'
+// 获取店铺搜藏列表
+export const getFavoriteStoreList =
+(page) =>
+  requestApi(
+    '/Memberfavoritesstore/favorites_list',
+    'POST',
+    {
+    },
+    'member'
+  )
+// 收藏店鋪
+export const addFavoriteStore =
+    (storeId) =>
+      requestApi(
+        '/Memberfavoritesstore/favorites_add',
+        'POST',
+        {
+          'store_id': storeId // 所属店铺
+        },
+        'member'
+      )
+// 删除店铺搜藏
+export const delFavoriteStore =
+    (favId) =>
+      requestApi(
+        '/Memberfavoritesstore/favorites_del',
+        'POST',
+        {
+          'fav_id': favId
+        },
+        'member'
+      )
+// 获取商品搜藏列表
+export const getFavoriteGoodsList =
+    (page) => requestApi(
+      '/Memberfavorites/favorites_list',
+      'POST',
+      {
+        'page': page
+      },
+      'member'
+    )
+// 删除商品搜藏
+export const delFavoriteGoods =
+    (favId) =>
+      requestApi(
+        '/Memberfavorites/favorites_del',
+        'POST',
+        {
+          'fav_id': favId
+        },
+        'member'
+      )

+ 25 - 0
api/memberFeedback.js

@@ -0,0 +1,25 @@
+import { requestApi } from '../util/network'
+
+// 添加反馈意见
+export const addFeedback =
+    (feedback) =>
+      requestApi(
+        '/Memberfeedback/feedback_add',
+        'POST',
+        {
+            feedback: feedback
+        },
+        'member'
+      )
+// 反馈列表
+export const getFeedbackList =
+    (params) =>
+      requestApi(
+        '/Memberfeedback/feedback_list',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page
+        },
+        'member'
+      )

+ 15 - 0
api/memberForget.js

@@ -0,0 +1,15 @@
+import { requestApi } from '../util/network'
+
+export const forget =
+    (userName, captcha, password, confirmPassword) =>
+      requestApi(
+        '/Connect/find_password',
+        'POST',
+        {
+          'phone': userName,
+          'captcha': captcha,
+          'password': password,
+          'password_confirm': confirmPassword,
+          'client': 'wap'
+        }
+      )

+ 48 - 0
api/memberFriend.js

@@ -0,0 +1,48 @@
+import { requestApi } from '../util/network'
+
+// 添加好友
+export const addFriend =
+    (mId) =>
+      requestApi(
+        '/Membersnsfriend/friend_add',
+        'POST',
+        {
+          m_id: mId
+        },
+        'member'
+      )
+export const delFriend =
+    (mId) =>
+      requestApi(
+        '/Membersnsfriend/friend_del',
+        'POST',
+        {
+          m_id: mId
+        },
+        'member'
+      )
+// 好友列表
+export const getFriendList =
+    (params) =>
+      requestApi(
+        '/Membersnsfriend/friend_list',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page
+        },
+        'member'
+      )
+// 好友列表
+export const searchFriend =
+    (params, mName) =>
+      requestApi(
+        '/Membersnsfriend/member_list',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page,
+          m_name: mName
+        },
+        'member'
+      )

+ 79 - 0
api/memberInform.js

@@ -0,0 +1,79 @@
+import { requestApi } from '../util/network'
+// 投诉列表
+export const getInformList =
+    (params) =>
+      requestApi(
+        '/memberinform/index',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page
+        },
+        'member'
+      )
+// 新增投诉
+export const addInform =
+(goods_id, subject, content, pic) =>
+  requestApi(
+    '/memberinform/inform_save',
+    'POST',
+    {
+      inform_goods_id: goods_id,
+      inform_subject: subject,
+      inform_content: content,
+      pic_name: pic
+    },
+    'member'
+  )
+// 取消投诉
+export const cancelInform =
+    (order_id) =>
+      requestApi(
+        '/memberinform/inform_cancel',
+        'POST',
+        {
+          inform_id: order_id
+        },
+        'member'
+      )
+// 更新凭证
+export const uploadInformPic =
+    (file) =>
+      requestApi(
+        '/memberinform/upload_pic',
+        'POST',
+        file,
+        'member',
+        true
+      )
+// 获取公共信息
+export const getCommonData =
+    (goods_id) =>
+      requestApi(
+        '/memberinform/inform_submit',
+        'POST',
+        {
+          goods_id: goods_id
+        },
+        'member'
+      )
+export const getInformInfo =
+    (inform_id) =>
+      requestApi(
+        '/memberinform/inform_info',
+        'POST',
+        {
+          inform_id: inform_id
+        },
+        'member'
+      )
+export const getInformSubject =
+    (type_id) =>
+      requestApi(
+        '/memberinform/get_subject_by_typeid',
+        'POST',
+        {
+          type_id: type_id
+        },
+        'member'
+      )

+ 65 - 0
api/memberInstantMessage.js

@@ -0,0 +1,65 @@
+import { requestApi } from '../util/network'
+
+// 获取用户订单列表
+export const addInstantMessage =
+(data) =>
+  requestApi(
+    '/member_instant_message/add',
+    'POST',
+    data,
+    'member'
+  )
+// 加入聊天
+export const joinChat =
+    (client_id) =>
+      requestApi(
+        '/member_instant_message/join',
+        'POST',
+        {
+          client_id: client_id
+        },
+        'member'
+      )
+// 已读消息
+export const setMessage =
+    (data) =>
+      requestApi(
+        '/member_instant_message/set_message',
+        'POST',
+        data,
+        'member'
+      )
+// 聊天历史
+export const getChatHistory =
+    (params, t_id) =>
+      requestApi(
+        '/member_instant_message/get_chat_log',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page,
+          t_id: t_id
+        },
+        'member'
+      )
+// 最近消息
+export const getChatList =
+    () =>
+      requestApi(
+        '/member_instant_message/get_user_list',
+        'POST',
+        {
+          recent: 1
+        },
+        'member'
+      )
+// 新消息数
+export const getChatCount =
+    () =>
+      requestApi(
+        '/member_instant_message/get_msg_count',
+        'POST',
+        {
+        },
+        'member'
+      )

+ 49 - 0
api/memberInviter.js

@@ -0,0 +1,49 @@
+import { requestApi } from '../util/network'
+
+// 检测是否有推广权限
+export const checkInviter =
+    () =>
+      requestApi(
+        '/memberinviter/check',
+        'POST',
+        {
+        },
+        'member'
+      )
+
+// 获取推广海报
+export const getInviterPoster =
+() =>
+  requestApi(
+    '/memberinviter/index',
+    'POST',
+    {
+
+    },
+    'member'
+  )
+
+// 获取推广会员
+export const getInviterUser =
+    (params) =>
+      requestApi(
+        '/memberinviter/user',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page
+        },
+        'member'
+      )
+// 获取推广佣金
+export const getInviterOrder =
+    (params) =>
+      requestApi(
+        '/memberinviter/order',
+        'POST',
+        {
+          page: params.page,
+          per_page: params.per_page
+        },
+        'member'
+      )

+ 75 - 0
api/memberInvoice.js

@@ -0,0 +1,75 @@
+import { requestApi } from '../util/network'
+
+// 获取用户发票列表
+export const getInvoiceList =
+    () =>
+      requestApi(
+        '/Memberinvoice/invoice_list',
+        'POST',
+        {
+        },
+        'member'
+      )
+// 获取单个发票信息
+export const getInvoiceInfo =
+    (invoiceId) =>
+      requestApi(
+        '/Memberinvoice/invoice_info',
+        'POST',
+        {
+          'invoice_id': invoiceId
+        },
+        'member'
+      )
+// 新增发票
+export const addInvoice =
+    (data) =>
+      requestApi(
+        '/Memberinvoice/invoice_add',
+        'POST',
+        {
+          'invoice_state': data.invoice_state,
+          'invoice_title': data.invoice_title,
+          'invoice_code': data.invoice_code,
+          'invoice_content': data.invoice_content,
+          'invoice_company': data.invoice_company,
+          'invoice_company_code': data.invoice_company_code,
+          'invoice_reg_addr': data.invoice_reg_addr,
+          'invoice_reg_phone': data.invoice_reg_phone,
+          'invoice_reg_bname': data.invoice_reg_bname,
+          'invoice_reg_baccount': data.invoice_reg_baccount
+        },
+        'member'
+      )
+// 编辑发票
+export const editInvoice =
+    (data, invoiceId) =>
+      requestApi(
+        '/Memberinvoice/invoice_edit',
+        'POST',
+        {
+          'invoice_id': invoiceId,
+          'invoice_state': data.invoice_state,
+          'invoice_title': data.invoice_title,
+          'invoice_code': data.invoice_code,
+          'invoice_content': data.invoice_content,
+          'invoice_company': data.invoice_company,
+          'invoice_company_code': data.invoice_company_code,
+          'invoice_reg_addr': data.invoice_reg_addr,
+          'invoice_reg_phone': data.invoice_reg_phone,
+          'invoice_reg_bname': data.invoice_reg_bname,
+          'invoice_reg_baccount': data.invoice_reg_baccount
+        },
+        'member'
+      )
+// 删除发票
+export const delInvoice =
+    (invoiceId) =>
+      requestApi(
+        '/Memberinvoice/invoice_del',
+        'POST',
+        {
+          'invoice_id': invoiceId
+        },
+        'member'
+      )

+ 67 - 0
api/memberLive.js

@@ -0,0 +1,67 @@
+import { requestApi } from '../util/network'
+export const getLiveList =
+    (data) =>
+      requestApi(
+        '/live/get_live_list',
+        'POST',
+        data
+      )
+export const getMiniproLiveList =
+    (data) =>
+      requestApi(
+        '/live/get_minipro_live_list',
+        'POST',
+        data
+      )
+export const getLiveInfo =
+    (live_apply_id) =>
+      requestApi(
+        '/member_live/get_live_info',
+        'POST',
+        {
+          'live_apply_id': live_apply_id
+        },
+        'member'
+      )
+export const joinLive =
+    (live_apply_id, client_id) =>
+      requestApi(
+        '/member_live/join_live',
+        'POST',
+        {
+          'live_apply_id': live_apply_id,
+          'client_id': client_id
+        },
+        'member'
+      )
+export const leaveLive =
+    (live_apply_id, client_id) =>
+      requestApi(
+        '/member_live/leave_live',
+        'POST',
+        {
+          'live_apply_id': live_apply_id,
+          'client_id': client_id
+        },
+        'member'
+      )
+export const addLike =
+    (live_apply_id) =>
+      requestApi(
+        '/member_live/add_like',
+        'POST',
+        {
+          'live_apply_id': live_apply_id
+        },
+        'member'
+      )
+export const addGift =
+    (live_apply_id) =>
+      requestApi(
+        '/member_live/add_gift',
+        'POST',
+        {
+          'live_apply_id': live_apply_id
+        },
+        'member'
+      )

+ 82 - 0
api/memberLogin.js

@@ -0,0 +1,82 @@
+import { requestApi } from '../util/network'
+// 用户登录
+export const login =
+    (userName, password, pictureCode = '') =>
+      requestApi(
+        '/Login/index',
+        'POST',
+        {
+          'username': userName,
+          'password': password,
+          'captcha': pictureCode,
+          'client_type': 'wap'
+        }
+      )
+// 用户微信登录
+export const wechatLogin =
+    (ref, inviterId) =>
+      requestApi(
+        '/Wxauto/login',
+        'GET',
+        {
+          'ref': ref,
+          'inviter_id': inviterId
+        }
+      )
+// 用户微信登录
+export const wechatcheck =
+    (data) =>
+      requestApi(
+        '/Wxauto/checkAuth',
+        'GET',
+        data
+      )
+// 用户微信登录
+export const wechatUser =
+    (data) =>
+      requestApi(
+        '/Wxauto/getUser',
+        'GET',
+        data
+      )
+// 用户手机登录
+export const LoginByMobile =
+    (phone, captcha) =>
+      requestApi(
+        '/Connect/sms_login',
+        'POST',
+        {
+          'usermobile': phone,
+          'mobilecode': captcha,
+          'client': 'wap'
+        }
+      )
+// 绑定
+export const bind =
+    (type, from, openid, unionid, nickname, headimgurl, user, password, password2, inviter_id) =>
+      requestApi(
+        '/Login/bind',
+        'POST',
+        {
+          type: type,
+          from: from,
+          openid: openid,
+          unionid: unionid,
+          nickname: nickname,
+          headimgurl: headimgurl,
+          user: user,
+          password: password,
+          password2: password2,
+          inviter_id: inviter_id,
+          client_type: 'wap'
+        }
+      )
+export const getThirdLogin =
+    (id) =>
+      requestApi(
+        '/Login/third_login',
+        'POST',
+        {
+          id:id
+        }
+      )

+ 14 - 0
api/memberNotice.js

@@ -0,0 +1,14 @@
+import { requestApi } from '../util/network'
+
+// 获取用户通知列表
+export const getNoticeList =
+(params) =>
+  requestApi(
+    '/member_message/get_list',
+    'POST',
+    {
+      page: params.page,
+        per_page: params.per_page,
+    },
+    'member'
+  )

+ 96 - 0
api/memberOrder.js

@@ -0,0 +1,96 @@
+import { requestApi } from '../util/network'
+
+// 获取用户订单列表
+export const getOrderList =
+(parmas, stateType, orderKey,keyword) =>
+  requestApi(
+    '/Memberorder/order_list',
+    'POST',
+    {
+      'page': parmas.page,
+      'per_page': parmas.per_page,
+      'state_type': stateType,
+      'order_key': orderKey,
+	  'keyword':keyword
+    },
+    'member'
+  )
+// 获取订单信息
+export const getOrderInfo =
+(orderId) =>
+  requestApi(
+    '/Memberorder/order_info',
+    'POST',
+    {
+      'order_id': orderId
+    },
+    'member'
+  )
+// 订单评价
+export const saveOrderEvaluate =
+    (orderId, result) =>
+      requestApi(
+        '/Memberevaluate/save',
+        'POST',
+        Object.assign(
+          {
+            'order_id': orderId
+          },
+          result),
+        'member'
+      )
+// 获取评价信息
+export const getOrderEvaluateInfo =
+    (orderId) =>
+      requestApi(
+        '/Memberevaluate/index',
+        'POST',
+        {
+          'order_id': orderId
+        },
+        'member'
+      )
+// 取消订单
+export const cancelOrder =
+    (orderId) =>
+      requestApi(
+        '/Memberorder/order_cancel',
+        'POST',
+        {
+          'order_id': orderId
+        },
+        'member'
+      )
+// 删除订单
+export const deleteOrder =
+    (orderId) =>
+        requestApi(
+            '/Memberorder/order_delete',
+            'POST',
+            {
+                'order_id': orderId
+            },
+            'member'
+        )
+// 订单收货
+export const receiveOrder =
+    (orderId) =>
+      requestApi(
+        '/Memberorder/order_receive',
+        'POST',
+        {
+          'order_id': orderId
+        },
+        'member'
+      )
+// 物流跟踪
+export const getOrderDeliver =
+    (orderId) =>
+      requestApi(
+        '/Memberorder/search_deliver',
+        'POST',
+        {
+          'order_id': orderId
+        },
+        'member'
+      )

+ 21 - 0
api/memberPayment.js

@@ -0,0 +1,21 @@
+// 获取订单支付信息
+import { requestRaw,requestApi } from '../util/network'
+import { env } from '../static/config'
+// 用户支付
+export const pay =
+    (paySn, payType, data, key, uniapp=0) =>
+      requestRaw(
+        env.SITE_URL + '/index.php?s=api/Memberpayment/' + payType + '/pay_sn/' + paySn + '/password/' + data.password + '/rcb_pay/' + data.rcb_pay + '/pd_pay/' + data.pd_pay + '/payment_code/' + data.payment_code + '/key/' + key + '/uniapp/' + uniapp + '/openid/' + data.openid + '/random_number/' + Math.random() + '/'
+      )
+// 获取支付方式列表
+export const getPaymentList =
+(payment_platform='',payment_code='') =>
+  requestApi(
+    '/Memberpayment/payment_list',
+    'POST',
+    {
+			payment_platform:payment_platform,
+      payment_code:payment_code
+    },
+    'member'
+  )

+ 36 - 0
api/memberPoint.js

@@ -0,0 +1,36 @@
+import { requestApi } from '../util/network'
+
+// 获取用户积分列表
+export const getPointList =
+(params) =>
+  requestApi(
+    '/Memberpoints/pointslog',
+    'POST',
+    {
+      page: params.page,
+      per_page: params.per_page
+    },
+    'member'
+  )
+
+// 获取签到日历
+export const getPointSignin =
+    (search_day) =>
+      requestApi(
+        '/Memberpoints/points_signin',
+        'POST',
+        {
+          search_day: search_day
+        },
+        'member'
+      )
+// 签到
+export const addPointSignin =
+    () =>
+      requestApi(
+        '/Memberpoints/signin_add',
+        'POST',
+        {
+        },
+        'member'
+      )

+ 84 - 0
api/memberPointscart.js

@@ -0,0 +1,84 @@
+import { requestApi } from '../util/network'
+// 积分商品列表
+export const cartGet =
+    () =>
+      requestApi(
+        '/Pointcart/cart_list',
+        'POST',
+        {
+
+        },
+        'member'
+      )
+// 删除购物车
+export const cartDelete =
+(pcartId) =>
+  requestApi(
+    '/Pointcart/cart_del',
+    'POST',
+    {
+      'pcart_id': pcartId
+    },
+    'member'
+  )
+
+// 购物车更新
+export const cartUpdate =
+(pcartId, quantity) =>
+  requestApi(
+    '/Pointcart/cart_edit_quantity',
+    'POST',
+    {
+      'pcart_id': pcartId,
+      'quantity': quantity
+    },
+    'member'
+  )
+// 积分商品加入购物车
+export const cartAdd =
+    (pgid, quantity) =>
+      requestApi(
+        '/Pointcart/add',
+        'POST',
+        {
+          'pgid': pgid,
+          'quantity': quantity
+        },
+        'member'
+      )
+// 购物车数量
+export const cartQuantity =
+    () =>
+      requestApi(
+        '/Pointcart/cart_count',
+        'POST',
+        {
+        },
+        'member'
+      )
+// 兑换积分商品步骤1
+export const buyStep1 =
+    (cartId, ifcart) =>
+      requestApi(
+        '/Pointcart/step1',
+        'POST',
+        {
+          'cart_id': cartId,
+          'ifcart': ifcart
+        },
+        'member'
+      )
+// 兑换积分商品步骤2
+export const buyStep2 =
+    (cartId, ifcart, addressId, message) =>
+      requestApi(
+        '/Pointcart/step2',
+        'POST',
+        {
+          'cart_id': cartId,
+          'ifcart': ifcart,
+          'address_options': addressId,
+          'pcart_message': message
+        },
+        'member'
+      )

+ 49 - 0
api/memberPointsorder.js

@@ -0,0 +1,49 @@
+import { requestApi } from '../util/network'
+
+// 获取用户订单列表
+export const getOrderList =
+(params, stateType, orderKey) =>
+  requestApi(
+    '/Memberpointorder/orderlist',
+    'POST',
+    {
+      'page': params.page,
+        'per_page':params.per_page,
+      'state_type': stateType,
+      'order_key': orderKey
+    },
+    'member'
+  )
+// 获取订单信息
+export const getOrderInfo =
+    (orderId) =>
+      requestApi(
+        '/Memberpointorder/order_info',
+        'GET',
+        {
+          'order_id': orderId
+        },
+        'member'
+      )
+// 取消订单
+export const cancelOrder =
+    (orderId) =>
+      requestApi(
+        '/Memberpointorder/cancel_order',
+        'POST',
+        {
+          'order_id': orderId
+        },
+        'member'
+      )
+// 订单收货
+export const receiveOrder =
+    (orderId) =>
+      requestApi(
+        '/Memberpointorder/receiving_order',
+        'POST',
+        {
+          'order_id': orderId
+        },
+        'member'
+      )

+ 37 - 0
api/memberPredeposit.js

@@ -0,0 +1,37 @@
+import { requestApi } from '../util/network'
+
+// 获取用户预存款记录
+export const getPredepositList =
+(params) =>
+  requestApi(
+    '/Memberfund/predepositlog',
+    'POST',
+    {
+        page:params.page,
+        per_page:params.per_page
+    },
+    'member'
+  )
+// 获取用户充值卡记录
+export const getRechargeCardList =
+    (params) =>
+        requestApi(
+            '/Memberfund/rcblog',
+            'POST',
+            {
+                page:params.page,
+                per_page:params.per_page
+            },
+            'member'
+        )
+// 增加充值卡
+export const addRechargeCard =
+    (rc_sn) =>
+        requestApi(
+            '/Memberfund/rechargecard_add',
+            'POST',
+            {
+                rc_sn:rc_sn
+            },
+            'member'
+        )

+ 33 - 0
api/memberRecharge.js

@@ -0,0 +1,33 @@
+import { requestApi } from '../util/network'
+
+export const getRechargeList =
+(params) =>
+  requestApi(
+    '/Memberfund/pdrechargelist',
+    'POST',
+    {
+        page:params.page,
+        per_page:params.per_page
+    },
+    'member'
+  )
+export const getRechargeInfo =
+    (paysn) =>
+      requestApi(
+        '/Recharge/recharge_order',
+        'POST',
+        {
+          paysn: paysn
+        },
+        'member'
+      )
+export const addRecharge =
+    (amount) =>
+      requestApi(
+        '/Recharge/index',
+        'POST',
+        {
+          pdr_amount: amount
+        },
+        'member'
+      )

+ 78 - 0
api/memberRefund.js

@@ -0,0 +1,78 @@
+import { requestApi } from '../util/network'
+
+// 获取退款列表
+export const getRefundList =
+(params) =>
+  requestApi(
+    '/Memberrefund/get_refund_list',
+    'POST',
+    {
+      page: params.page,
+      per_page: params.per_page
+    },
+    'member'
+  )
+// 获取单个退款信息
+export const getRefundInfo =
+(refundId) =>
+  requestApi(
+    '/Memberrefund/get_refund_info',
+    'POST',
+    {
+      refund_id: refundId
+    },
+    'member'
+  )
+// 新增全部退款
+export const addRefundAll =
+(orderId, buyerMessage, fileValue) =>
+  requestApi(
+    '/Memberrefund/refund_all_post',
+    'POST',
+    {
+      order_id: orderId,
+      buyer_message: buyerMessage,
+      refund_pic: fileValue
+    },
+    'member'
+  )
+// 新增部分退款
+export const addRefund =
+    (refundType, orderId, orderGoodsId, refundAmount, goodsNum, reasonId, buyerMessage, fileValue) =>
+      requestApi(
+        '/Memberrefund/refund_post',
+        'POST',
+        {
+          refund_type: refundType,
+          order_id: orderId,
+          order_goods_id: orderGoodsId,
+          refund_amount: refundAmount,
+          goods_num: goodsNum,
+          reason_id: reasonId,
+          buyer_message: buyerMessage,
+          refund_pic: fileValue
+        },
+        'member'
+      )
+// 上传退款凭证
+export const uploadRefundImage =
+(file) =>
+  requestApi(
+    '/Memberrefund/upload_pic',
+    'POST',
+    file,
+    'member',
+    true
+  )
+// 获取公共信息
+export const getCommonData =
+    (orderId, recId) =>
+      requestApi(
+        '/Memberrefund/refund_form',
+        'POST',
+        {
+          order_id: orderId,
+          order_goods_id: recId
+        },
+        'member'
+      )

+ 41 - 0
api/memberRegister.js

@@ -0,0 +1,41 @@
+import { requestApi } from '../util/network'
+// 获取推荐人
+export const getInviterInfo =
+    (inviter_id) =>
+      requestApi(
+        '/Login/get_inviter',
+        'POST',
+        {
+          'inviter_id': inviter_id
+        }
+      )
+// 用户注册
+export const register =
+    (username, password, passwordConfirm, inviterId,pictureCode='') =>
+      requestApi(
+        '/Login/register',
+        'POST',
+        {
+          'username': username,
+          'password': password,
+          'password_confirm': passwordConfirm,
+          'inviter_id': inviterId,
+            'captcha':pictureCode,
+          'client': 'wap'
+        }
+      )
+// 用户手机注册
+export const registerByMobile =
+    (phone, password, passwordConfirm, captcha, inviterId) =>
+      requestApi(
+        '/Connect/sms_register',
+        'POST',
+        {
+          'phone': phone,
+          'password': password,
+          'password_confirm': passwordConfirm,
+          'captcha': captcha,
+          'inviter_id': inviterId,
+          'client': 'wap'
+        }
+      )

+ 60 - 0
api/memberReturn.js

@@ -0,0 +1,60 @@
+import { requestApi } from '../util/network'
+
+// 获取退货列表
+export const getReturnList =
+(params) =>
+  requestApi(
+    '/Memberreturn/get_return_list',
+    'POST',
+    {
+      page: params.page,
+      per_page: params.per_page
+    },
+    'member'
+  )
+// 获取单个退货信息
+export const getReturnInfo =
+(returnId) =>
+  requestApi(
+    '/Memberreturn/get_return_info',
+    'POST',
+    {
+      return_id: returnId
+    },
+    'member'
+  )
+
+// 获取物流公司
+export const getExpress =
+    () =>
+      requestApi(
+        '/Memberreturn/get_express',
+        'POST',
+        {
+        },
+        'member'
+      )
+// 退货
+export const sendReturn =
+    (returnId, expressId, invoiceNo) =>
+      requestApi(
+        '/Memberreturn/ship_post',
+        'POST',
+        {
+          return_id: returnId,
+          express_id: expressId,
+          invoice_no: invoiceNo
+        },
+        'member'
+      )
+// 延迟
+export const delayReturn =
+    (returnId) =>
+      requestApi(
+        '/Memberreturn/delay_post',
+        'POST',
+        {
+          return_id: returnId
+        },
+        'member'
+      )

+ 80 - 0
api/memberSetting.js

@@ -0,0 +1,80 @@
+import { requestApi } from '../util/network'
+// 发送验证码
+export const sendAuthCode =
+(type) =>
+  requestApi(
+    '/Memberaccount/send_auth_code',
+    'POST',
+    {
+      type: type
+    },
+    'member'
+  )
+// 验证码检测
+export const checkAuthCode =
+    (authCode) =>
+      requestApi(
+        '/Memberaccount/check_auth_code',
+        'POST',
+        {
+          auth_code: authCode
+        },
+        'member'
+      )
+// 更新用户手机号
+export const updateUserMobile =
+    (authCode) =>
+      requestApi(
+        '/Memberaccount/bind_mobile_step2',
+        'POST',
+        {
+          auth_code: authCode
+        },
+        'member'
+      )
+// 更新用户密码
+export const updateUserPassword =
+    (password, password1) =>
+      requestApi(
+        '/Memberaccount/modify_password',
+        'POST',
+        {
+          password: password,
+          password1: password1
+        },
+        'member'
+      )
+// 更新用户支付密码
+export const updateUserPaypwd =
+    (password, password1) =>
+      requestApi(
+        '/Memberaccount/modify_paypwd',
+        'POST',
+        {
+          password: password,
+          password1: password1
+        },
+        'member'
+      )
+// 绑定用户手机
+export const bindUserMobile =
+    (mobile) =>
+      requestApi(
+        '/Memberaccount/bind_mobile_step1',
+        'POST',
+        {
+          mobile: mobile
+        },
+        'member'
+      )
+// 绑定用户邮箱
+export const bindUserEmail =
+    (email) =>
+      requestApi(
+        '/Memberaccount/bind_email_step1',
+        'POST',
+        {
+          email: email
+        },
+        'member'
+      )

+ 51 - 0
api/memberVoucher.js

@@ -0,0 +1,51 @@
+import { requestApi } from '../util/network'
+
+// 获取用户平台代金券列表
+export const getMallVoucherList =
+(params,stateType) =>
+  requestApi(
+    '/Membermallvoucher/mallvoucher_list',
+    'POST',
+    {
+        page:params.page,
+        per_page:params.per_page,
+        mallvoucher_state:stateType
+    },
+    'member'
+  )
+// 获取用户店铺代金券列表
+export const getVoucherList =
+(params,stateType) =>
+  requestApi(
+    '/Membervoucher/voucher_list',
+    'POST',
+    {
+        page:params.page,
+        per_page:params.per_page,
+        voucher_state:stateType
+    },
+    'member'
+  )
+
+// 兑换代金券
+export const receiveVoucher =
+    (vouchertemplate_id) =>
+      requestApi(
+        '/Membervoucher/voucher_point',
+        'POST',
+        {
+          'tid': vouchertemplate_id
+        },
+        'member'
+      )
+// 私密代金券
+export const getVoucherPrivate =
+    (vouchertemplate_id) =>
+      requestApi(
+        '/Membervoucher/voucher_private',
+        'POST',
+        {
+          'vouchertemplate_id': vouchertemplate_id
+        },
+        'member'
+      )

+ 45 - 0
api/memberVrBuy.js

@@ -0,0 +1,45 @@
+import { requestApi } from '../util/network'
+
+// 获取订单信息
+export const buyStep1 =
+(goods_id, quantity, extra = {}) =>
+  requestApi(
+    '/membervrbuy/buy_step1',
+    'POST',
+    Object.assign(
+    {
+      'goods_id': goods_id,
+      'quantity': quantity
+    },
+    extra),
+    'member'
+  )
+
+// 下单入库
+export const buyStep2 =
+    (goods_id, quantity, buyer_phone, buyer_msg, extra = {}) =>
+      requestApi(
+        '/membervrbuy/buy_step2',
+        'POST',
+        Object.assign(
+        {
+          'goods_id': goods_id,
+          'quantity': quantity,
+          'buyer_phone': buyer_phone,
+          'buyer_msg': buyer_msg,
+        },
+        extra),
+        'member'
+      )
+
+// 获取订单支付信息
+export const getVrOrderpayInfo =
+    (paySn) =>
+      requestApi(
+        '/membervrbuy/pay',
+        'POST',
+        {
+          'pay_sn': paySn
+        },
+        'member'
+      )

+ 63 - 0
api/memberVrOrder.js

@@ -0,0 +1,63 @@
+import { requestApi } from '../util/network'
+
+// 获取用户订单列表
+export const getOrderList =
+(parmas, stateType, orderKey) =>
+  requestApi(
+    '/Membervrorder/order_list',
+    'POST',
+    {
+      'page': parmas.page,
+
+      'per_page': parmas.per_page,
+      'state_type': stateType,
+      'order_key': orderKey
+    },
+    'member'
+  )
+// 获取订单信息
+export const getOrderInfo =
+(orderId) =>
+  requestApi(
+    '/Membervrorder/order_info',
+    'POST',
+    {
+      'order_id': orderId
+    },
+    'member'
+  )
+// 订单评价
+export const saveOrderEvaluate =
+    (orderId, result) =>
+      requestApi(
+        '/Memberevaluate/save_vr',
+        'POST',
+        Object.assign(
+          {
+            'order_id': orderId
+          },
+          result),
+        'member'
+      )
+// 获取评价信息
+export const getOrderEvaluateInfo =
+    (orderId) =>
+      requestApi(
+        '/Memberevaluate/vr',
+        'POST',
+        {
+          'order_id': orderId
+        },
+        'member'
+      )
+// 取消订单
+export const cancelOrder =
+    (orderId) =>
+      requestApi(
+        '/Membervrorder/order_cancel',
+        'POST',
+        {
+          'order_id': orderId
+        },
+        'member'
+      )

+ 51 - 0
api/memberVrRefund.js

@@ -0,0 +1,51 @@
+import { requestApi } from '../util/network'
+
+// 获取退款列表
+export const getVrRefundList =
+(params) =>
+  requestApi(
+    '/Membervrrefund/index',
+    'POST',
+    {
+      page: params.page,
+      per_page: params.per_page
+    },
+    'member'
+  )
+// 获取单个退款信息
+export const getVrRefundInfo =
+(refundId) =>
+  requestApi(
+    '/Membervrrefund/view',
+    'POST',
+    {
+      refund_id: refundId
+    },
+    'member'
+  )
+
+// 新增部分退款
+export const addVrRefund =
+    (orderId, recId, buyerMessage) =>
+      requestApi(
+        '/Membervrrefund/add_refund',
+        'POST',
+        {
+            rec_id: recId,
+          order_id: orderId,
+          buyer_message: buyerMessage,
+        },
+        'member'
+      )
+
+// 获取公共信息
+export const getCommonData =
+    (orderId, recId) =>
+      requestApi(
+        '/Membervrrefund/refund_form',
+        'POST',
+        {
+          order_id: orderId,
+        },
+        'member'
+      )

+ 25 - 0
api/memberWithdraw.js

@@ -0,0 +1,25 @@
+import { requestApi } from '../util/network'
+
+export const getWithdrawList =
+(params) =>
+  requestApi(
+    '/Memberfund/pdcashlist',
+    'POST',
+    {
+      page: params.page,
+      per_page: params.per_page
+    },
+    'member'
+  )
+export const addWithdraw =
+    (pdcAmount, memberbankId, password) =>
+      requestApi(
+        '/Recharge/pd_cash_add',
+        'POST',
+        {
+          pdc_amount: pdcAmount,
+          memberbank_id: memberbankId,
+          password: password
+        },
+        'member'
+      )

+ 117 - 0
api/seller.js

@@ -0,0 +1,117 @@
+import { requestApi } from '../util/network'
+
+// 卖家退出登录
+export const logout =
+    (seller_name) =>
+      requestApi(
+        '/Sellerlogout/index',
+        'POST',
+        {
+          seller_name: seller_name,
+          client: 'wap'
+        },
+        'seller'
+      )
+// 获取店铺基本信息
+export const getSellerInfo =
+    () =>
+      requestApi(
+        '/Sellerindex/index',
+        'POST',
+        {
+          'client_type': 'wap'
+        },
+        'seller'
+      )
+export const getStoreClass =
+    () =>
+      requestApi(
+        '/store/get_store_class',
+        'POST',
+        {
+
+        }
+      )
+export const getStoreGrade =
+    () =>
+      requestApi(
+        '/store/get_store_grade',
+        'POST',
+        {
+
+        }
+      )
+export const getStoreJoinin =
+    () =>
+      requestApi(
+        '/Sellerjoinin/get_info',
+        'POST',
+        {
+
+        },
+        'member'
+      )
+export const saveStoreJoinin2 =
+    (joinin) =>
+      requestApi(
+        '/Sellerjoinin/step2',
+        'POST',
+        joinin,
+        'member'
+      )
+export const saveStoreJoinin3 =
+    (joinin) =>
+      requestApi(
+        '/Sellerjoinin/step3',
+        'POST',
+        joinin,
+        'member'
+      )
+export const saveStoreJoinin4 =
+    (joinin) =>
+      requestApi(
+        '/Sellerjoinin/step4',
+        'POST',
+        joinin,
+        'member'
+      )
+export const saveStoreJoinin5 =
+    (joinin) =>
+      requestApi(
+        '/Sellerjoinin/pay_save',
+        'POST',
+        joinin,
+        'member'
+      )
+export const uploadInfoFile =
+    (file) =>
+      requestApi(
+        '/Sellerjoinin/upload_image',
+        'POST',
+        file,
+        'member',
+        true
+      )
+// 获取店铺日志记录
+export const getSellerLogList =
+    () =>
+      requestApi(
+        '/Sellerlog/log_list',
+        'POST',
+        {
+
+        },
+        'seller'
+      )
+
+// 获取店铺的消费记录
+export const getSellerCostList =
+    () =>
+      requestApi(
+        '/Sellercost/cost_list',
+        'POST',
+        {
+
+        },
+        'seller'
+      )

+ 699 - 0
components/thorui/tui-picture-cropper/tui-picture-cropper.vue

@@ -0,0 +1,699 @@
+<template>
+	<view class="tui-container" @touchmove.stop.prevent="stop">
+		<view
+			class="tui-image-cropper"
+			:change:prop="parse.propsChange"
+			:prop="props"
+			:data-lockRatio="lockRatio"
+			:data-lockWidth="lockWidth"
+			:data-lockHeight="lockHeight"
+			:data-maxWidth="maxWidth"
+			:data-minWidth="minWidth"
+			:data-maxHeight="maxHeight"
+			:data-minHeight="minHeight"
+			:data-width="width"
+			:data-height="height"
+			:data-limitMove="limitMove"
+			:data-windowHeight="sysInfo.windowHeight || 600"
+			:data-windowWidth="sysInfo.windowWidth || 400"
+			:data-imgTop="imgTop"
+			:data-imgLeft="imgLeft"
+			:data-imgWidth="imgWidth"
+			:data-imgHeight="imgHeight"
+			:data-angle="angle"
+			@touchend="parse.cutTouchEnd"
+			@touchstart="parse.cutTouchStart"
+			@touchmove="parse.cutTouchMove"
+		>
+			<view class="tui-content">
+				<view class="tui-content-top tui-bg-transparent" :style="{ transitionProperty: cutAnimation ? '' : 'background' }"></view>
+				<view class="tui-content-middle">
+					<view class="tui-bg-transparent tui-wxs-bg" :style="{ transitionProperty: cutAnimation ? '' : 'background' }"></view>
+					<view class="tui-cropper-box" :style="{ borderColor: borderColor, transitionProperty: cutAnimation ? '' : 'background' }">
+						<view
+							v-for="(item, index) in 4"
+							:key="index"
+							class="tui-edge"
+							:class="[`tui-${index < 2 ? 'top' : 'bottom'}-${index === 0 || index === 2 ? 'left' : 'right'}`]"
+							:style="{
+								width: edgeWidth,
+								height: edgeWidth,
+								borderColor: edgeColor,
+								borderWidth: edgeBorderWidth,
+								left: index === 0 || index === 2 ? `-${edgeOffsets}` : 'auto',
+								right: index === 1 || index === 3 ? `-${edgeOffsets}` : 'auto',
+								top: index < 2 ? `-${edgeOffsets}` : 'auto',
+								bottom: index > 1 ? `-${edgeOffsets}` : 'auto'
+							}"
+						></view>
+					</view>
+					<view class="tui-flex-auto tui-bg-transparent" :style="{ transitionProperty: cutAnimation ? '' : 'background' }"></view>
+				</view>
+				<view class="tui-flex-auto tui-bg-transparent" :style="{ transitionProperty: cutAnimation ? '' : 'background' }"></view>
+			</view>
+			<image
+				@load="imageLoad"
+				@error="imageLoad"
+				@touchstart="parse.touchstart"
+				@touchmove="parse.touchmove"
+				@touchend="parse.touchend"
+				:data-minScale="minScale"
+				:data-maxScale="maxScale"
+				:data-disableRotate="disableRotate"
+				:style="{
+					width: imgWidth ? imgWidth + 'px' : 'auto',
+					height: imgHeight ? imgHeight + 'px' : 'auto',
+					transitionDuration: (cutAnimation ? 0.3 : 0) + 's'
+				}"
+				class="tui-cropper-image"
+				:src="imageUrl"
+				v-if="imageUrl"
+				mode="widthFix"
+			></image>
+		</view>
+		<canvas
+			canvas-id="tui-image-cropper"
+			id="tui-image-cropper"
+			:disable-scroll="true"
+			:style="{ width: CROPPER_WIDTH * scaleRatio + 'px', height: CROPPER_HEIGHT * scaleRatio + 'px' }"
+			class="tui-cropper-canvas"
+		></canvas>
+		<view class="tui-cropper-tabbar" v-if="!custom">
+			<view class="tui-op-btn" @tap.stop="back">取消</view>
+			<image :src="rotateImg" class="tui-rotate-img" @tap="setAngle"></image>
+			<view class="tui-op-btn" @tap.stop="getImage">完成</view>
+		</view>
+	</view>
+</template>
+<script src="./tui-picture-cropper.wxs" module="parse" lang="wxs"></script>
+<script>
+/**
+ * 注意:组件中使用的图片地址,将文件复制到自己项目中
+ * 如果图片位置与组件同级,编译成小程序时图片会丢失
+ * 拷贝static下整个components文件夹
+ *也可直接转成base64(不建议)
+ * */
+export default {
+	name: 'tuiPictureCropper',
+	props: {
+		//图片路径
+		imageUrl: {
+			type: String,
+			default: ''
+		},
+		/*
+		 默认正方形,可修改大小控制比例
+		 裁剪框高度 px
+		*/
+		height: {
+			type: Number,
+			default: 280
+		},
+		//裁剪框宽度 px
+		width: {
+			type: Number,
+			default: 280
+		},
+		//裁剪框最小宽度 px
+		minWidth: {
+			type: Number,
+			default: 100
+		},
+		//裁剪框最小高度 px
+		minHeight: {
+			type: Number,
+			default: 100
+		},
+		//裁剪框最大宽度 px
+		maxWidth: {
+			type: Number,
+			default: 360
+		},
+		//裁剪框最大高度 px
+		maxHeight: {
+			type: Number,
+			default: 360
+		},
+		//裁剪框border颜色
+		borderColor: {
+			type: String,
+			default: 'rgba(255,255,255,0.1)'
+		},
+		//裁剪框边缘线颜色
+		edgeColor: {
+			type: String,
+			default: '#FFFFFF'
+		},
+		//裁剪框边缘线宽度 w=h
+		edgeWidth: {
+			type: String,
+			default: '34rpx'
+		},
+		//裁剪框边缘线border宽度
+		edgeBorderWidth: {
+			type: String,
+			default: '6rpx'
+		},
+		//偏移距离,根据edgeBorderWidth进行调整
+		edgeOffsets: {
+			type: String,
+			default: '6rpx'
+		},
+		/**
+		 * 如果宽度和高度都为true则裁剪框禁止拖动
+		 * 裁剪框宽度锁定
+		 */
+		lockWidth: {
+			type: Boolean,
+			default: false
+		},
+		//裁剪框高度锁定
+		lockHeight: {
+			type: Boolean,
+			default: false
+		},
+		//锁定裁剪框比例(放大或缩小)
+		lockRatio: {
+			type: Boolean,
+			default: false
+		},
+		//生成的图片尺寸相对剪裁框的比例
+		scaleRatio: {
+			type: Number,
+			default: 2
+		},
+		//图片的质量,取值范围为 (0, 1],不在范围内时当作1.0处理
+		quality: {
+			type: Number,
+			default: 0.8
+		},
+		//图片旋转角度
+		rotateAngle: {
+			type: Number,
+			default: 0
+		},
+		//图片最小缩放比
+		minScale: {
+			type: Number,
+			default: 0.5
+		},
+		//图片最大缩放比
+		maxScale: {
+			type: Number,
+			default: 2
+		},
+		//是否禁用触摸旋转(为false则可以触摸转动图片,limitMove为false生效)
+		disableRotate: {
+			type: Boolean,
+			default: true
+		},
+		//是否限制移动范围(剪裁框只能在图片内,为true不可触摸转动图片)
+		limitMove: {
+			type: Boolean,
+			default: true
+		},
+		//自定义操作栏(为true时隐藏底部操作栏)
+		custom: {
+			type: Boolean,
+			default: false
+		},
+		//值发生改变开始裁剪(custom为true时生效)
+		startCutting: {
+			type: [Number, Boolean],
+			default: 0
+		},
+		/**
+		 * 是否返回base64(H5端默认base64)
+		 * 支持平台:App,微信小程序,支付宝小程序,H5(默认url就是base64)
+		 **/
+		isBase64: {
+			type: Boolean,
+			default: false
+		},
+		//裁剪时是否显示loadding
+		loadding: {
+			type: Boolean,
+			default: true
+		},
+		//旋转icon
+		rotateImg: {
+			type: String,
+			default: '/static/components/cropper/img_rotate.png'
+		}
+	},
+	data() {
+		return {
+			TIME_CUT_CENTER: null,
+			CROPPER_WIDTH: 200, //裁剪框宽
+			CROPPER_HEIGHT: 200, //裁剪框高
+			cutX: 0, //画布x轴起点
+			cutY: 0, //画布y轴起点0
+			canvasWidth: 0,
+			canvasHeight: 0,
+			imgWidth: 0, //图片宽度
+			imgHeight: 0, //图片高度
+			scale: 1, //图片缩放比
+			angle: 0, //图片旋转角度
+			cutAnimation: false, //是否开启图片和裁剪框过渡
+			cutAnimationTime: null,
+			imgTop: 0, //图片上边距
+			imgLeft: 0, //图片左边距
+			ctx: null,
+			sysInfo: {},
+			props: '',
+			sizeChange: 0, //2
+			angleChange: 0, //3
+			resetChange: 0, //4
+			centerChange: 0 //5
+		};
+	},
+	watch: {
+		//定义变量然后利用change触发
+		imageUrl(val, oldVal) {
+			this.imageReset();
+			this.showLoading();
+			uni.getImageInfo({
+				src: val,
+				success: res => {
+					//计算图片尺寸
+					this.imgComputeSize(res.width, res.height);
+					if (this.limitMove) {
+						this.angleChange++;
+						this.props = `3,${this.angleChange}`;
+					}
+				},
+				fail: err => {
+					this.imgComputeSize();
+					if (this.limitMove) {
+						this.angleChange++;
+						this.props = `3,${this.angleChange}`;
+					}
+				}
+			});
+		},
+		rotateAngle(val) {
+			this.cutAnimation = true;
+			this.angle = val;
+			this.angleChanged(val);
+		},
+		cutAnimation(val) {
+			//开启过渡260毫秒之后自动关闭
+			clearTimeout(this.cutAnimationTime);
+			if (val) {
+				this.cutAnimationTime = setTimeout(() => {
+					this.cutAnimation = false;
+				}, 260);
+			}
+		},
+		limitMove(val) {
+			if (val) {
+				this.angleChanged(this.angle);
+			}
+		},
+		startCutting(val) {
+			if (this.custom && val) {
+				this.getImage();
+			}
+		}
+	},
+	mounted() {
+		this.sysInfo = uni.getSystemInfoSync();
+		this.imgTop = this.sysInfo.windowHeight / 2;
+		this.imgLeft = this.sysInfo.windowWidth / 2;
+		this.CROPPER_WIDTH = this.width;
+		this.CROPPER_HEIGHT = this.height;
+		this.canvasHeight = this.height;
+		this.canvasWidth = this.width;
+		this.ctx = uni.createCanvasContext('tui-image-cropper', this);
+		//初始化
+		setTimeout(() => {
+			this.props = '1,1';
+		}, 0);
+		setTimeout(() => {
+			this.$emit('ready', {});
+		}, 200);
+	},
+	methods: {
+		//网络图片转成本地文件[同步执行]
+		async getLocalImage(url) {
+			return await new Promise((resolve, reject) => {
+				uni.downloadFile({
+					url: url,
+					success: res => {
+						resolve(res.tempFilePath);
+					},
+					fail: res => {
+						reject(false)
+					}
+				})
+			})
+		},
+		//返回裁剪后图片信息
+		getImage() {
+			if (!this.imageUrl) {
+				uni.showToast({
+					title: '请选择图片',
+					icon: 'none'
+				});
+				return;
+			}
+			this.loadding && this.showLoading();
+			let draw =async () => {
+				//图片实际大小
+				let imgWidth = this.imgWidth * this.scale * this.scaleRatio;
+				let imgHeight = this.imgHeight * this.scale * this.scaleRatio;
+				//canvas和图片的相对距离
+				let xpos = this.imgLeft - this.cutX;
+				let ypos = this.imgTop - this.cutY;
+				//旋转画布
+				this.ctx.translate(xpos * this.scaleRatio, ypos * this.scaleRatio);
+				this.ctx.rotate((this.angle * Math.PI) / 180);
+				let imgUrl = this.imageUrl;
+				// #ifdef APP-PLUS || MP-WEIXIN
+				if (~this.imageUrl.indexOf('https:')) {
+					imgUrl = await this.getLocalImage(this.imageUrl)
+				}
+				// #endif
+				this.ctx.drawImage(imgUrl, -imgWidth / 2, -imgHeight / 2, imgWidth, imgHeight);
+				this.ctx.draw(false, () => {
+					let params = {
+						width: this.canvasWidth * this.scaleRatio,
+						height: Math.round(this.canvasHeight * this.scaleRatio),
+						destWidth: this.canvasWidth * this.scaleRatio,
+						destHeight: Math.round(this.canvasHeight) * this.scaleRatio,
+						fileType: 'png',
+						quality: this.quality
+					};
+					let data = {
+						url: '',
+						base64: '',
+						width: this.canvasWidth * this.scaleRatio,
+						height: this.canvasHeight * this.scaleRatio
+					};
+					// #ifdef MP-ALIPAY
+
+					if (this.isBase64) {
+						this.ctx.toDataURL(params).then(dataURL => {
+							data.base64 = dataURL;
+							this.loadding && uni.hideLoading();
+							this.$emit('cropper', data);
+						});
+					} else {
+						this.ctx.toTempFilePath({
+							...params,
+							success: res => {
+								data.url = res.tempFilePath;
+								this.loadding && uni.hideLoading();
+								this.$emit('cropper', data);
+							}
+						});
+					}
+					// #endif
+
+					// #ifndef MP-ALIPAY
+					// #ifdef MP-BAIDU || MP-TOUTIAO || H5
+					this.isBase64 = false;
+					// #endif
+					if (this.isBase64) {
+						uni.canvasGetImageData({
+							canvasId: 'tui-image-cropper',
+							x: 0,
+							y: 0,
+							width: this.canvasWidth * this.scaleRatio,
+							height: Math.round(this.canvasHeight * this.scaleRatio),
+							success: res => {
+								const arrayBuffer = new Uint8Array(res.data);
+								const base64 = uni.arrayBufferToBase64(arrayBuffer);
+								data.base64 = base64;
+								this.loadding && uni.hideLoading();
+								this.$emit('cropper', data);
+							}
+						},this);
+					} else {
+						uni.canvasToTempFilePath(
+							{
+								...params,
+								canvasId: 'tui-image-cropper',
+								success: res => {
+									data.url = res.tempFilePath;
+									// #ifdef H5
+									data.base64 = res.tempFilePath;
+									// #endif
+									this.loadding && uni.hideLoading();
+									this.$emit('cropper', data);
+								},
+								fail(res) {
+									console.log(res);
+								}
+							},
+							this
+						);
+					}
+					// #endif
+				});
+			};
+			if (this.CROPPER_WIDTH != this.canvasWidth || this.CROPPER_HEIGHT != this.canvasHeight) {
+				this.CROPPER_WIDTH = this.canvasWidth;
+				this.CROPPER_HEIGHT = this.canvasHeight;
+				this.$nextTick(() => {
+					this.ctx.draw();
+					setTimeout(() => {
+						draw();
+					}, 100);
+				});
+			} else {
+				draw();
+			}
+		},
+		change(e) {
+			this.cutX = e.cutX || 0;
+			this.cutY = e.cutY || 0;
+			this.canvasWidth = e.canvasWidth || this.width;
+			this.canvasHeight = e.canvasHeight || this.height;
+			this.imgWidth = e.imgWidth || this.imgWidth;
+			this.imgHeight = e.imgHeight || this.imgHeight;
+			this.scale = e.scale || 1;
+			this.angle = e.angle || 0;
+			this.imgTop = e.imgTop || 0;
+			this.imgLeft = e.imgLeft || 0;
+		},
+		imageReset() {
+			this.scale = 1;
+			this.angle = 0;
+			let sys = this.sysInfo.windowHeight ? this.sysInfo : uni.getSystemInfoSync();
+			this.imgTop = sys.windowHeight / 2;
+			this.imgLeft = sys.windowWidth / 2;
+			this.resetChange++;
+			this.props = `4,${this.resetChange}`;
+			//初始化旋转角度 0deg
+			this.$emit('initAngle', {});
+		},
+		imageLoad(e) {
+			this.imageReset();
+			uni.hideLoading();
+			this.$emit('imageLoad', {});
+		},
+
+		imgComputeSize(width, height) {
+			//默认按图片最小边 = 对应裁剪框尺寸
+			let imgWidth = width,
+				imgHeight = height;
+			if (imgWidth && imgHeight) {
+				if (imgWidth / imgHeight > this.width / this.height) {
+					imgHeight = this.height;
+					imgWidth = (width / height) * imgHeight;
+				} else {
+					imgWidth = this.width;
+					imgHeight = (height / width) * imgWidth;
+				}
+			} else {
+				let sys = this.sysInfo.windowHeight ? this.sysInfo : uni.getSystemInfoSync();
+				imgWidth = sys.windowWidth;
+				imgHeight = 0;
+			}
+			this.imgWidth = imgWidth;
+			this.imgHeight = imgHeight;
+			this.sizeChange++;
+			this.props = `2,${this.sizeChange}`;
+		},
+		moveStop() {
+			clearTimeout(this.TIME_CUT_CENTER);
+			this.TIME_CUT_CENTER = setTimeout(() => {
+				if (!this.cutAnimation) {
+					this.cutAnimation = true;
+				}
+				this.centerChange++;
+				this.props = `5,${this.centerChange}`;
+			}, 666);
+		},
+		moveDuring() {
+			clearTimeout(this.TIME_CUT_CENTER);
+		},
+		showLoading() {
+			uni.showLoading({
+				title: '请稍候...',
+				mask: true
+			});
+		},
+		stop() {},
+		back() {
+			this.$emit('back')
+		},
+		angleChanged(val) {
+			this.moveStop();
+			if (this.limitMove && val % 90) {
+				this.angle = Math.round(val / 90) * 90;
+			}
+			this.angleChange++;
+			this.props = `3,${this.angleChange}`;
+		},
+		setAngle() {
+			this.cutAnimation = true;
+			this.angle = this.angle + 90;
+			this.angleChanged(this.angle);
+		}
+	}
+};
+</script>
+
+<style scoped>
+.tui-container {
+	width: 100vw;
+	height: 100vh;
+	background-color: rgba(0, 0, 0, 0.6);
+	position: fixed;
+	top: 0;
+	left: 0;
+	z-index: 1;
+}
+
+.tui-image-cropper {
+	width: 100vw;
+	height: 100vh;
+	position: absolute;
+}
+
+.tui-content {
+	width: 100vw;
+	height: 100vh;
+	position: absolute;
+	z-index: 9;
+	display: flex;
+	flex-direction: column;
+	pointer-events: none;
+}
+
+.tui-bg-transparent {
+	background-color: rgba(0, 0, 0, 0.6);
+	transition-duration: 0.3s;
+}
+
+.tui-content-top {
+	pointer-events: none;
+}
+
+.tui-content-middle {
+	width: 100%;
+	height: 200px;
+	display: flex;
+	box-sizing: border-box;
+}
+
+.tui-cropper-box {
+	position: relative;
+	/* transition-duration: 0.2s; */
+	border-style: solid;
+	border-width: 1rpx;
+	box-sizing: border-box;
+}
+
+.tui-flex-auto {
+	flex: auto;
+}
+
+.tui-cropper-image {
+	width: 100%;
+	border-style: none;
+	position: absolute;
+	top: 0;
+	left: 0;
+	z-index: 2;
+	-webkit-backface-visibility: hidden;
+	backface-visibility: hidden;
+	transform-origin: center;
+}
+
+.tui-cropper-canvas {
+	position: fixed;
+	z-index: 10;
+	left: -2000px;
+	top: -2000px;
+	pointer-events: none;
+}
+
+.tui-edge {
+	border-style: solid;
+	pointer-events: auto;
+	position: absolute;
+	box-sizing: border-box;
+}
+
+.tui-top-left {
+	border-bottom-width: 0 !important;
+	border-right-width: 0 !important;
+}
+
+.tui-top-right {
+	border-bottom-width: 0 !important;
+	border-left-width: 0 !important;
+}
+
+.tui-bottom-left {
+	border-top-width: 0 !important;
+	border-right-width: 0 !important;
+}
+
+.tui-bottom-right {
+	border-top-width: 0 !important;
+	border-left-width: 0 !important;
+}
+
+.tui-cropper-tabbar {
+	width: 100%;
+	height: 120rpx;
+	padding: 0 40rpx;
+	box-sizing: border-box;
+	position: fixed;
+	left: 0;
+	bottom: 0;
+	z-index: 99;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	color: #ffffff;
+	font-size: 32rpx;
+}
+
+.tui-cropper-tabbar::after {
+	content: ' ';
+	position: absolute;
+	top: 0;
+	right: 0;
+	left: 0;
+	border-top: 1rpx solid rgba(255, 255, 255, 0.2);
+	-webkit-transform: scaleY(0.5) translateZ(0);
+	transform: scaleY(0.5) translateZ(0);
+	transform-origin: 0 100%;
+}
+
+.tui-op-btn {
+	height: 80rpx;
+	display: flex;
+	align-items: center;
+}
+
+.tui-rotate-img {
+	width: 44rpx;
+	height: 44rpx;
+}
+</style>

+ 560 - 0
components/thorui/tui-picture-cropper/tui-picture-cropper.wxs

@@ -0,0 +1,560 @@
+var cropper = {
+	CUT_START: null,
+	cutX: 0, //画布x轴起点
+	cutY: 0, //画布y轴起点0
+	touchRelative: [{
+		x: 0,
+		y: 0
+	}], //手指或鼠标和图片中心的相对位置
+	flagCutTouch: false, //是否是拖动裁剪框
+	hypotenuseLength: 0, //双指触摸时斜边长度
+	flagEndTouch: false, //是否结束触摸
+	canvasWidth: 0,
+	canvasHeight: 0,
+	imgWidth: 0, //图片宽度
+	imgHeight: 0, //图片高度
+	scale: 1, //图片缩放比
+	angle: 0, //图片旋转角度
+	imgTop: 0, //图片上边距
+	imgLeft: 0, //图片左边距
+	//是否限制移动范围(剪裁框只能在图片内,为true不可触摸转动图片)
+	limitMove: true,
+	minHeight: 0,
+	maxHeight: 0,
+	minWidth: 0,
+	maxWidth: 0,
+	windowHeight: 0,
+	windowWidth: 0,
+	init: true
+}
+
+function bool(str) {
+	return str === 'true' || str == true ? true : false
+}
+
+function touchstart(e, ins) {
+	//var instance = e.instance;
+	// var state = instance.getState();
+	var touch = e.touches || e.changedTouches;
+	cropper.flagEndTouch = false;
+	if (touch.length == 1) {
+		cropper.touchRelative[0] = {
+			x: touch[0].pageX - cropper.imgLeft,
+			y: touch[0].pageY - cropper.imgTop
+		};
+	} else {
+		var width = Math.abs(touch[0].pageX - touch[1].pageX);
+		var height = Math.abs(touch[0].pageY - touch[1].pageY);
+		cropper.touchRelative = [{
+				x: touch[0].pageX - cropper.imgLeft,
+				y: touch[0].pageY - cropper.imgTop
+			},
+			{
+				x: touch[1].pageX - cropper.imgLeft,
+				y: touch[1].pageY - cropper.imgTop
+			}
+		];
+		cropper.hypotenuseLength = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));
+	}
+
+}
+
+function moveDuring(ins) {
+	if (!ins) return;
+	ins.callMethod('moveDuring')
+}
+
+function moveStop(ins) {
+	if (!ins) return;
+	ins.callMethod('moveStop')
+};
+
+function setCutCenter(ins) {
+	var cutY = (cropper.windowHeight - cropper.canvasHeight) * 0.5;
+	var cutX = (cropper.windowWidth - cropper.canvasWidth) * 0.5;
+	//顺序不能变
+	cropper.imgTop = cropper.imgTop - cropper.cutY + cutY;
+	cropper.cutY = cutY; //截取的框上边距
+	cropper.imgLeft = cropper.imgLeft - cropper.cutX + cutX;
+	cropper.cutX = cutX; //截取的框左边距
+	styleUpdate(ins)
+	cutDetectionPosition(ins)
+	imgTransform(ins)
+	updateData(ins)
+}
+
+function touchmove(e, ins) {
+	var touch = e.touches || e.changedTouches;
+	if (cropper.flagEndTouch) return;
+	moveDuring(ins);
+	if (e.touches.length == 1) {
+		var left = touch[0].pageX - cropper.touchRelative[0].x,
+			top = touch[0].pageY - cropper.touchRelative[0].y;
+		cropper.imgLeft = left;
+		cropper.imgTop = top;
+		imgTransform(ins);
+		imgMarginDetectionPosition(ins);
+	} else {
+		var res = e.instance.getDataset();
+		var minScale = +res.minscale;
+		var maxScale = +res.maxscale;
+		var disableRotate = bool(res.disablerotate)
+		var width = Math.abs(touch[0].pageX - touch[1].pageX),
+			height = Math.abs(touch[0].pageY - touch[1].pageY),
+			hypotenuse = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)),
+			scale = cropper.scale * (hypotenuse / cropper.hypotenuseLength),
+			current_deg = 0;
+		scale = scale <= minScale ? minScale : scale;
+		scale = scale >= maxScale ? maxScale : scale;
+		cropper.scale = scale;
+		imgMarginDetectionScale(ins, true);
+		var touchRelative = [{
+				x: touch[0].pageX - cropper.imgLeft,
+				y: touch[0].pageY - cropper.imgTop
+			},
+			{
+				x: touch[1].pageX - cropper.imgLeft,
+				y: touch[1].pageY - cropper.imgTop
+			}
+		];
+		if (!disableRotate) {
+			var first_atan = (180 / Math.PI) * Math.atan2(touchRelative[0].y, touchRelative[0].x);
+			var first_atan_old = (180 / Math.PI) * Math.atan2(cropper.touchRelative[0].y, cropper.touchRelative[0].x);
+			var second_atan = (180 / Math.PI) * Math.atan2(touchRelative[1].y, touchRelative[1].x);
+			var second_atan_old = (180 / Math.PI) * Math.atan2(cropper.touchRelative[1].y, cropper.touchRelative[1].x);
+			var first_deg = first_atan - first_atan_old,
+				second_deg = second_atan - second_atan_old;
+			if (first_deg != 0) {
+				current_deg = first_deg;
+			} else if (second_deg != 0) {
+				current_deg = second_deg;
+			}
+		}
+		cropper.touchRelative = touchRelative;
+		cropper.hypotenuseLength = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));
+		//更新视图
+		cropper.angle = cropper.angle + current_deg;
+		imgTransform(ins);
+	}
+}
+
+function touchend(e, ins) {
+	cropper.flagEndTouch = true;
+	moveStop(ins);
+	updateData(ins)
+}
+
+
+function cutTouchStart(e, ins) {
+	var touch = e.touches || e.changedTouches;
+	var currentX = touch[0].pageX;
+	var currentY = touch[0].pageY;
+
+	/*
+	 * (右下-1 右上-2 左上-3 左下-4)
+	 * left_x [3,4]
+	 * top_y [2,3]
+	 * right_x [1,2]
+	 * bottom_y [1,4]
+	 */
+	var left_x1 = cropper.cutX - 30;
+	var left_x2 = cropper.cutX + 30;
+
+	var top_y1 = cropper.cutY - 30;
+	var top_y2 = cropper.cutY + 30;
+
+	var right_x1 = cropper.cutX + cropper.canvasWidth - 30;
+	var right_x2 = cropper.cutX + cropper.canvasWidth + 30;
+
+	var bottom_y1 = cropper.cutY + cropper.canvasHeight - 30;
+	var bottom_y2 = cropper.cutY + cropper.canvasHeight + 30;
+
+	if (currentX > right_x1 && currentX < right_x2 && currentY > bottom_y1 && currentY < bottom_y2) {
+		moveDuring();
+		cropper.flagCutTouch = true;
+		cropper.flagEndTouch = true;
+		cropper.CUT_START = {
+			width: cropper.canvasWidth,
+			height: cropper.canvasHeight,
+			x: currentX,
+			y: currentY,
+			corner: 1
+		};
+	} else if (currentX > right_x1 && currentX < right_x2 && currentY > top_y1 && currentY < top_y2) {
+		moveDuring();
+		cropper.flagCutTouch = true;
+		cropper.flagEndTouch = true;
+		cropper.CUT_START = {
+			width: cropper.canvasWidth,
+			height: cropper.canvasHeight,
+			x: currentX,
+			y: currentY,
+			cutY: cropper.cutY,
+			cutX: cropper.cutX,
+			corner: 2
+		};
+	} else if (currentX > left_x1 && currentX < left_x2 && currentY > top_y1 && currentY < top_y2) {
+		moveDuring();
+		cropper.flagCutTouch = true;
+		cropper.flagEndTouch = true;
+		cropper.CUT_START = {
+			width: cropper.canvasWidth,
+			height: cropper.canvasHeight,
+			cutY: cropper.cutY,
+			cutX: cropper.cutX,
+			x: currentX,
+			y: currentY,
+			corner: 3
+		};
+	} else if (currentX > left_x1 && currentX < left_x2 && currentY > bottom_y1 && currentY < bottom_y2) {
+		moveDuring();
+		cropper.flagCutTouch = true;
+		cropper.flagEndTouch = true;
+		cropper.CUT_START = {
+			width: cropper.canvasWidth,
+			height: cropper.canvasHeight,
+			cutY: cropper.cutY,
+			cutX: cropper.cutX,
+			x: currentX,
+			y: currentY,
+			corner: 4
+		};
+	}
+}
+
+function cutTouchMove(e, ins) {
+	if (!cropper.CUT_START || cropper.CUT_START === 'null') return;
+	if (cropper.flagCutTouch) {
+		var touch = e.touches || e.changedTouches;
+		var res = e.instance.getDataset();
+		var lockRatio = bool(res.lockratio);
+		var lockWidth = bool(res.lockwidth);
+		var lockHeight = bool(res.lockheight);
+		if (lockRatio && (lockWidth || lockHeight)) return;
+		var width = cropper.canvasWidth,
+			height = cropper.canvasHeight,
+			cutY = cropper.cutY,
+			cutX = cropper.cutX;
+
+		var size_correct = function() {
+			width = width <= cropper.maxWidth ? (width >= cropper.minWidth ? width : cropper.minWidth) : cropper.maxWidth;
+			height = height <= cropper.maxHeight ? (height >= cropper.minHeight ? height : cropper.minHeight) : cropper.maxHeight;
+		}
+
+		var size_inspect = function() {
+			if ((width > cropper.maxWidth || width < cropper.minWidth || height > cropper.maxHeight || height < cropper.minHeight) &&
+				lockRatio) {
+				size_correct();
+				return false;
+			} else {
+				size_correct();
+				return true;
+			}
+		};
+		height = cropper.CUT_START.height + (cropper.CUT_START.corner > 1 && cropper.CUT_START.corner < 4 ? 1 : -1) * (
+			cropper.CUT_START.y - touch[0].pageY);
+		switch (cropper.CUT_START.corner) {
+			case 1:
+				width = cropper.CUT_START.width - cropper.CUT_START.x + touch[0].pageX;
+				if (lockRatio) {
+					height = width / (cropper.canvasWidth / cropper.canvasHeight);
+				}
+				if (!size_inspect()) return;
+				break;
+			case 2:
+				width = cropper.CUT_START.width - cropper.CUT_START.x + touch[0].pageX;
+				if (lockRatio) {
+					height = width / (cropper.canvasWidth / cropper.canvasHeight);
+				}
+				if (!size_inspect()) return;
+				cutY = cropper.CUT_START.cutY - (height - cropper.CUT_START.height);
+				break;
+			case 3:
+				width = cropper.CUT_START.width + cropper.CUT_START.x - touch[0].pageX;
+				if (lockRatio) {
+					height = width / (cropper.canvasWidth / cropper.canvasHeight);
+				}
+				if (!size_inspect()) return;
+				cutY = cropper.CUT_START.cutY - (height - cropper.CUT_START.height);
+				cutX = cropper.CUT_START.cutX - (width - cropper.CUT_START.width);
+				break;
+			case 4:
+				width = cropper.CUT_START.width + cropper.CUT_START.x - touch[0].pageX;
+				if (lockRatio) {
+					height = width / (cropper.canvasWidth / cropper.canvasHeight);
+				}
+				if (!size_inspect()) return;
+				cutX = cropper.CUT_START.cutX - (width - cropper.CUT_START.width);
+				break;
+			default:
+				break;
+		}
+		if (!lockWidth && !lockHeight) {
+			cropper.canvasWidth = width;
+			cropper.cutX = cutX;
+			cropper.canvasHeight = height;
+			cropper.cutY = cutY;
+			canvasHeight(ins);
+			canvasWidth(ins);
+		} else if (!lockWidth) {
+			cropper.canvasWidth = width;
+			cropper.cutX = cutX;
+			canvasWidth(ins);
+		} else if (!lockHeight) {
+			cropper.canvasHeight = height;
+			cropper.cutY = cutY;
+			canvasHeight(ins);
+		}
+		styleUpdate(ins)
+		imgMarginDetectionScale(ins);
+	}
+}
+
+//检测剪裁框位置是否在允许的范围内(屏幕内)
+function cutDetectionPosition(ins) {
+	var windowHeight = cropper.windowHeight,
+		windowWidth = cropper.windowWidth;
+
+	var cutDetectionPositionTop = function() {
+		//检测上边距是否在范围内
+		if (cropper.cutY < 0) {
+			cropper.cutY = 0;
+		}
+		if (cropper.cutY > windowHeight - cropper.canvasHeight) {
+			cropper.cutY = windowHeight - cropper.canvasHeight;
+		}
+	}
+
+	var cutDetectionPositionLeft = function() {
+		//检测左边距是否在范围内
+		if (cropper.cutX < 0) {
+			cropper.cutX = 0;
+		}
+		if (cropper.cutX > windowWidth - cropper.canvasWidth) {
+			cropper.cutX = windowWidth - cropper.canvasWidth;
+		}
+	}
+	//裁剪框坐标处理(如果只写一个参数则另一个默认为0,都不写默认居中)
+	if (cropper.cutY == null && cropper.cutX == null) {
+		var cutY = (windowHeight - cropper.canvasHeight) * 0.5;
+		var cutX = (windowWidth - cropper.canvasWidth) * 0.5;
+		cropper.cutY = cutY; //截取的框上边距
+		cropper.cutX = cutX; //截取的框左边距
+	} else if (cropper.cutY != null && cropper.cutX != null) {
+		cutDetectionPositionTop();
+		cutDetectionPositionLeft();
+	} else if (cropper.cutY != null && cropper.cutX == null) {
+		cutDetectionPositionTop();
+		cropper.cutX = (windowWidth - cropper.canvasWidth) / 2;
+	} else if (cropper.cutY == null && cropper.cutX != null) {
+		cutDetectionPositionLeft();
+		cropper.cutY = (windowHeight - cropper.canvasHeight) / 2;
+	}
+
+	styleUpdate(ins)
+}
+
+/**
+ * 图片边缘检测-缩放
+ */
+function imgMarginDetectionScale(ins, delay) {
+	if (!cropper.limitMove) return;
+	var scale = cropper.scale;
+	var imgWidth = cropper.imgWidth;
+	var imgHeight = cropper.imgHeight;
+	if ((cropper.angle / 90) % 2) {
+		imgWidth = cropper.imgHeight;
+		imgHeight = cropper.imgWidth;
+	}
+	if (imgWidth * scale < cropper.canvasWidth) {
+		scale = cropper.canvasWidth / imgWidth;
+	}
+	if (imgHeight * scale < cropper.canvasHeight) {
+		scale = Math.max(scale, cropper.canvasHeight / imgHeight);
+	}
+	imgMarginDetectionPosition(ins, scale, delay);
+}
+/**
+ * 图片边缘检测-位置
+ */
+function imgMarginDetectionPosition(ins, scale, delay) {
+	if (!cropper.limitMove) return;
+	var left = cropper.imgLeft;
+	var top = cropper.imgTop;
+	scale = scale || cropper.scale;
+	var imgWidth = cropper.imgWidth;
+	var imgHeight = cropper.imgHeight;
+	if ((cropper.angle / 90) % 2) {
+		imgWidth = cropper.imgHeight;
+		imgHeight = cropper.imgWidth;
+	}
+	left = cropper.cutX + (imgWidth * scale) / 2 >= left ? left : cropper.cutX + (imgWidth * scale) / 2;
+	left = cropper.cutX + cropper.canvasWidth - (imgWidth * scale) / 2 <= left ? left : cropper.cutX + cropper.canvasWidth -
+		(imgWidth * scale) / 2;
+	top = cropper.cutY + (imgHeight * scale) / 2 >= top ? top : cropper.cutY + (imgHeight * scale) / 2;
+	top = cropper.cutY + cropper.canvasHeight - (imgHeight * scale) / 2 <= top ? top : cropper.cutY + cropper.canvasHeight -
+		(imgHeight * scale) / 2;
+
+	cropper.imgLeft = left;
+	cropper.imgTop = top;
+	cropper.scale = scale;
+	styleUpdate(ins)
+	if (!delay || delay === 'null') {
+		imgTransform(ins);
+	}
+}
+
+
+function cutTouchEnd(e, ins) {
+	moveStop(ins);
+	cropper.flagCutTouch = false;
+	updateData(ins)
+}
+
+
+//改变截取框大小
+function computeCutSize(ins) {
+	if (cropper.canvasWidth > cropper.windowWidth) {
+		cropper.canvasWidth = cropper.windowWidth;
+		// canvasWidth(ins)
+	} else if (cropper.canvasWidth + cropper.cutX > cropper.windowWidth) {
+		cropper.cutX = cropper.windowWidth - cropper.cutX;
+	}
+	if (cropper.canvasHeight > cropper.windowHeight) {
+		cropper.canvasHeight = cropper.windowHeight;
+		// canvasHeight(ins)
+	} else if (cropper.canvasHeight + cropper.cutY > cropper.windowHeight) {
+		cropper.cutY = cropper.windowHeight - cropper.cutY;
+	}
+	// styleUpdate(ins)
+}
+
+function styleUpdate(ins) {
+	if (!ins) return;
+	ins.selectComponent('.tui-cropper-box').setStyle({
+		'width': cropper.canvasWidth + 'px',
+		'height': cropper.canvasHeight + 'px'
+	})
+	ins.selectComponent('.tui-content-middle').setStyle({
+		'height': cropper.canvasHeight + 'px'
+	})
+	ins.selectComponent('.tui-content-top').setStyle({
+		'height': cropper.cutY + 'px'
+	})
+	ins.selectComponent('.tui-wxs-bg').setStyle({
+		'width': cropper.cutX + 'px'
+	})
+
+}
+
+function imgTransform(ins) {
+	var owner = ins.selectComponent('.tui-cropper-image')
+	if (!owner) return
+	var x = cropper.imgLeft - cropper.imgWidth / 2;
+	var y = cropper.imgTop - cropper.imgHeight / 2;
+	owner.setStyle({
+		'transform': 'translate3d(' + x + 'px,' + y + 'px,0) scale(' + cropper.scale + ') rotate(' + cropper.angle + 'deg)'
+	})
+}
+
+function imageReset(ins) {
+	cropper.scale = 1;
+	cropper.angle = 0;
+	imgTransform(ins);
+}
+//监听截取框宽高变化
+function canvasWidth(ins) {
+	if (cropper.canvasWidth < cropper.minWidth) {
+		cropper.canvasWidth = cropper.minWidth;
+	}
+	if (!ins) return;
+	computeCutSize(ins);
+}
+
+function canvasHeight(ins) {
+	if (cropper.canvasHeight < cropper.minHeight) {
+		cropper.canvasHeight = cropper.minHeight;
+	}
+	if (!ins) return;
+	computeCutSize(ins);
+}
+
+function updateData(ins) {
+	if (!ins) return;
+	ins.callMethod('change', {
+		cutX: cropper.cutX,
+		cutY: cropper.cutY,
+		canvasWidth: cropper.canvasWidth,
+		canvasHeight: cropper.canvasHeight,
+		imgWidth: cropper.imgWidth,
+		imgHeight: cropper.imgHeight,
+		scale: cropper.scale,
+		angle: cropper.angle,
+		imgTop: cropper.imgTop,
+		imgLeft: cropper.imgLeft
+	})
+}
+
+function propsChange(prop, oldProp, ownerInstance, ins) {
+	if (prop && prop !== 'null') {
+		var params = prop.split(',')
+		var type = +params[0]
+		var dataset = ins.getDataset();
+		if (cropper.init || type == 4) {
+			cropper.maxHeight = +dataset.maxheight;
+			cropper.minHeight = +dataset.minheight;
+			cropper.maxWidth = +dataset.maxwidth;
+			cropper.minWidth = +dataset.minwidth;
+			cropper.canvasWidth = +dataset.width;
+			cropper.canvasHeight = +dataset.height;
+			cropper.imgTop = dataset.windowheight / 2;
+			cropper.imgLeft = dataset.windowwidth / 2;
+			cropper.imgWidth = +dataset.imgwidth;
+			cropper.imgHeight = +dataset.imgheight;
+			cropper.windowHeight = +dataset.windowheight;
+			cropper.windowWidth = +dataset.windowwidth;
+			cropper.init = false
+		} else if (type == 2 || type == 3) {
+			cropper.imgWidth = +dataset.imgwidth;
+			cropper.imgHeight = +dataset.imgheight;
+		}
+		cropper.limitMove = bool(dataset.limitmove);
+		cropper.angle = +dataset.angle;
+		if (type == 3) {
+			imgTransform(ownerInstance);
+		}
+		switch (type) {
+			case 1:
+				setCutCenter(ownerInstance);
+				//设置裁剪框大小>设置图片尺寸>绘制canvas
+				computeCutSize(ownerInstance);
+				//检查裁剪框是否在范围内
+				cutDetectionPosition(ownerInstance);
+				break;
+			case 2:
+				setCutCenter(ownerInstance);
+				break;
+			case 3:
+				imgMarginDetectionScale(ownerInstance)
+				break;
+			case 4:
+				imageReset(ownerInstance);
+				break;
+			case 5:
+				setCutCenter(ownerInstance);
+				break;
+			default:
+				break;
+		}
+	}
+}
+
+module.exports = {
+	touchstart: touchstart,
+	touchmove: touchmove,
+	touchend: touchend,
+	cutTouchStart: cutTouchStart,
+	cutTouchMove: cutTouchMove,
+	cutTouchEnd: cutTouchEnd,
+	propsChange: propsChange
+}

+ 22 - 0
main.js

@@ -0,0 +1,22 @@
+import Vue from 'vue'
+import App from './App'
+import store from './store'
+import moment from 'moment'
+import utils from './util/util'
+
+moment.locale('zh-cn')
+
+Vue.prototype.utils = utils
+Vue.prototype.$moment = moment
+Vue.prototype.$store = store
+
+
+Vue.config.productionTip = false
+
+App.mpType = 'app'
+
+const app = new Vue({
+  store,
+  ...App
+})
+app.$mount()

+ 188 - 0
manifest.json

@@ -0,0 +1,188 @@
+{
+    "name" : "云咖交易",
+    "appid" : "__UNI__BDAA79C",
+    "description" : "",
+    "versionName" : "3.0.1",
+    "versionCode" : 301,
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "runmode" : "liberate",
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {
+            "Payment" : {},
+            "Share" : {},
+            "VideoPlayer" : {},
+            "Maps" : {},
+            "Geolocation" : {},
+            "OAuth" : {}
+        },
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {
+                "privacyDescription" : {
+                    "NSPhotoLibraryUsageDescription" : "上传图片时需要",
+                    "NSLocationWhenInUseUsageDescription" : "定位时需要",
+                    "NSCameraUsageDescription" : "上传图片时需要"
+                },
+                "idfa" : false
+            },
+            /* SDK配置 */
+            "sdkConfigs" : {
+                "ad" : {},
+                "payment" : {
+                    "alipay" : {
+                        "__platform__" : [ "ios", "android" ]
+                    },
+                    "weixin" : {
+                        "__platform__" : [ "ios", "android" ],
+                        "appid" : "wx65ea6cb402565257",
+                        "UniversalLinks" : "https://dsmall.csdeshang.com/ulink/"
+                    }
+                },
+                "share" : {
+                    "weixin" : {
+                        "appid" : "wx65ea6cb402565257",
+                        "UniversalLinks" : "https://dsmall.csdeshang.com/ulink/"
+                    }
+                },
+                "maps" : {
+                    "baidu" : {
+                        "appkey_ios" : "7Lr4vSSiKYO1xUZo84mBVb5EpYMt8xkw",
+                        "appkey_android" : "XZzv6qoeGRrI01uHaQUo1y2SjDGaOvzV"
+                    }
+                },
+                "geolocation" : {
+                    "baidu" : {
+                        "__platform__" : [ "ios", "android" ],
+                        "appkey_ios" : "7Lr4vSSiKYO1xUZo84mBVb5EpYMt8xkw",
+                        "appkey_android" : "XZzv6qoeGRrI01uHaQUo1y2SjDGaOvzV"
+                    }
+                },
+                "oauth" : {
+                    "weixin" : {
+                        "appid" : "wx65ea6cb402565257",
+                        "appsecret" : "acde7a9ace19a5dc9096631e1bae3e94",
+                        "UniversalLinks" : "https://dsmall.csdeshang.com/ulink/"
+                    }
+                }
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "unpackage/res/icons/72x72.png",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
+                    "xxhdpi" : "unpackage/res/icons/144x144.png",
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
+                },
+                "ios" : {
+                    "appstore" : "unpackage/res/icons/1024x1024.png",
+                    "ipad" : {
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
+                    },
+                    "iphone" : {
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
+                    }
+                }
+            },
+            "splashscreen" : {
+                "androidStyle" : "common"
+            }
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wx7c160594b6ce37ec",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "h5" : {
+        "title" : "云咖交易",
+        "domain" : "uniapp.dsmall.csdeshang.com",
+        "router" : {
+            "mode" : "history"
+        },
+        "devServer" : {
+            "https" : false,
+            "port" : 8000 //浏览器运行端口
+        },
+        // "disableHostCheck": true,
+        // "proxy": {
+        //     "/api": {
+        //         "target": "https://pl.valimart.net",//接口请求地址
+        //         "changeOrigin": true,
+        //         "secure": false,
+        // 		"pathRewrite": {
+        // 			"^/api": ""
+        // 		}
+        //     }
+        // }
+        "sdkConfigs" : {
+            "maps" : {}
+        }
+    }
+}

+ 970 - 0
node_modules/moment/CHANGELOG.md

@@ -0,0 +1,970 @@
+Changelog
+=========
+
+### 2.29.1 [See full changelog](https://gist.github.com/marwahaha/cc478ba01a1292ab4bd4e861d164d99b)
+
+* Release Oct 6, 2020
+
+Updated deprecation message, bugfix in hi locale
+
+### 2.29.0 [See full changelog](https://gist.github.com/marwahaha/b0111718641a6461800066549957ec14)
+
+* Release Sept 22, 2020
+
+New locales (es-mx, bn-bd).
+Minor bugfixes and locale improvements.
+More tests.
+Moment is in maintenance mode. Read more at this link:
+https://momentjs.com/docs/#/-project-status/
+
+### 2.28.0 [See full changelog](https://gist.github.com/marwahaha/028fd6c2b2470b2804857cfd63c0e94f)
+
+* Release Sept 13, 2020
+
+Fix bug where .format() modifies original instance, and locale updates
+
+### 2.27.0 [See full changelog](https://gist.github.com/marwahaha/5100c9c2f42019067b1f6cefc333daa7)
+
+* Release June 18, 2020
+
+Added Turkmen locale, other locale improvements, slight TypeScript fixes
+
+### 2.26.0 [See full changelog](https://gist.github.com/marwahaha/0725c40740560854a849b096ea7b7590)
+
+* Release May 19, 2020
+
+TypeScript fixes and many locale improvements
+
+### 2.25.3
+
+* Release May 4, 2020
+
+Remove package.json module property. It looks like webpack behaves differently
+for modules loaded via module vs jsnext:main.
+
+### 2.25.2
+
+* Release May 4, 2020
+
+This release includes ES Module bundled moment, separate from it's source code
+under dist/ folder. This might alleviate issues with finding the `./locale
+subfolder for loading locales. This might also mean now webpack will bundle all
+locales automatically, unless told otherwise.
+
+### 2.25.1
+
+* Release May 1, 2020
+
+This is a quick patch release to address some of the issues raised after
+releasing 2.25.0.
+
+* [2e268635](https://github.com/moment/moment/commit/2e268635) [misc] Revert #5269 due to webpack warning
+* [226799e1](https://github.com/moment/moment/commit/226799e1) [locale] fil: Fix metadata comment
+* [a83a521](https://github.com/moment/moment/commit/a83a521) [bugfix] Fix typeoff usages
+* [e324334](https://github.com/moment/moment/commit/e324334) [pkg] Add ts3.1-typings in npm package
+* [28cc23e](https://github.com/moment/moment/commit/28cc23e) [misc] Remove deleted generated locale en-SG
+
+### 2.25.0 [See full changelog](https://gist.github.com/ichernev/6148e64df2427e455b10ce6a18de1a65)
+
+* Release May 1, 2020
+
+* [#4611](https://github.com/moment/moment/issues/4611) [022dc038](https://github.com/moment/moment/commit/022dc038) [feature] Support for strict string parsing, fixes [#2469](https://github.com/moment/moment/issues/2469)
+* [#4599](https://github.com/moment/moment/issues/4599) [4b615b9d](https://github.com/moment/moment/commit/4b615b9d) [feature] Add support for eras in en and jp
+* [#4296](https://github.com/moment/moment/issues/4296) [757d4ff8](https://github.com/moment/moment/commit/757d4ff8) [feature] Accept custom relative thresholds in duration.humanize
+
+* 18 bigfixes
+* 36 locale fixes
+* 5 new locales (oc-lnc, zh-mo, en-in, gom-deva, fil)
+
+### 2.24.0 [See full changelog](https://gist.github.com/marwahaha/12366fe45bee328f33acf125d4cd540e)
+
+* Release Jan 21, 2019
+
+* [#4338](https://github.com/moment/moment/pull/4338) [bugfix] Fix startOf/endOf DST issues while boosting performance
+* [#4553](https://github.com/moment/moment/pull/4553) [feature] Add localeSort param to Locale weekday methods
+* [#4887](https://github.com/moment/moment/pull/4887) [bugfix] Make Duration#as work with quarters
+* 3 new locales (it-ch, ga, en-SG)
+* Lots of locale improvements
+
+### 2.23.0 [See full changelog](https://gist.github.com/marwahaha/eadb7ac11b761290399a576f8b2419a5)
+
+* Release Dec 12, 2018
+
+* [#4863](https://github.com/moment/moment/pull/4863) [new locale] added Kurdish language (ku)
+* [#4417](https://github.com/moment/moment/pull/4417) [bugfix] isBetween should return false for invalid dates
+* [#4700](https://github.com/moment/moment/pull/4700) [bugfix] Fix [#4698](https://github.com/moment/moment/pull/4698): Use ISO WeekYear for HTML5_FMT.WEEK
+* [#4563](https://github.com/moment/moment/pull/4563) [feature] Fix [#4518](https://github.com/moment/moment/pull/4518): Add support to add/subtract ISO weeks
+* other locale changes, build process changes, typos
+
+### 2.22.2 [See full changelog](https://gist.github.com/marwahaha/4d992c13c2dbc0f59d4d8acae1dc6d3a)
+
+* Release May 31, 2018
+
+* [#4564](https://github.com/moment/moment/pull/4564) [bugfix] Avoid using trim()
+* [#4453](https://github.com/moment/moment/pull/4453) [bugfix] Treat periods as periods, not regex-anything period, for weekday parsing in strict mode.
+* Minor locale improvements (pa-in, be, az)
+
+### 2.22.1 [See full changelog](https://gist.github.com/marwahaha/ff2cd13d0eda08afb7a237b10aae558c)
+
+* Release Apr 14, 2018
+
+* [#4495](https://github.com/moment/moment/pull/4495) [bugfix] Added HTML5_FMT to moment.d.ts
+* Minor locale improvements
+* QUnit upgrade and coveralls reporting
+
+### 2.22.0 [See full changelog](https://gist.github.com/marwahaha/ae895025dac3f0641fa9ec2e36d282bb)
+
+* Release Mar 30, 2018
+
+* [#4423](https://github.com/moment/moment/pull/4423) [new locale] Added Mongolian locale mn
+* Various locale improvements
+* Minor misc changes
+
+### 2.21.0 [See full changelog](https://gist.github.com/marwahaha/80d19ef882b71df1948df7865efdd40e)
+
+* Release Mar 2, 2018
+
+* [#4391](https://github.com/moment/moment/pull/4391) [bugfix] Fix [#4390](https://github.com/moment/moment/pull/4390): use offset properly in toISOString
+* [#4310](https://github.com/moment/moment/pull/4310) [bugfix] Fix [#3883](https://github.com/moment/moment/pull/3883) lazy load parentLocale in defineLocale, fallback to global if missing
+* [#4085](https://github.com/moment/moment/pull/4085) [misc] Print console warning when setting non-existent locales
+* [#4371](https://github.com/moment/moment/pull/4371) [misc] fix deprecated rollup options
+* New locales: ug-cn, en-il, tg
+* Various locale improvements
+
+### 2.20.1 [See changelog](https://gist.github.com/marwahaha/d72c1cb22076373be889b16272cbd187)
+
+* Release Dec 18, 2017
+
+* [#4359](https://github.com/moment/moment/pull/4359) [locale] Fix Arabic locale for months (again)
+* [#4357](https://github.com/moment/moment/pull/4357) [misc] Add optional parameter keepOffset to toISOString
+
+### 2.20.0 [See full changelog](https://gist.github.com/marwahaha/e0d4135fbf8bb75fa85c4aa2bddc5031)
+
+* Release Dec 16, 2017
+
+* [#4312](https://github.com/moment/moment/pull/4312) [bugfix] Fix [#4251](https://github.com/moment/moment/pull/4251): Avoid RFC2822 in utc() test
+* [#4240](https://github.com/moment/moment/pull/4240) [bugfix] Fix incorrect strict parsing with full-width parentheses
+* [#4341](https://github.com/moment/moment/pull/4341) [feature] Prevent toISOString converting to UTC (issue [#1751](https://github.com/moment/moment/pull/1751))
+* [#4154](https://github.com/moment/moment/pull/4154) [feature] add format constants to support output to HTML5 input type formats (see [#3928](https://github.com/moment/moment/pull/3928))
+* [#4143](https://github.com/moment/moment/pull/4143) [new locale] mt: Maltese language
+* [#4183](https://github.com/moment/moment/pull/4183) [locale] Relative seconds i18n
+* Various other locale improvements
+
+### 2.19.4 [See changelog](https://gist.github.com/marwahaha/d3b7b0ddf4bdae512244f16e8cc59efb)
+
+* Release Dec 10, 2017
+
+* [#4332](https://github.com/moment/moment/pull/4332) [bugfix] Fix weekday verification for UTC and offset days (fixes [#4227](https://github.com/moment/moment/pull/4227))
+* [#4336](https://github.com/moment/moment/pull/4336) [bugfix] Fix [#4334](https://github.com/moment/moment/pull/4334): Remove unused function call argument
+* [#4246](https://github.com/moment/moment/pull/4246) [misc] Add 'ss' relative time key to typescript definition
+
+### 2.19.3 [See changelog](https://gist.github.com/marwahaha/3654006bc0c2e522451c08d12c0bfabf)
+
+* Release Nov 29, 2017
+
+* [#4326](https://github.com/moment/moment/pull/4326) [bugfix] Fix for ReDOS vulnerability (see [#4163](https://github.com/moment/moment/issues/4163))
+* [#4289](https://github.com/moment/moment/pull/4289) [misc] Fix spelling and formatting for U.S. for es-us
+
+### 2.19.2 [See changelog (it's the same >:D)](https://gist.github.com/ichernev/76b1a3f33d3a8ff9665ce434a45221d0)
+
+* Release Nov 11, 2017
+
+* [#4255](https://github.com/moment/moment/pull/4255) [bugfix] Fix year setter for random days in a leap year, fixes [#4238](https://github.com/moment/moment/issues/4238)
+* [#4242](https://github.com/moment/moment/pull/4242) [bugfix] updateLocale now tries to load parent, fixes [#3626](https://github.com/moment/moment/issues/3626)
+
+### 2.19.1
+
+* Release Oct 11, 2017
+
+Make react native and webpack both work
+* #4225 #4226 #4232
+
+### 2.19.0 [See full changelog](https://gist.github.com/ichernev/5f3f4eb02761b4f765a0cccf02cec603)
+
+* Release Oct 10, 2017
+
+## Fix React Native 0.49+ crash
+* [#4213](https://github.com/moment/moment/pull/4213) [critical] Rename dynamic
+  require to avoid React Native crash
+* [#4214](https://github.com/moment/moment/pull/4214) [fixup] Move require
+  rename inside try/catch, fixes
+  [#4213](https://github.com/moment/moment/issues/4213)
+
+## Features
+
+* [#3735](https://github.com/moment/moment/pull/3735) [feature] Ignore NaN values in setters
+* [#4106](https://github.com/moment/moment/pull/4106) [fixup] Drop isNumeric utility fn, fixes [#3735](https://github.com/moment/moment/issues/3735)
+* [#4080](https://github.com/moment/moment/pull/4080) [feature] Implement a clone method for durations, fixes [#4078](https://github.com/moment/moment/issues/4078)
+* [#4215](https://github.com/moment/moment/pull/4215) [misc] TS: Add duration.clone(), for [#4080](https://github.com/moment/moment/issues/4080)
+
+## Packaging
+
+* [#4003](https://github.com/moment/moment/pull/4003) [pkg] bower: Remove tests from package
+* [#3904](https://github.com/moment/moment/pull/3904) [pkg] jsnext:main -> module in package.json
+* [#4060](https://github.com/moment/moment/pull/4060) [pkg] Account for new rollup interface
+
+Bugfixes, new locales, locale fixes etc...
+
+### 2.18.1
+
+* Release Mar 22, 2017
+
+* [#3853](https://github.com/moment/moment/pull/3853) [misc] Fix invalid whitespace character causing inability to parse
+  moment.js
+
+### 2.18.0 [See full changelog](https://gist.github.com/ichernev/78920c5a1e419fb28c6e4546d1b7235c)
+
+* Release Mar 18, 2017
+
+## Features
+
+* [#3708](https://github.com/moment/moment/pull/3708) [feature] RFC2822 parsing
+* [#3611](https://github.com/moment/moment/pull/3611) [feature] Durations gain validity
+* [#3738](https://github.com/moment/moment/pull/3738) [feature] Enable relative time for multiple seconds, request [#2558](https://github.com/moment/moment/issues/2558)
+* [#3766](https://github.com/moment/moment/pull/3766) [feature] Add support for k and kk format parsing
+
+## Bugfixes
+
+* [#3643](https://github.com/moment/moment/pull/3643) [bugfix] Fixes [#3520](https://github.com/moment/moment/issues/3520), parseZone incorrectly handled minutes under 16
+* [#3710](https://github.com/moment/moment/pull/3710) [bugfix] Fixes [#3632](https://github.com/moment/moment/issues/3632), toISOString returns null for invalid date
+* [#3787](https://github.com/moment/moment/pull/3787) [bugfix] Fixes [#3717](https://github.com/moment/moment/issues/3717), ensure day-of-year is non-zero
+* [#3780](https://github.com/moment/moment/pull/3780) [bugfix] Fixes [#3765](https://github.com/moment/moment/issues/3765): Ensure year 0 is formatted with YYYY
+* [#3806](https://github.com/moment/moment/pull/3806) [bugfix] Fixes [#3805](https://github.com/moment/moment/issues/3805), fix locale month getters for standalone/format cases
+
+7 new locales, many locale improvements and some misc changes
+
+### 2.17.1 [Also available here](https://gist.github.com/ichernev/f38280b2b29c4932914a6d3a4e50bfb2)
+* Release Dec 03, 2016
+
+* [#3638](https://github.com/moment/moment/pull/3638) [misc] TS: Make typescript definitions work with 1.x
+* [#3628](https://github.com/moment/moment/pull/3628) [misc] Adds "sign CLA" link to `CONTRIBUTING.md`
+* [#3640](https://github.com/moment/moment/pull/3640) [misc] Fix locale issues
+
+### 2.17.0 [Also available here](https://gist.github.com/ichernev/ed58f76fb95205eeac653d719972b90c)
+* Release Nov 22, 2016
+
+* [#3435](https://github.com/moment/moment/pull/3435) [new locale] yo: Yoruba (Nigeria) locale
+* [#3595](https://github.com/moment/moment/pull/3595) [bugfix] Fix accidental reference to global "value" variable
+* [#3506](https://github.com/moment/moment/pull/3506) [bugfix] Fix invalid moments returning valid dates to method calls
+* [#3563](https://github.com/moment/moment/pull/3563) [locale] ca: Change future relative time
+* [#3504](https://github.com/moment/moment/pull/3504) [tests] Fixes [#3463](https://github.com/moment/moment/issues/3463), parseZone not handling Z correctly (tests only)
+* [#3591](https://github.com/moment/moment/pull/3591) [misc] typescript: update typescript to 2.0.8, add strictNullChecks=true
+* [#3597](https://github.com/moment/moment/pull/3597) [misc] Fixed capitalization in nuget spec
+
+### 2.16.0 [See full changelog](https://gist.github.com/ichernev/17bffc1005a032cb1a8ac4c1558b4994)
+* Release Nov 9, 2016
+
+## Features
+* [#3530](https://github.com/moment/moment/pull/3530) [feature] Check whether input is date before checking if format is array
+* [#3515](https://github.com/moment/moment/pull/3515) [feature] Fix [#2300](https://github.com/moment/moment/issues/2300): Default to current week.
+
+## Bugfixes
+* [#3546](https://github.com/moment/moment/pull/3546) [bugfix] Implement lazy-loading of child locales with missing prents
+* [#3523](https://github.com/moment/moment/pull/3523) [bugfix] parseZone should handle UTC
+* [#3502](https://github.com/moment/moment/pull/3502) [bugfix] Fix [#3500](https://github.com/moment/moment/issues/3500): ISO 8601 parsing should match the full string, not the beginning of the string.
+* [#3581](https://github.com/moment/moment/pull/3581) [bugfix] Fix parseZone, redo [#3504](https://github.com/moment/moment/issues/3504), fix [#3463](https://github.com/moment/moment/issues/3463)
+
+## New Locales
+* [#3416](https://github.com/moment/moment/pull/3416) [new locale] nl-be: Dutch (Belgium) locale
+* [#3393](https://github.com/moment/moment/pull/3393) [new locale] ar-dz: Arabic (Algeria) locale
+* [#3342](https://github.com/moment/moment/pull/3342) [new locale] tet: Tetun Dili (East Timor) locale
+
+And more locale, build and typescript improvements
+
+### 2.15.2
+* Release Oct 23, 2016
+* [#3525](https://github.com/moment/moment/pull/3525) Speedup month standalone/format regexes **(IMPORTANT)**
+* [#3466](https://github.com/moment/moment/pull/3466) Fix typo of Javanese
+
+### 2.15.1
+* Release Sept 20, 2016
+* [#3438](https://github.com/moment/moment/pull/3438) Fix locale autoload, revert [#3344](https://github.com/moment/moment/pull/3344)
+
+### 2.15.0 [See full changelog](https://gist.github.com/ichernev/10e1c5bf647545c72ca30e9628a09ed3)
+- Release Sept 12, 2016
+
+## New Locales
+* [#3255](https://github.com/moment/moment/pull/3255) [new locale] mi: Maori language
+* [#3267](https://github.com/moment/moment/pull/3267) [new locale] ar-ly: Arabic (Libya) locale
+* [#3333](https://github.com/moment/moment/pull/3333) [new locale] zh-hk: Chinese (Hong Kong) locale
+
+## Bugfixes
+* [#3276](https://github.com/moment/moment/pull/3276) [bugfix] duration: parser: Support ms durations in .NET syntax
+* [#3312](https://github.com/moment/moment/pull/3312) [bugfix] locales: Enable locale-data getters without moment (fixes [#3284](https://github.com/moment/moment/issues/3284))
+* [#3381](https://github.com/moment/moment/pull/3381) [bugfix] parsing: Fix parseZone without timezone in string, fixes [#3083](https://github.com/moment/moment/issues/3083)
+* [#3383](https://github.com/moment/moment/pull/3383) [bugfix] toJSON: Fix isValid so that toJSON works after a moment is frozen
+* [#3427](https://github.com/moment/moment/pull/3427) [bugfix] ie8: Fix IE8 (regression in 2.14.x)
+
+## Packaging
+* [#3299](https://github.com/moment/moment/pull/3299) [pkg] npm: Do not include .npmignore in npm package
+* [#3273](https://github.com/moment/moment/pull/3273) [pkg] jspm: Include moment.d.ts file in package
+* [#3344](https://github.com/moment/moment/pull/3344) [pkg] exports: use module.require for nodejs
+
+Also some locale and typescript improvements
+
+### 2.14.1
+- Release July 20, 2016
+* [#3280](https://github.com/moment/moment/pull/3280) Fix typescript definitions
+
+
+### 2.14.0 [See full changelog](https://gist.github.com/ichernev/812e79ac36a7829a22598fe964bfc18a)
+
+- Release July 20, 2016
+
+## New Features
+* [#3233](https://github.com/moment/moment/pull/3233) Introduce month.isFormat for format/standalone discovery
+* [#2848](https://github.com/moment/moment/pull/2848) Allow user to get/set the rounding method used when calculating relative time
+* [#3112](https://github.com/moment/moment/pull/3112) optimize configFromStringAndFormat
+* [#3147](https://github.com/moment/moment/pull/3147) Call calendar format function with moment context
+* [#3160](https://github.com/moment/moment/pull/3160) deprecate isDSTShifted
+* [#3175](https://github.com/moment/moment/pull/3175) make moment calendar extensible with ad-hoc options
+* [#3191](https://github.com/moment/moment/pull/3191) toDate returns a copy of the internal date object
+* [#3192](https://github.com/moment/moment/pull/3192) Adding support for rollup import.
+* [#3238](https://github.com/moment/moment/pull/3238) Handle empty object and empty array for creation as now
+* [#3082](https://github.com/moment/moment/pull/3082) Use relative AMD moment dependency
+
+## Bugfixes
+* [#3241](https://github.com/moment/moment/pull/3241) Escape all 24 mixed pieces, not only first 12 in computeMonthsParse
+* [#3008](https://github.com/moment/moment/pull/3008) Object setter orders sets based on size of unit
+* [#3177](https://github.com/moment/moment/pull/3177) Bug Fix [#2704](https://github.com/moment/moment/pull/2704) - isoWeekday(String) inconsistent with isoWeekday(Number)
+* [#3230](https://github.com/moment/moment/pull/3230) fix passing date with format string to ignore format string
+* [#3232](https://github.com/moment/moment/pull/3232) Fix negative 0 in certain diff cases
+* [#3235](https://github.com/moment/moment/pull/3235) Use proper locale inheritance for the base locale, fixes [#3137](https://github.com/moment/moment/pull/3137)
+
+Plus es-do locale and locale bugfixes
+
+### 2.13.0 [See full changelog](https://gist.github.com/ichernev/0132fcf5b61f7fc140b0bb0090480d49)
+- Release April 18, 2016
+
+## Enhancements:
+* [#2982](https://github.com/moment/moment/pull/2982) Add 'date' as alias to 'day' for startOf() and endOf().
+* [#2955](https://github.com/moment/moment/pull/2955) Add parsing negative components in durations when ISO 8601
+* [#2991](https://github.com/moment/moment/pull/2991) isBetween support for both open and closed intervals
+* [#3105](https://github.com/moment/moment/pull/3105) Add localeSorted argument to weekday listers
+* [#3102](https://github.com/moment/moment/pull/3102) Add k and kk formatting tokens
+
+## Bugfixes
+* [#3109](https://github.com/moment/moment/pull/3109) Fix [#1756](https://github.com/moment/moment/issues/1756) Resolved thread-safe issue on server side.
+* [#3078](https://github.com/moment/moment/pull/3078) Fix parsing for months/weekdays with weird characters
+* [#3098](https://github.com/moment/moment/pull/3098) Use Z suffix when in UTC mode ([#3020](https://github.com/moment/moment/issues/3020))
+* [#2995](https://github.com/moment/moment/pull/2995) Fix floating point rounding errors in durations
+* [#3059](https://github.com/moment/moment/pull/3059) fix bug where diff returns -0 in month-related diffs
+* [#3045](https://github.com/moment/moment/pull/3045) Fix mistaking any input for 'a' token
+* [#2877](https://github.com/moment/moment/pull/2877) Use explicit .valueOf() calls instead of coercion
+* [#3036](https://github.com/moment/moment/pull/3036) Year setter should keep time when DST changes
+
+Plus 3 new locales and locale fixes.
+
+### 2.12.0 [See full changelog](https://gist.github.com/ichernev/6e5bfdf8d6522fc4ac73)
+
+- Release March 7, 2016
+
+## Enhancements:
+* [#2932](https://github.com/moment/moment/pull/2932) List loaded locales
+* [#2818](https://github.com/moment/moment/pull/2818) Parse ISO-8061 duration containing both day and week values
+* [#2774](https://github.com/moment/moment/pull/2774) Implement locale inheritance and locale updating
+
+## Bugfixes:
+* [#2970](https://github.com/moment/moment/pull/2970) change add subtract to handle decimal values by rounding
+* [#2887](https://github.com/moment/moment/pull/2887) Fix toJSON casting of invalid moment
+* [#2897](https://github.com/moment/moment/pull/2897) parse string arguments for month() correctly, closes #2884
+* [#2946](https://github.com/moment/moment/pull/2946) Fix usage suggestions for min and max
+
+## New locales:
+* [#2917](https://github.com/moment/moment/pull/2917) Locale Punjabi(Gurmukhi) India format conversion
+
+And more
+
+### 2.11.2 (Fix ReDoS attack vector)
+
+- Release February 7, 2016
+
+* [#2939](https://github.com/moment/moment/pull/2939) use full-string match to speed up aspnet regex match
+
+### 2.11.1 [See full changelog](https://gist.github.com/ichernev/8ec3ee25b749b4cff3c2)
+
+- Release January 9, 2016
+
+## Bugfixes:
+* [#2881](https://github.com/moment/moment/pull/2881) Revert "Merge pull request #2746 from mbad0la:develop" Sep->Sept
+* [#2868](https://github.com/moment/moment/pull/2868) Add format and parse token Y, so it actually works
+* [#2865](https://github.com/moment/moment/pull/2865) Use typeof checks for undefined for global variables
+* [#2858](https://github.com/moment/moment/pull/2858) Fix Date mocking regression introduced in 2.11.0
+* [#2864](https://github.com/moment/moment/pull/2864) Include changelog in npm release
+* [#2830](https://github.com/moment/moment/pull/2830) dep: add grunt-cli
+* [#2869](https://github.com/moment/moment/pull/2869) Fix months parsing for some locales
+
+### 2.11.0 [See full changelog](https://gist.github.com/ichernev/6594bc29719dde6b2f66)
+
+- Release January 4, 2016
+
+* [#2624](https://github.com/moment/moment/pull/2624) Proper handling of invalid moments
+* [#2634](https://github.com/moment/moment/pull/2634) Fix strict month parsing issue in cs,ru,sk
+* [#2735](https://github.com/moment/moment/pull/2735) Reset the locale back to 'en' after defining all locales in min/locales.js
+* [#2702](https://github.com/moment/moment/pull/2702) Week rework
+* [#2746](https://github.com/moment/moment/pull/2746) Changed September Abbreviation to "Sept" in locale-specific english
+  files and default locale file
+* [#2646](https://github.com/moment/moment/pull/2646) Fix [#2645](https://github.com/moment/moment/pull/2645) - invalid dates pre-1970
+
+* [#2641](https://github.com/moment/moment/pull/2641) Implement basic format and comma as ms separator in ISO 8601
+* [#2665](https://github.com/moment/moment/pull/2665) Implement stricter weekday parsing
+* [#2700](https://github.com/moment/moment/pull/2700) Add [Hh]mm and [Hh]mmss formatting tokens, so you can parse 123 with
+  hmm for example
+* [#2565](https://github.com/moment/moment/pull/2565) [#2835](https://github.com/moment/moment/pull/2835) Expose arguments used for moment creation with creationData
+  (fix [#2443](https://github.com/moment/moment/pull/2443))
+* [#2648](https://github.com/moment/moment/pull/2648) fix issue [#2640](https://github.com/moment/moment/pull/2640): support instanceof operator
+* [#2709](https://github.com/moment/moment/pull/2709) Add isSameOrAfter and isSameOrBefore comparison methods
+* [#2721](https://github.com/moment/moment/pull/2721) Fix moment creation from object with strings values
+* [#2740](https://github.com/moment/moment/pull/2740) Enable 'd hh:mm:ss.sss' format for durations
+* [#2766](https://github.com/moment/moment/pull/2766) [#2833](https://github.com/moment/moment/pull/2833) Alternate Clock Source Support
+
+### 2.10.6
+
+- Release July 28, 2015
+
+[#2515](https://github.com/moment/moment/pull/2515) Fix regression introduced
+in `2.10.5` related to `moment.ISO_8601` parsing.
+
+### 2.10.5 [See full changelog](https://gist.github.com/ichernev/6ec13ac7efc396da44b2)
+
+- Release July 26, 2015
+
+Important changes:
+* [#2357](https://github.com/moment/moment/pull/2357) Improve unit bubbling for ISO dates
+  this fixes day to year conversions to work around end-of-year (~365 days). As
+  a side effect 365 days is 11 months and 30 days, and 366 days is one year.
+* [#2438](https://github.com/moment/moment/pull/2438) Fix inconsistent moment.min and moment.max results
+  Return invalid result if any of the inputs is invalid
+* [#2494](https://github.com/moment/moment/pull/2494) Fix two digit year parsing with YYYY format
+  This brings the benefits of YY to YYYY
+* [#2368](https://github.com/moment/moment/pull/2368) perf: use faster form of copying dates, across the board improvement
+
+
+### 2.10.3 [See full changelog](https://gist.github.com/ichernev/f264b9bed5b00f8b1b7f)
+
+- Release May 13, 2015
+
+* add `moment.fn.to` and `moment.fn.toNow` (similar to `from` and `fromNow`)
+* new locales (Sinhalese (si), Montenegrin (me), Javanese (ja))
+* performance improvements
+
+### 2.10.2
+
+- Release April 9, 2015
+
+* fixed moment-with-locales in browser env caused by esperanto change
+
+### 2.10.1
+
+* regression: Add moment.duration.fn back
+
+### 2.10.0
+
+Ported code to es6 modules.
+
+### 2.9.0 [See full changelog](https://gist.github.com/ichernev/0c9a9b49951111a27ce7)
+
+- Release January 8, 2015
+
+languages:
+* [2104](https://github.com/moment/moment/issues/2104) Frisian (fy) language file with unit test
+* [2097](https://github.com/moment/moment/issues/2097) add ar-tn locale
+
+deprecations:
+* [2074](https://github.com/moment/moment/issues/2074) Implement `moment.fn.utcOffset`, deprecate `moment.fn.zone`
+
+features:
+* [2088](https://github.com/moment/moment/issues/2088) add moment.fn.isBetween
+* [2054](https://github.com/moment/moment/issues/2054) Call updateOffset when creating moment (needed for default timezone in
+  moment-timezone)
+* [1893](https://github.com/moment/moment/issues/1893) Add moment.isDate method
+* [1825](https://github.com/moment/moment/issues/1825) Implement toJSON function on Duration
+* [1809](https://github.com/moment/moment/issues/1809) Allowing moment.set() to accept a hash of units
+* [2128](https://github.com/moment/moment/issues/2128) Add firstDayOfWeek, firstDayOfYear locale getters
+* [2131](https://github.com/moment/moment/issues/2131) Add quarter diff support
+
+Some bugfixes and language improvements -- [full changelog](https://gist.github.com/ichernev/0c9a9b49951111a27ce7)
+
+### 2.8.4 [See full changelog](https://gist.github.com/ichernev/a4fcb0a46d74e4b9b996)
+
+- Release November 19, 2014
+
+Features:
+
+* [#2000](https://github.com/moment/moment/issues/2000) Add LTS localised format that includes seconds
+* [#1960](https://github.com/moment/moment/issues/1960) added formatToken 'x' for unix offset in milliseconds #1938
+* [#1965](https://github.com/moment/moment/issues/1965) Support 24:00:00.000 to mean next day, at midnight.
+* [#2002](https://github.com/moment/moment/issues/2002) Accept 'date' key when creating moment with object
+* [#2009](https://github.com/moment/moment/issues/2009) Use native toISOString when we can
+
+Some bugfixes and language improvements -- [full changelog](https://gist.github.com/ichernev/a4fcb0a46d74e4b9b996)
+
+### 2.8.3
+
+- Release September 5, 2014
+
+Bugfixes:
+
+* [#1801](https://github.com/moment/moment/issues/1801) proper pluralization for Arabic
+* [#1833](https://github.com/moment/moment/issues/1833) improve spm integration
+* [#1871](https://github.com/moment/moment/issues/1871) fix zone bug caused by Firefox 24
+* [#1882](https://github.com/moment/moment/issues/1882) Use hh:mm in Czech
+* [#1883](https://github.com/moment/moment/issues/1883) Fix 2.8.0 regression in duration as conversions
+* [#1890](https://github.com/moment/moment/issues/1890) Faster travis builds
+* [#1892](https://github.com/moment/moment/issues/1892) Faster isBefore/After/Same
+* [#1848](https://github.com/moment/moment/issues/1848) Fix flaky month diffs
+* [#1895](https://github.com/moment/moment/issues/1895) Fix 2.8.0 regression in moment.utc with format array
+* [#1896](https://github.com/moment/moment/issues/1896) Support setting invalid instance locale (noop)
+* [#1897](https://github.com/moment/moment/issues/1897) Support moment([str]) in addition to moment([int])
+
+### 2.8.2
+
+- Release August 22, 2014
+
+Minor bugfixes:
+
+* [#1874](https://github.com/moment/moment/issues/1874) use `Object.prototype.hasOwnProperty`
+  instead of `obj.hasOwnProperty` (ie8 bug)
+* [#1873](https://github.com/moment/moment/issues/1873) add `duration#toString()`
+* [#1859](https://github.com/moment/moment/issues/1859) better month/weekday names in norwegian
+* [#1812](https://github.com/moment/moment/issues/1812) meridiem parsing for greek
+* [#1804](https://github.com/moment/moment/issues/1804) spanish del -> de
+* [#1800](https://github.com/moment/moment/issues/1800) korean LT improvement
+
+### 2.8.1
+
+- Release August 1, 2014
+
+* bugfix [#1813](https://github.com/moment/moment/issues/1813): fix moment().lang([key]) incompatibility
+
+### 2.8.0 [See changelog](https://gist.github.com/ichernev/ac3899324a5fa6c8c9b4)
+
+- Release July 31, 2014
+
+* incompatible changes
+    * [#1761](https://github.com/moment/moment/issues/1761): moments created without a language are no longer following the global language, in case it changes. Only newly created moments take the global language by default. In case you're affected by this, wait, comment on [#1797](https://github.com/moment/moment/issues/1797) and wait for a proper reimplementation
+    * [#1642](https://github.com/moment/moment/issues/1642): 45 days is no longer "a month" according to humanize, cutoffs for month, and year have changed. Hopefully your code does not depend on a particular answer from humanize (which it shouldn't anyway)
+    * [#1784](https://github.com/moment/moment/issues/1784): if you use the human readable English datetime format in a weird way (like storing them in a database) that would break when the format changes you're at risk.
+
+* deprecations (old behavior will be dropped in 3.0)
+    * [#1761](https://github.com/moment/moment/issues/1761) `lang` is renamed to `locale`, `langData` -> `localeData`. Also there is now `defineLocale` that should be used when creating new locales
+    * [#1763](https://github.com/moment/moment/issues/1763) `add(unit, value)` and `subtract(unit, value)` are now deprecated. Use `add(value, unit)` and `subtract(value, unit)` instead.
+    * [#1759](https://github.com/moment/moment/issues/1759) rename `duration.toIsoString` to `duration.toISOString`. The js standard library and moment's `toISOString` follow that convention.
+
+* new locales
+    * [#1789](https://github.com/moment/moment/issues/1789) Tibetan (bo)
+    * [#1786](https://github.com/moment/moment/issues/1786) Africaans (af)
+    * [#1778](https://github.com/moment/moment/issues/1778) Burmese (my)
+    * [#1727](https://github.com/moment/moment/issues/1727) Belarusian (be)
+
+* bugfixes, locale bugfixes, performance improvements, features
+
+### 2.7.0 [See changelog](https://gist.github.com/ichernev/b0a3d456d5a84c9901d7)
+
+- Release June 12, 2014
+
+* new languages
+
+  * [#1678](https://github.com/moment/moment/issues/1678) Bengali (bn)
+  * [#1628](https://github.com/moment/moment/issues/1628) Azerbaijani (az)
+  * [#1633](https://github.com/moment/moment/issues/1633) Arabic, Saudi Arabia (ar-sa)
+  * [#1648](https://github.com/moment/moment/issues/1648) Austrian German (de-at)
+
+* features
+
+  * [#1663](https://github.com/moment/moment/issues/1663) configurable relative time thresholds
+  * [#1554](https://github.com/moment/moment/issues/1554) support anchor time in moment.calendar
+  * [#1693](https://github.com/moment/moment/issues/1693) support moment.ISO_8601 as parsing format
+  * [#1637](https://github.com/moment/moment/issues/1637) add moment.min and moment.max and deprecate min/max instance methods
+  * [#1704](https://github.com/moment/moment/issues/1704) support string value in add/subtract
+  * [#1647](https://github.com/moment/moment/issues/1647) add spm support (package manager)
+
+* bugfixes
+
+### 2.6.0 [See changelog](https://gist.github.com/ichernev/10544682)
+
+- Release April 12 , 2014
+
+* languages
+  * [#1529](https://github.com/moment/moment/issues/1529) Serbian-Cyrillic (sr-cyr)
+  * [#1544](https://github.com/moment/moment/issues/1544), [#1546](https://github.com/moment/moment/issues/1546) Khmer Cambodia (km)
+
+* features
+    * [#1419](https://github.com/moment/moment/issues/1419), [#1468](https://github.com/moment/moment/issues/1468), [#1467](https://github.com/moment/moment/issues/1467), [#1546](https://github.com/moment/moment/issues/1546) better handling of timezone-d moments around DST
+    * [#1462](https://github.com/moment/moment/issues/1462) add weeksInYear and isoWeeksInYear
+    * [#1475](https://github.com/moment/moment/issues/1475) support ordinal parsing
+    * [#1499](https://github.com/moment/moment/issues/1499) composer support
+    * [#1577](https://github.com/moment/moment/issues/1577), [#1604](https://github.com/moment/moment/issues/1604) put Date parsing in moment.createFromInputFallback so it can be properly deprecated and controlled in the future
+    * [#1545](https://github.com/moment/moment/issues/1545) extract two-digit year parsing in moment.parseTwoDigitYear, so it can be overwritten
+    * [#1590](https://github.com/moment/moment/issues/1590) (see [#1574](https://github.com/moment/moment/issues/1574)) set AMD global before module definition to better support non AMD module dependencies used in AMD environment
+    * [#1589](https://github.com/moment/moment/issues/1589) remove global in Node.JS environment (was not working before, nobody complained, was scheduled for removal anyway)
+    * [#1586](https://github.com/moment/moment/issues/1586) support quarter setting and parsing
+
+* 18 bugs fixed
+
+### 2.5.1
+
+- Release January 22, 2014
+
+* languages
+  * [#1392](https://github.com/moment/moment/issues/1392) Armenian (hy-am)
+
+* bugfixes
+  * [#1429](https://github.com/moment/moment/issues/1429) fixes [#1423](https://github.com/moment/moment/issues/1423) weird chrome-32 bug with js object creation
+  * [#1421](https://github.com/moment/moment/issues/1421) remove html entities from Welsh
+  * [#1418](https://github.com/moment/moment/issues/1418) fixes [#1401](https://github.com/moment/moment/issues/1401) improved non-padded tokens in strict matching
+  * [#1417](https://github.com/moment/moment/issues/1417) fixes [#1404](https://github.com/moment/moment/issues/1404) handle buggy moment object created by property cloning
+  * [#1398](https://github.com/moment/moment/issues/1398) fixes [#1397](https://github.com/moment/moment/issues/1397) fix Arabic-like week number parsing
+  * [#1396](https://github.com/moment/moment/issues/1396) add leftZeroFill(4) to GGGG and gggg formats
+  * [#1373](https://github.com/moment/moment/issues/1373) use lowercase for months and days in Catalan
+
+* testing
+  * [#1374](https://github.com/moment/moment/issues/1374) run tests on multiple browser/os combos via SauceLabs and Travis
+
+### 2.5.0 [See changelog](https://gist.github.com/ichernev/8104451)
+
+- Release Dec 24, 2013
+
+* New languages
+  * Luxemburish (lb) [1247](https://github.com/moment/moment/issues/1247)
+  * Serbian (rs) [1319](https://github.com/moment/moment/issues/1319)
+  * Tamil (ta) [1324](https://github.com/moment/moment/issues/1324)
+  * Macedonian (mk) [1337](https://github.com/moment/moment/issues/1337)
+
+* Features
+  * [1311](https://github.com/moment/moment/issues/1311) Add quarter getter and format token `Q`
+  * [1303](https://github.com/moment/moment/issues/1303) strict parsing now respects number of digits per token (fix [1196](https://github.com/moment/moment/issues/1196))
+  * 0d30bb7 add jspm support
+  * [1347](https://github.com/moment/moment/issues/1347) improve zone parsing
+  * [1362](https://github.com/moment/moment/issues/1362) support merideam parsing in Korean
+
+* 22 bugfixes
+
+### 2.4.0
+
+- Release Oct 27, 2013
+
+* **Deprecate** globally exported moment, will be removed in next major
+* New languages
+  * Farose (fo) [#1206](https://github.com/moment/moment/issues/1206)
+  * Tagalog/Filipino (tl-ph) [#1197](https://github.com/moment/moment/issues/1197)
+  * Welsh (cy) [#1215](https://github.com/moment/moment/issues/1215)
+* Bugfixes
+  * properly handle Z at the end of iso RegExp [#1187](https://github.com/moment/moment/issues/1187)
+  * chinese meridian time improvements [#1076](https://github.com/moment/moment/issues/1076)
+  * fix language tests [#1177](https://github.com/moment/moment/issues/1177)
+  * remove some failing tests (that should have never existed :))
+    [#1185](https://github.com/moment/moment/issues/1185)
+    [#1183](https://github.com/moment/moment/issues/1183)
+  * handle russian noun cases in weird cases [#1195](https://github.com/moment/moment/issues/1195)
+
+### 2.3.1
+
+- Release Oct 9, 2013
+
+Removed a trailing comma [1169] and fixed a bug with `months`, `weekdays` getters [#1171](https://github.com/moment/moment/issues/1171).
+
+### 2.3.0 [See changelog](https://gist.github.com/ichernev/6864354)
+
+- Release Oct 7, 2013
+
+Changed isValid, added strict parsing.
+Week tokens parsing.
+
+### 2.2.1
+
+- Release Sep 12, 2013
+
+Fixed bug in string prototype test.
+Updated authors and contributors.
+
+### 2.2.0 [See changelog](https://gist.github.com/ichernev/00f837a9baf46a3565e4)
+
+- Release  Sep 11, 2013
+
+Added bower support.
+
+Language files now use UMD.
+
+Creating moment defaults to current date/month/year.
+
+Added a bundle of moment and all language files.
+
+### 2.1.0 [See changelog](https://gist.github.com/timrwood/b8c2d90d528eddb53ab5)
+
+- Release Jul 8, 2013
+
+Added better week support.
+
+Added ability to set offset with `moment#zone`.
+
+Added ability to set month or weekday from a string.
+
+Added `moment#min` and `moment#max`
+
+### 2.0.0 [See changelog](https://gist.github.com/timrwood/e72f2eef320ed9e37c51)
+
+- Release Feb 9, 2013
+
+Added short form localized tokens.
+
+Added ability to define language a string should be parsed in.
+
+Added support for reversed add/subtract arguments.
+
+Added support for `endOf('week')` and `startOf('week')`.
+
+Fixed the logic for `moment#diff(Moment, 'months')` and `moment#diff(Moment, 'years')`
+
+`moment#diff` now floors instead of rounds.
+
+Normalized `moment#toString`.
+
+Added `isSame`, `isAfter`, and `isBefore` methods.
+
+Added better week support.
+
+Added `moment#toJSON`
+
+Bugfix: Fixed parsing of first century dates
+
+Bugfix: Parsing 10Sep2001 should work as expected
+
+Bugfix: Fixed weirdness with `moment.utc()` parsing.
+
+Changed language ordinal method to return the number + ordinal instead of just the ordinal.
+
+Changed two digit year parsing cutoff to match strptime.
+
+Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`.
+
+Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`.
+
+Removed the lang data objects from the top level namespace.
+
+Duplicate `Date` passed to `moment()` instead of referencing it.
+
+### 1.7.2 [See discussion](https://github.com/timrwood/moment/issues/456)
+
+- Release Oct 2, 2012
+
+Bugfixes
+
+### 1.7.1 [See discussion](https://github.com/timrwood/moment/issues/384)
+
+- Release Oct 1, 2012
+
+Bugfixes
+
+### 1.7.0 [See discussion](https://github.com/timrwood/moment/issues/288)
+
+- Release Jul 26, 2012
+
+Added `moment.fn.endOf()` and `moment.fn.startOf()`.
+
+Added validation via `moment.fn.isValid()`.
+
+Made formatting method 3x faster. http://jsperf.com/momentjs-cached-format-functions
+
+Add support for month/weekday callbacks in `moment.fn.format()`
+
+Added instance specific languages.
+
+Added two letter weekday abbreviations with the formatting token `dd`.
+
+Various language updates.
+
+Various bugfixes.
+
+### 1.6.0 [See discussion](https://github.com/timrwood/moment/pull/268)
+
+- Release Apr 26, 2012
+
+Added Durations.
+
+Revamped parser to support parsing non-separated strings (YYYYMMDD vs YYYY-MM-DD).
+
+Added support for millisecond parsing and formatting tokens (S SS SSS)
+
+Added a getter for `moment.lang()`
+
+Various bugfixes.
+
+There are a few things deprecated in the 1.6.0 release.
+
+1. The format tokens `z` and `zz` (timezone abbreviations like EST CST MST etc) will no longer be supported. Due to inconsistent browser support, we are unable to consistently produce this value. See [this issue](https://github.com/timrwood/moment/issues/162) for more background.
+
+2. The method `moment.fn.native` is deprecated in favor of `moment.fn.toDate`. There continue to be issues with Google Closure Compiler throwing errors when using `native`, even in valid instances.
+
+3. The way to customize am/pm strings is being changed. This would only affect you if you created a custom language file. For more information, see [this issue](https://github.com/timrwood/moment/pull/222).
+
+### 1.5.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=10&page=1&state=closed)
+
+- Release Mar 20, 2012
+
+Added UTC mode.
+
+Added automatic ISO8601 parsing.
+
+Various bugfixes.
+
+### 1.4.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=8&state=closed)
+
+- Release Feb 4, 2012
+
+Added `moment.fn.toDate` as a replacement for `moment.fn.native`.
+
+Added `moment.fn.sod` and `moment.fn.eod` to get the start and end of day.
+
+Various bugfixes.
+
+### 1.3.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=7&state=closed)
+
+- Release Jan 5, 2012
+
+Added support for parsing month names in the current language.
+
+Added escape blocks for parsing tokens.
+
+Added `moment.fn.calendar` to format strings like 'Today 2:30 PM', 'Tomorrow 1:25 AM', and 'Last Sunday 4:30 AM'.
+
+Added `moment.fn.day` as a setter.
+
+Various bugfixes
+
+### 1.2.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=4&state=closed)
+
+- Release Dec 7, 2011
+
+Added timezones to parser and formatter.
+
+Added `moment.fn.isDST`.
+
+Added `moment.fn.zone` to get the timezone offset in minutes.
+
+### 1.1.2 [See milestone](https://github.com/timrwood/moment/issues?milestone=6&state=closed)
+
+- Release Nov 18, 2011
+
+Various bugfixes
+
+### 1.1.1 [See milestone](https://github.com/timrwood/moment/issues?milestone=5&state=closed)
+
+- Release Nov 12, 2011
+
+Added time specific diffs (months, days, hours, etc)
+
+### 1.1.0
+
+- Release Oct 28, 2011
+
+Added `moment.fn.format` localized masks. 'L LL LLL LLLL' [issue 29](https://github.com/timrwood/moment/pull/29)
+
+Fixed [issue 31](https://github.com/timrwood/moment/pull/31).
+
+### 1.0.1
+
+- Release Oct 18, 2011
+
+Added `moment.version` to get the current version.
+
+Removed `window !== undefined` when checking if module exists to support browserify. [issue 25](https://github.com/timrwood/moment/pull/25)
+
+### 1.0.0
+
+- Release
+
+Added convenience methods for getting and setting date parts.
+
+Added better support for `moment.add()`.
+
+Added better lang support in NodeJS.
+
+Renamed library from underscore.date to Moment.js
+
+### 0.6.1
+
+- Release Oct 12, 2011
+
+Added Portuguese, Italian, and French language support
+
+### 0.6.0
+
+- Release Sep 21, 2011
+
+Added _date.lang() support.
+Added support for passing multiple formats to try to parse a date. _date("07-10-1986", ["MM-DD-YYYY", "YYYY-MM-DD"]);
+Made parse from string and single format 25% faster.
+
+### 0.5.2
+
+- Release Jul 11, 2011
+
+Bugfix for [issue 8](https://github.com/timrwood/underscore.date/pull/8) and [issue 9](https://github.com/timrwood/underscore.date/pull/9).
+
+### 0.5.1
+
+- Release Jun 17, 2011
+
+Bugfix for [issue 5](https://github.com/timrwood/underscore.date/pull/5).
+
+### 0.5.0
+
+- Release Jun 13, 2011
+
+Dropped the redundant `_date.date()` in favor of `_date()`.
+Removed `_date.now()`, as it is a duplicate of `_date()` with no parameters.
+Removed `_date.isLeapYear(yearNumber)`. Use `_date([yearNumber]).isLeapYear()` instead.
+Exposed customization options through the `_date.relativeTime`, `_date.weekdays`, `_date.weekdaysShort`, `_date.months`, `_date.monthsShort`, and `_date.ordinal` variables instead of the `_date.customize()` function.
+
+### 0.4.1
+
+- Release May 9, 2011
+
+Added date input formats for input strings.
+
+### 0.4.0
+
+- Release May 9, 2011
+
+Added underscore.date to npm. Removed dependencies on underscore.
+
+### 0.3.2
+
+- Release Apr 9, 2011
+
+Added `'z'` and `'zz'` to `_.date().format()`. Cleaned up some redundant code to trim off some bytes.
+
+### 0.3.1
+
+- Release Mar 25, 2011
+
+Cleaned up the namespace. Moved all date manipulation and display functions to the _.date() object.
+
+### 0.3.0
+
+- Release Mar 25, 2011
+
+Switched to the Underscore methodology of not mucking with the native objects' prototypes.
+Made chaining possible.
+
+### 0.2.1
+
+- Release
+
+Changed date names to be a more pseudo standardized 'dddd, MMMM Do YYYY, h:mm:ss a'.
+Added `Date.prototype` functions `add`, `subtract`, `isdst`, and `isleapyear`.
+
+### 0.2.0
+
+- Release
+
+Changed function names to be more concise.
+Changed date format from php date format to custom format.
+
+### 0.1.0
+
+- Release
+
+Initial release
+

+ 22 - 0
node_modules/moment/LICENSE

@@ -0,0 +1,22 @@
+Copyright (c) JS Foundation and other contributors
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.

+ 55 - 0
node_modules/moment/README.md

@@ -0,0 +1,55 @@
+# [Moment.js](http://momentjs.com/)
+
+[![NPM version][npm-version-image]][npm-url]
+[![NPM downloads][npm-downloads-image]][npm-downloads-url]
+[![MIT License][license-image]][license-url]
+[![Build Status][travis-image]][travis-url]
+[![Coverage Status][coveralls-image]][coveralls-url]
+[![FOSSA Status][fossa-badge-image]][fossa-badge-url]
+[![SemVer compatibility][semver-image]][semver-url]
+
+A JavaScript date library for parsing, validating, manipulating, and formatting dates.
+
+## Project Status
+
+Moment.js is a legacy project, now in maintenance mode.  In most cases, you should choose a different library.
+
+For more details and recommendations, please see [Project Status](https://momentjs.com/docs/#/-project-status/) in the docs.
+
+*Thank you.*
+
+## Resources
+
+- [Documentation](https://momentjs.com/docs/)
+- [Changelog](CHANGELOG.md)
+- [Stack Overflow](https://stackoverflow.com/questions/tagged/momentjs)
+
+## License
+
+Moment.js is freely distributable under the terms of the [MIT license][license-url].
+
+[![FOSSA Status][fossa-large-image]][fossa-large-url]
+
+[license-image]: https://img.shields.io/badge/license-MIT-blue.svg?style=flat
+[license-url]: LICENSE
+
+[npm-url]: https://npmjs.org/package/moment
+[npm-version-image]: https://img.shields.io/npm/v/moment.svg?style=flat
+
+[npm-downloads-image]: https://img.shields.io/npm/dm/moment.svg?style=flat
+[npm-downloads-url]: https://npmcharts.com/compare/moment?minimal=true
+
+[travis-url]: https://travis-ci.org/moment/moment
+[travis-image]: https://img.shields.io/travis/moment/moment/develop.svg?style=flat
+
+[coveralls-image]: https://coveralls.io/repos/moment/moment/badge.svg?branch=develop
+[coveralls-url]: https://coveralls.io/r/moment/moment?branch=develop
+
+[fossa-badge-image]: https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmoment%2Fmoment.svg?type=shield
+[fossa-badge-url]: https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmoment%2Fmoment?ref=badge_shield
+
+[fossa-large-image]: https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmoment%2Fmoment.svg?type=large
+[fossa-large-url]: https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmoment%2Fmoment?ref=badge_large
+
+[semver-image]: https://api.dependabot.com/badges/compatibility_score?dependency-name=moment&package-manager=npm_and_yarn&version-scheme=semver
+[semver-url]: https://dependabot.com/compatibility-score.html?dependency-name=moment&package-manager=npm_and_yarn&version-scheme=semver

+ 71 - 0
node_modules/moment/dist/locale/af.js

@@ -0,0 +1,71 @@
+//! moment.js locale configuration
+//! locale : Afrikaans [af]
+//! author : Werner Mollentze : https://github.com/wernerm
+
+import moment from '../moment';
+
+export default moment.defineLocale('af', {
+    months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split(
+        '_'
+    ),
+    monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
+    weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split(
+        '_'
+    ),
+    weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
+    weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
+    meridiemParse: /vm|nm/i,
+    isPM: function (input) {
+        return /^nm$/i.test(input);
+    },
+    meridiem: function (hours, minutes, isLower) {
+        if (hours < 12) {
+            return isLower ? 'vm' : 'VM';
+        } else {
+            return isLower ? 'nm' : 'NM';
+        }
+    },
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd, D MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[Vandag om] LT',
+        nextDay: '[Môre om] LT',
+        nextWeek: 'dddd [om] LT',
+        lastDay: '[Gister om] LT',
+        lastWeek: '[Laas] dddd [om] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'oor %s',
+        past: '%s gelede',
+        s: "'n paar sekondes",
+        ss: '%d sekondes',
+        m: "'n minuut",
+        mm: '%d minute',
+        h: "'n uur",
+        hh: '%d ure',
+        d: "'n dag",
+        dd: '%d dae',
+        M: "'n maand",
+        MM: '%d maande',
+        y: "'n jaar",
+        yy: '%d jaar',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
+    ordinal: function (number) {
+        return (
+            number +
+            (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
+        ); // Thanks to Joris Röling : https://github.com/jjupiter
+    },
+    week: {
+        dow: 1, // Maandag is die eerste dag van die week.
+        doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+    },
+});

+ 156 - 0
node_modules/moment/dist/locale/ar-dz.js

@@ -0,0 +1,156 @@
+//! moment.js locale configuration
+//! locale : Arabic (Algeria) [ar-dz]
+//! author : Amine Roukh: https://github.com/Amine27
+//! author : Abdel Said: https://github.com/abdelsaid
+//! author : Ahmed Elkhatib
+//! author : forabi https://github.com/forabi
+//! author : Noureddine LOUAHEDJ : https://github.com/noureddinem
+
+import moment from '../moment';
+
+var pluralForm = function (n) {
+        return n === 0
+            ? 0
+            : n === 1
+            ? 1
+            : n === 2
+            ? 2
+            : n % 100 >= 3 && n % 100 <= 10
+            ? 3
+            : n % 100 >= 11
+            ? 4
+            : 5;
+    },
+    plurals = {
+        s: [
+            'أقل من ثانية',
+            'ثانية واحدة',
+            ['ثانيتان', 'ثانيتين'],
+            '%d ثوان',
+            '%d ثانية',
+            '%d ثانية',
+        ],
+        m: [
+            'أقل من دقيقة',
+            'دقيقة واحدة',
+            ['دقيقتان', 'دقيقتين'],
+            '%d دقائق',
+            '%d دقيقة',
+            '%d دقيقة',
+        ],
+        h: [
+            'أقل من ساعة',
+            'ساعة واحدة',
+            ['ساعتان', 'ساعتين'],
+            '%d ساعات',
+            '%d ساعة',
+            '%d ساعة',
+        ],
+        d: [
+            'أقل من يوم',
+            'يوم واحد',
+            ['يومان', 'يومين'],
+            '%d أيام',
+            '%d يومًا',
+            '%d يوم',
+        ],
+        M: [
+            'أقل من شهر',
+            'شهر واحد',
+            ['شهران', 'شهرين'],
+            '%d أشهر',
+            '%d شهرا',
+            '%d شهر',
+        ],
+        y: [
+            'أقل من عام',
+            'عام واحد',
+            ['عامان', 'عامين'],
+            '%d أعوام',
+            '%d عامًا',
+            '%d عام',
+        ],
+    },
+    pluralize = function (u) {
+        return function (number, withoutSuffix, string, isFuture) {
+            var f = pluralForm(number),
+                str = plurals[u][pluralForm(number)];
+            if (f === 2) {
+                str = str[withoutSuffix ? 0 : 1];
+            }
+            return str.replace(/%d/i, number);
+        };
+    },
+    months = [
+        'جانفي',
+        'فيفري',
+        'مارس',
+        'أفريل',
+        'ماي',
+        'جوان',
+        'جويلية',
+        'أوت',
+        'سبتمبر',
+        'أكتوبر',
+        'نوفمبر',
+        'ديسمبر',
+    ];
+
+export default moment.defineLocale('ar-dz', {
+    months: months,
+    monthsShort: months,
+    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'D/\u200FM/\u200FYYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd D MMMM YYYY HH:mm',
+    },
+    meridiemParse: /ص|م/,
+    isPM: function (input) {
+        return 'م' === input;
+    },
+    meridiem: function (hour, minute, isLower) {
+        if (hour < 12) {
+            return 'ص';
+        } else {
+            return 'م';
+        }
+    },
+    calendar: {
+        sameDay: '[اليوم عند الساعة] LT',
+        nextDay: '[غدًا عند الساعة] LT',
+        nextWeek: 'dddd [عند الساعة] LT',
+        lastDay: '[أمس عند الساعة] LT',
+        lastWeek: 'dddd [عند الساعة] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'بعد %s',
+        past: 'منذ %s',
+        s: pluralize('s'),
+        ss: pluralize('s'),
+        m: pluralize('m'),
+        mm: pluralize('m'),
+        h: pluralize('h'),
+        hh: pluralize('h'),
+        d: pluralize('d'),
+        dd: pluralize('d'),
+        M: pluralize('M'),
+        MM: pluralize('M'),
+        y: pluralize('y'),
+        yy: pluralize('y'),
+    },
+    postformat: function (string) {
+        return string.replace(/,/g, '،');
+    },
+    week: {
+        dow: 0, // Sunday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 54 - 0
node_modules/moment/dist/locale/ar-kw.js

@@ -0,0 +1,54 @@
+//! moment.js locale configuration
+//! locale : Arabic (Kuwait) [ar-kw]
+//! author : Nusret Parlak: https://github.com/nusretparlak
+
+import moment from '../moment';
+
+export default moment.defineLocale('ar-kw', {
+    months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
+        '_'
+    ),
+    monthsShort: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
+        '_'
+    ),
+    weekdays: 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+    weekdaysShort: 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd D MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[اليوم على الساعة] LT',
+        nextDay: '[غدا على الساعة] LT',
+        nextWeek: 'dddd [على الساعة] LT',
+        lastDay: '[أمس على الساعة] LT',
+        lastWeek: 'dddd [على الساعة] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'في %s',
+        past: 'منذ %s',
+        s: 'ثوان',
+        ss: '%d ثانية',
+        m: 'دقيقة',
+        mm: '%d دقائق',
+        h: 'ساعة',
+        hh: '%d ساعات',
+        d: 'يوم',
+        dd: '%d أيام',
+        M: 'شهر',
+        MM: '%d أشهر',
+        y: 'سنة',
+        yy: '%d سنوات',
+    },
+    week: {
+        dow: 0, // Sunday is the first day of the week.
+        doy: 12, // The week that contains Jan 12th is the first week of the year.
+    },
+});

+ 171 - 0
node_modules/moment/dist/locale/ar-ly.js

@@ -0,0 +1,171 @@
+//! moment.js locale configuration
+//! locale : Arabic (Lybia) [ar-ly]
+//! author : Ali Hmer: https://github.com/kikoanis
+
+import moment from '../moment';
+
+var symbolMap = {
+        1: '1',
+        2: '2',
+        3: '3',
+        4: '4',
+        5: '5',
+        6: '6',
+        7: '7',
+        8: '8',
+        9: '9',
+        0: '0',
+    },
+    pluralForm = function (n) {
+        return n === 0
+            ? 0
+            : n === 1
+            ? 1
+            : n === 2
+            ? 2
+            : n % 100 >= 3 && n % 100 <= 10
+            ? 3
+            : n % 100 >= 11
+            ? 4
+            : 5;
+    },
+    plurals = {
+        s: [
+            'أقل من ثانية',
+            'ثانية واحدة',
+            ['ثانيتان', 'ثانيتين'],
+            '%d ثوان',
+            '%d ثانية',
+            '%d ثانية',
+        ],
+        m: [
+            'أقل من دقيقة',
+            'دقيقة واحدة',
+            ['دقيقتان', 'دقيقتين'],
+            '%d دقائق',
+            '%d دقيقة',
+            '%d دقيقة',
+        ],
+        h: [
+            'أقل من ساعة',
+            'ساعة واحدة',
+            ['ساعتان', 'ساعتين'],
+            '%d ساعات',
+            '%d ساعة',
+            '%d ساعة',
+        ],
+        d: [
+            'أقل من يوم',
+            'يوم واحد',
+            ['يومان', 'يومين'],
+            '%d أيام',
+            '%d يومًا',
+            '%d يوم',
+        ],
+        M: [
+            'أقل من شهر',
+            'شهر واحد',
+            ['شهران', 'شهرين'],
+            '%d أشهر',
+            '%d شهرا',
+            '%d شهر',
+        ],
+        y: [
+            'أقل من عام',
+            'عام واحد',
+            ['عامان', 'عامين'],
+            '%d أعوام',
+            '%d عامًا',
+            '%d عام',
+        ],
+    },
+    pluralize = function (u) {
+        return function (number, withoutSuffix, string, isFuture) {
+            var f = pluralForm(number),
+                str = plurals[u][pluralForm(number)];
+            if (f === 2) {
+                str = str[withoutSuffix ? 0 : 1];
+            }
+            return str.replace(/%d/i, number);
+        };
+    },
+    months = [
+        'يناير',
+        'فبراير',
+        'مارس',
+        'أبريل',
+        'مايو',
+        'يونيو',
+        'يوليو',
+        'أغسطس',
+        'سبتمبر',
+        'أكتوبر',
+        'نوفمبر',
+        'ديسمبر',
+    ];
+
+export default moment.defineLocale('ar-ly', {
+    months: months,
+    monthsShort: months,
+    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'D/\u200FM/\u200FYYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd D MMMM YYYY HH:mm',
+    },
+    meridiemParse: /ص|م/,
+    isPM: function (input) {
+        return 'م' === input;
+    },
+    meridiem: function (hour, minute, isLower) {
+        if (hour < 12) {
+            return 'ص';
+        } else {
+            return 'م';
+        }
+    },
+    calendar: {
+        sameDay: '[اليوم عند الساعة] LT',
+        nextDay: '[غدًا عند الساعة] LT',
+        nextWeek: 'dddd [عند الساعة] LT',
+        lastDay: '[أمس عند الساعة] LT',
+        lastWeek: 'dddd [عند الساعة] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'بعد %s',
+        past: 'منذ %s',
+        s: pluralize('s'),
+        ss: pluralize('s'),
+        m: pluralize('m'),
+        mm: pluralize('m'),
+        h: pluralize('h'),
+        hh: pluralize('h'),
+        d: pluralize('d'),
+        dd: pluralize('d'),
+        M: pluralize('M'),
+        MM: pluralize('M'),
+        y: pluralize('y'),
+        yy: pluralize('y'),
+    },
+    preparse: function (string) {
+        return string.replace(/،/g, ',');
+    },
+    postformat: function (string) {
+        return string
+            .replace(/\d/g, function (match) {
+                return symbolMap[match];
+            })
+            .replace(/,/g, '،');
+    },
+    week: {
+        dow: 6, // Saturday is the first day of the week.
+        doy: 12, // The week that contains Jan 12th is the first week of the year.
+    },
+});

+ 55 - 0
node_modules/moment/dist/locale/ar-ma.js

@@ -0,0 +1,55 @@
+//! moment.js locale configuration
+//! locale : Arabic (Morocco) [ar-ma]
+//! author : ElFadili Yassine : https://github.com/ElFadiliY
+//! author : Abdel Said : https://github.com/abdelsaid
+
+import moment from '../moment';
+
+export default moment.defineLocale('ar-ma', {
+    months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
+        '_'
+    ),
+    monthsShort: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
+        '_'
+    ),
+    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+    weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd D MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[اليوم على الساعة] LT',
+        nextDay: '[غدا على الساعة] LT',
+        nextWeek: 'dddd [على الساعة] LT',
+        lastDay: '[أمس على الساعة] LT',
+        lastWeek: 'dddd [على الساعة] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'في %s',
+        past: 'منذ %s',
+        s: 'ثوان',
+        ss: '%d ثانية',
+        m: 'دقيقة',
+        mm: '%d دقائق',
+        h: 'ساعة',
+        hh: '%d ساعات',
+        d: 'يوم',
+        dd: '%d أيام',
+        M: 'شهر',
+        MM: '%d أشهر',
+        y: 'سنة',
+        yy: '%d سنوات',
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 104 - 0
node_modules/moment/dist/locale/ar-sa.js

@@ -0,0 +1,104 @@
+//! moment.js locale configuration
+//! locale : Arabic (Saudi Arabia) [ar-sa]
+//! author : Suhail Alkowaileet : https://github.com/xsoh
+
+import moment from '../moment';
+
+var symbolMap = {
+        1: '١',
+        2: '٢',
+        3: '٣',
+        4: '٤',
+        5: '٥',
+        6: '٦',
+        7: '٧',
+        8: '٨',
+        9: '٩',
+        0: '٠',
+    },
+    numberMap = {
+        '١': '1',
+        '٢': '2',
+        '٣': '3',
+        '٤': '4',
+        '٥': '5',
+        '٦': '6',
+        '٧': '7',
+        '٨': '8',
+        '٩': '9',
+        '٠': '0',
+    };
+
+export default moment.defineLocale('ar-sa', {
+    months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
+        '_'
+    ),
+    monthsShort: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
+        '_'
+    ),
+    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd D MMMM YYYY HH:mm',
+    },
+    meridiemParse: /ص|م/,
+    isPM: function (input) {
+        return 'م' === input;
+    },
+    meridiem: function (hour, minute, isLower) {
+        if (hour < 12) {
+            return 'ص';
+        } else {
+            return 'م';
+        }
+    },
+    calendar: {
+        sameDay: '[اليوم على الساعة] LT',
+        nextDay: '[غدا على الساعة] LT',
+        nextWeek: 'dddd [على الساعة] LT',
+        lastDay: '[أمس على الساعة] LT',
+        lastWeek: 'dddd [على الساعة] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'في %s',
+        past: 'منذ %s',
+        s: 'ثوان',
+        ss: '%d ثانية',
+        m: 'دقيقة',
+        mm: '%d دقائق',
+        h: 'ساعة',
+        hh: '%d ساعات',
+        d: 'يوم',
+        dd: '%d أيام',
+        M: 'شهر',
+        MM: '%d أشهر',
+        y: 'سنة',
+        yy: '%d سنوات',
+    },
+    preparse: function (string) {
+        return string
+            .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+                return numberMap[match];
+            })
+            .replace(/،/g, ',');
+    },
+    postformat: function (string) {
+        return string
+            .replace(/\d/g, function (match) {
+                return symbolMap[match];
+            })
+            .replace(/,/g, '،');
+    },
+    week: {
+        dow: 0, // Sunday is the first day of the week.
+        doy: 6, // The week that contains Jan 6th is the first week of the year.
+    },
+});

+ 54 - 0
node_modules/moment/dist/locale/ar-tn.js

@@ -0,0 +1,54 @@
+//! moment.js locale configuration
+//! locale  :  Arabic (Tunisia) [ar-tn]
+//! author : Nader Toukabri : https://github.com/naderio
+
+import moment from '../moment';
+
+export default moment.defineLocale('ar-tn', {
+    months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
+        '_'
+    ),
+    monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
+        '_'
+    ),
+    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd D MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[اليوم على الساعة] LT',
+        nextDay: '[غدا على الساعة] LT',
+        nextWeek: 'dddd [على الساعة] LT',
+        lastDay: '[أمس على الساعة] LT',
+        lastWeek: 'dddd [على الساعة] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'في %s',
+        past: 'منذ %s',
+        s: 'ثوان',
+        ss: '%d ثانية',
+        m: 'دقيقة',
+        mm: '%d دقائق',
+        h: 'ساعة',
+        hh: '%d ساعات',
+        d: 'يوم',
+        dd: '%d أيام',
+        M: 'شهر',
+        MM: '%d أشهر',
+        y: 'سنة',
+        yy: '%d سنوات',
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 189 - 0
node_modules/moment/dist/locale/ar.js

@@ -0,0 +1,189 @@
+//! moment.js locale configuration
+//! locale : Arabic [ar]
+//! author : Abdel Said: https://github.com/abdelsaid
+//! author : Ahmed Elkhatib
+//! author : forabi https://github.com/forabi
+
+import moment from '../moment';
+
+var symbolMap = {
+        1: '١',
+        2: '٢',
+        3: '٣',
+        4: '٤',
+        5: '٥',
+        6: '٦',
+        7: '٧',
+        8: '٨',
+        9: '٩',
+        0: '٠',
+    },
+    numberMap = {
+        '١': '1',
+        '٢': '2',
+        '٣': '3',
+        '٤': '4',
+        '٥': '5',
+        '٦': '6',
+        '٧': '7',
+        '٨': '8',
+        '٩': '9',
+        '٠': '0',
+    },
+    pluralForm = function (n) {
+        return n === 0
+            ? 0
+            : n === 1
+            ? 1
+            : n === 2
+            ? 2
+            : n % 100 >= 3 && n % 100 <= 10
+            ? 3
+            : n % 100 >= 11
+            ? 4
+            : 5;
+    },
+    plurals = {
+        s: [
+            'أقل من ثانية',
+            'ثانية واحدة',
+            ['ثانيتان', 'ثانيتين'],
+            '%d ثوان',
+            '%d ثانية',
+            '%d ثانية',
+        ],
+        m: [
+            'أقل من دقيقة',
+            'دقيقة واحدة',
+            ['دقيقتان', 'دقيقتين'],
+            '%d دقائق',
+            '%d دقيقة',
+            '%d دقيقة',
+        ],
+        h: [
+            'أقل من ساعة',
+            'ساعة واحدة',
+            ['ساعتان', 'ساعتين'],
+            '%d ساعات',
+            '%d ساعة',
+            '%d ساعة',
+        ],
+        d: [
+            'أقل من يوم',
+            'يوم واحد',
+            ['يومان', 'يومين'],
+            '%d أيام',
+            '%d يومًا',
+            '%d يوم',
+        ],
+        M: [
+            'أقل من شهر',
+            'شهر واحد',
+            ['شهران', 'شهرين'],
+            '%d أشهر',
+            '%d شهرا',
+            '%d شهر',
+        ],
+        y: [
+            'أقل من عام',
+            'عام واحد',
+            ['عامان', 'عامين'],
+            '%d أعوام',
+            '%d عامًا',
+            '%d عام',
+        ],
+    },
+    pluralize = function (u) {
+        return function (number, withoutSuffix, string, isFuture) {
+            var f = pluralForm(number),
+                str = plurals[u][pluralForm(number)];
+            if (f === 2) {
+                str = str[withoutSuffix ? 0 : 1];
+            }
+            return str.replace(/%d/i, number);
+        };
+    },
+    months = [
+        'يناير',
+        'فبراير',
+        'مارس',
+        'أبريل',
+        'مايو',
+        'يونيو',
+        'يوليو',
+        'أغسطس',
+        'سبتمبر',
+        'أكتوبر',
+        'نوفمبر',
+        'ديسمبر',
+    ];
+
+export default moment.defineLocale('ar', {
+    months: months,
+    monthsShort: months,
+    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'D/\u200FM/\u200FYYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd D MMMM YYYY HH:mm',
+    },
+    meridiemParse: /ص|م/,
+    isPM: function (input) {
+        return 'م' === input;
+    },
+    meridiem: function (hour, minute, isLower) {
+        if (hour < 12) {
+            return 'ص';
+        } else {
+            return 'م';
+        }
+    },
+    calendar: {
+        sameDay: '[اليوم عند الساعة] LT',
+        nextDay: '[غدًا عند الساعة] LT',
+        nextWeek: 'dddd [عند الساعة] LT',
+        lastDay: '[أمس عند الساعة] LT',
+        lastWeek: 'dddd [عند الساعة] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'بعد %s',
+        past: 'منذ %s',
+        s: pluralize('s'),
+        ss: pluralize('s'),
+        m: pluralize('m'),
+        mm: pluralize('m'),
+        h: pluralize('h'),
+        hh: pluralize('h'),
+        d: pluralize('d'),
+        dd: pluralize('d'),
+        M: pluralize('M'),
+        MM: pluralize('M'),
+        y: pluralize('y'),
+        yy: pluralize('y'),
+    },
+    preparse: function (string) {
+        return string
+            .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+                return numberMap[match];
+            })
+            .replace(/،/g, ',');
+    },
+    postformat: function (string) {
+        return string
+            .replace(/\d/g, function (match) {
+                return symbolMap[match];
+            })
+            .replace(/,/g, '،');
+    },
+    week: {
+        dow: 6, // Saturday is the first day of the week.
+        doy: 12, // The week that contains Jan 12th is the first week of the year.
+    },
+});

+ 101 - 0
node_modules/moment/dist/locale/az.js

@@ -0,0 +1,101 @@
+//! moment.js locale configuration
+//! locale : Azerbaijani [az]
+//! author : topchiyev : https://github.com/topchiyev
+
+import moment from '../moment';
+
+var suffixes = {
+    1: '-inci',
+    5: '-inci',
+    8: '-inci',
+    70: '-inci',
+    80: '-inci',
+    2: '-nci',
+    7: '-nci',
+    20: '-nci',
+    50: '-nci',
+    3: '-üncü',
+    4: '-üncü',
+    100: '-üncü',
+    6: '-ncı',
+    9: '-uncu',
+    10: '-uncu',
+    30: '-uncu',
+    60: '-ıncı',
+    90: '-ıncı',
+};
+
+export default moment.defineLocale('az', {
+    months: 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split(
+        '_'
+    ),
+    monthsShort: 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
+    weekdays: 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split(
+        '_'
+    ),
+    weekdaysShort: 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
+    weekdaysMin: 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD.MM.YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd, D MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[bugün saat] LT',
+        nextDay: '[sabah saat] LT',
+        nextWeek: '[gələn həftə] dddd [saat] LT',
+        lastDay: '[dünən] LT',
+        lastWeek: '[keçən həftə] dddd [saat] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: '%s sonra',
+        past: '%s əvvəl',
+        s: 'bir neçə saniyə',
+        ss: '%d saniyə',
+        m: 'bir dəqiqə',
+        mm: '%d dəqiqə',
+        h: 'bir saat',
+        hh: '%d saat',
+        d: 'bir gün',
+        dd: '%d gün',
+        M: 'bir ay',
+        MM: '%d ay',
+        y: 'bir il',
+        yy: '%d il',
+    },
+    meridiemParse: /gecə|səhər|gündüz|axşam/,
+    isPM: function (input) {
+        return /^(gündüz|axşam)$/.test(input);
+    },
+    meridiem: function (hour, minute, isLower) {
+        if (hour < 4) {
+            return 'gecə';
+        } else if (hour < 12) {
+            return 'səhər';
+        } else if (hour < 17) {
+            return 'gündüz';
+        } else {
+            return 'axşam';
+        }
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
+    ordinal: function (number) {
+        if (number === 0) {
+            // special case for zero
+            return number + '-ıncı';
+        }
+        var a = number % 10,
+            b = (number % 100) - a,
+            c = number >= 100 ? 100 : null;
+        return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 7, // The week that contains Jan 7th is the first week of the year.
+    },
+});

+ 141 - 0
node_modules/moment/dist/locale/be.js

@@ -0,0 +1,141 @@
+//! moment.js locale configuration
+//! locale : Belarusian [be]
+//! author : Dmitry Demidov : https://github.com/demidov91
+//! author: Praleska: http://praleska.pro/
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+import moment from '../moment';
+
+function plural(word, num) {
+    var forms = word.split('_');
+    return num % 10 === 1 && num % 100 !== 11
+        ? forms[0]
+        : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
+        ? forms[1]
+        : forms[2];
+}
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+    var format = {
+        ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',
+        mm: withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
+        hh: withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
+        dd: 'дзень_дні_дзён',
+        MM: 'месяц_месяцы_месяцаў',
+        yy: 'год_гады_гадоў',
+    };
+    if (key === 'm') {
+        return withoutSuffix ? 'хвіліна' : 'хвіліну';
+    } else if (key === 'h') {
+        return withoutSuffix ? 'гадзіна' : 'гадзіну';
+    } else {
+        return number + ' ' + plural(format[key], +number);
+    }
+}
+
+export default moment.defineLocale('be', {
+    months: {
+        format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split(
+            '_'
+        ),
+        standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split(
+            '_'
+        ),
+    },
+    monthsShort: 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split(
+        '_'
+    ),
+    weekdays: {
+        format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split(
+            '_'
+        ),
+        standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split(
+            '_'
+        ),
+        isFormat: /\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/,
+    },
+    weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+    weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD.MM.YYYY',
+        LL: 'D MMMM YYYY г.',
+        LLL: 'D MMMM YYYY г., HH:mm',
+        LLLL: 'dddd, D MMMM YYYY г., HH:mm',
+    },
+    calendar: {
+        sameDay: '[Сёння ў] LT',
+        nextDay: '[Заўтра ў] LT',
+        lastDay: '[Учора ў] LT',
+        nextWeek: function () {
+            return '[У] dddd [ў] LT';
+        },
+        lastWeek: function () {
+            switch (this.day()) {
+                case 0:
+                case 3:
+                case 5:
+                case 6:
+                    return '[У мінулую] dddd [ў] LT';
+                case 1:
+                case 2:
+                case 4:
+                    return '[У мінулы] dddd [ў] LT';
+            }
+        },
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'праз %s',
+        past: '%s таму',
+        s: 'некалькі секунд',
+        m: relativeTimeWithPlural,
+        mm: relativeTimeWithPlural,
+        h: relativeTimeWithPlural,
+        hh: relativeTimeWithPlural,
+        d: 'дзень',
+        dd: relativeTimeWithPlural,
+        M: 'месяц',
+        MM: relativeTimeWithPlural,
+        y: 'год',
+        yy: relativeTimeWithPlural,
+    },
+    meridiemParse: /ночы|раніцы|дня|вечара/,
+    isPM: function (input) {
+        return /^(дня|вечара)$/.test(input);
+    },
+    meridiem: function (hour, minute, isLower) {
+        if (hour < 4) {
+            return 'ночы';
+        } else if (hour < 12) {
+            return 'раніцы';
+        } else if (hour < 17) {
+            return 'дня';
+        } else {
+            return 'вечара';
+        }
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/,
+    ordinal: function (number, period) {
+        switch (period) {
+            case 'M':
+            case 'd':
+            case 'DDD':
+            case 'w':
+            case 'W':
+                return (number % 10 === 2 || number % 10 === 3) &&
+                    number % 100 !== 12 &&
+                    number % 100 !== 13
+                    ? number + '-і'
+                    : number + '-ы';
+            case 'D':
+                return number + '-га';
+            default:
+                return number;
+        }
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 7, // The week that contains Jan 7th is the first week of the year.
+    },
+});

+ 87 - 0
node_modules/moment/dist/locale/bg.js

@@ -0,0 +1,87 @@
+//! moment.js locale configuration
+//! locale : Bulgarian [bg]
+//! author : Krasen Borisov : https://github.com/kraz
+
+import moment from '../moment';
+
+export default moment.defineLocale('bg', {
+    months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split(
+        '_'
+    ),
+    monthsShort: 'яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
+    weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split(
+        '_'
+    ),
+    weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
+    weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+    longDateFormat: {
+        LT: 'H:mm',
+        LTS: 'H:mm:ss',
+        L: 'D.MM.YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY H:mm',
+        LLLL: 'dddd, D MMMM YYYY H:mm',
+    },
+    calendar: {
+        sameDay: '[Днес в] LT',
+        nextDay: '[Утре в] LT',
+        nextWeek: 'dddd [в] LT',
+        lastDay: '[Вчера в] LT',
+        lastWeek: function () {
+            switch (this.day()) {
+                case 0:
+                case 3:
+                case 6:
+                    return '[Миналата] dddd [в] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[Миналия] dddd [в] LT';
+            }
+        },
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'след %s',
+        past: 'преди %s',
+        s: 'няколко секунди',
+        ss: '%d секунди',
+        m: 'минута',
+        mm: '%d минути',
+        h: 'час',
+        hh: '%d часа',
+        d: 'ден',
+        dd: '%d дена',
+        w: 'седмица',
+        ww: '%d седмици',
+        M: 'месец',
+        MM: '%d месеца',
+        y: 'година',
+        yy: '%d години',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
+    ordinal: function (number) {
+        var lastDigit = number % 10,
+            last2Digits = number % 100;
+        if (number === 0) {
+            return number + '-ев';
+        } else if (last2Digits === 0) {
+            return number + '-ен';
+        } else if (last2Digits > 10 && last2Digits < 20) {
+            return number + '-ти';
+        } else if (lastDigit === 1) {
+            return number + '-ви';
+        } else if (lastDigit === 2) {
+            return number + '-ри';
+        } else if (lastDigit === 7 || lastDigit === 8) {
+            return number + '-ми';
+        } else {
+            return number + '-ти';
+        }
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 7, // The week that contains Jan 7th is the first week of the year.
+    },
+});

+ 52 - 0
node_modules/moment/dist/locale/bm.js

@@ -0,0 +1,52 @@
+//! moment.js locale configuration
+//! locale : Bambara [bm]
+//! author : Estelle Comment : https://github.com/estellecomment
+// Language contact person : Abdoufata Kane : https://github.com/abdoufata
+
+import moment from '../moment';
+
+export default moment.defineLocale('bm', {
+    months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split(
+        '_'
+    ),
+    monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),
+    weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),
+    weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),
+    weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'MMMM [tile] D [san] YYYY',
+        LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
+        LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
+    },
+    calendar: {
+        sameDay: '[Bi lɛrɛ] LT',
+        nextDay: '[Sini lɛrɛ] LT',
+        nextWeek: 'dddd [don lɛrɛ] LT',
+        lastDay: '[Kunu lɛrɛ] LT',
+        lastWeek: 'dddd [tɛmɛnen lɛrɛ] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: '%s kɔnɔ',
+        past: 'a bɛ %s bɔ',
+        s: 'sanga dama dama',
+        ss: 'sekondi %d',
+        m: 'miniti kelen',
+        mm: 'miniti %d',
+        h: 'lɛrɛ kelen',
+        hh: 'lɛrɛ %d',
+        d: 'tile kelen',
+        dd: 'tile %d',
+        M: 'kalo kelen',
+        MM: 'kalo %d',
+        y: 'san kelen',
+        yy: 'san %d',
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 128 - 0
node_modules/moment/dist/locale/bn-bd.js

@@ -0,0 +1,128 @@
+//! moment.js locale configuration
+//! locale : Bengali (Bangladesh) [bn-bd]
+//! author : Asraf Hossain Patoary : https://github.com/ashwoolford
+
+import moment from '../moment';
+
+var symbolMap = {
+        1: '১',
+        2: '২',
+        3: '৩',
+        4: '৪',
+        5: '৫',
+        6: '৬',
+        7: '৭',
+        8: '৮',
+        9: '৯',
+        0: '০',
+    },
+    numberMap = {
+        '১': '1',
+        '২': '2',
+        '৩': '3',
+        '৪': '4',
+        '৫': '5',
+        '৬': '6',
+        '৭': '7',
+        '৮': '8',
+        '৯': '9',
+        '০': '0',
+    };
+
+export default moment.defineLocale('bn-bd', {
+    months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
+        '_'
+    ),
+    monthsShort: 'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
+        '_'
+    ),
+    weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
+        '_'
+    ),
+    weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
+    weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
+    longDateFormat: {
+        LT: 'A h:mm সময়',
+        LTS: 'A h:mm:ss সময়',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY, A h:mm সময়',
+        LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
+    },
+    calendar: {
+        sameDay: '[আজ] LT',
+        nextDay: '[আগামীকাল] LT',
+        nextWeek: 'dddd, LT',
+        lastDay: '[গতকাল] LT',
+        lastWeek: '[গত] dddd, LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: '%s পরে',
+        past: '%s আগে',
+        s: 'কয়েক সেকেন্ড',
+        ss: '%d সেকেন্ড',
+        m: 'এক মিনিট',
+        mm: '%d মিনিট',
+        h: 'এক ঘন্টা',
+        hh: '%d ঘন্টা',
+        d: 'এক দিন',
+        dd: '%d দিন',
+        M: 'এক মাস',
+        MM: '%d মাস',
+        y: 'এক বছর',
+        yy: '%d বছর',
+    },
+    preparse: function (string) {
+        return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
+            return numberMap[match];
+        });
+    },
+    postformat: function (string) {
+        return string.replace(/\d/g, function (match) {
+            return symbolMap[match];
+        });
+    },
+
+    meridiemParse: /রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,
+    meridiemHour: function (hour, meridiem) {
+        if (hour === 12) {
+            hour = 0;
+        }
+        if (meridiem === 'রাত') {
+            return hour < 4 ? hour : hour + 12;
+        } else if (meridiem === 'ভোর') {
+            return hour;
+        } else if (meridiem === 'সকাল') {
+            return hour;
+        } else if (meridiem === 'দুপুর') {
+            return hour >= 3 ? hour : hour + 12;
+        } else if (meridiem === 'বিকাল') {
+            return hour + 12;
+        } else if (meridiem === 'সন্ধ্যা') {
+            return hour + 12;
+        }
+    },
+
+    meridiem: function (hour, minute, isLower) {
+        if (hour < 4) {
+            return 'রাত';
+        } else if (hour < 6) {
+            return 'ভোর';
+        } else if (hour < 12) {
+            return 'সকাল';
+        } else if (hour < 15) {
+            return 'দুপুর';
+        } else if (hour < 18) {
+            return 'বিকাল';
+        } else if (hour < 20) {
+            return 'সন্ধ্যা';
+        } else {
+            return 'রাত';
+        }
+    },
+    week: {
+        dow: 0, // Sunday is the first day of the week.
+        doy: 6, // The week that contains Jan 6th is the first week of the year.
+    },
+});

+ 118 - 0
node_modules/moment/dist/locale/bn.js

@@ -0,0 +1,118 @@
+//! moment.js locale configuration
+//! locale : Bengali [bn]
+//! author : Kaushik Gandhi : https://github.com/kaushikgandhi
+
+import moment from '../moment';
+
+var symbolMap = {
+        1: '১',
+        2: '২',
+        3: '৩',
+        4: '৪',
+        5: '৫',
+        6: '৬',
+        7: '৭',
+        8: '৮',
+        9: '৯',
+        0: '০',
+    },
+    numberMap = {
+        '১': '1',
+        '২': '2',
+        '৩': '3',
+        '৪': '4',
+        '৫': '5',
+        '৬': '6',
+        '৭': '7',
+        '৮': '8',
+        '৯': '9',
+        '০': '0',
+    };
+
+export default moment.defineLocale('bn', {
+    months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
+        '_'
+    ),
+    monthsShort: 'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
+        '_'
+    ),
+    weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
+        '_'
+    ),
+    weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
+    weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
+    longDateFormat: {
+        LT: 'A h:mm সময়',
+        LTS: 'A h:mm:ss সময়',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY, A h:mm সময়',
+        LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
+    },
+    calendar: {
+        sameDay: '[আজ] LT',
+        nextDay: '[আগামীকাল] LT',
+        nextWeek: 'dddd, LT',
+        lastDay: '[গতকাল] LT',
+        lastWeek: '[গত] dddd, LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: '%s পরে',
+        past: '%s আগে',
+        s: 'কয়েক সেকেন্ড',
+        ss: '%d সেকেন্ড',
+        m: 'এক মিনিট',
+        mm: '%d মিনিট',
+        h: 'এক ঘন্টা',
+        hh: '%d ঘন্টা',
+        d: 'এক দিন',
+        dd: '%d দিন',
+        M: 'এক মাস',
+        MM: '%d মাস',
+        y: 'এক বছর',
+        yy: '%d বছর',
+    },
+    preparse: function (string) {
+        return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
+            return numberMap[match];
+        });
+    },
+    postformat: function (string) {
+        return string.replace(/\d/g, function (match) {
+            return symbolMap[match];
+        });
+    },
+    meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
+    meridiemHour: function (hour, meridiem) {
+        if (hour === 12) {
+            hour = 0;
+        }
+        if (
+            (meridiem === 'রাত' && hour >= 4) ||
+            (meridiem === 'দুপুর' && hour < 5) ||
+            meridiem === 'বিকাল'
+        ) {
+            return hour + 12;
+        } else {
+            return hour;
+        }
+    },
+    meridiem: function (hour, minute, isLower) {
+        if (hour < 4) {
+            return 'রাত';
+        } else if (hour < 10) {
+            return 'সকাল';
+        } else if (hour < 17) {
+            return 'দুপুর';
+        } else if (hour < 20) {
+            return 'বিকাল';
+        } else {
+            return 'রাত';
+        }
+    },
+    week: {
+        dow: 0, // Sunday is the first day of the week.
+        doy: 6, // The week that contains Jan 6th is the first week of the year.
+    },
+});

+ 122 - 0
node_modules/moment/dist/locale/bo.js

@@ -0,0 +1,122 @@
+//! moment.js locale configuration
+//! locale : Tibetan [bo]
+//! author : Thupten N. Chakrishar : https://github.com/vajradog
+
+import moment from '../moment';
+
+var symbolMap = {
+        1: '༡',
+        2: '༢',
+        3: '༣',
+        4: '༤',
+        5: '༥',
+        6: '༦',
+        7: '༧',
+        8: '༨',
+        9: '༩',
+        0: '༠',
+    },
+    numberMap = {
+        '༡': '1',
+        '༢': '2',
+        '༣': '3',
+        '༤': '4',
+        '༥': '5',
+        '༦': '6',
+        '༧': '7',
+        '༨': '8',
+        '༩': '9',
+        '༠': '0',
+    };
+
+export default moment.defineLocale('bo', {
+    months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split(
+        '_'
+    ),
+    monthsShort: 'ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12'.split(
+        '_'
+    ),
+    monthsShortRegex: /^(ཟླ་\d{1,2})/,
+    monthsParseExact: true,
+    weekdays: 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split(
+        '_'
+    ),
+    weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split(
+        '_'
+    ),
+    weekdaysMin: 'ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན'.split('_'),
+    longDateFormat: {
+        LT: 'A h:mm',
+        LTS: 'A h:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY, A h:mm',
+        LLLL: 'dddd, D MMMM YYYY, A h:mm',
+    },
+    calendar: {
+        sameDay: '[དི་རིང] LT',
+        nextDay: '[སང་ཉིན] LT',
+        nextWeek: '[བདུན་ཕྲག་རྗེས་མ], LT',
+        lastDay: '[ཁ་སང] LT',
+        lastWeek: '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: '%s ལ་',
+        past: '%s སྔན་ལ',
+        s: 'ལམ་སང',
+        ss: '%d སྐར་ཆ།',
+        m: 'སྐར་མ་གཅིག',
+        mm: '%d སྐར་མ',
+        h: 'ཆུ་ཚོད་གཅིག',
+        hh: '%d ཆུ་ཚོད',
+        d: 'ཉིན་གཅིག',
+        dd: '%d ཉིན་',
+        M: 'ཟླ་བ་གཅིག',
+        MM: '%d ཟླ་བ',
+        y: 'ལོ་གཅིག',
+        yy: '%d ལོ',
+    },
+    preparse: function (string) {
+        return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
+            return numberMap[match];
+        });
+    },
+    postformat: function (string) {
+        return string.replace(/\d/g, function (match) {
+            return symbolMap[match];
+        });
+    },
+    meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
+    meridiemHour: function (hour, meridiem) {
+        if (hour === 12) {
+            hour = 0;
+        }
+        if (
+            (meridiem === 'མཚན་མོ' && hour >= 4) ||
+            (meridiem === 'ཉིན་གུང' && hour < 5) ||
+            meridiem === 'དགོང་དག'
+        ) {
+            return hour + 12;
+        } else {
+            return hour;
+        }
+    },
+    meridiem: function (hour, minute, isLower) {
+        if (hour < 4) {
+            return 'མཚན་མོ';
+        } else if (hour < 10) {
+            return 'ཞོགས་ཀས';
+        } else if (hour < 17) {
+            return 'ཉིན་གུང';
+        } else if (hour < 20) {
+            return 'དགོང་དག';
+        } else {
+            return 'མཚན་མོ';
+        }
+    },
+    week: {
+        dow: 0, // Sunday is the first day of the week.
+        doy: 6, // The week that contains Jan 6th is the first week of the year.
+    },
+});

+ 165 - 0
node_modules/moment/dist/locale/br.js

@@ -0,0 +1,165 @@
+//! moment.js locale configuration
+//! locale : Breton [br]
+//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+import moment from '../moment';
+
+function relativeTimeWithMutation(number, withoutSuffix, key) {
+    var format = {
+        mm: 'munutenn',
+        MM: 'miz',
+        dd: 'devezh',
+    };
+    return number + ' ' + mutation(format[key], number);
+}
+function specialMutationForYears(number) {
+    switch (lastNumber(number)) {
+        case 1:
+        case 3:
+        case 4:
+        case 5:
+        case 9:
+            return number + ' bloaz';
+        default:
+            return number + ' vloaz';
+    }
+}
+function lastNumber(number) {
+    if (number > 9) {
+        return lastNumber(number % 10);
+    }
+    return number;
+}
+function mutation(text, number) {
+    if (number === 2) {
+        return softMutation(text);
+    }
+    return text;
+}
+function softMutation(text) {
+    var mutationTable = {
+        m: 'v',
+        b: 'v',
+        d: 'z',
+    };
+    if (mutationTable[text.charAt(0)] === undefined) {
+        return text;
+    }
+    return mutationTable[text.charAt(0)] + text.substring(1);
+}
+
+var monthsParse = [
+        /^gen/i,
+        /^c[ʼ\']hwe/i,
+        /^meu/i,
+        /^ebr/i,
+        /^mae/i,
+        /^(mez|eve)/i,
+        /^gou/i,
+        /^eos/i,
+        /^gwe/i,
+        /^her/i,
+        /^du/i,
+        /^ker/i,
+    ],
+    monthsRegex = /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
+    monthsStrictRegex = /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,
+    monthsShortStrictRegex = /^(gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
+    fullWeekdaysParse = [
+        /^sul/i,
+        /^lun/i,
+        /^meurzh/i,
+        /^merc[ʼ\']her/i,
+        /^yaou/i,
+        /^gwener/i,
+        /^sadorn/i,
+    ],
+    shortWeekdaysParse = [
+        /^Sul/i,
+        /^Lun/i,
+        /^Meu/i,
+        /^Mer/i,
+        /^Yao/i,
+        /^Gwe/i,
+        /^Sad/i,
+    ],
+    minWeekdaysParse = [
+        /^Su/i,
+        /^Lu/i,
+        /^Me([^r]|$)/i,
+        /^Mer/i,
+        /^Ya/i,
+        /^Gw/i,
+        /^Sa/i,
+    ];
+
+export default moment.defineLocale('br', {
+    months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split(
+        '_'
+    ),
+    monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
+    weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),
+    weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
+    weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
+    weekdaysParse: minWeekdaysParse,
+    fullWeekdaysParse: fullWeekdaysParse,
+    shortWeekdaysParse: shortWeekdaysParse,
+    minWeekdaysParse: minWeekdaysParse,
+
+    monthsRegex: monthsRegex,
+    monthsShortRegex: monthsRegex,
+    monthsStrictRegex: monthsStrictRegex,
+    monthsShortStrictRegex: monthsShortStrictRegex,
+    monthsParse: monthsParse,
+    longMonthsParse: monthsParse,
+    shortMonthsParse: monthsParse,
+
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D [a viz] MMMM YYYY',
+        LLL: 'D [a viz] MMMM YYYY HH:mm',
+        LLLL: 'dddd, D [a viz] MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[Hiziv da] LT',
+        nextDay: '[Warcʼhoazh da] LT',
+        nextWeek: 'dddd [da] LT',
+        lastDay: '[Decʼh da] LT',
+        lastWeek: 'dddd [paset da] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'a-benn %s',
+        past: '%s ʼzo',
+        s: 'un nebeud segondennoù',
+        ss: '%d eilenn',
+        m: 'ur vunutenn',
+        mm: relativeTimeWithMutation,
+        h: 'un eur',
+        hh: '%d eur',
+        d: 'un devezh',
+        dd: relativeTimeWithMutation,
+        M: 'ur miz',
+        MM: relativeTimeWithMutation,
+        y: 'ur bloaz',
+        yy: specialMutationForYears,
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/,
+    ordinal: function (number) {
+        var output = number === 1 ? 'añ' : 'vet';
+        return number + output;
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    meridiemParse: /a.m.|g.m./, // goude merenn | a-raok merenn
+    isPM: function (token) {
+        return token === 'g.m.';
+    },
+    meridiem: function (hour, minute, isLower) {
+        return hour < 12 ? 'a.m.' : 'g.m.';
+    },
+});

+ 149 - 0
node_modules/moment/dist/locale/bs.js

@@ -0,0 +1,149 @@
+//! moment.js locale configuration
+//! locale : Bosnian [bs]
+//! author : Nedim Cholich : https://github.com/frontyard
+//! based on (hr) translation by Bojan Marković
+
+import moment from '../moment';
+
+function translate(number, withoutSuffix, key) {
+    var result = number + ' ';
+    switch (key) {
+        case 'ss':
+            if (number === 1) {
+                result += 'sekunda';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'sekunde';
+            } else {
+                result += 'sekundi';
+            }
+            return result;
+        case 'm':
+            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minuta';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'jedan sat' : 'jednog sata';
+        case 'hh':
+            if (number === 1) {
+                result += 'sat';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'sata';
+            } else {
+                result += 'sati';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dana';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mjesec';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'mjeseca';
+            } else {
+                result += 'mjeseci';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'godina';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'godine';
+            } else {
+                result += 'godina';
+            }
+            return result;
+    }
+}
+
+export default moment.defineLocale('bs', {
+    months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split(
+        '_'
+    ),
+    monthsShort: 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split(
+        '_'
+    ),
+    monthsParseExact: true,
+    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
+        '_'
+    ),
+    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'H:mm',
+        LTS: 'H:mm:ss',
+        L: 'DD.MM.YYYY',
+        LL: 'D. MMMM YYYY',
+        LLL: 'D. MMMM YYYY H:mm',
+        LLLL: 'dddd, D. MMMM YYYY H:mm',
+    },
+    calendar: {
+        sameDay: '[danas u] LT',
+        nextDay: '[sutra u] LT',
+        nextWeek: function () {
+            switch (this.day()) {
+                case 0:
+                    return '[u] [nedjelju] [u] LT';
+                case 3:
+                    return '[u] [srijedu] [u] LT';
+                case 6:
+                    return '[u] [subotu] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[u] dddd [u] LT';
+            }
+        },
+        lastDay: '[jučer u] LT',
+        lastWeek: function () {
+            switch (this.day()) {
+                case 0:
+                case 3:
+                    return '[prošlu] dddd [u] LT';
+                case 6:
+                    return '[prošle] [subote] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prošli] dddd [u] LT';
+            }
+        },
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'za %s',
+        past: 'prije %s',
+        s: 'par sekundi',
+        ss: translate,
+        m: translate,
+        mm: translate,
+        h: translate,
+        hh: translate,
+        d: 'dan',
+        dd: translate,
+        M: 'mjesec',
+        MM: translate,
+        y: 'godinu',
+        yy: translate,
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}\./,
+    ordinal: '%d.',
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 7, // The week that contains Jan 7th is the first week of the year.
+    },
+});

+ 97 - 0
node_modules/moment/dist/locale/ca.js

@@ -0,0 +1,97 @@
+//! moment.js locale configuration
+//! locale : Catalan [ca]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
+
+import moment from '../moment';
+
+export default moment.defineLocale('ca', {
+    months: {
+        standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split(
+            '_'
+        ),
+        format: "de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split(
+            '_'
+        ),
+        isFormat: /D[oD]?(\s)+MMMM/,
+    },
+    monthsShort: 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split(
+        '_'
+    ),
+    monthsParseExact: true,
+    weekdays: 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split(
+        '_'
+    ),
+    weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
+    weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'H:mm',
+        LTS: 'H:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM [de] YYYY',
+        ll: 'D MMM YYYY',
+        LLL: 'D MMMM [de] YYYY [a les] H:mm',
+        lll: 'D MMM YYYY, H:mm',
+        LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',
+        llll: 'ddd D MMM YYYY, H:mm',
+    },
+    calendar: {
+        sameDay: function () {
+            return '[avui a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
+        },
+        nextDay: function () {
+            return '[demà a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
+        },
+        nextWeek: function () {
+            return 'dddd [a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
+        },
+        lastDay: function () {
+            return '[ahir a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
+        },
+        lastWeek: function () {
+            return (
+                '[el] dddd [passat a ' +
+                (this.hours() !== 1 ? 'les' : 'la') +
+                '] LT'
+            );
+        },
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: "d'aquí %s",
+        past: 'fa %s',
+        s: 'uns segons',
+        ss: '%d segons',
+        m: 'un minut',
+        mm: '%d minuts',
+        h: 'una hora',
+        hh: '%d hores',
+        d: 'un dia',
+        dd: '%d dies',
+        M: 'un mes',
+        MM: '%d mesos',
+        y: 'un any',
+        yy: '%d anys',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/,
+    ordinal: function (number, period) {
+        var output =
+            number === 1
+                ? 'r'
+                : number === 2
+                ? 'n'
+                : number === 3
+                ? 'r'
+                : number === 4
+                ? 't'
+                : 'è';
+        if (period === 'w' || period === 'W') {
+            output = 'a';
+        }
+        return number + output;
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 171 - 0
node_modules/moment/dist/locale/cs.js

@@ -0,0 +1,171 @@
+//! moment.js locale configuration
+//! locale : Czech [cs]
+//! author : petrbela : https://github.com/petrbela
+
+import moment from '../moment';
+
+var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split(
+        '_'
+    ),
+    monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'),
+    monthsParse = [
+        /^led/i,
+        /^úno/i,
+        /^bře/i,
+        /^dub/i,
+        /^kvě/i,
+        /^(čvn|červen$|června)/i,
+        /^(čvc|červenec|července)/i,
+        /^srp/i,
+        /^zář/i,
+        /^říj/i,
+        /^lis/i,
+        /^pro/i,
+    ],
+    // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
+    // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
+    monthsRegex = /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;
+
+function plural(n) {
+    return n > 1 && n < 5 && ~~(n / 10) !== 1;
+}
+function translate(number, withoutSuffix, key, isFuture) {
+    var result = number + ' ';
+    switch (key) {
+        case 's': // a few seconds / in a few seconds / a few seconds ago
+            return withoutSuffix || isFuture ? 'pár sekund' : 'pár sekundami';
+        case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'sekundy' : 'sekund');
+            } else {
+                return result + 'sekundami';
+            }
+        case 'm': // a minute / in a minute / a minute ago
+            return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';
+        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'minuty' : 'minut');
+            } else {
+                return result + 'minutami';
+            }
+        case 'h': // an hour / in an hour / an hour ago
+            return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
+        case 'hh': // 9 hours / in 9 hours / 9 hours ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'hodiny' : 'hodin');
+            } else {
+                return result + 'hodinami';
+            }
+        case 'd': // a day / in a day / a day ago
+            return withoutSuffix || isFuture ? 'den' : 'dnem';
+        case 'dd': // 9 days / in 9 days / 9 days ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'dny' : 'dní');
+            } else {
+                return result + 'dny';
+            }
+        case 'M': // a month / in a month / a month ago
+            return withoutSuffix || isFuture ? 'měsíc' : 'měsícem';
+        case 'MM': // 9 months / in 9 months / 9 months ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'měsíce' : 'měsíců');
+            } else {
+                return result + 'měsíci';
+            }
+        case 'y': // a year / in a year / a year ago
+            return withoutSuffix || isFuture ? 'rok' : 'rokem';
+        case 'yy': // 9 years / in 9 years / 9 years ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'roky' : 'let');
+            } else {
+                return result + 'lety';
+            }
+    }
+}
+
+export default moment.defineLocale('cs', {
+    months: months,
+    monthsShort: monthsShort,
+    monthsRegex: monthsRegex,
+    monthsShortRegex: monthsRegex,
+    // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
+    // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
+    monthsStrictRegex: /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,
+    monthsShortStrictRegex: /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,
+    monthsParse: monthsParse,
+    longMonthsParse: monthsParse,
+    shortMonthsParse: monthsParse,
+    weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
+    weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),
+    weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),
+    longDateFormat: {
+        LT: 'H:mm',
+        LTS: 'H:mm:ss',
+        L: 'DD.MM.YYYY',
+        LL: 'D. MMMM YYYY',
+        LLL: 'D. MMMM YYYY H:mm',
+        LLLL: 'dddd D. MMMM YYYY H:mm',
+        l: 'D. M. YYYY',
+    },
+    calendar: {
+        sameDay: '[dnes v] LT',
+        nextDay: '[zítra v] LT',
+        nextWeek: function () {
+            switch (this.day()) {
+                case 0:
+                    return '[v neděli v] LT';
+                case 1:
+                case 2:
+                    return '[v] dddd [v] LT';
+                case 3:
+                    return '[ve středu v] LT';
+                case 4:
+                    return '[ve čtvrtek v] LT';
+                case 5:
+                    return '[v pátek v] LT';
+                case 6:
+                    return '[v sobotu v] LT';
+            }
+        },
+        lastDay: '[včera v] LT',
+        lastWeek: function () {
+            switch (this.day()) {
+                case 0:
+                    return '[minulou neděli v] LT';
+                case 1:
+                case 2:
+                    return '[minulé] dddd [v] LT';
+                case 3:
+                    return '[minulou středu v] LT';
+                case 4:
+                case 5:
+                    return '[minulý] dddd [v] LT';
+                case 6:
+                    return '[minulou sobotu v] LT';
+            }
+        },
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'za %s',
+        past: 'před %s',
+        s: translate,
+        ss: translate,
+        m: translate,
+        mm: translate,
+        h: translate,
+        hh: translate,
+        d: translate,
+        dd: translate,
+        M: translate,
+        MM: translate,
+        y: translate,
+        yy: translate,
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}\./,
+    ordinal: '%d.',
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 62 - 0
node_modules/moment/dist/locale/cv.js

@@ -0,0 +1,62 @@
+//! moment.js locale configuration
+//! locale : Chuvash [cv]
+//! author : Anatoly Mironov : https://github.com/mirontoli
+
+import moment from '../moment';
+
+export default moment.defineLocale('cv', {
+    months: 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split(
+        '_'
+    ),
+    monthsShort: 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
+    weekdays: 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split(
+        '_'
+    ),
+    weekdaysShort: 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
+    weekdaysMin: 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD-MM-YYYY',
+        LL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
+        LLL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
+        LLLL: 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
+    },
+    calendar: {
+        sameDay: '[Паян] LT [сехетре]',
+        nextDay: '[Ыран] LT [сехетре]',
+        lastDay: '[Ӗнер] LT [сехетре]',
+        nextWeek: '[Ҫитес] dddd LT [сехетре]',
+        lastWeek: '[Иртнӗ] dddd LT [сехетре]',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: function (output) {
+            var affix = /сехет$/i.exec(output)
+                ? 'рен'
+                : /ҫул$/i.exec(output)
+                ? 'тан'
+                : 'ран';
+            return output + affix;
+        },
+        past: '%s каялла',
+        s: 'пӗр-ик ҫеккунт',
+        ss: '%d ҫеккунт',
+        m: 'пӗр минут',
+        mm: '%d минут',
+        h: 'пӗр сехет',
+        hh: '%d сехет',
+        d: 'пӗр кун',
+        dd: '%d кун',
+        M: 'пӗр уйӑх',
+        MM: '%d уйӑх',
+        y: 'пӗр ҫул',
+        yy: '%d ҫул',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}-мӗш/,
+    ordinal: '%d-мӗш',
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 7, // The week that contains Jan 7th is the first week of the year.
+    },
+});

+ 97 - 0
node_modules/moment/dist/locale/cy.js

@@ -0,0 +1,97 @@
+//! moment.js locale configuration
+//! locale : Welsh [cy]
+//! author : Robert Allen : https://github.com/robgallen
+//! author : https://github.com/ryangreaves
+
+import moment from '../moment';
+
+export default moment.defineLocale('cy', {
+    months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split(
+        '_'
+    ),
+    monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split(
+        '_'
+    ),
+    weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split(
+        '_'
+    ),
+    weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
+    weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
+    weekdaysParseExact: true,
+    // time formats are the same as en-gb
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd, D MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[Heddiw am] LT',
+        nextDay: '[Yfory am] LT',
+        nextWeek: 'dddd [am] LT',
+        lastDay: '[Ddoe am] LT',
+        lastWeek: 'dddd [diwethaf am] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'mewn %s',
+        past: '%s yn ôl',
+        s: 'ychydig eiliadau',
+        ss: '%d eiliad',
+        m: 'munud',
+        mm: '%d munud',
+        h: 'awr',
+        hh: '%d awr',
+        d: 'diwrnod',
+        dd: '%d diwrnod',
+        M: 'mis',
+        MM: '%d mis',
+        y: 'blwyddyn',
+        yy: '%d flynedd',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
+    // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+    ordinal: function (number) {
+        var b = number,
+            output = '',
+            lookup = [
+                '',
+                'af',
+                'il',
+                'ydd',
+                'ydd',
+                'ed',
+                'ed',
+                'ed',
+                'fed',
+                'fed',
+                'fed', // 1af to 10fed
+                'eg',
+                'fed',
+                'eg',
+                'eg',
+                'fed',
+                'eg',
+                'eg',
+                'fed',
+                'eg',
+                'fed', // 11eg to 20fed
+            ];
+        if (b > 20) {
+            if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
+                output = 'fed'; // not 30ain, 70ain or 90ain
+            } else {
+                output = 'ain';
+            }
+        } else if (b > 0) {
+            output = lookup[b];
+        }
+        return number + output;
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 53 - 0
node_modules/moment/dist/locale/da.js

@@ -0,0 +1,53 @@
+//! moment.js locale configuration
+//! locale : Danish [da]
+//! author : Ulrik Nielsen : https://github.com/mrbase
+
+import moment from '../moment';
+
+export default moment.defineLocale('da', {
+    months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split(
+        '_'
+    ),
+    monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+    weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+    weekdaysShort: 'søn_man_tir_ons_tor_fre_lør'.split('_'),
+    weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD.MM.YYYY',
+        LL: 'D. MMMM YYYY',
+        LLL: 'D. MMMM YYYY HH:mm',
+        LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm',
+    },
+    calendar: {
+        sameDay: '[i dag kl.] LT',
+        nextDay: '[i morgen kl.] LT',
+        nextWeek: 'på dddd [kl.] LT',
+        lastDay: '[i går kl.] LT',
+        lastWeek: '[i] dddd[s kl.] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'om %s',
+        past: '%s siden',
+        s: 'få sekunder',
+        ss: '%d sekunder',
+        m: 'et minut',
+        mm: '%d minutter',
+        h: 'en time',
+        hh: '%d timer',
+        d: 'en dag',
+        dd: '%d dage',
+        M: 'en måned',
+        MM: '%d måneder',
+        y: 'et år',
+        yy: '%d år',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}\./,
+    ordinal: '%d.',
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 79 - 0
node_modules/moment/dist/locale/de-at.js

@@ -0,0 +1,79 @@
+//! moment.js locale configuration
+//! locale : German (Austria) [de-at]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Martin Groller : https://github.com/MadMG
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+import moment from '../moment';
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+    var format = {
+        m: ['eine Minute', 'einer Minute'],
+        h: ['eine Stunde', 'einer Stunde'],
+        d: ['ein Tag', 'einem Tag'],
+        dd: [number + ' Tage', number + ' Tagen'],
+        w: ['eine Woche', 'einer Woche'],
+        M: ['ein Monat', 'einem Monat'],
+        MM: [number + ' Monate', number + ' Monaten'],
+        y: ['ein Jahr', 'einem Jahr'],
+        yy: [number + ' Jahre', number + ' Jahren'],
+    };
+    return withoutSuffix ? format[key][0] : format[key][1];
+}
+
+export default moment.defineLocale('de-at', {
+    months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
+        '_'
+    ),
+    monthsShort: 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split(
+        '_'
+    ),
+    monthsParseExact: true,
+    weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
+        '_'
+    ),
+    weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD.MM.YYYY',
+        LL: 'D. MMMM YYYY',
+        LLL: 'D. MMMM YYYY HH:mm',
+        LLLL: 'dddd, D. MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[heute um] LT [Uhr]',
+        sameElse: 'L',
+        nextDay: '[morgen um] LT [Uhr]',
+        nextWeek: 'dddd [um] LT [Uhr]',
+        lastDay: '[gestern um] LT [Uhr]',
+        lastWeek: '[letzten] dddd [um] LT [Uhr]',
+    },
+    relativeTime: {
+        future: 'in %s',
+        past: 'vor %s',
+        s: 'ein paar Sekunden',
+        ss: '%d Sekunden',
+        m: processRelativeTime,
+        mm: '%d Minuten',
+        h: processRelativeTime,
+        hh: '%d Stunden',
+        d: processRelativeTime,
+        dd: processRelativeTime,
+        w: processRelativeTime,
+        ww: '%d Wochen',
+        M: processRelativeTime,
+        MM: processRelativeTime,
+        y: processRelativeTime,
+        yy: processRelativeTime,
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}\./,
+    ordinal: '%d.',
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 78 - 0
node_modules/moment/dist/locale/de-ch.js

@@ -0,0 +1,78 @@
+//! moment.js locale configuration
+//! locale : German (Switzerland) [de-ch]
+//! author : sschueller : https://github.com/sschueller
+
+// based on: https://www.bk.admin.ch/dokumentation/sprachen/04915/05016/index.html?lang=de#
+
+import moment from '../moment';
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+    var format = {
+        m: ['eine Minute', 'einer Minute'],
+        h: ['eine Stunde', 'einer Stunde'],
+        d: ['ein Tag', 'einem Tag'],
+        dd: [number + ' Tage', number + ' Tagen'],
+        w: ['eine Woche', 'einer Woche'],
+        M: ['ein Monat', 'einem Monat'],
+        MM: [number + ' Monate', number + ' Monaten'],
+        y: ['ein Jahr', 'einem Jahr'],
+        yy: [number + ' Jahre', number + ' Jahren'],
+    };
+    return withoutSuffix ? format[key][0] : format[key][1];
+}
+
+export default moment.defineLocale('de-ch', {
+    months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
+        '_'
+    ),
+    monthsShort: 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split(
+        '_'
+    ),
+    monthsParseExact: true,
+    weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
+        '_'
+    ),
+    weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD.MM.YYYY',
+        LL: 'D. MMMM YYYY',
+        LLL: 'D. MMMM YYYY HH:mm',
+        LLLL: 'dddd, D. MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[heute um] LT [Uhr]',
+        sameElse: 'L',
+        nextDay: '[morgen um] LT [Uhr]',
+        nextWeek: 'dddd [um] LT [Uhr]',
+        lastDay: '[gestern um] LT [Uhr]',
+        lastWeek: '[letzten] dddd [um] LT [Uhr]',
+    },
+    relativeTime: {
+        future: 'in %s',
+        past: 'vor %s',
+        s: 'ein paar Sekunden',
+        ss: '%d Sekunden',
+        m: processRelativeTime,
+        mm: '%d Minuten',
+        h: processRelativeTime,
+        hh: '%d Stunden',
+        d: processRelativeTime,
+        dd: processRelativeTime,
+        w: processRelativeTime,
+        ww: '%d Wochen',
+        M: processRelativeTime,
+        MM: processRelativeTime,
+        y: processRelativeTime,
+        yy: processRelativeTime,
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}\./,
+    ordinal: '%d.',
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 78 - 0
node_modules/moment/dist/locale/de.js

@@ -0,0 +1,78 @@
+//! moment.js locale configuration
+//! locale : German [de]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+import moment from '../moment';
+
+function processRelativeTime(number, withoutSuffix, key, isFuture) {
+    var format = {
+        m: ['eine Minute', 'einer Minute'],
+        h: ['eine Stunde', 'einer Stunde'],
+        d: ['ein Tag', 'einem Tag'],
+        dd: [number + ' Tage', number + ' Tagen'],
+        w: ['eine Woche', 'einer Woche'],
+        M: ['ein Monat', 'einem Monat'],
+        MM: [number + ' Monate', number + ' Monaten'],
+        y: ['ein Jahr', 'einem Jahr'],
+        yy: [number + ' Jahre', number + ' Jahren'],
+    };
+    return withoutSuffix ? format[key][0] : format[key][1];
+}
+
+export default moment.defineLocale('de', {
+    months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
+        '_'
+    ),
+    monthsShort: 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split(
+        '_'
+    ),
+    monthsParseExact: true,
+    weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
+        '_'
+    ),
+    weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD.MM.YYYY',
+        LL: 'D. MMMM YYYY',
+        LLL: 'D. MMMM YYYY HH:mm',
+        LLLL: 'dddd, D. MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[heute um] LT [Uhr]',
+        sameElse: 'L',
+        nextDay: '[morgen um] LT [Uhr]',
+        nextWeek: 'dddd [um] LT [Uhr]',
+        lastDay: '[gestern um] LT [Uhr]',
+        lastWeek: '[letzten] dddd [um] LT [Uhr]',
+    },
+    relativeTime: {
+        future: 'in %s',
+        past: 'vor %s',
+        s: 'ein paar Sekunden',
+        ss: '%d Sekunden',
+        m: processRelativeTime,
+        mm: '%d Minuten',
+        h: processRelativeTime,
+        hh: '%d Stunden',
+        d: processRelativeTime,
+        dd: processRelativeTime,
+        w: processRelativeTime,
+        ww: '%d Wochen',
+        M: processRelativeTime,
+        MM: processRelativeTime,
+        y: processRelativeTime,
+        yy: processRelativeTime,
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}\./,
+    ordinal: '%d.',
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 90 - 0
node_modules/moment/dist/locale/dv.js

@@ -0,0 +1,90 @@
+//! moment.js locale configuration
+//! locale : Maldivian [dv]
+//! author : Jawish Hameed : https://github.com/jawish
+
+import moment from '../moment';
+
+var months = [
+        'ޖެނުއަރީ',
+        'ފެބްރުއަރީ',
+        'މާރިޗު',
+        'އޭޕްރީލު',
+        'މޭ',
+        'ޖޫން',
+        'ޖުލައި',
+        'އޯގަސްޓު',
+        'ސެޕްޓެމްބަރު',
+        'އޮކްޓޯބަރު',
+        'ނޮވެމްބަރު',
+        'ޑިސެމްބަރު',
+    ],
+    weekdays = [
+        'އާދިއްތަ',
+        'ހޯމަ',
+        'އަންގާރަ',
+        'ބުދަ',
+        'ބުރާސްފަތި',
+        'ހުކުރު',
+        'ހޮނިހިރު',
+    ];
+
+export default moment.defineLocale('dv', {
+    months: months,
+    monthsShort: months,
+    weekdays: weekdays,
+    weekdaysShort: weekdays,
+    weekdaysMin: 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'D/M/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd D MMMM YYYY HH:mm',
+    },
+    meridiemParse: /މކ|މފ/,
+    isPM: function (input) {
+        return 'މފ' === input;
+    },
+    meridiem: function (hour, minute, isLower) {
+        if (hour < 12) {
+            return 'މކ';
+        } else {
+            return 'މފ';
+        }
+    },
+    calendar: {
+        sameDay: '[މިއަދު] LT',
+        nextDay: '[މާދަމާ] LT',
+        nextWeek: 'dddd LT',
+        lastDay: '[އިއްޔެ] LT',
+        lastWeek: '[ފާއިތުވި] dddd LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'ތެރޭގައި %s',
+        past: 'ކުރިން %s',
+        s: 'ސިކުންތުކޮޅެއް',
+        ss: 'd% ސިކުންތު',
+        m: 'މިނިޓެއް',
+        mm: 'މިނިޓު %d',
+        h: 'ގަޑިއިރެއް',
+        hh: 'ގަޑިއިރު %d',
+        d: 'ދުވަހެއް',
+        dd: 'ދުވަސް %d',
+        M: 'މަހެއް',
+        MM: 'މަސް %d',
+        y: 'އަހަރެއް',
+        yy: 'އަހަރު %d',
+    },
+    preparse: function (string) {
+        return string.replace(/،/g, ',');
+    },
+    postformat: function (string) {
+        return string.replace(/,/g, '،');
+    },
+    week: {
+        dow: 7, // Sunday is the first day of the week.
+        doy: 12, // The week that contains Jan 12th is the first week of the year.
+    },
+});

+ 104 - 0
node_modules/moment/dist/locale/el.js

@@ -0,0 +1,104 @@
+//! moment.js locale configuration
+//! locale : Greek [el]
+//! author : Aggelos Karalias : https://github.com/mehiel
+
+import moment from '../moment';
+
+function isFunction(input) {
+    return (
+        (typeof Function !== 'undefined' && input instanceof Function) ||
+        Object.prototype.toString.call(input) === '[object Function]'
+    );
+}
+
+export default moment.defineLocale('el', {
+    monthsNominativeEl: 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split(
+        '_'
+    ),
+    monthsGenitiveEl: 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split(
+        '_'
+    ),
+    months: function (momentToFormat, format) {
+        if (!momentToFormat) {
+            return this._monthsNominativeEl;
+        } else if (
+            typeof format === 'string' &&
+            /D/.test(format.substring(0, format.indexOf('MMMM')))
+        ) {
+            // if there is a day number before 'MMMM'
+            return this._monthsGenitiveEl[momentToFormat.month()];
+        } else {
+            return this._monthsNominativeEl[momentToFormat.month()];
+        }
+    },
+    monthsShort: 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
+    weekdays: 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split(
+        '_'
+    ),
+    weekdaysShort: 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
+    weekdaysMin: 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
+    meridiem: function (hours, minutes, isLower) {
+        if (hours > 11) {
+            return isLower ? 'μμ' : 'ΜΜ';
+        } else {
+            return isLower ? 'πμ' : 'ΠΜ';
+        }
+    },
+    isPM: function (input) {
+        return (input + '').toLowerCase()[0] === 'μ';
+    },
+    meridiemParse: /[ΠΜ]\.?Μ?\.?/i,
+    longDateFormat: {
+        LT: 'h:mm A',
+        LTS: 'h:mm:ss A',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY h:mm A',
+        LLLL: 'dddd, D MMMM YYYY h:mm A',
+    },
+    calendarEl: {
+        sameDay: '[Σήμερα {}] LT',
+        nextDay: '[Αύριο {}] LT',
+        nextWeek: 'dddd [{}] LT',
+        lastDay: '[Χθες {}] LT',
+        lastWeek: function () {
+            switch (this.day()) {
+                case 6:
+                    return '[το προηγούμενο] dddd [{}] LT';
+                default:
+                    return '[την προηγούμενη] dddd [{}] LT';
+            }
+        },
+        sameElse: 'L',
+    },
+    calendar: function (key, mom) {
+        var output = this._calendarEl[key],
+            hours = mom && mom.hours();
+        if (isFunction(output)) {
+            output = output.apply(mom);
+        }
+        return output.replace('{}', hours % 12 === 1 ? 'στη' : 'στις');
+    },
+    relativeTime: {
+        future: 'σε %s',
+        past: '%s πριν',
+        s: 'λίγα δευτερόλεπτα',
+        ss: '%d δευτερόλεπτα',
+        m: 'ένα λεπτό',
+        mm: '%d λεπτά',
+        h: 'μία ώρα',
+        hh: '%d ώρες',
+        d: 'μία μέρα',
+        dd: '%d μέρες',
+        M: 'ένας μήνας',
+        MM: '%d μήνες',
+        y: 'ένας χρόνος',
+        yy: '%d χρόνια',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}η/,
+    ordinal: '%dη',
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4st is the first week of the year.
+    },
+});

+ 68 - 0
node_modules/moment/dist/locale/en-au.js

@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : English (Australia) [en-au]
+//! author : Jared Morse : https://github.com/jarcoal
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-au', {
+    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
+        '_'
+    ),
+    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
+        '_'
+    ),
+    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+    longDateFormat: {
+        LT: 'h:mm A',
+        LTS: 'h:mm:ss A',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY h:mm A',
+        LLLL: 'dddd, D MMMM YYYY h:mm A',
+    },
+    calendar: {
+        sameDay: '[Today at] LT',
+        nextDay: '[Tomorrow at] LT',
+        nextWeek: 'dddd [at] LT',
+        lastDay: '[Yesterday at] LT',
+        lastWeek: '[Last] dddd [at] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'in %s',
+        past: '%s ago',
+        s: 'a few seconds',
+        ss: '%d seconds',
+        m: 'a minute',
+        mm: '%d minutes',
+        h: 'an hour',
+        hh: '%d hours',
+        d: 'a day',
+        dd: '%d days',
+        M: 'a month',
+        MM: '%d months',
+        y: 'a year',
+        yy: '%d years',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
+    ordinal: function (number) {
+        var b = number % 10,
+            output =
+                ~~((number % 100) / 10) === 1
+                    ? 'th'
+                    : b === 1
+                    ? 'st'
+                    : b === 2
+                    ? 'nd'
+                    : b === 3
+                    ? 'rd'
+                    : 'th';
+        return number + output;
+    },
+    week: {
+        dow: 0, // Sunday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 64 - 0
node_modules/moment/dist/locale/en-ca.js

@@ -0,0 +1,64 @@
+//! moment.js locale configuration
+//! locale : English (Canada) [en-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-ca', {
+    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
+        '_'
+    ),
+    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
+        '_'
+    ),
+    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+    longDateFormat: {
+        LT: 'h:mm A',
+        LTS: 'h:mm:ss A',
+        L: 'YYYY-MM-DD',
+        LL: 'MMMM D, YYYY',
+        LLL: 'MMMM D, YYYY h:mm A',
+        LLLL: 'dddd, MMMM D, YYYY h:mm A',
+    },
+    calendar: {
+        sameDay: '[Today at] LT',
+        nextDay: '[Tomorrow at] LT',
+        nextWeek: 'dddd [at] LT',
+        lastDay: '[Yesterday at] LT',
+        lastWeek: '[Last] dddd [at] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'in %s',
+        past: '%s ago',
+        s: 'a few seconds',
+        ss: '%d seconds',
+        m: 'a minute',
+        mm: '%d minutes',
+        h: 'an hour',
+        hh: '%d hours',
+        d: 'a day',
+        dd: '%d days',
+        M: 'a month',
+        MM: '%d months',
+        y: 'a year',
+        yy: '%d years',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
+    ordinal: function (number) {
+        var b = number % 10,
+            output =
+                ~~((number % 100) / 10) === 1
+                    ? 'th'
+                    : b === 1
+                    ? 'st'
+                    : b === 2
+                    ? 'nd'
+                    : b === 3
+                    ? 'rd'
+                    : 'th';
+        return number + output;
+    },
+});

+ 68 - 0
node_modules/moment/dist/locale/en-gb.js

@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : English (United Kingdom) [en-gb]
+//! author : Chris Gedrim : https://github.com/chrisgedrim
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-gb', {
+    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
+        '_'
+    ),
+    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
+        '_'
+    ),
+    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd, D MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[Today at] LT',
+        nextDay: '[Tomorrow at] LT',
+        nextWeek: 'dddd [at] LT',
+        lastDay: '[Yesterday at] LT',
+        lastWeek: '[Last] dddd [at] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'in %s',
+        past: '%s ago',
+        s: 'a few seconds',
+        ss: '%d seconds',
+        m: 'a minute',
+        mm: '%d minutes',
+        h: 'an hour',
+        hh: '%d hours',
+        d: 'a day',
+        dd: '%d days',
+        M: 'a month',
+        MM: '%d months',
+        y: 'a year',
+        yy: '%d years',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
+    ordinal: function (number) {
+        var b = number % 10,
+            output =
+                ~~((number % 100) / 10) === 1
+                    ? 'th'
+                    : b === 1
+                    ? 'st'
+                    : b === 2
+                    ? 'nd'
+                    : b === 3
+                    ? 'rd'
+                    : 'th';
+        return number + output;
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 68 - 0
node_modules/moment/dist/locale/en-ie.js

@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : English (Ireland) [en-ie]
+//! author : Chris Cartlidge : https://github.com/chriscartlidge
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-ie', {
+    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
+        '_'
+    ),
+    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
+        '_'
+    ),
+    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd D MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[Today at] LT',
+        nextDay: '[Tomorrow at] LT',
+        nextWeek: 'dddd [at] LT',
+        lastDay: '[Yesterday at] LT',
+        lastWeek: '[Last] dddd [at] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'in %s',
+        past: '%s ago',
+        s: 'a few seconds',
+        ss: '%d seconds',
+        m: 'a minute',
+        mm: '%d minutes',
+        h: 'an hour',
+        hh: '%d hours',
+        d: 'a day',
+        dd: '%d days',
+        M: 'a month',
+        MM: '%d months',
+        y: 'a year',
+        yy: '%d years',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
+    ordinal: function (number) {
+        var b = number % 10,
+            output =
+                ~~((number % 100) / 10) === 1
+                    ? 'th'
+                    : b === 1
+                    ? 'st'
+                    : b === 2
+                    ? 'nd'
+                    : b === 3
+                    ? 'rd'
+                    : 'th';
+        return number + output;
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 64 - 0
node_modules/moment/dist/locale/en-il.js

@@ -0,0 +1,64 @@
+//! moment.js locale configuration
+//! locale : English (Israel) [en-il]
+//! author : Chris Gedrim : https://github.com/chrisgedrim
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-il', {
+    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
+        '_'
+    ),
+    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
+        '_'
+    ),
+    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd, D MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[Today at] LT',
+        nextDay: '[Tomorrow at] LT',
+        nextWeek: 'dddd [at] LT',
+        lastDay: '[Yesterday at] LT',
+        lastWeek: '[Last] dddd [at] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'in %s',
+        past: '%s ago',
+        s: 'a few seconds',
+        ss: '%d seconds',
+        m: 'a minute',
+        mm: '%d minutes',
+        h: 'an hour',
+        hh: '%d hours',
+        d: 'a day',
+        dd: '%d days',
+        M: 'a month',
+        MM: '%d months',
+        y: 'a year',
+        yy: '%d years',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
+    ordinal: function (number) {
+        var b = number % 10,
+            output =
+                ~~((number % 100) / 10) === 1
+                    ? 'th'
+                    : b === 1
+                    ? 'st'
+                    : b === 2
+                    ? 'nd'
+                    : b === 3
+                    ? 'rd'
+                    : 'th';
+        return number + output;
+    },
+});

+ 68 - 0
node_modules/moment/dist/locale/en-in.js

@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : English (India) [en-in]
+//! author : Jatin Agrawal : https://github.com/jatinag22
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-in', {
+    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
+        '_'
+    ),
+    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
+        '_'
+    ),
+    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+    longDateFormat: {
+        LT: 'h:mm A',
+        LTS: 'h:mm:ss A',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY h:mm A',
+        LLLL: 'dddd, D MMMM YYYY h:mm A',
+    },
+    calendar: {
+        sameDay: '[Today at] LT',
+        nextDay: '[Tomorrow at] LT',
+        nextWeek: 'dddd [at] LT',
+        lastDay: '[Yesterday at] LT',
+        lastWeek: '[Last] dddd [at] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'in %s',
+        past: '%s ago',
+        s: 'a few seconds',
+        ss: '%d seconds',
+        m: 'a minute',
+        mm: '%d minutes',
+        h: 'an hour',
+        hh: '%d hours',
+        d: 'a day',
+        dd: '%d days',
+        M: 'a month',
+        MM: '%d months',
+        y: 'a year',
+        yy: '%d years',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
+    ordinal: function (number) {
+        var b = number % 10,
+            output =
+                ~~((number % 100) / 10) === 1
+                    ? 'th'
+                    : b === 1
+                    ? 'st'
+                    : b === 2
+                    ? 'nd'
+                    : b === 3
+                    ? 'rd'
+                    : 'th';
+        return number + output;
+    },
+    week: {
+        dow: 0, // Sunday is the first day of the week.
+        doy: 6, // The week that contains Jan 1st is the first week of the year.
+    },
+});

+ 68 - 0
node_modules/moment/dist/locale/en-nz.js

@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : English (New Zealand) [en-nz]
+//! author : Luke McGregor : https://github.com/lukemcgregor
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-nz', {
+    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
+        '_'
+    ),
+    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
+        '_'
+    ),
+    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+    longDateFormat: {
+        LT: 'h:mm A',
+        LTS: 'h:mm:ss A',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY h:mm A',
+        LLLL: 'dddd, D MMMM YYYY h:mm A',
+    },
+    calendar: {
+        sameDay: '[Today at] LT',
+        nextDay: '[Tomorrow at] LT',
+        nextWeek: 'dddd [at] LT',
+        lastDay: '[Yesterday at] LT',
+        lastWeek: '[Last] dddd [at] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'in %s',
+        past: '%s ago',
+        s: 'a few seconds',
+        ss: '%d seconds',
+        m: 'a minute',
+        mm: '%d minutes',
+        h: 'an hour',
+        hh: '%d hours',
+        d: 'a day',
+        dd: '%d days',
+        M: 'a month',
+        MM: '%d months',
+        y: 'a year',
+        yy: '%d years',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
+    ordinal: function (number) {
+        var b = number % 10,
+            output =
+                ~~((number % 100) / 10) === 1
+                    ? 'th'
+                    : b === 1
+                    ? 'st'
+                    : b === 2
+                    ? 'nd'
+                    : b === 3
+                    ? 'rd'
+                    : 'th';
+        return number + output;
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 68 - 0
node_modules/moment/dist/locale/en-sg.js

@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : English (Singapore) [en-sg]
+//! author : Matthew Castrillon-Madrigal : https://github.com/techdimension
+
+import moment from '../moment';
+
+export default moment.defineLocale('en-sg', {
+    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
+        '_'
+    ),
+    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
+        '_'
+    ),
+    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D MMMM YYYY',
+        LLL: 'D MMMM YYYY HH:mm',
+        LLLL: 'dddd, D MMMM YYYY HH:mm',
+    },
+    calendar: {
+        sameDay: '[Today at] LT',
+        nextDay: '[Tomorrow at] LT',
+        nextWeek: 'dddd [at] LT',
+        lastDay: '[Yesterday at] LT',
+        lastWeek: '[Last] dddd [at] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'in %s',
+        past: '%s ago',
+        s: 'a few seconds',
+        ss: '%d seconds',
+        m: 'a minute',
+        mm: '%d minutes',
+        h: 'an hour',
+        hh: '%d hours',
+        d: 'a day',
+        dd: '%d days',
+        M: 'a month',
+        MM: '%d months',
+        y: 'a year',
+        yy: '%d years',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
+    ordinal: function (number) {
+        var b = number % 10,
+            output =
+                ~~((number % 100) / 10) === 1
+                    ? 'th'
+                    : b === 1
+                    ? 'st'
+                    : b === 2
+                    ? 'nd'
+                    : b === 3
+                    ? 'rd'
+                    : 'th';
+        return number + output;
+    },
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 68 - 0
node_modules/moment/dist/locale/eo.js

@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : Esperanto [eo]
+//! author : Colin Dean : https://github.com/colindean
+//! author : Mia Nordentoft Imperatori : https://github.com/miestasmia
+//! comment : miestasmia corrected the translation by colindean
+//! comment : Vivakvo corrected the translation by colindean and miestasmia
+
+import moment from '../moment';
+
+export default moment.defineLocale('eo', {
+    months: 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split(
+        '_'
+    ),
+    monthsShort: 'jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec'.split('_'),
+    weekdays: 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),
+    weekdaysShort: 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),
+    weekdaysMin: 'di_lu_ma_me_ĵa_ve_sa'.split('_'),
+    longDateFormat: {
+        LT: 'HH:mm',
+        LTS: 'HH:mm:ss',
+        L: 'YYYY-MM-DD',
+        LL: '[la] D[-an de] MMMM, YYYY',
+        LLL: '[la] D[-an de] MMMM, YYYY HH:mm',
+        LLLL: 'dddd[n], [la] D[-an de] MMMM, YYYY HH:mm',
+        llll: 'ddd, [la] D[-an de] MMM, YYYY HH:mm',
+    },
+    meridiemParse: /[ap]\.t\.m/i,
+    isPM: function (input) {
+        return input.charAt(0).toLowerCase() === 'p';
+    },
+    meridiem: function (hours, minutes, isLower) {
+        if (hours > 11) {
+            return isLower ? 'p.t.m.' : 'P.T.M.';
+        } else {
+            return isLower ? 'a.t.m.' : 'A.T.M.';
+        }
+    },
+    calendar: {
+        sameDay: '[Hodiaŭ je] LT',
+        nextDay: '[Morgaŭ je] LT',
+        nextWeek: 'dddd[n je] LT',
+        lastDay: '[Hieraŭ je] LT',
+        lastWeek: '[pasintan] dddd[n je] LT',
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'post %s',
+        past: 'antaŭ %s',
+        s: 'kelkaj sekundoj',
+        ss: '%d sekundoj',
+        m: 'unu minuto',
+        mm: '%d minutoj',
+        h: 'unu horo',
+        hh: '%d horoj',
+        d: 'unu tago', //ne 'diurno', ĉar estas uzita por proksimumo
+        dd: '%d tagoj',
+        M: 'unu monato',
+        MM: '%d monatoj',
+        y: 'unu jaro',
+        yy: '%d jaroj',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}a/,
+    ordinal: '%da',
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 7, // The week that contains Jan 7th is the first week of the year.
+    },
+});

+ 104 - 0
node_modules/moment/dist/locale/es-do.js

@@ -0,0 +1,104 @@
+//! moment.js locale configuration
+//! locale : Spanish (Dominican Republic) [es-do]
+
+import moment from '../moment';
+
+var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
+        '_'
+    ),
+    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
+    monthsParse = [
+        /^ene/i,
+        /^feb/i,
+        /^mar/i,
+        /^abr/i,
+        /^may/i,
+        /^jun/i,
+        /^jul/i,
+        /^ago/i,
+        /^sep/i,
+        /^oct/i,
+        /^nov/i,
+        /^dic/i,
+    ],
+    monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;
+
+export default moment.defineLocale('es-do', {
+    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
+        '_'
+    ),
+    monthsShort: function (m, format) {
+        if (!m) {
+            return monthsShortDot;
+        } else if (/-MMM-/.test(format)) {
+            return monthsShort[m.month()];
+        } else {
+            return monthsShortDot[m.month()];
+        }
+    },
+    monthsRegex: monthsRegex,
+    monthsShortRegex: monthsRegex,
+    monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
+    monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
+    monthsParse: monthsParse,
+    longMonthsParse: monthsParse,
+    shortMonthsParse: monthsParse,
+    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'h:mm A',
+        LTS: 'h:mm:ss A',
+        L: 'DD/MM/YYYY',
+        LL: 'D [de] MMMM [de] YYYY',
+        LLL: 'D [de] MMMM [de] YYYY h:mm A',
+        LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',
+    },
+    calendar: {
+        sameDay: function () {
+            return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
+        },
+        nextDay: function () {
+            return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
+        },
+        nextWeek: function () {
+            return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
+        },
+        lastDay: function () {
+            return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
+        },
+        lastWeek: function () {
+            return (
+                '[el] dddd [pasado a la' +
+                (this.hours() !== 1 ? 's' : '') +
+                '] LT'
+            );
+        },
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'en %s',
+        past: 'hace %s',
+        s: 'unos segundos',
+        ss: '%d segundos',
+        m: 'un minuto',
+        mm: '%d minutos',
+        h: 'una hora',
+        hh: '%d horas',
+        d: 'un día',
+        dd: '%d días',
+        w: 'una semana',
+        ww: '%d semanas',
+        M: 'un mes',
+        MM: '%d meses',
+        y: 'un año',
+        yy: '%d años',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}º/,
+    ordinal: '%dº',
+    week: {
+        dow: 1, // Monday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+});

+ 106 - 0
node_modules/moment/dist/locale/es-mx.js

@@ -0,0 +1,106 @@
+//! moment.js locale configuration
+//! locale : Spanish (Mexico) [es-mx]
+//! author : JC Franco : https://github.com/jcfranco
+
+import moment from '../moment';
+
+var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
+        '_'
+    ),
+    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
+    monthsParse = [
+        /^ene/i,
+        /^feb/i,
+        /^mar/i,
+        /^abr/i,
+        /^may/i,
+        /^jun/i,
+        /^jul/i,
+        /^ago/i,
+        /^sep/i,
+        /^oct/i,
+        /^nov/i,
+        /^dic/i,
+    ],
+    monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;
+
+export default moment.defineLocale('es-mx', {
+    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
+        '_'
+    ),
+    monthsShort: function (m, format) {
+        if (!m) {
+            return monthsShortDot;
+        } else if (/-MMM-/.test(format)) {
+            return monthsShort[m.month()];
+        } else {
+            return monthsShortDot[m.month()];
+        }
+    },
+    monthsRegex: monthsRegex,
+    monthsShortRegex: monthsRegex,
+    monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
+    monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
+    monthsParse: monthsParse,
+    longMonthsParse: monthsParse,
+    shortMonthsParse: monthsParse,
+    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+    weekdaysParseExact: true,
+    longDateFormat: {
+        LT: 'H:mm',
+        LTS: 'H:mm:ss',
+        L: 'DD/MM/YYYY',
+        LL: 'D [de] MMMM [de] YYYY',
+        LLL: 'D [de] MMMM [de] YYYY H:mm',
+        LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
+    },
+    calendar: {
+        sameDay: function () {
+            return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
+        },
+        nextDay: function () {
+            return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
+        },
+        nextWeek: function () {
+            return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
+        },
+        lastDay: function () {
+            return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
+        },
+        lastWeek: function () {
+            return (
+                '[el] dddd [pasado a la' +
+                (this.hours() !== 1 ? 's' : '') +
+                '] LT'
+            );
+        },
+        sameElse: 'L',
+    },
+    relativeTime: {
+        future: 'en %s',
+        past: 'hace %s',
+        s: 'unos segundos',
+        ss: '%d segundos',
+        m: 'un minuto',
+        mm: '%d minutos',
+        h: 'una hora',
+        hh: '%d horas',
+        d: 'un día',
+        dd: '%d días',
+        w: 'una semana',
+        ww: '%d semanas',
+        M: 'un mes',
+        MM: '%d meses',
+        y: 'un año',
+        yy: '%d años',
+    },
+    dayOfMonthOrdinalParse: /\d{1,2}º/,
+    ordinal: '%dº',
+    week: {
+        dow: 0, // Sunday is the first day of the week.
+        doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    invalidDate: 'Fecha inválida',
+});

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů