From 0483b4b3646e4a26061a5de0ccc2c2cfbe9ad124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=A0=E7=9A=84=E5=90=8D=E5=AD=97?= Date: Mon, 14 Jul 2025 10:22:40 +0800 Subject: [PATCH] 1 --- .env.example | 0 .gitignore | 10 + .htaccess | 1 + .user.ini | 1 + 404.html | 74 + 502.html | 74 + application/akszadmin/controller/Article.php | 140 + .../akszadmin/controller/ArticleType.php | 113 + application/akszadmin/controller/Auth.php | 180 + application/akszadmin/controller/Bank.php | 100 + application/akszadmin/controller/Cash.php | 131 + application/akszadmin/controller/Config.php | 130 + application/akszadmin/controller/Finance.php | 63 + application/akszadmin/controller/Goods.php | 171 + application/akszadmin/controller/Index.php | 311 + application/akszadmin/controller/Info.php | 109 + application/akszadmin/controller/Invest.php | 64 + .../akszadmin/controller/InvestList.php | 65 + application/akszadmin/controller/Item.php | 132 + .../akszadmin/controller/ItemClass.php | 121 + application/akszadmin/controller/Login.php | 119 + application/akszadmin/controller/Mall.php | 116 + .../akszadmin/controller/MallInvest.php | 61 + .../akszadmin/controller/MallInvestList.php | 65 + application/akszadmin/controller/Member.php | 93 + application/akszadmin/controller/Menu.php | 160 + application/akszadmin/controller/Msg.php | 121 + application/akszadmin/controller/Oplog.php | 94 + application/akszadmin/controller/Order.php | 130 + application/akszadmin/controller/OrderLog.php | 50 + application/akszadmin/controller/Prize.php | 49 + .../akszadmin/controller/PrizeList.php | 89 + application/akszadmin/controller/Queue.php | 144 + application/akszadmin/controller/Recharge.php | 175 + application/akszadmin/controller/Shop.php | 116 + .../akszadmin/controller/ShopOrder.php | 62 + application/akszadmin/controller/Slide.php | 103 + application/akszadmin/controller/Sms.php | 90 + application/akszadmin/controller/User.php | 202 + application/akszadmin/controller/Users.php | 281 + application/akszadmin/controller/Yuebao.php | 220 + .../akszadmin/controller/api/Plugs.php | 150 + .../akszadmin/controller/api/Update.php | 60 + application/akszadmin/model/Item.php | 53 + application/akszadmin/model/Users.php | 48 + application/akszadmin/sys.php | 195 + .../akszadmin/view/api/plugs/icon.html | 3659 ++++ application/akszadmin/view/article/form.html | 92 + application/akszadmin/view/article/index.html | 88 + .../akszadmin/view/article/index_search.html | 33 + .../view/article_type/class_search.html | 15 + .../akszadmin/view/article_type/form.html | 32 + .../akszadmin/view/article_type/index.html | 61 + application/akszadmin/view/auth/apply.html | 116 + application/akszadmin/view/auth/form.html | 30 + application/akszadmin/view/auth/index.html | 80 + .../akszadmin/view/auth/index_search.html | 42 + application/akszadmin/view/bank/form.html | 24 + application/akszadmin/view/bank/index.html | 69 + .../akszadmin/view/bank/index_search.html | 27 + application/akszadmin/view/cash/edit.html | 50 + application/akszadmin/view/cash/index.html | 122 + .../akszadmin/view/cash/index_search.html | 41 + application/akszadmin/view/config/info.html | 88 + .../akszadmin/view/config/storage-local.html | 20 + .../akszadmin/view/config/storage-oss.html | 80 + .../akszadmin/view/config/storage-qiniu.html | 80 + .../akszadmin/view/config/system-config.html | 28 + application/akszadmin/view/finance/index.html | 65 + .../akszadmin/view/finance/index_search.html | 47 + application/akszadmin/view/goods/form.html | 218 + application/akszadmin/view/goods/index.html | 97 + .../akszadmin/view/goods/index_search.html | 15 + application/akszadmin/view/goods/risk.html | 86 + application/akszadmin/view/index/index.html | 242 + application/akszadmin/view/index/main.html | 200 + application/akszadmin/view/info/form.html | 285 + application/akszadmin/view/info/img.html | 202 + application/akszadmin/view/info/pay.html | 329 + application/akszadmin/view/info/reward.html | 94 + application/akszadmin/view/invest/index.html | 51 + .../akszadmin/view/invest/index_search.html | 49 + .../akszadmin/view/invest_list/index.html | 43 + .../view/invest_list/index_search.html | 30 + application/akszadmin/view/item/form.html | 236 + application/akszadmin/view/item/index.html | 81 + .../akszadmin/view/item/index_search.html | 45 + .../view/item_class/class_search.html | 15 + .../akszadmin/view/item_class/form.html | 47 + .../akszadmin/view/item_class/index.html | 62 + application/akszadmin/view/login/index.html | 57 + application/akszadmin/view/main.html | 11 + application/akszadmin/view/mall/form.html | 118 + application/akszadmin/view/mall/index.html | 77 + .../akszadmin/view/mall/index_search.html | 15 + .../akszadmin/view/mall_invest/index.html | 50 + .../view/mall_invest/index_search.html | 27 + .../view/mall_invest_list/index.html | 43 + .../view/mall_invest_list/index_search.html | 30 + application/akszadmin/view/member/form.html | 35 + application/akszadmin/view/member/index.html | 60 + application/akszadmin/view/menu/form.html | 89 + application/akszadmin/view/menu/index.html | 80 + application/akszadmin/view/msg/form.html | 72 + application/akszadmin/view/msg/index.html | 75 + .../akszadmin/view/msg/index_search.html | 21 + application/akszadmin/view/oplog/index.html | 68 + .../akszadmin/view/oplog/index_search.html | 56 + application/akszadmin/view/order/edits.html | 95 + application/akszadmin/view/order/form.html | 71 + application/akszadmin/view/order/index.html | 170 + .../akszadmin/view/order/index_search.html | 29 + .../akszadmin/view/order_log/index.html | 53 + .../view/order_log/index_search.html | 21 + application/akszadmin/view/prize/form.html | 270 + .../akszadmin/view/prize_list/form.html | 50 + .../akszadmin/view/prize_list/index.html | 72 + .../view/prize_list/index_search.html | 35 + application/akszadmin/view/queue/index.html | 94 + .../akszadmin/view/queue/index_search.html | 70 + application/akszadmin/view/recharge/edit.html | 58 + application/akszadmin/view/recharge/form.html | 50 + .../akszadmin/view/recharge/index.html | 83 + .../akszadmin/view/recharge/index_search.html | 71 + application/akszadmin/view/shop/form.html | 91 + application/akszadmin/view/shop/index.html | 90 + .../akszadmin/view/shop/index_search.html | 15 + .../akszadmin/view/shop_order/index.html | 69 + .../view/shop_order/index_search.html | 35 + application/akszadmin/view/slide/form.html | 52 + application/akszadmin/view/slide/index.html | 85 + .../akszadmin/view/sms/class_search.html | 15 + application/akszadmin/view/sms/form.html | 32 + application/akszadmin/view/sms/index.html | 53 + application/akszadmin/view/user/form.html | 73 + application/akszadmin/view/user/index.html | 77 + .../akszadmin/view/user/index_search.html | 57 + application/akszadmin/view/user/pass.html | 57 + application/akszadmin/view/user/suffix.html | 17 + application/akszadmin/view/users/form.html | 74 + application/akszadmin/view/users/index.html | 123 + .../akszadmin/view/users/index_search.html | 88 + .../akszadmin/view/users/relation_search.html | 29 + application/akszadmin/view/users/review.html | 55 + .../akszadmin/view/users/user_relation.html | 54 + application/akszadmin/view/yuebao/index.html | 217 + application/akszadmin/view/yuebao/lists.html | 157 + application/common.php | 26 + application/index/controller/Base.php | 21 + application/index/controller/Index.php | 1894 ++ application/index/controller/Login.php | 158 + application/index/controller/Plugs.php | 137 + application/index/controller/Test.php | 64 + application/index/controller/User.php | 1416 ++ application/index/controller/api/Index.php | 1580 ++ application/index/controller/api/Login.php | 132 + application/index/controller/api/User.php | 1410 ++ application/index/controller/code.txt | 20 + application/index/service/IndexService.php | 23 + application/index/sys.php | 1163 ++ application/index/view/index/about.html | 93 + .../index/view/index/about_details.html | 23 + application/index/view/index/about_list.html | 79 + application/index/view/index/calculator.html | 323 + application/index/view/index/ex_lists.html | 287 + .../index/view/index/expirefutures.html | 285 + application/index/view/index/form.html | 658 + application/index/view/index/futureslist.html | 152 + application/index/view/index/goods.html | 806 + application/index/view/index/home.html | 215 + application/index/view/index/index.html | 170 + application/index/view/index/item.html | 243 + application/index/view/index/lists.html | 286 + application/index/view/index/mall.html | 226 + application/index/view/index/mall_detail.html | 271 + application/index/view/index/mall_form.html | 516 + application/index/view/index/msg_view.html | 25 + application/index/view/index/my_news.html | 124 + application/index/view/index/new_index.html | 87 + .../index/view/index/normalfutures.html | 286 + application/index/view/index/notice.html | 36 + application/index/view/index/prize.html | 131 + application/index/view/index/prize_list.html | 108 + application/index/view/index/shop.html | 68 + .../index/view/index/shop_details.html | 143 + application/index/view/index/shop_order.html | 37 + application/index/view/login/index.html | 110 + application/index/view/login/reg.html | 192 + application/index/view/public/footer.html | 38 + application/index/view/public/header.html | 20 + application/index/view/public/header1.html | 9 + application/index/view/user/account.html | 231 + application/index/view/user/add_card.html | 100 + application/index/view/user/alipay.html | 125 + application/index/view/user/bank.html | 564 + application/index/view/user/bank_card.html | 44 + application/index/view/user/cash.html | 156 + application/index/view/user/cash_record.html | 71 + .../index/view/user/certification.html | 103 + application/index/view/user/contract.html | 80 + application/index/view/user/details.html | 55 + application/index/view/user/extend.html | 182 + application/index/view/user/fund.html | 43 + application/index/view/user/hold.html | 166 + application/index/view/user/index.html | 193 + application/index/view/user/inquiries.html | 45 + application/index/view/user/interest.html | 185 + application/index/view/user/invest.html | 185 + .../index/view/user/mall_contract.html | 88 + application/index/view/user/msg.html | 48 + application/index/view/user/msg_view.html | 25 + application/index/view/user/pwd_login.html | 98 + application/index/view/user/pwd_pay.html | 98 + application/index/view/user/recharge.html | 146 + .../index/view/user/recharge_record.html | 65 + application/index/view/user/recommend.html | 227 + application/index/view/user/scan.html | 42 + application/index/view/user/set_account.html | 38 + application/index/view/user/trade.html | 679 + application/index/view/user/verified.html | 244 + application/index/view/user/wallet.html | 148 + application/index/view/user/yeb.html | 244 + application/lang/en.json | 1 + application/lang/fr.json | 1 + application/lang/ko.json | 1 + application/lang/pt.json | 1 + application/lang/th.json | 1 + application/lang/tr.json | 1 + application/lang/vi.json | 1 + application/lang/zh-cn.json | 50 + build.php | 26 + config/app.php | 31 + config/cookie.php | 25 + config/database.php | 35 + config/log.php | 27 + config/session.php | 26 + config/template.php | 30 + config/wechat.php | 28 + db/0302-2_20250306_112456.sql.gz | Bin 0 -> 295826 bytes db/wp_amazonhub_sit_20230208_224851.sql.gz | Bin 0 -> 35607 bytes extend/ExtendException.php | 21 + extend/GdImageClass.php | 220 + index.html | 55 + nodejs/String-ext.js | 38 + nodejs/data.js | 99 + nodejs/node_modules/cron-parser/.idea/.name | 1 + .../cron-parser/.idea/cron-parser.iml | 8 + .../cron-parser/.idea/encodings.xml | 6 + .../cron-parser/.idea/jsLibraryMappings.xml | 6 + .../cron-parser/.idea/modules.xml | 8 + nodejs/node_modules/cron-parser/.idea/vcs.xml | 6 + .../cron-parser/.idea/workspace.xml | 363 + nodejs/node_modules/cron-parser/.travis.yml | 8 + nodejs/node_modules/cron-parser/LICENSE | 21 + nodejs/node_modules/cron-parser/README.md | 129 + .../node_modules/cron-parser/component.json | 11 + nodejs/node_modules/cron-parser/lib/date.js | 209 + .../cron-parser/lib/expression.js | 737 + .../node_modules/cron-parser/lib/index.d.ts | 97 + nodejs/node_modules/cron-parser/lib/parser.js | 103 + nodejs/node_modules/cron-parser/package.json | 136 + .../cron-parser/test/31_of_month.js | 17 + nodejs/node_modules/cron-parser/test/bug.js | 32 + .../cron-parser/test/crontab.example | 7 + .../cron-parser/test/expression.js | 1009 ++ .../test/increment_on_first_iteration.js | 22 + .../node_modules/cron-parser/test/parser.js | 59 + .../node_modules/cron-parser/test/timezone.js | 379 + .../define-properties/.editorconfig | 13 + .../node_modules/define-properties/.eslintrc | 12 + .../node_modules/define-properties/.jscs.json | 175 + .../define-properties/.travis.yml | 233 + .../define-properties/CHANGELOG.md | 44 + nodejs/node_modules/define-properties/LICENSE | 21 + .../node_modules/define-properties/README.md | 86 + .../node_modules/define-properties/index.js | 58 + .../define-properties/package.json | 99 + .../define-properties/test/index.js | 125 + .../double-ended-queue/.npmignore | 31 + .../double-ended-queue/Gruntfile.js | 188 + .../node_modules/double-ended-queue/LICENSE | 19 + .../node_modules/double-ended-queue/README.md | 293 + .../double-ended-queue/js/deque.js | 275 + .../double-ended-queue/package.json | 71 + nodejs/node_modules/is-nan/.eslintrc | 9 + nodejs/node_modules/is-nan/.jscs.json | 124 + nodejs/node_modules/is-nan/.npmignore | 15 + nodejs/node_modules/is-nan/.travis.yml | 49 + nodejs/node_modules/is-nan/CHANGELOG.md | 27 + nodejs/node_modules/is-nan/LICENSE | 20 + nodejs/node_modules/is-nan/README.md | 56 + nodejs/node_modules/is-nan/implementation.js | 7 + nodejs/node_modules/is-nan/index.js | 17 + nodejs/node_modules/is-nan/package.json | 104 + nodejs/node_modules/is-nan/polyfill.js | 10 + nodejs/node_modules/is-nan/shim.js | 12 + nodejs/node_modules/is-nan/test/index.js | 10 + nodejs/node_modules/is-nan/test/shimmed.js | 28 + nodejs/node_modules/is-nan/test/tests.js | 36 + nodejs/node_modules/long-timeout/README.md | 32 + nodejs/node_modules/long-timeout/example.js | 23 + nodejs/node_modules/long-timeout/index.js | 101 + nodejs/node_modules/long-timeout/package.json | 54 + nodejs/node_modules/moment-timezone/LICENSE | 20 + nodejs/node_modules/moment-timezone/README.md | 36 + .../moment-timezone-with-data-2012-2022.js | 1212 ++ ...moment-timezone-with-data-2012-2022.min.js | 1 + .../builds/moment-timezone-with-data.js | 1212 ++ .../builds/moment-timezone-with-data.min.js | 1 + .../builds/moment-timezone.min.js | 1 + .../node_modules/moment-timezone/changelog.md | 178 + .../moment-timezone/composer.json | 43 + .../moment-timezone/data/meta/latest.json | 5118 ++++++ .../moment-timezone/data/packed/latest.json | 599 + nodejs/node_modules/moment-timezone/index.js | 2 + .../moment-timezone/moment-timezone-utils.js | 318 + .../moment-timezone/moment-timezone.js | 613 + .../node_modules/moment-timezone/package.json | 84 + nodejs/node_modules/moment/CHANGELOG.md | 875 + nodejs/node_modules/moment/LICENSE | 22 + nodejs/node_modules/moment/README.md | 64 + nodejs/node_modules/moment/ender.js | 1 + nodejs/node_modules/moment/locale/af.js | 72 + nodejs/node_modules/moment/locale/ar-dz.js | 58 + nodejs/node_modules/moment/locale/ar-kw.js | 58 + nodejs/node_modules/moment/locale/ar-ly.js | 121 + nodejs/node_modules/moment/locale/ar-ma.js | 58 + nodejs/node_modules/moment/locale/ar-sa.js | 103 + nodejs/node_modules/moment/locale/ar-tn.js | 58 + nodejs/node_modules/moment/locale/ar.js | 134 + nodejs/node_modules/moment/locale/az.js | 104 + nodejs/node_modules/moment/locale/be.js | 131 + nodejs/node_modules/moment/locale/bg.js | 89 + nodejs/node_modules/moment/locale/bm.js | 57 + nodejs/node_modules/moment/locale/bn.js | 118 + nodejs/node_modules/moment/locale/bo.js | 118 + nodejs/node_modules/moment/locale/br.js | 107 + nodejs/node_modules/moment/locale/bs.js | 150 + nodejs/node_modules/moment/locale/ca.js | 87 + nodejs/node_modules/moment/locale/cs.js | 178 + nodejs/node_modules/moment/locale/cv.js | 62 + nodejs/node_modules/moment/locale/cy.js | 79 + nodejs/node_modules/moment/locale/da.js | 59 + nodejs/node_modules/moment/locale/de-at.js | 75 + nodejs/node_modules/moment/locale/de-ch.js | 75 + nodejs/node_modules/moment/locale/de.js | 75 + nodejs/node_modules/moment/locale/dv.js | 98 + nodejs/node_modules/moment/locale/el.js | 99 + nodejs/node_modules/moment/locale/en-au.js | 66 + nodejs/node_modules/moment/locale/en-ca.js | 62 + nodejs/node_modules/moment/locale/en-gb.js | 66 + nodejs/node_modules/moment/locale/en-ie.js | 66 + nodejs/node_modules/moment/locale/en-il.js | 61 + nodejs/node_modules/moment/locale/en-nz.js | 66 + nodejs/node_modules/moment/locale/eo.js | 70 + nodejs/node_modules/moment/locale/es-do.js | 91 + nodejs/node_modules/moment/locale/es-us.js | 82 + nodejs/node_modules/moment/locale/es.js | 91 + nodejs/node_modules/moment/locale/et.js | 79 + nodejs/node_modules/moment/locale/eu.js | 65 + nodejs/node_modules/moment/locale/fa.js | 105 + nodejs/node_modules/moment/locale/fi.js | 108 + nodejs/node_modules/moment/locale/fo.js | 59 + nodejs/node_modules/moment/locale/fr-ca.js | 73 + nodejs/node_modules/moment/locale/fr-ch.js | 77 + nodejs/node_modules/moment/locale/fr.js | 82 + nodejs/node_modules/moment/locale/fy.js | 74 + nodejs/node_modules/moment/locale/gd.js | 75 + nodejs/node_modules/moment/locale/gl.js | 76 + nodejs/node_modules/moment/locale/gom-latn.js | 122 + nodejs/node_modules/moment/locale/gu.js | 123 + nodejs/node_modules/moment/locale/he.js | 96 + nodejs/node_modules/moment/locale/hi.js | 123 + nodejs/node_modules/moment/locale/hr.js | 153 + nodejs/node_modules/moment/locale/hu.js | 109 + nodejs/node_modules/moment/locale/hy-am.js | 94 + nodejs/node_modules/moment/locale/id.js | 81 + nodejs/node_modules/moment/locale/is.js | 131 + nodejs/node_modules/moment/locale/it.js | 68 + nodejs/node_modules/moment/locale/ja.js | 91 + nodejs/node_modules/moment/locale/jv.js | 81 + nodejs/node_modules/moment/locale/ka.js | 88 + nodejs/node_modules/moment/locale/kk.js | 86 + nodejs/node_modules/moment/locale/km.js | 109 + nodejs/node_modules/moment/locale/kn.js | 125 + nodejs/node_modules/moment/locale/ko.js | 80 + nodejs/node_modules/moment/locale/ky.js | 86 + nodejs/node_modules/moment/locale/lb.js | 135 + nodejs/node_modules/moment/locale/lo.js | 69 + nodejs/node_modules/moment/locale/lt.js | 117 + nodejs/node_modules/moment/locale/lv.js | 96 + nodejs/node_modules/moment/locale/me.js | 111 + nodejs/node_modules/moment/locale/mi.js | 63 + nodejs/node_modules/moment/locale/mk.js | 89 + nodejs/node_modules/moment/locale/ml.js | 80 + nodejs/node_modules/moment/locale/mn.js | 103 + nodejs/node_modules/moment/locale/mr.js | 159 + nodejs/node_modules/moment/locale/ms-my.js | 81 + nodejs/node_modules/moment/locale/ms.js | 81 + nodejs/node_modules/moment/locale/mt.js | 59 + nodejs/node_modules/moment/locale/my.js | 92 + nodejs/node_modules/moment/locale/nb.js | 61 + nodejs/node_modules/moment/locale/ne.js | 122 + nodejs/node_modules/moment/locale/nl-be.js | 86 + nodejs/node_modules/moment/locale/nl.js | 86 + nodejs/node_modules/moment/locale/nn.js | 59 + nodejs/node_modules/moment/locale/pa-in.js | 123 + nodejs/node_modules/moment/locale/pl.js | 125 + nodejs/node_modules/moment/locale/pt-br.js | 60 + nodejs/node_modules/moment/locale/pt.js | 64 + nodejs/node_modules/moment/locale/ro.js | 74 + nodejs/node_modules/moment/locale/ru.js | 181 + nodejs/node_modules/moment/locale/sd.js | 97 + nodejs/node_modules/moment/locale/se.js | 59 + nodejs/node_modules/moment/locale/si.js | 70 + nodejs/node_modules/moment/locale/sk.js | 155 + nodejs/node_modules/moment/locale/sl.js | 172 + nodejs/node_modules/moment/locale/sq.js | 67 + nodejs/node_modules/moment/locale/sr-cyrl.js | 110 + nodejs/node_modules/moment/locale/sr.js | 110 + nodejs/node_modules/moment/locale/ss.js | 87 + nodejs/node_modules/moment/locale/sv.js | 68 + nodejs/node_modules/moment/locale/sw.js | 58 + nodejs/node_modules/moment/locale/ta.js | 128 + nodejs/node_modules/moment/locale/te.js | 88 + nodejs/node_modules/moment/locale/tet.js | 66 + nodejs/node_modules/moment/locale/tg.js | 115 + nodejs/node_modules/moment/locale/th.js | 66 + nodejs/node_modules/moment/locale/tl-ph.js | 61 + nodejs/node_modules/moment/locale/tlh.js | 121 + nodejs/node_modules/moment/locale/tr.js | 93 + nodejs/node_modules/moment/locale/tzl.js | 90 + nodejs/node_modules/moment/locale/tzm-latn.js | 57 + nodejs/node_modules/moment/locale/tzm.js | 57 + nodejs/node_modules/moment/locale/ug-cn.js | 118 + nodejs/node_modules/moment/locale/uk.js | 150 + nodejs/node_modules/moment/locale/ur.js | 97 + nodejs/node_modules/moment/locale/uz-latn.js | 57 + nodejs/node_modules/moment/locale/uz.js | 57 + nodejs/node_modules/moment/locale/vi.js | 78 + nodejs/node_modules/moment/locale/x-pseudo.js | 67 + nodejs/node_modules/moment/locale/yo.js | 59 + nodejs/node_modules/moment/locale/zh-cn.js | 109 + nodejs/node_modules/moment/locale/zh-hk.js | 102 + nodejs/node_modules/moment/locale/zh-tw.js | 102 + nodejs/node_modules/moment/min/locales.js | 9889 +++++++++++ nodejs/node_modules/moment/min/locales.min.js | 1 + .../moment/min/moment-with-locales.js | 14380 ++++++++++++++++ .../moment/min/moment-with-locales.min.js | 1 + nodejs/node_modules/moment/min/moment.min.js | 1 + nodejs/node_modules/moment/moment.d.ts | 734 + nodejs/node_modules/moment/moment.js | 4506 +++++ nodejs/node_modules/moment/package.js | 11 + nodejs/node_modules/moment/package.json | 150 + .../moment/src/lib/create/check-overflow.js | 34 + .../moment/src/lib/create/date-from-array.js | 21 + .../moment/src/lib/create/from-anything.js | 110 + .../moment/src/lib/create/from-array.js | 147 + .../moment/src/lib/create/from-object.js | 16 + .../src/lib/create/from-string-and-array.js | 50 + .../src/lib/create/from-string-and-format.js | 113 + .../moment/src/lib/create/from-string.js | 230 + .../moment/src/lib/create/local.js | 5 + .../moment/src/lib/create/parsing-flags.js | 26 + .../node_modules/moment/src/lib/create/utc.js | 5 + .../moment/src/lib/create/valid.js | 50 + .../moment/src/lib/duration/abs.js | 18 + .../moment/src/lib/duration/add-subtract.js | 21 + .../moment/src/lib/duration/as.js | 61 + .../moment/src/lib/duration/bubble.js | 61 + .../moment/src/lib/duration/clone.js | 6 + .../moment/src/lib/duration/constructor.js | 44 + .../moment/src/lib/duration/create.js | 122 + .../moment/src/lib/duration/duration.js | 16 + .../moment/src/lib/duration/get.js | 25 + .../moment/src/lib/duration/humanize.js | 85 + .../moment/src/lib/duration/iso-string.js | 64 + .../moment/src/lib/duration/prototype.js | 52 + .../moment/src/lib/duration/valid.js | 36 + .../moment/src/lib/format/format.js | 92 + .../moment/src/lib/locale/base-config.js | 44 + .../moment/src/lib/locale/calendar.js | 15 + .../moment/src/lib/locale/constructor.js | 5 + .../node_modules/moment/src/lib/locale/en.js | 15 + .../moment/src/lib/locale/formats.js | 23 + .../moment/src/lib/locale/invalid.js | 5 + .../moment/src/lib/locale/lists.js | 93 + .../moment/src/lib/locale/locale.js | 39 + .../moment/src/lib/locale/locales.js | 197 + .../moment/src/lib/locale/ordinal.js | 7 + .../moment/src/lib/locale/pre-post-format.js | 3 + .../moment/src/lib/locale/prototype.js | 69 + .../moment/src/lib/locale/relative.js | 30 + .../node_modules/moment/src/lib/locale/set.js | 49 + .../moment/src/lib/moment/add-subtract.js | 55 + .../moment/src/lib/moment/calendar.js | 26 + .../moment/src/lib/moment/clone.js | 5 + .../moment/src/lib/moment/compare.js | 59 + .../moment/src/lib/moment/constructor.js | 77 + .../moment/src/lib/moment/creation-data.js | 9 + .../moment/src/lib/moment/diff.js | 58 + .../moment/src/lib/moment/format.js | 62 + .../moment/src/lib/moment/from.js | 17 + .../moment/src/lib/moment/get-set.js | 61 + .../moment/src/lib/moment/locale.js | 34 + .../moment/src/lib/moment/min-max.js | 63 + .../moment/src/lib/moment/moment.js | 28 + .../node_modules/moment/src/lib/moment/now.js | 3 + .../moment/src/lib/moment/prototype.js | 150 + .../moment/src/lib/moment/start-end-of.js | 59 + .../moment/src/lib/moment/to-type.js | 34 + .../node_modules/moment/src/lib/moment/to.js | 17 + .../moment/src/lib/moment/valid.js | 15 + .../moment/src/lib/parse/regex.js | 54 + .../moment/src/lib/parse/token.js | 33 + .../moment/src/lib/units/aliases.js | 30 + .../moment/src/lib/units/constants.js | 9 + .../moment/src/lib/units/day-of-month.js | 39 + .../moment/src/lib/units/day-of-week.js | 364 + .../moment/src/lib/units/day-of-year.js | 36 + .../node_modules/moment/src/lib/units/hour.js | 144 + .../moment/src/lib/units/millisecond.js | 69 + .../moment/src/lib/units/minute.js | 29 + .../moment/src/lib/units/month.js | 290 + .../moment/src/lib/units/offset.js | 235 + .../moment/src/lib/units/priorities.js | 16 + .../moment/src/lib/units/quarter.js | 32 + .../moment/src/lib/units/second.js | 29 + .../moment/src/lib/units/timestamp.js | 20 + .../moment/src/lib/units/timezone.js | 16 + .../moment/src/lib/units/units.js | 20 + .../src/lib/units/week-calendar-utils.js | 65 + .../moment/src/lib/units/week-year.js | 107 + .../node_modules/moment/src/lib/units/week.js | 67 + .../node_modules/moment/src/lib/units/year.js | 75 + .../moment/src/lib/utils/abs-ceil.js | 7 + .../moment/src/lib/utils/abs-floor.js | 8 + .../moment/src/lib/utils/abs-round.js | 7 + .../moment/src/lib/utils/compare-arrays.js | 16 + .../moment/src/lib/utils/defaults.js | 10 + .../moment/src/lib/utils/deprecate.js | 55 + .../moment/src/lib/utils/extend.js | 19 + .../moment/src/lib/utils/has-own-prop.js | 3 + .../moment/src/lib/utils/hooks.js | 13 + .../moment/src/lib/utils/index-of.js | 18 + .../moment/src/lib/utils/is-array.js | 3 + .../moment/src/lib/utils/is-date.js | 3 + .../moment/src/lib/utils/is-function.js | 3 + .../moment/src/lib/utils/is-number.js | 3 + .../moment/src/lib/utils/is-object-empty.js | 13 + .../moment/src/lib/utils/is-object.js | 5 + .../moment/src/lib/utils/is-undefined.js | 3 + .../node_modules/moment/src/lib/utils/keys.js | 19 + .../node_modules/moment/src/lib/utils/map.js | 7 + .../node_modules/moment/src/lib/utils/mod.js | 3 + .../node_modules/moment/src/lib/utils/some.js | 19 + .../moment/src/lib/utils/to-int.js | 12 + .../moment/src/lib/utils/zero-fill.js | 7 + nodejs/node_modules/moment/src/locale/af.js | 64 + .../node_modules/moment/src/locale/ar-dz.js | 51 + .../node_modules/moment/src/locale/ar-kw.js | 50 + .../node_modules/moment/src/locale/ar-ly.js | 113 + .../node_modules/moment/src/locale/ar-ma.js | 52 + .../node_modules/moment/src/locale/ar-sa.js | 96 + .../node_modules/moment/src/locale/ar-tn.js | 51 + nodejs/node_modules/moment/src/locale/ar.js | 128 + nodejs/node_modules/moment/src/locale/az.js | 97 + nodejs/node_modules/moment/src/locale/be.js | 126 + nodejs/node_modules/moment/src/locale/bg.js | 82 + nodejs/node_modules/moment/src/locale/bm.js | 50 + nodejs/node_modules/moment/src/locale/bn.js | 110 + nodejs/node_modules/moment/src/locale/bo.js | 111 + nodejs/node_modules/moment/src/locale/br.js | 100 + nodejs/node_modules/moment/src/locale/bs.js | 143 + nodejs/node_modules/moment/src/locale/ca.js | 80 + nodejs/node_modules/moment/src/locale/cs.js | 171 + nodejs/node_modules/moment/src/locale/cv.js | 54 + nodejs/node_modules/moment/src/locale/cy.js | 73 + nodejs/node_modules/moment/src/locale/da.js | 51 + .../node_modules/moment/src/locale/de-at.js | 70 + .../node_modules/moment/src/locale/de-ch.js | 69 + nodejs/node_modules/moment/src/locale/de.js | 69 + nodejs/node_modules/moment/src/locale/dv.js | 90 + nodejs/node_modules/moment/src/locale/el.js | 89 + .../node_modules/moment/src/locale/en-au.js | 59 + .../node_modules/moment/src/locale/en-ca.js | 54 + .../node_modules/moment/src/locale/en-gb.js | 59 + .../node_modules/moment/src/locale/en-ie.js | 59 + .../node_modules/moment/src/locale/en-il.js | 54 + .../node_modules/moment/src/locale/en-nz.js | 58 + nodejs/node_modules/moment/src/locale/eo.js | 65 + .../node_modules/moment/src/locale/es-do.js | 83 + .../node_modules/moment/src/locale/es-us.js | 74 + nodejs/node_modules/moment/src/locale/es.js | 83 + nodejs/node_modules/moment/src/locale/et.js | 73 + nodejs/node_modules/moment/src/locale/eu.js | 58 + nodejs/node_modules/moment/src/locale/fa.js | 98 + nodejs/node_modules/moment/src/locale/fi.js | 101 + nodejs/node_modules/moment/src/locale/fo.js | 52 + .../node_modules/moment/src/locale/fr-ca.js | 66 + .../node_modules/moment/src/locale/fr-ch.js | 70 + nodejs/node_modules/moment/src/locale/fr.js | 75 + nodejs/node_modules/moment/src/locale/fy.js | 67 + nodejs/node_modules/moment/src/locale/gd.js | 68 + nodejs/node_modules/moment/src/locale/gl.js | 69 + .../moment/src/locale/gom-latn.js | 114 + nodejs/node_modules/moment/src/locale/gu.js | 115 + nodejs/node_modules/moment/src/locale/he.js | 91 + nodejs/node_modules/moment/src/locale/hi.js | 116 + nodejs/node_modules/moment/src/locale/hr.js | 145 + nodejs/node_modules/moment/src/locale/hu.js | 103 + .../node_modules/moment/src/locale/hy-am.js | 87 + nodejs/node_modules/moment/src/locale/id.js | 74 + nodejs/node_modules/moment/src/locale/is.js | 124 + nodejs/node_modules/moment/src/locale/it.js | 62 + nodejs/node_modules/moment/src/locale/ja.js | 84 + nodejs/node_modules/moment/src/locale/jv.js | 74 + nodejs/node_modules/moment/src/locale/ka.js | 81 + nodejs/node_modules/moment/src/locale/kk.js | 78 + nodejs/node_modules/moment/src/locale/km.js | 101 + nodejs/node_modules/moment/src/locale/kn.js | 117 + nodejs/node_modules/moment/src/locale/ko.js | 74 + nodejs/node_modules/moment/src/locale/ky.js | 79 + nodejs/node_modules/moment/src/locale/lb.js | 129 + nodejs/node_modules/moment/src/locale/lo.js | 62 + nodejs/node_modules/moment/src/locale/lt.js | 110 + nodejs/node_modules/moment/src/locale/lv.js | 90 + nodejs/node_modules/moment/src/locale/me.js | 103 + nodejs/node_modules/moment/src/locale/mi.js | 55 + nodejs/node_modules/moment/src/locale/mk.js | 82 + nodejs/node_modules/moment/src/locale/ml.js | 73 + nodejs/node_modules/moment/src/locale/mn.js | 96 + nodejs/node_modules/moment/src/locale/mr.js | 153 + .../node_modules/moment/src/locale/ms-my.js | 75 + nodejs/node_modules/moment/src/locale/ms.js | 74 + nodejs/node_modules/moment/src/locale/mt.js | 51 + nodejs/node_modules/moment/src/locale/my.js | 87 + nodejs/node_modules/moment/src/locale/nb.js | 55 + nodejs/node_modules/moment/src/locale/ne.js | 115 + .../node_modules/moment/src/locale/nl-be.js | 80 + nodejs/node_modules/moment/src/locale/nl.js | 80 + nodejs/node_modules/moment/src/locale/nn.js | 52 + .../node_modules/moment/src/locale/pa-in.js | 116 + nodejs/node_modules/moment/src/locale/pl.js | 117 + .../node_modules/moment/src/locale/pt-br.js | 53 + nodejs/node_modules/moment/src/locale/pt.js | 57 + nodejs/node_modules/moment/src/locale/ro.js | 68 + nodejs/node_modules/moment/src/locale/ru.js | 175 + nodejs/node_modules/moment/src/locale/sd.js | 89 + nodejs/node_modules/moment/src/locale/se.js | 52 + nodejs/node_modules/moment/src/locale/si.js | 62 + nodejs/node_modules/moment/src/locale/sk.js | 149 + nodejs/node_modules/moment/src/locale/sl.js | 164 + nodejs/node_modules/moment/src/locale/sq.js | 62 + .../node_modules/moment/src/locale/sr-cyrl.js | 102 + nodejs/node_modules/moment/src/locale/sr.js | 102 + nodejs/node_modules/moment/src/locale/ss.js | 81 + nodejs/node_modules/moment/src/locale/sv.js | 61 + nodejs/node_modules/moment/src/locale/sw.js | 51 + nodejs/node_modules/moment/src/locale/ta.js | 121 + nodejs/node_modules/moment/src/locale/te.js | 80 + nodejs/node_modules/moment/src/locale/tet.js | 60 + nodejs/node_modules/moment/src/locale/tg.js | 107 + nodejs/node_modules/moment/src/locale/th.js | 58 + .../node_modules/moment/src/locale/tl-ph.js | 54 + nodejs/node_modules/moment/src/locale/tlh.js | 113 + nodejs/node_modules/moment/src/locale/tr.js | 90 + nodejs/node_modules/moment/src/locale/tzl.js | 84 + .../moment/src/locale/tzm-latn.js | 50 + nodejs/node_modules/moment/src/locale/tzm.js | 50 + .../node_modules/moment/src/locale/ug-cn.js | 110 + nodejs/node_modules/moment/src/locale/uk.js | 144 + nodejs/node_modules/moment/src/locale/ur.js | 90 + .../node_modules/moment/src/locale/uz-latn.js | 50 + nodejs/node_modules/moment/src/locale/uz.js | 50 + nodejs/node_modules/moment/src/locale/vi.js | 71 + .../moment/src/locale/x-pseudo.js | 59 + nodejs/node_modules/moment/src/locale/yo.js | 51 + .../node_modules/moment/src/locale/zh-cn.js | 102 + .../node_modules/moment/src/locale/zh-hk.js | 96 + .../node_modules/moment/src/locale/zh-tw.js | 95 + nodejs/node_modules/moment/src/moment.js | 95 + nodejs/node_modules/node-schedule/.eslintrc | 17 + nodejs/node_modules/node-schedule/.travis.yml | 15 + .../node-schedule/CONTRIBUTING.md | 31 + nodejs/node_modules/node-schedule/LICENSE | 19 + nodejs/node_modules/node-schedule/README.md | 256 + .../node-schedule/lib/schedule.js | 648 + .../node_modules/node-schedule/package.json | 70 + .../node_modules/node-schedule/test/.eslintrc | 5 + .../test/cancel-long-running-jobs.js | 24 + .../test/convenience-method-test.js | 713 + .../test/date-convenience-methods-test.js | 59 + .../node-schedule/test/es6/job-test.js | 33 + .../node-schedule/test/job-test.js | 517 + .../node-schedule/test/range-test.js | 77 + .../test/recurrence-rule-test.js | 375 + .../node-schedule/test/schedule-cron-jobs.js | 134 + .../node-schedule/test/start-end-test.js | 327 + nodejs/node_modules/object-keys/.editorconfig | 13 + nodejs/node_modules/object-keys/.eslintrc | 17 + nodejs/node_modules/object-keys/.jscs.json | 175 + nodejs/node_modules/object-keys/.travis.yml | 225 + nodejs/node_modules/object-keys/CHANGELOG.md | 220 + nodejs/node_modules/object-keys/LICENSE | 21 + nodejs/node_modules/object-keys/README.md | 76 + nodejs/node_modules/object-keys/index.js | 141 + .../node_modules/object-keys/isArguments.js | 17 + nodejs/node_modules/object-keys/package.json | 122 + nodejs/node_modules/object-keys/test/index.js | 5 + .../node_modules/redis-commands/.travis.yml | 9 + nodejs/node_modules/redis-commands/LICENSE | 22 + nodejs/node_modules/redis-commands/README.md | 51 + .../node_modules/redis-commands/changelog.md | 58 + .../node_modules/redis-commands/commands.json | 1992 +++ nodejs/node_modules/redis-commands/index.js | 155 + .../node_modules/redis-commands/package.json | 72 + .../redis-commands/tools/build.js | 62 + nodejs/node_modules/redis-parser/.npmignore | 15 + nodejs/node_modules/redis-parser/LICENSE | 22 + nodejs/node_modules/redis-parser/README.md | 163 + nodejs/node_modules/redis-parser/changelog.md | 138 + nodejs/node_modules/redis-parser/index.js | 6 + .../node_modules/redis-parser/lib/hiredis.js | 62 + .../node_modules/redis-parser/lib/parser.js | 581 + .../redis-parser/lib/parserError.js | 25 + .../redis-parser/lib/redisError.js | 24 + .../redis-parser/lib/replyError.js | 23 + nodejs/node_modules/redis-parser/package.json | 81 + nodejs/node_modules/redis/.eslintignore | 4 + nodejs/node_modules/redis/.eslintrc | 108 + .../redis/.github/ISSUE_TEMPLATE.md | 15 + .../redis/.github/PULL_REQUEST_TEMPLATE.md | 14 + nodejs/node_modules/redis/.npmignore | 10 + nodejs/node_modules/redis/LICENSE | 24 + nodejs/node_modules/redis/README.md | 965 ++ nodejs/node_modules/redis/changelog.md | 845 + nodejs/node_modules/redis/index.js | 1105 ++ nodejs/node_modules/redis/lib/command.js | 16 + nodejs/node_modules/redis/lib/commands.js | 121 + nodejs/node_modules/redis/lib/createClient.js | 80 + nodejs/node_modules/redis/lib/customErrors.js | 59 + nodejs/node_modules/redis/lib/debug.js | 11 + nodejs/node_modules/redis/lib/extendedApi.js | 113 + .../redis/lib/individualCommands.js | 617 + nodejs/node_modules/redis/lib/multi.js | 187 + nodejs/node_modules/redis/lib/utils.js | 134 + nodejs/node_modules/redis/package.json | 90 + .../sorted-array-functions/.travis.yml | 6 + .../sorted-array-functions/LICENSE | 21 + .../sorted-array-functions/README.md | 71 + .../sorted-array-functions/example.js | 13 + .../sorted-array-functions/index.js | 160 + .../sorted-array-functions/package.json | 55 + .../sorted-array-functions/test.js | 366 + nodejs/package-lock.json | 94 + nodejs/package.json | 87 + public/.gitignore | 2 + public/adminer.php | 874 + public/bignumber.min.js | 1 + public/domissions.php | 100 + public/favicon.ico | Bin 0 -> 3028 bytes public/index.php | 39 + public/push.sh | 3 + public/start.sh | 8 + public/static/admin.js | 820 + public/static/index.a5c69d49.css | 1 + public/static/login.js | 62 + public/static/mp3/cz.mp3 | Bin 0 -> 8928 bytes public/static/mp3/cztx.mp3 | Bin 0 -> 12672 bytes public/static/mp3/order.mp3 | Bin 0 -> 246652 bytes public/static/mp3/tx.mp3 | Bin 0 -> 8496 bytes public/static/myself/my_plugs_files | 0 public/static/plugs/angular/angular.min.js | 337 + public/static/plugs/awesome/fonts.css | 4 + .../plugs/awesome/fonts/FontAwesome.otf | Bin 0 -> 134808 bytes public/static/plugs/awesome/fonts/webfont.eot | Bin 0 -> 165742 bytes public/static/plugs/awesome/fonts/webfont.svg | 2671 +++ public/static/plugs/awesome/fonts/webfont.ttf | Bin 0 -> 165548 bytes .../static/plugs/awesome/fonts/webfont.woff | Bin 0 -> 98024 bytes .../static/plugs/awesome/fonts/webfont.woff2 | Bin 0 -> 77160 bytes public/static/plugs/ckeditor/ckeditor.js | 1349 ++ public/static/plugs/ckeditor/config.js | 75 + public/static/plugs/ckeditor/contents.css | 208 + public/static/plugs/ckeditor/lang/en.js | 5 + public/static/plugs/ckeditor/lang/zh-cn.js | 5 + public/static/plugs/ckeditor/lang/zh.js | 5 + .../plugins/a11yhelp/dialogs/a11yhelp.js | 10 + .../plugins/a11yhelp/dialogs/lang/en.js | 11 + .../plugins/a11yhelp/dialogs/lang/zh-cn.js | 9 + .../plugins/a11yhelp/dialogs/lang/zh.js | 9 + .../ckeditor/plugins/about/dialogs/about.js | 8 + .../about/dialogs/hidpi/logo_ckeditor.png | Bin 0 -> 12236 bytes .../plugins/about/dialogs/logo_ckeditor.png | Bin 0 -> 5650 bytes .../plugins/clipboard/dialogs/paste.js | 11 + .../colordialog/dialogs/colordialog.css | 20 + .../colordialog/dialogs/colordialog.js | 14 + .../cursors/cursor-disabled.svg | 25 + .../plugins/copyformatting/cursors/cursor.svg | 14 + .../copyformatting/styles/copyformatting.css | 45 + .../plugins/dialog/dialogDefinition.js | 4 + .../plugs/ckeditor/plugins/div/dialogs/div.js | 9 + .../ckeditor/plugins/find/dialogs/find.js | 25 + .../ckeditor/plugins/flash/dialogs/flash.js | 24 + .../plugins/flash/images/placeholder.png | Bin 0 -> 256 bytes .../ckeditor/plugins/forms/dialogs/button.js | 8 + .../plugins/forms/dialogs/checkbox.js | 9 + .../ckeditor/plugins/forms/dialogs/form.js | 8 + .../plugins/forms/dialogs/hiddenfield.js | 7 + .../ckeditor/plugins/forms/dialogs/radio.js | 9 + .../ckeditor/plugins/forms/dialogs/select.js | 21 + .../plugins/forms/dialogs/textarea.js | 8 + .../plugins/forms/dialogs/textfield.js | 11 + .../plugins/forms/images/hiddenfield.gif | Bin 0 -> 178 bytes .../static/plugs/ckeditor/plugins/icons.png | Bin 0 -> 12421 bytes .../plugs/ckeditor/plugins/icons_hidpi.png | Bin 0 -> 40265 bytes .../ckeditor/plugins/iframe/dialogs/iframe.js | 10 + .../plugins/iframe/images/placeholder.png | Bin 0 -> 265 bytes .../ckeditor/plugins/image/dialogs/image.js | 44 + .../ckeditor/plugins/image/images/noimage.png | Bin 0 -> 1610 bytes .../ckeditor/plugins/link/dialogs/anchor.js | 8 + .../ckeditor/plugins/link/dialogs/link.js | 30 + .../ckeditor/plugins/link/images/anchor.png | Bin 0 -> 752 bytes .../plugins/link/images/hidpi/anchor.png | Bin 0 -> 1109 bytes .../plugins/liststyle/dialogs/liststyle.js | 10 + .../magicline/images/hidpi/icon-rtl.png | Bin 0 -> 176 bytes .../plugins/magicline/images/hidpi/icon.png | Bin 0 -> 199 bytes .../plugins/magicline/images/icon-rtl.png | Bin 0 -> 138 bytes .../plugins/magicline/images/icon.png | Bin 0 -> 133 bytes .../plugins/pagebreak/images/pagebreak.gif | Bin 0 -> 99 bytes .../plugins/pastefromword/filter/default.js | 58 + .../ckeditor/plugins/preview/preview.html | 13 + .../plugs/ckeditor/plugins/scayt/CHANGELOG.md | 20 + .../plugs/ckeditor/plugins/scayt/LICENSE.md | 28 + .../plugs/ckeditor/plugins/scayt/README.md | 81 + .../ckeditor/plugins/scayt/dialogs/dialog.css | 23 + .../ckeditor/plugins/scayt/dialogs/options.js | 32 + .../plugins/scayt/dialogs/toolbar.css | 71 + .../plugins/scayt/skins/moono-lisa/scayt.css | 25 + .../showblocks/images/block_address.png | Bin 0 -> 152 bytes .../showblocks/images/block_blockquote.png | Bin 0 -> 154 bytes .../plugins/showblocks/images/block_div.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h1.png | Bin 0 -> 120 bytes .../plugins/showblocks/images/block_h2.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h3.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_h4.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_h5.png | Bin 0 -> 126 bytes .../plugins/showblocks/images/block_h6.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_p.png | Bin 0 -> 115 bytes .../plugins/showblocks/images/block_pre.png | Bin 0 -> 128 bytes .../ckeditor/plugins/smiley/dialogs/smiley.js | 11 + .../plugins/smiley/images/angel_smile.gif | Bin 0 -> 1245 bytes .../plugins/smiley/images/angel_smile.png | Bin 0 -> 1172 bytes .../plugins/smiley/images/angry_smile.gif | Bin 0 -> 1219 bytes .../plugins/smiley/images/angry_smile.png | Bin 0 -> 1220 bytes .../plugins/smiley/images/broken_heart.gif | Bin 0 -> 732 bytes .../plugins/smiley/images/broken_heart.png | Bin 0 -> 1139 bytes .../plugins/smiley/images/confused_smile.gif | Bin 0 -> 1202 bytes .../plugins/smiley/images/confused_smile.png | Bin 0 -> 1101 bytes .../plugins/smiley/images/cry_smile.gif | Bin 0 -> 795 bytes .../plugins/smiley/images/cry_smile.png | Bin 0 -> 1214 bytes .../plugins/smiley/images/devil_smile.gif | Bin 0 -> 1239 bytes .../plugins/smiley/images/devil_smile.png | Bin 0 -> 1220 bytes .../smiley/images/embaressed_smile.gif | Bin 0 -> 786 bytes .../smiley/images/embarrassed_smile.gif | Bin 0 -> 786 bytes .../smiley/images/embarrassed_smile.png | Bin 0 -> 1145 bytes .../plugins/smiley/images/envelope.gif | Bin 0 -> 506 bytes .../plugins/smiley/images/envelope.png | Bin 0 -> 760 bytes .../ckeditor/plugins/smiley/images/heart.gif | Bin 0 -> 692 bytes .../ckeditor/plugins/smiley/images/heart.png | Bin 0 -> 999 bytes .../ckeditor/plugins/smiley/images/kiss.gif | Bin 0 -> 683 bytes .../ckeditor/plugins/smiley/images/kiss.png | Bin 0 -> 1003 bytes .../plugins/smiley/images/lightbulb.gif | Bin 0 -> 660 bytes .../plugins/smiley/images/lightbulb.png | Bin 0 -> 919 bytes .../plugins/smiley/images/omg_smile.gif | Bin 0 -> 820 bytes .../plugins/smiley/images/omg_smile.png | Bin 0 -> 1122 bytes .../plugins/smiley/images/regular_smile.gif | Bin 0 -> 1209 bytes .../plugins/smiley/images/regular_smile.png | Bin 0 -> 1084 bytes .../plugins/smiley/images/sad_smile.gif | Bin 0 -> 782 bytes .../plugins/smiley/images/sad_smile.png | Bin 0 -> 1115 bytes .../plugins/smiley/images/shades_smile.gif | Bin 0 -> 1231 bytes .../plugins/smiley/images/shades_smile.png | Bin 0 -> 1204 bytes .../plugins/smiley/images/teeth_smile.gif | Bin 0 -> 1201 bytes .../plugins/smiley/images/teeth_smile.png | Bin 0 -> 1183 bytes .../plugins/smiley/images/thumbs_down.gif | Bin 0 -> 715 bytes .../plugins/smiley/images/thumbs_down.png | Bin 0 -> 985 bytes .../plugins/smiley/images/thumbs_up.gif | Bin 0 -> 714 bytes .../plugins/smiley/images/thumbs_up.png | Bin 0 -> 959 bytes .../plugins/smiley/images/tongue_smile.gif | Bin 0 -> 1210 bytes .../plugins/smiley/images/tongue_smile.png | Bin 0 -> 1132 bytes .../plugins/smiley/images/tounge_smile.gif | Bin 0 -> 1210 bytes .../images/whatchutalkingabout_smile.gif | Bin 0 -> 775 bytes .../images/whatchutalkingabout_smile.png | Bin 0 -> 1039 bytes .../plugins/smiley/images/wink_smile.gif | Bin 0 -> 1202 bytes .../plugins/smiley/images/wink_smile.png | Bin 0 -> 1114 bytes .../plugins/specialchar/dialogs/lang/en.js | 13 + .../plugins/specialchar/dialogs/lang/zh-cn.js | 9 + .../plugins/specialchar/dialogs/lang/zh.js | 9 + .../specialchar/dialogs/specialchar.js | 14 + .../ckeditor/plugins/table/dialogs/table.js | 21 + .../tableselection/styles/tableselection.css | 36 + .../plugins/tabletools/dialogs/tableCell.js | 18 + .../plugins/templates/dialogs/templates.css | 84 + .../plugins/templates/dialogs/templates.js | 10 + .../plugins/templates/templates/default.js | 7 + .../templates/templates/images/template1.gif | Bin 0 -> 539 bytes .../templates/templates/images/template2.gif | Bin 0 -> 497 bytes .../templates/templates/images/template3.gif | Bin 0 -> 557 bytes .../ckeditor/plugins/widget/images/handle.png | Bin 0 -> 220 bytes .../plugs/ckeditor/plugins/wsc/LICENSE.md | 28 + .../plugs/ckeditor/plugins/wsc/README.md | 80 + .../ckeditor/plugins/wsc/dialogs/ciframe.html | 66 + .../plugins/wsc/dialogs/tmpFrameset.html | 52 + .../ckeditor/plugins/wsc/dialogs/wsc.css | 82 + .../plugs/ckeditor/plugins/wsc/dialogs/wsc.js | 91 + .../ckeditor/plugins/wsc/dialogs/wsc_ie.js | 11 + .../plugins/wsc/skins/moono-lisa/wsc.css | 43 + .../ckeditor/skins/moono-lisa/dialog.css | 5 + .../ckeditor/skins/moono-lisa/dialog_ie.css | 5 + .../ckeditor/skins/moono-lisa/dialog_ie8.css | 5 + .../skins/moono-lisa/dialog_iequirks.css | 5 + .../ckeditor/skins/moono-lisa/editor.css | 5 + .../skins/moono-lisa/editor_gecko.css | 5 + .../ckeditor/skins/moono-lisa/editor_ie.css | 5 + .../ckeditor/skins/moono-lisa/editor_ie8.css | 5 + .../skins/moono-lisa/editor_iequirks.css | 5 + .../plugs/ckeditor/skins/moono-lisa/icons.png | Bin 0 -> 12421 bytes .../ckeditor/skins/moono-lisa/icons_hidpi.png | Bin 0 -> 40265 bytes .../skins/moono-lisa/images/arrow.png | Bin 0 -> 191 bytes .../skins/moono-lisa/images/close.png | Bin 0 -> 615 bytes .../skins/moono-lisa/images/hidpi/close.png | Bin 0 -> 1238 bytes .../moono-lisa/images/hidpi/lock-open.png | Bin 0 -> 1071 bytes .../skins/moono-lisa/images/hidpi/lock.png | Bin 0 -> 1062 bytes .../skins/moono-lisa/images/hidpi/refresh.png | Bin 0 -> 1623 bytes .../skins/moono-lisa/images/lock-open.png | Bin 0 -> 511 bytes .../ckeditor/skins/moono-lisa/images/lock.png | Bin 0 -> 506 bytes .../skins/moono-lisa/images/refresh.png | Bin 0 -> 757 bytes .../skins/moono-lisa/images/spinner.gif | Bin 0 -> 2984 bytes .../plugs/ckeditor/skins/moono-lisa/readme.md | 46 + public/static/plugs/ckeditor/styles.js | 137 + public/static/plugs/echarts/echarts.min.js | 22 + public/static/plugs/jquery/area/area.js | 30 + public/static/plugs/jquery/area/area.json | 6198 +++++++ public/static/plugs/jquery/area/area.php | 18 + public/static/plugs/jquery/autocompleter.css | 79 + .../static/plugs/jquery/autocompleter.min.js | 8 + public/static/plugs/jquery/base64.min.js | 1 + public/static/plugs/jquery/jquery.min.js | 5 + public/static/plugs/jquery/json.min.js | 1 + public/static/plugs/jquery/less.min.js | 18 + public/static/plugs/jquery/masonry.min.js | 9 + public/static/plugs/jquery/md5.min.js | 1 + public/static/plugs/jquery/pace.min.js | 2 + public/static/plugs/jquery/pcasunzips.js | 30 + public/static/plugs/jquery/uploader.js | 46 + public/static/plugs/layui/css/layui.css | 2 + .../static/plugs/layui/css/layui.mobile.css | 2 + .../static/plugs/layui/css/modules/code.css | 2 + .../css/modules/laydate/default/laydate.css | 2 + .../css/modules/layer/default/icon-ext.png | Bin 0 -> 5911 bytes .../layui/css/modules/layer/default/icon.png | Bin 0 -> 11493 bytes .../layui/css/modules/layer/default/layer.css | 2 + .../css/modules/layer/default/loading-0.gif | Bin 0 -> 5793 bytes .../css/modules/layer/default/loading-1.gif | Bin 0 -> 701 bytes .../css/modules/layer/default/loading-2.gif | Bin 0 -> 1787 bytes public/static/plugs/layui/font/iconfont.eot | Bin 0 -> 41712 bytes public/static/plugs/layui/font/iconfont.svg | 485 + public/static/plugs/layui/font/iconfont.ttf | Bin 0 -> 41536 bytes public/static/plugs/layui/font/iconfont.woff | Bin 0 -> 27256 bytes public/static/plugs/layui/font/iconfont.woff2 | Bin 0 -> 23140 bytes public/static/plugs/layui/images/face/0.gif | Bin 0 -> 2689 bytes public/static/plugs/layui/images/face/1.gif | Bin 0 -> 5514 bytes public/static/plugs/layui/images/face/10.gif | Bin 0 -> 2797 bytes public/static/plugs/layui/images/face/11.gif | Bin 0 -> 4121 bytes public/static/plugs/layui/images/face/12.gif | Bin 0 -> 3361 bytes public/static/plugs/layui/images/face/13.gif | Bin 0 -> 7425 bytes public/static/plugs/layui/images/face/14.gif | Bin 0 -> 2375 bytes public/static/plugs/layui/images/face/15.gif | Bin 0 -> 1793 bytes public/static/plugs/layui/images/face/16.gif | Bin 0 -> 6721 bytes public/static/plugs/layui/images/face/17.gif | Bin 0 -> 4439 bytes public/static/plugs/layui/images/face/18.gif | Bin 0 -> 3017 bytes public/static/plugs/layui/images/face/19.gif | Bin 0 -> 3040 bytes public/static/plugs/layui/images/face/2.gif | Bin 0 -> 3222 bytes public/static/plugs/layui/images/face/20.gif | Bin 0 -> 5144 bytes public/static/plugs/layui/images/face/21.gif | Bin 0 -> 5191 bytes public/static/plugs/layui/images/face/22.gif | Bin 0 -> 9823 bytes public/static/plugs/layui/images/face/23.gif | Bin 0 -> 3792 bytes public/static/plugs/layui/images/face/24.gif | Bin 0 -> 8096 bytes public/static/plugs/layui/images/face/25.gif | Bin 0 -> 3127 bytes public/static/plugs/layui/images/face/26.gif | Bin 0 -> 3291 bytes public/static/plugs/layui/images/face/27.gif | Bin 0 -> 4377 bytes public/static/plugs/layui/images/face/28.gif | Bin 0 -> 2793 bytes public/static/plugs/layui/images/face/29.gif | Bin 0 -> 4854 bytes public/static/plugs/layui/images/face/3.gif | Bin 0 -> 4017 bytes public/static/plugs/layui/images/face/30.gif | Bin 0 -> 2555 bytes public/static/plugs/layui/images/face/31.gif | Bin 0 -> 2002 bytes public/static/plugs/layui/images/face/32.gif | Bin 0 -> 3481 bytes public/static/plugs/layui/images/face/33.gif | Bin 0 -> 2454 bytes public/static/plugs/layui/images/face/34.gif | Bin 0 -> 3700 bytes public/static/plugs/layui/images/face/35.gif | Bin 0 -> 1800 bytes public/static/plugs/layui/images/face/36.gif | Bin 0 -> 2331 bytes public/static/plugs/layui/images/face/37.gif | Bin 0 -> 1513 bytes public/static/plugs/layui/images/face/38.gif | Bin 0 -> 3615 bytes public/static/plugs/layui/images/face/39.gif | Bin 0 -> 6495 bytes public/static/plugs/layui/images/face/4.gif | Bin 0 -> 5689 bytes public/static/plugs/layui/images/face/40.gif | Bin 0 -> 3154 bytes public/static/plugs/layui/images/face/41.gif | Bin 0 -> 3644 bytes public/static/plugs/layui/images/face/42.gif | Bin 0 -> 5305 bytes public/static/plugs/layui/images/face/43.gif | Bin 0 -> 2674 bytes public/static/plugs/layui/images/face/44.gif | Bin 0 -> 4126 bytes public/static/plugs/layui/images/face/45.gif | Bin 0 -> 3417 bytes public/static/plugs/layui/images/face/46.gif | Bin 0 -> 3007 bytes public/static/plugs/layui/images/face/47.gif | Bin 0 -> 2333 bytes public/static/plugs/layui/images/face/48.gif | Bin 0 -> 2689 bytes public/static/plugs/layui/images/face/49.gif | Bin 0 -> 2315 bytes public/static/plugs/layui/images/face/5.gif | Bin 0 -> 4567 bytes public/static/plugs/layui/images/face/50.gif | Bin 0 -> 5866 bytes public/static/plugs/layui/images/face/51.gif | Bin 0 -> 2785 bytes public/static/plugs/layui/images/face/52.gif | Bin 0 -> 777 bytes public/static/plugs/layui/images/face/53.gif | Bin 0 -> 2127 bytes public/static/plugs/layui/images/face/54.gif | Bin 0 -> 2196 bytes public/static/plugs/layui/images/face/55.gif | Bin 0 -> 1971 bytes public/static/plugs/layui/images/face/56.gif | Bin 0 -> 2034 bytes public/static/plugs/layui/images/face/57.gif | Bin 0 -> 2705 bytes public/static/plugs/layui/images/face/58.gif | Bin 0 -> 2258 bytes public/static/plugs/layui/images/face/59.gif | Bin 0 -> 10311 bytes public/static/plugs/layui/images/face/6.gif | Bin 0 -> 2213 bytes public/static/plugs/layui/images/face/60.gif | Bin 0 -> 3245 bytes public/static/plugs/layui/images/face/61.gif | Bin 0 -> 2495 bytes public/static/plugs/layui/images/face/62.gif | Bin 0 -> 2017 bytes public/static/plugs/layui/images/face/63.gif | Bin 0 -> 5871 bytes public/static/plugs/layui/images/face/64.gif | Bin 0 -> 6448 bytes public/static/plugs/layui/images/face/65.gif | Bin 0 -> 3576 bytes public/static/plugs/layui/images/face/66.gif | Bin 0 -> 3029 bytes public/static/plugs/layui/images/face/67.gif | Bin 0 -> 2701 bytes public/static/plugs/layui/images/face/68.gif | Bin 0 -> 1424 bytes public/static/plugs/layui/images/face/69.gif | Bin 0 -> 2431 bytes public/static/plugs/layui/images/face/7.gif | Bin 0 -> 3398 bytes public/static/plugs/layui/images/face/70.gif | Bin 0 -> 4590 bytes public/static/plugs/layui/images/face/71.gif | Bin 0 -> 5304 bytes public/static/plugs/layui/images/face/8.gif | Bin 0 -> 4050 bytes public/static/plugs/layui/images/face/9.gif | Bin 0 -> 4221 bytes public/static/plugs/layui/layui.all.js | 5 + public/static/plugs/michat/chart.js | 116 + public/static/plugs/michat/image/bg.jpg | Bin 0 -> 18610 bytes public/static/plugs/michat/michat.css | 271 + public/static/plugs/michat/michat.css.map | 1 + public/static/plugs/michat/michat.js | 82 + public/static/plugs/michat/michat.less | 321 + public/static/plugs/michat/mimc-min_1_0_2.js | 717 + public/static/plugs/michat/template.html | 29 + public/static/plugs/require/css.js | 1 + public/static/plugs/require/require.js | 1 + public/static/plugs/socket/swfobject.js | 4 + public/static/plugs/socket/websocket.js | 6 + public/static/plugs/socket/websocket.swf | Bin 0 -> 177238 bytes public/static/plugs/supersized/progress.gif | Bin 0 -> 5481 bytes .../plugs/supersized/supersized.3.2.7.min.js | 677 + public/static/plugs/supersized/supersized.css | 1 + .../ztree/zTreeStyle/img/diy/1_close.png | Bin 0 -> 601 bytes .../plugs/ztree/zTreeStyle/img/diy/1_open.png | Bin 0 -> 580 bytes .../plugs/ztree/zTreeStyle/img/diy/2.png | Bin 0 -> 570 bytes .../plugs/ztree/zTreeStyle/img/diy/3.png | Bin 0 -> 762 bytes .../plugs/ztree/zTreeStyle/img/diy/4.png | Bin 0 -> 399 bytes .../plugs/ztree/zTreeStyle/img/diy/5.png | Bin 0 -> 710 bytes .../plugs/ztree/zTreeStyle/img/diy/6.png | Bin 0 -> 432 bytes .../plugs/ztree/zTreeStyle/img/diy/7.png | Bin 0 -> 534 bytes .../plugs/ztree/zTreeStyle/img/diy/8.png | Bin 0 -> 529 bytes .../plugs/ztree/zTreeStyle/img/diy/9.png | Bin 0 -> 467 bytes .../plugs/ztree/zTreeStyle/img/line_conn.gif | Bin 0 -> 45 bytes .../plugs/ztree/zTreeStyle/img/loading.gif | Bin 0 -> 381 bytes .../ztree/zTreeStyle/img/zTreeStandard.gif | Bin 0 -> 5564 bytes .../ztree/zTreeStyle/img/zTreeStandard.png | Bin 0 -> 11173 bytes .../plugs/ztree/zTreeStyle/zTreeStyle.css | 97 + public/static/plugs/ztree/ztree.all.min.js | 166 + public/static/theme/css/console.css | 1210 ++ public/static/theme/css/console.css.map | 1 + public/static/theme/css/console.custom.css | 529 + .../static/theme/css/console.custom.css.map | 1 + public/static/theme/css/console.custom.less | 717 + public/static/theme/css/console.form.css | 157 + public/static/theme/css/console.form.css.map | 1 + public/static/theme/css/console.form.less | 177 + public/static/theme/css/console.layout.css | 374 + .../static/theme/css/console.layout.css.map | 1 + public/static/theme/css/console.layout.less | 459 + public/static/theme/css/console.layui.css | 107 + public/static/theme/css/console.layui.css.map | 1 + public/static/theme/css/console.layui.less | 133 + public/static/theme/css/console.less | 74 + public/static/theme/css/icon/iconfont.eot | Bin 0 -> 2464 bytes public/static/theme/css/icon/iconfont.svg | 35 + public/static/theme/css/icon/iconfont.ttf | Bin 0 -> 2296 bytes public/static/theme/css/icon/iconfont.woff | Bin 0 -> 1540 bytes public/static/theme/css/login.css | 218 + public/static/theme/css/login.css.map | 1 + public/static/theme/css/login.less | 260 + public/static/theme/css/mobile.css | 30 + public/static/theme/img/404_icon.png | Bin 0 -> 47146 bytes public/static/theme/img/505_icon.png | Bin 0 -> 40901 bytes public/static/theme/img/headimg.png | Bin 0 -> 4869 bytes public/static/theme/img/ignore.png | Bin 0 -> 1216 bytes public/static/theme/img/image.png | Bin 0 -> 1672 bytes public/static/theme/img/login/bg1.jpg | Bin 0 -> 55719 bytes public/static/theme/img/login/bg2.jpg | Bin 0 -> 67855 bytes public/static/theme/img/notice.png | Bin 0 -> 4848 bytes public/static/theme/img/wechat/index.png | Bin 0 -> 231 bytes .../static/theme/img/wechat/mobile_foot.png | Bin 0 -> 1348 bytes .../static/theme/img/wechat/mobile_head.png | Bin 0 -> 12673 bytes .../static/theme/img/wechat/qrc_pay_error.jpg | Bin 0 -> 44321 bytes public/static/theme/img/wechat/qrc_payed.jpg | Bin 0 -> 28055 bytes public/static/theme/index/css/base.css | 330 + public/static/theme/index/css/footer.css | 9 + public/static/theme/index/css/header.css | 19 + public/static/theme/index/css/iconfont.css | 69 + public/static/theme/index/css/layer.css | 2 + public/static/theme/index/css/login.css | 21 + public/static/theme/index/css/mine.css | 32 + public/static/theme/index/css/new/app.css | 1 + .../static/theme/index/css/new/iconfont.css | 21 + .../static/theme/index/css/new/iconfont.ttf | Bin 0 -> 1788 bytes public/static/theme/index/css/register.css | 19 + public/static/theme/index/css/swiper.min.css | 12 + .../static/theme/index/img/about_notice.png | Bin 0 -> 1827 bytes public/static/theme/index/img/add.png | Bin 0 -> 1446 bytes public/static/theme/index/img/bitcoin.png | Bin 0 -> 1530 bytes public/static/theme/index/img/bz.png | Bin 0 -> 8169 bytes public/static/theme/index/img/choujiang.png | Bin 0 -> 5796 bytes public/static/theme/index/img/czico.png | Bin 0 -> 1560 bytes public/static/theme/index/img/deletes.png | Bin 0 -> 4178 bytes public/static/theme/index/img/detailico.jpg | Bin 0 -> 93900 bytes public/static/theme/index/img/down.png | Bin 0 -> 573 bytes public/static/theme/index/img/ethereum.png | Bin 0 -> 1258 bytes public/static/theme/index/img/goback.png | Bin 0 -> 717 bytes public/static/theme/index/img/gold.gif | Bin 0 -> 280055 bytes public/static/theme/index/img/hrefyou.png | Bin 0 -> 635 bytes public/static/theme/index/img/hy.png | Bin 0 -> 9044 bytes .../theme/index/img/icon_aboutus_bank.png | Bin 0 -> 1408 bytes .../theme/index/img/icon_aboutus_company.png | Bin 0 -> 1378 bytes .../theme/index/img/icon_aboutus_help.png | Bin 0 -> 1142 bytes .../theme/index/img/icon_aboutus_kf.png | Bin 0 -> 1903 bytes .../theme/index/img/icon_aboutus_notice.png | Bin 0 -> 1085 bytes .../theme/index/img/icon_aboutus_pay.png | Bin 0 -> 1625 bytes .../theme/index/img/icon_aboutus_photo.png | Bin 0 -> 1128 bytes .../theme/index/img/icon_aboutus_safe.png | Bin 0 -> 987 bytes .../theme/index/img/icon_aboutus_tel.png | Bin 0 -> 931 bytes public/static/theme/index/img/icon_add.png | Bin 0 -> 351 bytes public/static/theme/index/img/icon_alipay.png | Bin 0 -> 1796 bytes public/static/theme/index/img/icon_back.png | Bin 0 -> 490 bytes .../theme/index/img/icon_bankCard_add.png | Bin 0 -> 5036 bytes public/static/theme/index/img/icon_del.png | Bin 0 -> 2357 bytes .../static/theme/index/img/icon_identity.png | Bin 0 -> 5803 bytes .../static/theme/index/img/icon_index_1.png | Bin 0 -> 4533 bytes .../static/theme/index/img/icon_index_10.png | Bin 0 -> 7472 bytes .../static/theme/index/img/icon_index_11.png | Bin 0 -> 5011 bytes .../static/theme/index/img/icon_index_12.png | Bin 0 -> 4852 bytes .../static/theme/index/img/icon_index_2.png | Bin 0 -> 4307 bytes .../static/theme/index/img/icon_index_3.png | Bin 0 -> 4588 bytes .../static/theme/index/img/icon_index_4.png | Bin 0 -> 4616 bytes .../static/theme/index/img/icon_index_5.png | Bin 0 -> 4744 bytes .../static/theme/index/img/icon_index_6.png | Bin 0 -> 4881 bytes .../static/theme/index/img/icon_index_7.png | Bin 0 -> 4799 bytes .../static/theme/index/img/icon_index_8.png | Bin 0 -> 5267 bytes .../static/theme/index/img/icon_index_9.png | Bin 0 -> 4862 bytes public/static/theme/index/img/icon_my_1.png | Bin 0 -> 1023 bytes public/static/theme/index/img/icon_my_2.png | Bin 0 -> 1902 bytes public/static/theme/index/img/icon_my_3.png | Bin 0 -> 944 bytes public/static/theme/index/img/icon_my_4.png | Bin 0 -> 1340 bytes public/static/theme/index/img/icon_my_5.png | Bin 0 -> 317 bytes public/static/theme/index/img/icon_my_6.png | Bin 0 -> 1647 bytes public/static/theme/index/img/icon_my_7.png | Bin 0 -> 2103 bytes public/static/theme/index/img/icon_my_8.png | Bin 0 -> 1940 bytes public/static/theme/index/img/icon_my_9.png | Bin 0 -> 1704 bytes .../static/theme/index/img/icon_success.png | Bin 0 -> 9006 bytes public/static/theme/index/img/icon_tick.png | Bin 0 -> 4447 bytes public/static/theme/index/img/icon_tick1.png | Bin 0 -> 4896 bytes .../static/theme/index/img/icon_unionpay.png | Bin 0 -> 3422 bytes public/static/theme/index/img/icon_untick.png | Bin 0 -> 734 bytes public/static/theme/index/img/indexwm.png | Bin 0 -> 9434 bytes public/static/theme/index/img/invite_1.png | Bin 0 -> 32532 bytes public/static/theme/index/img/invite_2.png | Bin 0 -> 39796 bytes public/static/theme/index/img/invite_4.png | Bin 0 -> 114753 bytes public/static/theme/index/img/jisuanqi.png | Bin 0 -> 4841 bytes public/static/theme/index/img/jt.png | Bin 0 -> 479 bytes public/static/theme/index/img/kefu1.png | Bin 0 -> 1337 bytes public/static/theme/index/img/listico1.png | Bin 0 -> 1325 bytes public/static/theme/index/img/listico2.png | Bin 0 -> 4604 bytes public/static/theme/index/img/listico3.png | Bin 0 -> 4252 bytes public/static/theme/index/img/listico4.png | Bin 0 -> 2820 bytes public/static/theme/index/img/listico5.png | Bin 0 -> 3804 bytes public/static/theme/index/img/listico6.png | Bin 0 -> 4506 bytes public/static/theme/index/img/listico7.png | Bin 0 -> 3784 bytes public/static/theme/index/img/listico8.png | Bin 0 -> 3588 bytes public/static/theme/index/img/litecoin.png | Bin 0 -> 1097 bytes public/static/theme/index/img/login.jpg | Bin 0 -> 195299 bytes public/static/theme/index/img/logout.png | Bin 0 -> 7278 bytes public/static/theme/index/img/nico4.png | Bin 0 -> 4515 bytes public/static/theme/index/img/notice.png | Bin 0 -> 1228 bytes public/static/theme/index/img/over.png | Bin 0 -> 24978 bytes public/static/theme/index/img/panbg.png | Bin 0 -> 25662 bytes public/static/theme/index/img/passdel.png | Bin 0 -> 1907 bytes public/static/theme/index/img/plistico1.png | Bin 0 -> 1822 bytes public/static/theme/index/img/plistico2.png | Bin 0 -> 3588 bytes public/static/theme/index/img/plistico3.png | Bin 0 -> 2061 bytes public/static/theme/index/img/plistico5.png | Bin 0 -> 2099 bytes public/static/theme/index/img/qd.png | Bin 0 -> 8004 bytes public/static/theme/index/img/sc.png | Bin 0 -> 8432 bytes public/static/theme/index/img/shang.png | Bin 0 -> 981 bytes public/static/theme/index/img/smrz.png | Bin 0 -> 1321 bytes public/static/theme/index/img/sub.png | Bin 0 -> 1944 bytes public/static/theme/index/img/success.png | Bin 0 -> 500 bytes public/static/theme/index/img/sy.png | Bin 0 -> 8850 bytes public/static/theme/index/img/sytitl1.png | Bin 0 -> 1489 bytes public/static/theme/index/img/sytitr1.png | Bin 0 -> 1530 bytes public/static/theme/index/img/txico.png | Bin 0 -> 2298 bytes public/static/theme/index/img/up.png | Bin 0 -> 567 bytes public/static/theme/index/img/user_credit.png | Bin 0 -> 1596 bytes public/static/theme/index/img/user_prize.png | Bin 0 -> 887 bytes public/static/theme/index/img/userimg.png | Bin 0 -> 190725 bytes public/static/theme/index/img/xia.png | Bin 0 -> 1017 bytes public/static/theme/index/img/xx.png | Bin 0 -> 8616 bytes public/static/theme/index/img/yclose.png | Bin 0 -> 1338 bytes public/static/theme/index/img/ykjico.png | Bin 0 -> 5062 bytes public/static/theme/index/img/yopen.png | Bin 0 -> 1934 bytes public/static/theme/index/img/yq.png | Bin 0 -> 8914 bytes public/static/theme/index/js/adaptive.js | 150 + public/static/theme/index/js/autorem.js | 81 + public/static/theme/index/js/awardRotate.js | 303 + public/static/theme/index/js/calculator.js | 320 + public/static/theme/index/js/clipboard.min.js | 7 + public/static/theme/index/js/config.js | 4 + public/static/theme/index/js/echarts.min.js | 22 + public/static/theme/index/js/font.js | 14 + public/static/theme/index/js/jquery.js | 9791 +++++++++++ public/static/theme/index/js/layer.js | 2 + public/static/theme/index/js/public.js | 94 + public/static/theme/index/js/qrcode.js | 614 + public/static/theme/index/js/srcoll.js | 432 + public/static/theme/index/js/swiper.min.js | 13 + public/static/theme/index/js/yatongle.js | 57 + public/static/theme/news/css/app.css | 1 + public/static/theme/news/css/fake.css | 115 + public/static/theme/news/img/bg.jpg | Bin 0 -> 25525 bytes public/static/theme/news/img/bottom_1.png | Bin 0 -> 27618 bytes public/static/theme/news/img/bottom_2.png | Bin 0 -> 26449 bytes public/static/theme/news/img/bottom_4.png | Bin 0 -> 27567 bytes public/static/theme/news/img/bottom_5.png | Bin 0 -> 3632 bytes public/static/theme/news/img/bottom_6.png | Bin 0 -> 2296 bytes public/static/theme/news/img/close.png | Bin 0 -> 3636 bytes public/static/theme/prize/animate.min.css | 12 + public/static/theme/prize/award.css | 1369 ++ public/static/theme/prize/award.js | 318 + public/static/theme/prize/awardRotate.js | 302 + public/static/theme/prize/back.png | Bin 0 -> 97001 bytes public/static/theme/prize/back1.png | Bin 0 -> 5761 bytes public/static/theme/prize/bottom_shadow.png | Bin 0 -> 6517 bytes public/static/theme/prize/component.css | 302 + public/static/theme/prize/img_1.png | Bin 0 -> 18354 bytes public/static/theme/prize/img_2.png | Bin 0 -> 2880 bytes public/static/theme/prize/jquery-2.1.4.min.js | 4 + public/static/theme/prize/mui.min.css | 5 + public/static/theme/prize/mui.min.js | 3534 ++++ public/static/theme/prize/rule_title.png | Bin 0 -> 1105 bytes .../theme/prize/turnplate-pointer_2.png | Bin 0 -> 11413 bytes public/static/wap/css/box_pay.css | 1847 ++ public/static/wap/css/common.css | 14131 +++++++++++++++ public/static/wap/css/element.css | 12863 ++++++++++++++ public/static/wap/css/iconfont.css | 138 + public/static/wap/css/index.css | 10589 ++++++++++++ public/static/wap/css/ionic.css | 9815 +++++++++++ public/static/wap/css/login.css | 125 + public/static/wap/css/personal.css | 805 + public/static/wap/css/sign.css | 483 + public/static/wap/css/style.css | 2165 +++ public/static/wap/css/tabbar.css | 0 public/static/wap/css/tipmask.css | 53 + public/static/wap/css/trade-history.css | 169 + public/static/wap/css/trade.css | 165 + public/static/wap/fonts/iconfont.eot | Bin 0 -> 59710 bytes public/static/wap/fonts/iconfont.svg | 393 + public/static/wap/fonts/iconfont.ttf | Bin 0 -> 59428 bytes public/static/wap/fonts/iconfont.woff | Bin 0 -> 34384 bytes public/static/wap/fonts/ionicons.eot | Bin 0 -> 120724 bytes public/static/wap/fonts/ionicons.svg | 750 + public/static/wap/fonts/ionicons.ttf | Bin 0 -> 188508 bytes public/static/wap/fonts/ionicons.woff | Bin 0 -> 67904 bytes public/static/wap/images/123background.png | Bin 0 -> 30874 bytes .../2943d289a1f14ca6a31c3389093655d6.png | Bin 0 -> 526632 bytes .../52e2f9b57a152889d532fff6bd525a67.png | Bin 0 -> 150168 bytes .../94fe48d1cbda7dc7fe30eb4742aa4f8e.png | Bin 0 -> 94385 bytes .../a1085bc31e04429c5fd3034111228b19.png | Bin 0 -> 360442 bytes public/static/wap/images/accout_icon.png | Bin 0 -> 565 bytes public/static/wap/images/arrow_right.png | Bin 0 -> 837 bytes public/static/wap/images/back_logo.jpg | Bin 0 -> 525 bytes public/static/wap/images/background.png | Bin 0 -> 167889 bytes public/static/wap/images/bg.png | Bin 0 -> 5134 bytes public/static/wap/images/buydown.png | Bin 0 -> 3160 bytes public/static/wap/images/buytop.png | Bin 0 -> 3128 bytes .../cb58e0e4b587409e00db872e50b27059.png | Bin 0 -> 104656 bytes public/static/wap/images/ch1.png | Bin 0 -> 4029 bytes public/static/wap/images/ch2.png | Bin 0 -> 1108 bytes public/static/wap/images/ch3.png | Bin 0 -> 4103 bytes public/static/wap/images/ch4.png | Bin 0 -> 2460 bytes public/static/wap/images/ch5.png | Bin 0 -> 1375 bytes public/static/wap/images/ch6.png | Bin 0 -> 1743 bytes public/static/wap/images/charge.png | Bin 0 -> 7259 bytes public/static/wap/images/chicang.png | Bin 0 -> 498 bytes public/static/wap/images/chicang2.png | Bin 0 -> 1818 bytes public/static/wap/images/clock.png | Bin 0 -> 3935 bytes public/static/wap/images/cz.png | Bin 0 -> 528 bytes public/static/wap/images/cz2.png | Bin 0 -> 1778 bytes public/static/wap/images/dealBKG.png | Bin 0 -> 1520561 bytes .../e499128dbb5a0c84fcb63f91c436ad29.png | Bin 0 -> 10991 bytes public/static/wap/images/empty.png | Bin 0 -> 2541 bytes .../f5fa54b891ed0d02a0788f275d0f2464.png | Bin 0 -> 437150 bytes public/static/wap/images/f_idcard.png | Bin 0 -> 15040 bytes public/static/wap/images/gb11.png | Bin 0 -> 5193 bytes public/static/wap/images/goback.png | Bin 0 -> 1130 bytes public/static/wap/images/hold.png | Bin 0 -> 62141 bytes public/static/wap/images/hq11.png | Bin 0 -> 3279 bytes public/static/wap/images/hq12.png | Bin 0 -> 2787 bytes public/static/wap/images/icon_eye.png | Bin 0 -> 705 bytes .../static/wap/images/icon_my_agency@2x.png | Bin 0 -> 15659 bytes .../wap/images/icon_my_announcement@2x.png | Bin 0 -> 15975 bytes .../wap/images/icon_my_bank_card@2x.png | Bin 0 -> 15162 bytes .../static/wap/images/icon_my_cipher@2x.png | Bin 0 -> 15790 bytes .../static/wap/images/icon_my_pull_out@2x.png | Bin 0 -> 16147 bytes .../icon_my_revenue_and_expenditure@2x.png | Bin 0 -> 15366 bytes .../static/wap/images/icon_my_search@2x.png | Bin 0 -> 15790 bytes .../static/wap/images/icon_my_vouchers@2x.png | Bin 0 -> 11716 bytes public/static/wap/images/idcard.png | Bin 0 -> 10722 bytes public/static/wap/images/idcard_f.png | Bin 0 -> 8815 bytes public/static/wap/images/idcard_z.png | Bin 0 -> 9066 bytes public/static/wap/images/idx1.png | Bin 0 -> 2281 bytes public/static/wap/images/idx2.png | Bin 0 -> 2026 bytes public/static/wap/images/idx3.png | Bin 0 -> 2115 bytes public/static/wap/images/idx4.png | Bin 0 -> 2370 bytes public/static/wap/images/index.png | Bin 0 -> 163552 bytes public/static/wap/images/iright.png | Bin 0 -> 3496 bytes public/static/wap/images/jindubkg.png | Bin 0 -> 7054 bytes public/static/wap/images/jy11.png | Bin 0 -> 2351 bytes public/static/wap/images/jy12.png | Bin 0 -> 565 bytes public/static/wap/images/left_circle1.png | Bin 0 -> 8148 bytes public/static/wap/images/logow.png | Bin 0 -> 3340 bytes public/static/wap/images/mine.png | Bin 0 -> 465 bytes public/static/wap/images/mine2.png | Bin 0 -> 1650 bytes public/static/wap/images/my1.png | Bin 0 -> 1433 bytes public/static/wap/images/my11.png | Bin 0 -> 3099 bytes public/static/wap/images/my12.png | Bin 0 -> 1859 bytes public/static/wap/images/my2.png | Bin 0 -> 1392 bytes public/static/wap/images/my3.png | Bin 0 -> 1570 bytes public/static/wap/images/my4.png | Bin 0 -> 1955 bytes public/static/wap/images/myorderbkg.png | Bin 0 -> 52739 bytes public/static/wap/images/mys1.png | Bin 0 -> 94385 bytes public/static/wap/images/mys2.png | Bin 0 -> 104656 bytes public/static/wap/images/mys3.png | Bin 0 -> 150168 bytes public/static/wap/images/profit_logo.jpg | Bin 0 -> 525 bytes public/static/wap/images/right_circle1.png | Bin 0 -> 8277 bytes public/static/wap/images/sele.png | Bin 0 -> 4703 bytes public/static/wap/images/selection.png | Bin 0 -> 1481 bytes public/static/wap/images/status_0.png | Bin 0 -> 21149 bytes public/static/wap/images/status_1.png | Bin 0 -> 21007 bytes public/static/wap/images/status_2.png | Bin 0 -> 21007 bytes public/static/wap/images/status_3.png | Bin 0 -> 16686 bytes public/static/wap/images/sy.png | Bin 0 -> 412 bytes public/static/wap/images/sy2.png | Bin 0 -> 1701 bytes public/static/wap/images/wa11.png | Bin 0 -> 1807 bytes public/static/wap/images/wa12.png | Bin 0 -> 2398 bytes public/static/wap/images/yeb.png | Bin 0 -> 6614 bytes public/static/wap/images/yeb1.png | Bin 0 -> 7273 bytes public/static/wap/images/yeb2.png | Bin 0 -> 7259 bytes public/static/wap/images/z_idcard.png | Bin 0 -> 14586 bytes public/static/wap/images/zhanghubg.png | Bin 0 -> 541998 bytes public/static/wap/js/base64.js | 113 + public/static/wap/js/chardata.js | 502 + public/static/wap/js/echarts.js | 36 + public/static/wap/js/function.js | 65 + public/static/wap/js/hold.js | 340 + public/static/wap/js/jquery-1.9.1.min.js | 49 + .../wap/js/jquery.datetimepicker.fulls.js | 80 + public/static/wap/js/lodash.min.js | 98 + public/static/wap/js/m.js | 989 ++ public/static/wap/js/order.js | 94 + public/upload/.gitignore | 2 + route/demo.php | 55 + .../3025674501bf9fe2/6e61beff4bf4f1b7.png | Bin 0 -> 24018 bytes think | 22 + 安装.txt | 52 + 1388 files changed, 219353 insertions(+) create mode 100644 .env.example create mode 100755 .gitignore create mode 100644 .htaccess create mode 100644 .user.ini create mode 100644 404.html create mode 100644 502.html create mode 100755 application/akszadmin/controller/Article.php create mode 100755 application/akszadmin/controller/ArticleType.php create mode 100755 application/akszadmin/controller/Auth.php create mode 100755 application/akszadmin/controller/Bank.php create mode 100755 application/akszadmin/controller/Cash.php create mode 100755 application/akszadmin/controller/Config.php create mode 100755 application/akszadmin/controller/Finance.php create mode 100755 application/akszadmin/controller/Goods.php create mode 100755 application/akszadmin/controller/Index.php create mode 100755 application/akszadmin/controller/Info.php create mode 100755 application/akszadmin/controller/Invest.php create mode 100755 application/akszadmin/controller/InvestList.php create mode 100755 application/akszadmin/controller/Item.php create mode 100755 application/akszadmin/controller/ItemClass.php create mode 100755 application/akszadmin/controller/Login.php create mode 100755 application/akszadmin/controller/Mall.php create mode 100755 application/akszadmin/controller/MallInvest.php create mode 100755 application/akszadmin/controller/MallInvestList.php create mode 100755 application/akszadmin/controller/Member.php create mode 100755 application/akszadmin/controller/Menu.php create mode 100755 application/akszadmin/controller/Msg.php create mode 100755 application/akszadmin/controller/Oplog.php create mode 100755 application/akszadmin/controller/Order.php create mode 100755 application/akszadmin/controller/OrderLog.php create mode 100755 application/akszadmin/controller/Prize.php create mode 100755 application/akszadmin/controller/PrizeList.php create mode 100755 application/akszadmin/controller/Queue.php create mode 100755 application/akszadmin/controller/Recharge.php create mode 100755 application/akszadmin/controller/Shop.php create mode 100755 application/akszadmin/controller/ShopOrder.php create mode 100755 application/akszadmin/controller/Slide.php create mode 100755 application/akszadmin/controller/Sms.php create mode 100755 application/akszadmin/controller/User.php create mode 100755 application/akszadmin/controller/Users.php create mode 100755 application/akszadmin/controller/Yuebao.php create mode 100755 application/akszadmin/controller/api/Plugs.php create mode 100755 application/akszadmin/controller/api/Update.php create mode 100755 application/akszadmin/model/Item.php create mode 100755 application/akszadmin/model/Users.php create mode 100755 application/akszadmin/sys.php create mode 100755 application/akszadmin/view/api/plugs/icon.html create mode 100755 application/akszadmin/view/article/form.html create mode 100755 application/akszadmin/view/article/index.html create mode 100755 application/akszadmin/view/article/index_search.html create mode 100755 application/akszadmin/view/article_type/class_search.html create mode 100755 application/akszadmin/view/article_type/form.html create mode 100755 application/akszadmin/view/article_type/index.html create mode 100755 application/akszadmin/view/auth/apply.html create mode 100755 application/akszadmin/view/auth/form.html create mode 100755 application/akszadmin/view/auth/index.html create mode 100755 application/akszadmin/view/auth/index_search.html create mode 100755 application/akszadmin/view/bank/form.html create mode 100755 application/akszadmin/view/bank/index.html create mode 100755 application/akszadmin/view/bank/index_search.html create mode 100755 application/akszadmin/view/cash/edit.html create mode 100755 application/akszadmin/view/cash/index.html create mode 100755 application/akszadmin/view/cash/index_search.html create mode 100755 application/akszadmin/view/config/info.html create mode 100755 application/akszadmin/view/config/storage-local.html create mode 100755 application/akszadmin/view/config/storage-oss.html create mode 100755 application/akszadmin/view/config/storage-qiniu.html create mode 100755 application/akszadmin/view/config/system-config.html create mode 100755 application/akszadmin/view/finance/index.html create mode 100755 application/akszadmin/view/finance/index_search.html create mode 100755 application/akszadmin/view/goods/form.html create mode 100755 application/akszadmin/view/goods/index.html create mode 100755 application/akszadmin/view/goods/index_search.html create mode 100755 application/akszadmin/view/goods/risk.html create mode 100755 application/akszadmin/view/index/index.html create mode 100755 application/akszadmin/view/index/main.html create mode 100755 application/akszadmin/view/info/form.html create mode 100755 application/akszadmin/view/info/img.html create mode 100755 application/akszadmin/view/info/pay.html create mode 100755 application/akszadmin/view/info/reward.html create mode 100755 application/akszadmin/view/invest/index.html create mode 100755 application/akszadmin/view/invest/index_search.html create mode 100755 application/akszadmin/view/invest_list/index.html create mode 100755 application/akszadmin/view/invest_list/index_search.html create mode 100755 application/akszadmin/view/item/form.html create mode 100755 application/akszadmin/view/item/index.html create mode 100755 application/akszadmin/view/item/index_search.html create mode 100755 application/akszadmin/view/item_class/class_search.html create mode 100755 application/akszadmin/view/item_class/form.html create mode 100755 application/akszadmin/view/item_class/index.html create mode 100755 application/akszadmin/view/login/index.html create mode 100755 application/akszadmin/view/main.html create mode 100755 application/akszadmin/view/mall/form.html create mode 100755 application/akszadmin/view/mall/index.html create mode 100755 application/akszadmin/view/mall/index_search.html create mode 100755 application/akszadmin/view/mall_invest/index.html create mode 100755 application/akszadmin/view/mall_invest/index_search.html create mode 100755 application/akszadmin/view/mall_invest_list/index.html create mode 100755 application/akszadmin/view/mall_invest_list/index_search.html create mode 100755 application/akszadmin/view/member/form.html create mode 100755 application/akszadmin/view/member/index.html create mode 100755 application/akszadmin/view/menu/form.html create mode 100755 application/akszadmin/view/menu/index.html create mode 100755 application/akszadmin/view/msg/form.html create mode 100755 application/akszadmin/view/msg/index.html create mode 100755 application/akszadmin/view/msg/index_search.html create mode 100755 application/akszadmin/view/oplog/index.html create mode 100755 application/akszadmin/view/oplog/index_search.html create mode 100755 application/akszadmin/view/order/edits.html create mode 100755 application/akszadmin/view/order/form.html create mode 100755 application/akszadmin/view/order/index.html create mode 100755 application/akszadmin/view/order/index_search.html create mode 100755 application/akszadmin/view/order_log/index.html create mode 100755 application/akszadmin/view/order_log/index_search.html create mode 100755 application/akszadmin/view/prize/form.html create mode 100755 application/akszadmin/view/prize_list/form.html create mode 100755 application/akszadmin/view/prize_list/index.html create mode 100755 application/akszadmin/view/prize_list/index_search.html create mode 100755 application/akszadmin/view/queue/index.html create mode 100755 application/akszadmin/view/queue/index_search.html create mode 100755 application/akszadmin/view/recharge/edit.html create mode 100755 application/akszadmin/view/recharge/form.html create mode 100755 application/akszadmin/view/recharge/index.html create mode 100755 application/akszadmin/view/recharge/index_search.html create mode 100755 application/akszadmin/view/shop/form.html create mode 100755 application/akszadmin/view/shop/index.html create mode 100755 application/akszadmin/view/shop/index_search.html create mode 100755 application/akszadmin/view/shop_order/index.html create mode 100755 application/akszadmin/view/shop_order/index_search.html create mode 100755 application/akszadmin/view/slide/form.html create mode 100755 application/akszadmin/view/slide/index.html create mode 100755 application/akszadmin/view/sms/class_search.html create mode 100755 application/akszadmin/view/sms/form.html create mode 100755 application/akszadmin/view/sms/index.html create mode 100755 application/akszadmin/view/user/form.html create mode 100755 application/akszadmin/view/user/index.html create mode 100755 application/akszadmin/view/user/index_search.html create mode 100755 application/akszadmin/view/user/pass.html create mode 100755 application/akszadmin/view/user/suffix.html create mode 100755 application/akszadmin/view/users/form.html create mode 100755 application/akszadmin/view/users/index.html create mode 100755 application/akszadmin/view/users/index_search.html create mode 100755 application/akszadmin/view/users/relation_search.html create mode 100755 application/akszadmin/view/users/review.html create mode 100755 application/akszadmin/view/users/user_relation.html create mode 100755 application/akszadmin/view/yuebao/index.html create mode 100755 application/akszadmin/view/yuebao/lists.html create mode 100644 application/common.php create mode 100755 application/index/controller/Base.php create mode 100755 application/index/controller/Index.php create mode 100755 application/index/controller/Login.php create mode 100755 application/index/controller/Plugs.php create mode 100755 application/index/controller/Test.php create mode 100755 application/index/controller/User.php create mode 100644 application/index/controller/api/Index.php create mode 100644 application/index/controller/api/Login.php create mode 100644 application/index/controller/api/User.php create mode 100755 application/index/controller/code.txt create mode 100755 application/index/service/IndexService.php create mode 100755 application/index/sys.php create mode 100755 application/index/view/index/about.html create mode 100755 application/index/view/index/about_details.html create mode 100755 application/index/view/index/about_list.html create mode 100755 application/index/view/index/calculator.html create mode 100755 application/index/view/index/ex_lists.html create mode 100755 application/index/view/index/expirefutures.html create mode 100755 application/index/view/index/form.html create mode 100755 application/index/view/index/futureslist.html create mode 100755 application/index/view/index/goods.html create mode 100755 application/index/view/index/home.html create mode 100755 application/index/view/index/index.html create mode 100755 application/index/view/index/item.html create mode 100755 application/index/view/index/lists.html create mode 100755 application/index/view/index/mall.html create mode 100755 application/index/view/index/mall_detail.html create mode 100755 application/index/view/index/mall_form.html create mode 100644 application/index/view/index/msg_view.html create mode 100755 application/index/view/index/my_news.html create mode 100755 application/index/view/index/new_index.html create mode 100755 application/index/view/index/normalfutures.html create mode 100755 application/index/view/index/notice.html create mode 100755 application/index/view/index/prize.html create mode 100755 application/index/view/index/prize_list.html create mode 100755 application/index/view/index/shop.html create mode 100755 application/index/view/index/shop_details.html create mode 100755 application/index/view/index/shop_order.html create mode 100755 application/index/view/login/index.html create mode 100755 application/index/view/login/reg.html create mode 100755 application/index/view/public/footer.html create mode 100755 application/index/view/public/header.html create mode 100755 application/index/view/public/header1.html create mode 100755 application/index/view/user/account.html create mode 100755 application/index/view/user/add_card.html create mode 100755 application/index/view/user/alipay.html create mode 100755 application/index/view/user/bank.html create mode 100755 application/index/view/user/bank_card.html create mode 100755 application/index/view/user/cash.html create mode 100755 application/index/view/user/cash_record.html create mode 100755 application/index/view/user/certification.html create mode 100755 application/index/view/user/contract.html create mode 100755 application/index/view/user/details.html create mode 100755 application/index/view/user/extend.html create mode 100755 application/index/view/user/fund.html create mode 100755 application/index/view/user/hold.html create mode 100755 application/index/view/user/index.html create mode 100755 application/index/view/user/inquiries.html create mode 100755 application/index/view/user/interest.html create mode 100755 application/index/view/user/invest.html create mode 100755 application/index/view/user/mall_contract.html create mode 100755 application/index/view/user/msg.html create mode 100755 application/index/view/user/msg_view.html create mode 100755 application/index/view/user/pwd_login.html create mode 100755 application/index/view/user/pwd_pay.html create mode 100755 application/index/view/user/recharge.html create mode 100755 application/index/view/user/recharge_record.html create mode 100755 application/index/view/user/recommend.html create mode 100755 application/index/view/user/scan.html create mode 100755 application/index/view/user/set_account.html create mode 100755 application/index/view/user/trade.html create mode 100755 application/index/view/user/verified.html create mode 100755 application/index/view/user/wallet.html create mode 100755 application/index/view/user/yeb.html create mode 100644 application/lang/en.json create mode 100644 application/lang/fr.json create mode 100644 application/lang/ko.json create mode 100644 application/lang/pt.json create mode 100644 application/lang/th.json create mode 100644 application/lang/tr.json create mode 100644 application/lang/vi.json create mode 100644 application/lang/zh-cn.json create mode 100644 build.php create mode 100755 config/app.php create mode 100755 config/cookie.php create mode 100755 config/database.php create mode 100755 config/log.php create mode 100755 config/session.php create mode 100755 config/template.php create mode 100755 config/wechat.php create mode 100644 db/0302-2_20250306_112456.sql.gz create mode 100644 db/wp_amazonhub_sit_20230208_224851.sql.gz create mode 100644 extend/ExtendException.php create mode 100644 extend/GdImageClass.php create mode 100644 index.html create mode 100755 nodejs/String-ext.js create mode 100755 nodejs/data.js create mode 100755 nodejs/node_modules/cron-parser/.idea/.name create mode 100755 nodejs/node_modules/cron-parser/.idea/cron-parser.iml create mode 100755 nodejs/node_modules/cron-parser/.idea/encodings.xml create mode 100755 nodejs/node_modules/cron-parser/.idea/jsLibraryMappings.xml create mode 100755 nodejs/node_modules/cron-parser/.idea/modules.xml create mode 100755 nodejs/node_modules/cron-parser/.idea/vcs.xml create mode 100755 nodejs/node_modules/cron-parser/.idea/workspace.xml create mode 100755 nodejs/node_modules/cron-parser/.travis.yml create mode 100755 nodejs/node_modules/cron-parser/LICENSE create mode 100755 nodejs/node_modules/cron-parser/README.md create mode 100755 nodejs/node_modules/cron-parser/component.json create mode 100755 nodejs/node_modules/cron-parser/lib/date.js create mode 100755 nodejs/node_modules/cron-parser/lib/expression.js create mode 100755 nodejs/node_modules/cron-parser/lib/index.d.ts create mode 100755 nodejs/node_modules/cron-parser/lib/parser.js create mode 100755 nodejs/node_modules/cron-parser/package.json create mode 100755 nodejs/node_modules/cron-parser/test/31_of_month.js create mode 100755 nodejs/node_modules/cron-parser/test/bug.js create mode 100755 nodejs/node_modules/cron-parser/test/crontab.example create mode 100755 nodejs/node_modules/cron-parser/test/expression.js create mode 100755 nodejs/node_modules/cron-parser/test/increment_on_first_iteration.js create mode 100755 nodejs/node_modules/cron-parser/test/parser.js create mode 100755 nodejs/node_modules/cron-parser/test/timezone.js create mode 100755 nodejs/node_modules/define-properties/.editorconfig create mode 100755 nodejs/node_modules/define-properties/.eslintrc create mode 100755 nodejs/node_modules/define-properties/.jscs.json create mode 100755 nodejs/node_modules/define-properties/.travis.yml create mode 100755 nodejs/node_modules/define-properties/CHANGELOG.md create mode 100755 nodejs/node_modules/define-properties/LICENSE create mode 100755 nodejs/node_modules/define-properties/README.md create mode 100755 nodejs/node_modules/define-properties/index.js create mode 100755 nodejs/node_modules/define-properties/package.json create mode 100755 nodejs/node_modules/define-properties/test/index.js create mode 100755 nodejs/node_modules/double-ended-queue/.npmignore create mode 100755 nodejs/node_modules/double-ended-queue/Gruntfile.js create mode 100755 nodejs/node_modules/double-ended-queue/LICENSE create mode 100755 nodejs/node_modules/double-ended-queue/README.md create mode 100755 nodejs/node_modules/double-ended-queue/js/deque.js create mode 100755 nodejs/node_modules/double-ended-queue/package.json create mode 100755 nodejs/node_modules/is-nan/.eslintrc create mode 100755 nodejs/node_modules/is-nan/.jscs.json create mode 100755 nodejs/node_modules/is-nan/.npmignore create mode 100755 nodejs/node_modules/is-nan/.travis.yml create mode 100755 nodejs/node_modules/is-nan/CHANGELOG.md create mode 100755 nodejs/node_modules/is-nan/LICENSE create mode 100755 nodejs/node_modules/is-nan/README.md create mode 100755 nodejs/node_modules/is-nan/implementation.js create mode 100755 nodejs/node_modules/is-nan/index.js create mode 100755 nodejs/node_modules/is-nan/package.json create mode 100755 nodejs/node_modules/is-nan/polyfill.js create mode 100755 nodejs/node_modules/is-nan/shim.js create mode 100755 nodejs/node_modules/is-nan/test/index.js create mode 100755 nodejs/node_modules/is-nan/test/shimmed.js create mode 100755 nodejs/node_modules/is-nan/test/tests.js create mode 100755 nodejs/node_modules/long-timeout/README.md create mode 100755 nodejs/node_modules/long-timeout/example.js create mode 100755 nodejs/node_modules/long-timeout/index.js create mode 100755 nodejs/node_modules/long-timeout/package.json create mode 100755 nodejs/node_modules/moment-timezone/LICENSE create mode 100755 nodejs/node_modules/moment-timezone/README.md create mode 100755 nodejs/node_modules/moment-timezone/builds/moment-timezone-with-data-2012-2022.js create mode 100755 nodejs/node_modules/moment-timezone/builds/moment-timezone-with-data-2012-2022.min.js create mode 100755 nodejs/node_modules/moment-timezone/builds/moment-timezone-with-data.js create mode 100755 nodejs/node_modules/moment-timezone/builds/moment-timezone-with-data.min.js create mode 100755 nodejs/node_modules/moment-timezone/builds/moment-timezone.min.js create mode 100755 nodejs/node_modules/moment-timezone/changelog.md create mode 100755 nodejs/node_modules/moment-timezone/composer.json create mode 100755 nodejs/node_modules/moment-timezone/data/meta/latest.json create mode 100755 nodejs/node_modules/moment-timezone/data/packed/latest.json create mode 100755 nodejs/node_modules/moment-timezone/index.js create mode 100755 nodejs/node_modules/moment-timezone/moment-timezone-utils.js create mode 100755 nodejs/node_modules/moment-timezone/moment-timezone.js create mode 100755 nodejs/node_modules/moment-timezone/package.json create mode 100755 nodejs/node_modules/moment/CHANGELOG.md create mode 100755 nodejs/node_modules/moment/LICENSE create mode 100755 nodejs/node_modules/moment/README.md create mode 100755 nodejs/node_modules/moment/ender.js create mode 100755 nodejs/node_modules/moment/locale/af.js create mode 100755 nodejs/node_modules/moment/locale/ar-dz.js create mode 100755 nodejs/node_modules/moment/locale/ar-kw.js create mode 100755 nodejs/node_modules/moment/locale/ar-ly.js create mode 100755 nodejs/node_modules/moment/locale/ar-ma.js create mode 100755 nodejs/node_modules/moment/locale/ar-sa.js create mode 100755 nodejs/node_modules/moment/locale/ar-tn.js create mode 100755 nodejs/node_modules/moment/locale/ar.js create mode 100755 nodejs/node_modules/moment/locale/az.js create mode 100755 nodejs/node_modules/moment/locale/be.js create mode 100755 nodejs/node_modules/moment/locale/bg.js create mode 100755 nodejs/node_modules/moment/locale/bm.js create mode 100755 nodejs/node_modules/moment/locale/bn.js create mode 100755 nodejs/node_modules/moment/locale/bo.js create mode 100755 nodejs/node_modules/moment/locale/br.js create mode 100755 nodejs/node_modules/moment/locale/bs.js create mode 100755 nodejs/node_modules/moment/locale/ca.js create mode 100755 nodejs/node_modules/moment/locale/cs.js create mode 100755 nodejs/node_modules/moment/locale/cv.js create mode 100755 nodejs/node_modules/moment/locale/cy.js create mode 100755 nodejs/node_modules/moment/locale/da.js create mode 100755 nodejs/node_modules/moment/locale/de-at.js create mode 100755 nodejs/node_modules/moment/locale/de-ch.js create mode 100755 nodejs/node_modules/moment/locale/de.js create mode 100755 nodejs/node_modules/moment/locale/dv.js create mode 100755 nodejs/node_modules/moment/locale/el.js create mode 100755 nodejs/node_modules/moment/locale/en-au.js create mode 100755 nodejs/node_modules/moment/locale/en-ca.js create mode 100755 nodejs/node_modules/moment/locale/en-gb.js create mode 100755 nodejs/node_modules/moment/locale/en-ie.js create mode 100755 nodejs/node_modules/moment/locale/en-il.js create mode 100755 nodejs/node_modules/moment/locale/en-nz.js create mode 100755 nodejs/node_modules/moment/locale/eo.js create mode 100755 nodejs/node_modules/moment/locale/es-do.js create mode 100755 nodejs/node_modules/moment/locale/es-us.js create mode 100755 nodejs/node_modules/moment/locale/es.js create mode 100755 nodejs/node_modules/moment/locale/et.js create mode 100755 nodejs/node_modules/moment/locale/eu.js create mode 100755 nodejs/node_modules/moment/locale/fa.js create mode 100755 nodejs/node_modules/moment/locale/fi.js create mode 100755 nodejs/node_modules/moment/locale/fo.js create mode 100755 nodejs/node_modules/moment/locale/fr-ca.js create mode 100755 nodejs/node_modules/moment/locale/fr-ch.js create mode 100755 nodejs/node_modules/moment/locale/fr.js create mode 100755 nodejs/node_modules/moment/locale/fy.js create mode 100755 nodejs/node_modules/moment/locale/gd.js create mode 100755 nodejs/node_modules/moment/locale/gl.js create mode 100755 nodejs/node_modules/moment/locale/gom-latn.js create mode 100755 nodejs/node_modules/moment/locale/gu.js create mode 100755 nodejs/node_modules/moment/locale/he.js create mode 100755 nodejs/node_modules/moment/locale/hi.js create mode 100755 nodejs/node_modules/moment/locale/hr.js create mode 100755 nodejs/node_modules/moment/locale/hu.js create mode 100755 nodejs/node_modules/moment/locale/hy-am.js create mode 100755 nodejs/node_modules/moment/locale/id.js create mode 100755 nodejs/node_modules/moment/locale/is.js create mode 100755 nodejs/node_modules/moment/locale/it.js create mode 100755 nodejs/node_modules/moment/locale/ja.js create mode 100755 nodejs/node_modules/moment/locale/jv.js create mode 100755 nodejs/node_modules/moment/locale/ka.js create mode 100755 nodejs/node_modules/moment/locale/kk.js create mode 100755 nodejs/node_modules/moment/locale/km.js create mode 100755 nodejs/node_modules/moment/locale/kn.js create mode 100755 nodejs/node_modules/moment/locale/ko.js create mode 100755 nodejs/node_modules/moment/locale/ky.js create mode 100755 nodejs/node_modules/moment/locale/lb.js create mode 100755 nodejs/node_modules/moment/locale/lo.js create mode 100755 nodejs/node_modules/moment/locale/lt.js create mode 100755 nodejs/node_modules/moment/locale/lv.js create mode 100755 nodejs/node_modules/moment/locale/me.js create mode 100755 nodejs/node_modules/moment/locale/mi.js create mode 100755 nodejs/node_modules/moment/locale/mk.js create mode 100755 nodejs/node_modules/moment/locale/ml.js create mode 100755 nodejs/node_modules/moment/locale/mn.js create mode 100755 nodejs/node_modules/moment/locale/mr.js create mode 100755 nodejs/node_modules/moment/locale/ms-my.js create mode 100755 nodejs/node_modules/moment/locale/ms.js create mode 100755 nodejs/node_modules/moment/locale/mt.js create mode 100755 nodejs/node_modules/moment/locale/my.js create mode 100755 nodejs/node_modules/moment/locale/nb.js create mode 100755 nodejs/node_modules/moment/locale/ne.js create mode 100755 nodejs/node_modules/moment/locale/nl-be.js create mode 100755 nodejs/node_modules/moment/locale/nl.js create mode 100755 nodejs/node_modules/moment/locale/nn.js create mode 100755 nodejs/node_modules/moment/locale/pa-in.js create mode 100755 nodejs/node_modules/moment/locale/pl.js create mode 100755 nodejs/node_modules/moment/locale/pt-br.js create mode 100755 nodejs/node_modules/moment/locale/pt.js create mode 100755 nodejs/node_modules/moment/locale/ro.js create mode 100755 nodejs/node_modules/moment/locale/ru.js create mode 100755 nodejs/node_modules/moment/locale/sd.js create mode 100755 nodejs/node_modules/moment/locale/se.js create mode 100755 nodejs/node_modules/moment/locale/si.js create mode 100755 nodejs/node_modules/moment/locale/sk.js create mode 100755 nodejs/node_modules/moment/locale/sl.js create mode 100755 nodejs/node_modules/moment/locale/sq.js create mode 100755 nodejs/node_modules/moment/locale/sr-cyrl.js create mode 100755 nodejs/node_modules/moment/locale/sr.js create mode 100755 nodejs/node_modules/moment/locale/ss.js create mode 100755 nodejs/node_modules/moment/locale/sv.js create mode 100755 nodejs/node_modules/moment/locale/sw.js create mode 100755 nodejs/node_modules/moment/locale/ta.js create mode 100755 nodejs/node_modules/moment/locale/te.js create mode 100755 nodejs/node_modules/moment/locale/tet.js create mode 100755 nodejs/node_modules/moment/locale/tg.js create mode 100755 nodejs/node_modules/moment/locale/th.js create mode 100755 nodejs/node_modules/moment/locale/tl-ph.js create mode 100755 nodejs/node_modules/moment/locale/tlh.js create mode 100755 nodejs/node_modules/moment/locale/tr.js create mode 100755 nodejs/node_modules/moment/locale/tzl.js create mode 100755 nodejs/node_modules/moment/locale/tzm-latn.js create mode 100755 nodejs/node_modules/moment/locale/tzm.js create mode 100755 nodejs/node_modules/moment/locale/ug-cn.js create mode 100755 nodejs/node_modules/moment/locale/uk.js create mode 100755 nodejs/node_modules/moment/locale/ur.js create mode 100755 nodejs/node_modules/moment/locale/uz-latn.js create mode 100755 nodejs/node_modules/moment/locale/uz.js create mode 100755 nodejs/node_modules/moment/locale/vi.js create mode 100755 nodejs/node_modules/moment/locale/x-pseudo.js create mode 100755 nodejs/node_modules/moment/locale/yo.js create mode 100755 nodejs/node_modules/moment/locale/zh-cn.js create mode 100755 nodejs/node_modules/moment/locale/zh-hk.js create mode 100755 nodejs/node_modules/moment/locale/zh-tw.js create mode 100755 nodejs/node_modules/moment/min/locales.js create mode 100755 nodejs/node_modules/moment/min/locales.min.js create mode 100755 nodejs/node_modules/moment/min/moment-with-locales.js create mode 100755 nodejs/node_modules/moment/min/moment-with-locales.min.js create mode 100755 nodejs/node_modules/moment/min/moment.min.js create mode 100755 nodejs/node_modules/moment/moment.d.ts create mode 100755 nodejs/node_modules/moment/moment.js create mode 100755 nodejs/node_modules/moment/package.js create mode 100755 nodejs/node_modules/moment/package.json create mode 100755 nodejs/node_modules/moment/src/lib/create/check-overflow.js create mode 100755 nodejs/node_modules/moment/src/lib/create/date-from-array.js create mode 100755 nodejs/node_modules/moment/src/lib/create/from-anything.js create mode 100755 nodejs/node_modules/moment/src/lib/create/from-array.js create mode 100755 nodejs/node_modules/moment/src/lib/create/from-object.js create mode 100755 nodejs/node_modules/moment/src/lib/create/from-string-and-array.js create mode 100755 nodejs/node_modules/moment/src/lib/create/from-string-and-format.js create mode 100755 nodejs/node_modules/moment/src/lib/create/from-string.js create mode 100755 nodejs/node_modules/moment/src/lib/create/local.js create mode 100755 nodejs/node_modules/moment/src/lib/create/parsing-flags.js create mode 100755 nodejs/node_modules/moment/src/lib/create/utc.js create mode 100755 nodejs/node_modules/moment/src/lib/create/valid.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/abs.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/add-subtract.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/as.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/bubble.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/clone.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/constructor.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/create.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/duration.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/get.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/humanize.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/iso-string.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/prototype.js create mode 100755 nodejs/node_modules/moment/src/lib/duration/valid.js create mode 100755 nodejs/node_modules/moment/src/lib/format/format.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/base-config.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/calendar.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/constructor.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/en.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/formats.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/invalid.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/lists.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/locale.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/locales.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/ordinal.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/pre-post-format.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/prototype.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/relative.js create mode 100755 nodejs/node_modules/moment/src/lib/locale/set.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/add-subtract.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/calendar.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/clone.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/compare.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/constructor.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/creation-data.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/diff.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/format.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/from.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/get-set.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/locale.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/min-max.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/moment.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/now.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/prototype.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/start-end-of.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/to-type.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/to.js create mode 100755 nodejs/node_modules/moment/src/lib/moment/valid.js create mode 100755 nodejs/node_modules/moment/src/lib/parse/regex.js create mode 100755 nodejs/node_modules/moment/src/lib/parse/token.js create mode 100755 nodejs/node_modules/moment/src/lib/units/aliases.js create mode 100755 nodejs/node_modules/moment/src/lib/units/constants.js create mode 100755 nodejs/node_modules/moment/src/lib/units/day-of-month.js create mode 100755 nodejs/node_modules/moment/src/lib/units/day-of-week.js create mode 100755 nodejs/node_modules/moment/src/lib/units/day-of-year.js create mode 100755 nodejs/node_modules/moment/src/lib/units/hour.js create mode 100755 nodejs/node_modules/moment/src/lib/units/millisecond.js create mode 100755 nodejs/node_modules/moment/src/lib/units/minute.js create mode 100755 nodejs/node_modules/moment/src/lib/units/month.js create mode 100755 nodejs/node_modules/moment/src/lib/units/offset.js create mode 100755 nodejs/node_modules/moment/src/lib/units/priorities.js create mode 100755 nodejs/node_modules/moment/src/lib/units/quarter.js create mode 100755 nodejs/node_modules/moment/src/lib/units/second.js create mode 100755 nodejs/node_modules/moment/src/lib/units/timestamp.js create mode 100755 nodejs/node_modules/moment/src/lib/units/timezone.js create mode 100755 nodejs/node_modules/moment/src/lib/units/units.js create mode 100755 nodejs/node_modules/moment/src/lib/units/week-calendar-utils.js create mode 100755 nodejs/node_modules/moment/src/lib/units/week-year.js create mode 100755 nodejs/node_modules/moment/src/lib/units/week.js create mode 100755 nodejs/node_modules/moment/src/lib/units/year.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/abs-ceil.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/abs-floor.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/abs-round.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/compare-arrays.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/defaults.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/deprecate.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/extend.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/has-own-prop.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/hooks.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/index-of.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/is-array.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/is-date.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/is-function.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/is-number.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/is-object-empty.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/is-object.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/is-undefined.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/keys.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/map.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/mod.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/some.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/to-int.js create mode 100755 nodejs/node_modules/moment/src/lib/utils/zero-fill.js create mode 100755 nodejs/node_modules/moment/src/locale/af.js create mode 100755 nodejs/node_modules/moment/src/locale/ar-dz.js create mode 100755 nodejs/node_modules/moment/src/locale/ar-kw.js create mode 100755 nodejs/node_modules/moment/src/locale/ar-ly.js create mode 100755 nodejs/node_modules/moment/src/locale/ar-ma.js create mode 100755 nodejs/node_modules/moment/src/locale/ar-sa.js create mode 100755 nodejs/node_modules/moment/src/locale/ar-tn.js create mode 100755 nodejs/node_modules/moment/src/locale/ar.js create mode 100755 nodejs/node_modules/moment/src/locale/az.js create mode 100755 nodejs/node_modules/moment/src/locale/be.js create mode 100755 nodejs/node_modules/moment/src/locale/bg.js create mode 100755 nodejs/node_modules/moment/src/locale/bm.js create mode 100755 nodejs/node_modules/moment/src/locale/bn.js create mode 100755 nodejs/node_modules/moment/src/locale/bo.js create mode 100755 nodejs/node_modules/moment/src/locale/br.js create mode 100755 nodejs/node_modules/moment/src/locale/bs.js create mode 100755 nodejs/node_modules/moment/src/locale/ca.js create mode 100755 nodejs/node_modules/moment/src/locale/cs.js create mode 100755 nodejs/node_modules/moment/src/locale/cv.js create mode 100755 nodejs/node_modules/moment/src/locale/cy.js create mode 100755 nodejs/node_modules/moment/src/locale/da.js create mode 100755 nodejs/node_modules/moment/src/locale/de-at.js create mode 100755 nodejs/node_modules/moment/src/locale/de-ch.js create mode 100755 nodejs/node_modules/moment/src/locale/de.js create mode 100755 nodejs/node_modules/moment/src/locale/dv.js create mode 100755 nodejs/node_modules/moment/src/locale/el.js create mode 100755 nodejs/node_modules/moment/src/locale/en-au.js create mode 100755 nodejs/node_modules/moment/src/locale/en-ca.js create mode 100755 nodejs/node_modules/moment/src/locale/en-gb.js create mode 100755 nodejs/node_modules/moment/src/locale/en-ie.js create mode 100755 nodejs/node_modules/moment/src/locale/en-il.js create mode 100755 nodejs/node_modules/moment/src/locale/en-nz.js create mode 100755 nodejs/node_modules/moment/src/locale/eo.js create mode 100755 nodejs/node_modules/moment/src/locale/es-do.js create mode 100755 nodejs/node_modules/moment/src/locale/es-us.js create mode 100755 nodejs/node_modules/moment/src/locale/es.js create mode 100755 nodejs/node_modules/moment/src/locale/et.js create mode 100755 nodejs/node_modules/moment/src/locale/eu.js create mode 100755 nodejs/node_modules/moment/src/locale/fa.js create mode 100755 nodejs/node_modules/moment/src/locale/fi.js create mode 100755 nodejs/node_modules/moment/src/locale/fo.js create mode 100755 nodejs/node_modules/moment/src/locale/fr-ca.js create mode 100755 nodejs/node_modules/moment/src/locale/fr-ch.js create mode 100755 nodejs/node_modules/moment/src/locale/fr.js create mode 100755 nodejs/node_modules/moment/src/locale/fy.js create mode 100755 nodejs/node_modules/moment/src/locale/gd.js create mode 100755 nodejs/node_modules/moment/src/locale/gl.js create mode 100755 nodejs/node_modules/moment/src/locale/gom-latn.js create mode 100755 nodejs/node_modules/moment/src/locale/gu.js create mode 100755 nodejs/node_modules/moment/src/locale/he.js create mode 100755 nodejs/node_modules/moment/src/locale/hi.js create mode 100755 nodejs/node_modules/moment/src/locale/hr.js create mode 100755 nodejs/node_modules/moment/src/locale/hu.js create mode 100755 nodejs/node_modules/moment/src/locale/hy-am.js create mode 100755 nodejs/node_modules/moment/src/locale/id.js create mode 100755 nodejs/node_modules/moment/src/locale/is.js create mode 100755 nodejs/node_modules/moment/src/locale/it.js create mode 100755 nodejs/node_modules/moment/src/locale/ja.js create mode 100755 nodejs/node_modules/moment/src/locale/jv.js create mode 100755 nodejs/node_modules/moment/src/locale/ka.js create mode 100755 nodejs/node_modules/moment/src/locale/kk.js create mode 100755 nodejs/node_modules/moment/src/locale/km.js create mode 100755 nodejs/node_modules/moment/src/locale/kn.js create mode 100755 nodejs/node_modules/moment/src/locale/ko.js create mode 100755 nodejs/node_modules/moment/src/locale/ky.js create mode 100755 nodejs/node_modules/moment/src/locale/lb.js create mode 100755 nodejs/node_modules/moment/src/locale/lo.js create mode 100755 nodejs/node_modules/moment/src/locale/lt.js create mode 100755 nodejs/node_modules/moment/src/locale/lv.js create mode 100755 nodejs/node_modules/moment/src/locale/me.js create mode 100755 nodejs/node_modules/moment/src/locale/mi.js create mode 100755 nodejs/node_modules/moment/src/locale/mk.js create mode 100755 nodejs/node_modules/moment/src/locale/ml.js create mode 100755 nodejs/node_modules/moment/src/locale/mn.js create mode 100755 nodejs/node_modules/moment/src/locale/mr.js create mode 100755 nodejs/node_modules/moment/src/locale/ms-my.js create mode 100755 nodejs/node_modules/moment/src/locale/ms.js create mode 100755 nodejs/node_modules/moment/src/locale/mt.js create mode 100755 nodejs/node_modules/moment/src/locale/my.js create mode 100755 nodejs/node_modules/moment/src/locale/nb.js create mode 100755 nodejs/node_modules/moment/src/locale/ne.js create mode 100755 nodejs/node_modules/moment/src/locale/nl-be.js create mode 100755 nodejs/node_modules/moment/src/locale/nl.js create mode 100755 nodejs/node_modules/moment/src/locale/nn.js create mode 100755 nodejs/node_modules/moment/src/locale/pa-in.js create mode 100755 nodejs/node_modules/moment/src/locale/pl.js create mode 100755 nodejs/node_modules/moment/src/locale/pt-br.js create mode 100755 nodejs/node_modules/moment/src/locale/pt.js create mode 100755 nodejs/node_modules/moment/src/locale/ro.js create mode 100755 nodejs/node_modules/moment/src/locale/ru.js create mode 100755 nodejs/node_modules/moment/src/locale/sd.js create mode 100755 nodejs/node_modules/moment/src/locale/se.js create mode 100755 nodejs/node_modules/moment/src/locale/si.js create mode 100755 nodejs/node_modules/moment/src/locale/sk.js create mode 100755 nodejs/node_modules/moment/src/locale/sl.js create mode 100755 nodejs/node_modules/moment/src/locale/sq.js create mode 100755 nodejs/node_modules/moment/src/locale/sr-cyrl.js create mode 100755 nodejs/node_modules/moment/src/locale/sr.js create mode 100755 nodejs/node_modules/moment/src/locale/ss.js create mode 100755 nodejs/node_modules/moment/src/locale/sv.js create mode 100755 nodejs/node_modules/moment/src/locale/sw.js create mode 100755 nodejs/node_modules/moment/src/locale/ta.js create mode 100755 nodejs/node_modules/moment/src/locale/te.js create mode 100755 nodejs/node_modules/moment/src/locale/tet.js create mode 100755 nodejs/node_modules/moment/src/locale/tg.js create mode 100755 nodejs/node_modules/moment/src/locale/th.js create mode 100755 nodejs/node_modules/moment/src/locale/tl-ph.js create mode 100755 nodejs/node_modules/moment/src/locale/tlh.js create mode 100755 nodejs/node_modules/moment/src/locale/tr.js create mode 100755 nodejs/node_modules/moment/src/locale/tzl.js create mode 100755 nodejs/node_modules/moment/src/locale/tzm-latn.js create mode 100755 nodejs/node_modules/moment/src/locale/tzm.js create mode 100755 nodejs/node_modules/moment/src/locale/ug-cn.js create mode 100755 nodejs/node_modules/moment/src/locale/uk.js create mode 100755 nodejs/node_modules/moment/src/locale/ur.js create mode 100755 nodejs/node_modules/moment/src/locale/uz-latn.js create mode 100755 nodejs/node_modules/moment/src/locale/uz.js create mode 100755 nodejs/node_modules/moment/src/locale/vi.js create mode 100755 nodejs/node_modules/moment/src/locale/x-pseudo.js create mode 100755 nodejs/node_modules/moment/src/locale/yo.js create mode 100755 nodejs/node_modules/moment/src/locale/zh-cn.js create mode 100755 nodejs/node_modules/moment/src/locale/zh-hk.js create mode 100755 nodejs/node_modules/moment/src/locale/zh-tw.js create mode 100755 nodejs/node_modules/moment/src/moment.js create mode 100755 nodejs/node_modules/node-schedule/.eslintrc create mode 100755 nodejs/node_modules/node-schedule/.travis.yml create mode 100755 nodejs/node_modules/node-schedule/CONTRIBUTING.md create mode 100755 nodejs/node_modules/node-schedule/LICENSE create mode 100755 nodejs/node_modules/node-schedule/README.md create mode 100755 nodejs/node_modules/node-schedule/lib/schedule.js create mode 100755 nodejs/node_modules/node-schedule/package.json create mode 100755 nodejs/node_modules/node-schedule/test/.eslintrc create mode 100755 nodejs/node_modules/node-schedule/test/cancel-long-running-jobs.js create mode 100755 nodejs/node_modules/node-schedule/test/convenience-method-test.js create mode 100755 nodejs/node_modules/node-schedule/test/date-convenience-methods-test.js create mode 100755 nodejs/node_modules/node-schedule/test/es6/job-test.js create mode 100755 nodejs/node_modules/node-schedule/test/job-test.js create mode 100755 nodejs/node_modules/node-schedule/test/range-test.js create mode 100755 nodejs/node_modules/node-schedule/test/recurrence-rule-test.js create mode 100755 nodejs/node_modules/node-schedule/test/schedule-cron-jobs.js create mode 100755 nodejs/node_modules/node-schedule/test/start-end-test.js create mode 100755 nodejs/node_modules/object-keys/.editorconfig create mode 100755 nodejs/node_modules/object-keys/.eslintrc create mode 100755 nodejs/node_modules/object-keys/.jscs.json create mode 100755 nodejs/node_modules/object-keys/.travis.yml create mode 100755 nodejs/node_modules/object-keys/CHANGELOG.md create mode 100755 nodejs/node_modules/object-keys/LICENSE create mode 100755 nodejs/node_modules/object-keys/README.md create mode 100755 nodejs/node_modules/object-keys/index.js create mode 100755 nodejs/node_modules/object-keys/isArguments.js create mode 100755 nodejs/node_modules/object-keys/package.json create mode 100755 nodejs/node_modules/object-keys/test/index.js create mode 100755 nodejs/node_modules/redis-commands/.travis.yml create mode 100755 nodejs/node_modules/redis-commands/LICENSE create mode 100755 nodejs/node_modules/redis-commands/README.md create mode 100755 nodejs/node_modules/redis-commands/changelog.md create mode 100755 nodejs/node_modules/redis-commands/commands.json create mode 100755 nodejs/node_modules/redis-commands/index.js create mode 100755 nodejs/node_modules/redis-commands/package.json create mode 100755 nodejs/node_modules/redis-commands/tools/build.js create mode 100755 nodejs/node_modules/redis-parser/.npmignore create mode 100755 nodejs/node_modules/redis-parser/LICENSE create mode 100755 nodejs/node_modules/redis-parser/README.md create mode 100755 nodejs/node_modules/redis-parser/changelog.md create mode 100755 nodejs/node_modules/redis-parser/index.js create mode 100755 nodejs/node_modules/redis-parser/lib/hiredis.js create mode 100755 nodejs/node_modules/redis-parser/lib/parser.js create mode 100755 nodejs/node_modules/redis-parser/lib/parserError.js create mode 100755 nodejs/node_modules/redis-parser/lib/redisError.js create mode 100755 nodejs/node_modules/redis-parser/lib/replyError.js create mode 100755 nodejs/node_modules/redis-parser/package.json create mode 100755 nodejs/node_modules/redis/.eslintignore create mode 100755 nodejs/node_modules/redis/.eslintrc create mode 100755 nodejs/node_modules/redis/.github/ISSUE_TEMPLATE.md create mode 100755 nodejs/node_modules/redis/.github/PULL_REQUEST_TEMPLATE.md create mode 100755 nodejs/node_modules/redis/.npmignore create mode 100755 nodejs/node_modules/redis/LICENSE create mode 100755 nodejs/node_modules/redis/README.md create mode 100755 nodejs/node_modules/redis/changelog.md create mode 100755 nodejs/node_modules/redis/index.js create mode 100755 nodejs/node_modules/redis/lib/command.js create mode 100755 nodejs/node_modules/redis/lib/commands.js create mode 100755 nodejs/node_modules/redis/lib/createClient.js create mode 100755 nodejs/node_modules/redis/lib/customErrors.js create mode 100755 nodejs/node_modules/redis/lib/debug.js create mode 100755 nodejs/node_modules/redis/lib/extendedApi.js create mode 100755 nodejs/node_modules/redis/lib/individualCommands.js create mode 100755 nodejs/node_modules/redis/lib/multi.js create mode 100755 nodejs/node_modules/redis/lib/utils.js create mode 100755 nodejs/node_modules/redis/package.json create mode 100755 nodejs/node_modules/sorted-array-functions/.travis.yml create mode 100755 nodejs/node_modules/sorted-array-functions/LICENSE create mode 100755 nodejs/node_modules/sorted-array-functions/README.md create mode 100755 nodejs/node_modules/sorted-array-functions/example.js create mode 100755 nodejs/node_modules/sorted-array-functions/index.js create mode 100755 nodejs/node_modules/sorted-array-functions/package.json create mode 100755 nodejs/node_modules/sorted-array-functions/test.js create mode 100755 nodejs/package-lock.json create mode 100755 nodejs/package.json create mode 100644 public/.gitignore create mode 100644 public/adminer.php create mode 100644 public/bignumber.min.js create mode 100644 public/domissions.php create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/push.sh create mode 100644 public/start.sh create mode 100644 public/static/admin.js create mode 100644 public/static/index.a5c69d49.css create mode 100644 public/static/login.js create mode 100644 public/static/mp3/cz.mp3 create mode 100644 public/static/mp3/cztx.mp3 create mode 100644 public/static/mp3/order.mp3 create mode 100644 public/static/mp3/tx.mp3 create mode 100644 public/static/myself/my_plugs_files create mode 100644 public/static/plugs/angular/angular.min.js create mode 100644 public/static/plugs/awesome/fonts.css create mode 100644 public/static/plugs/awesome/fonts/FontAwesome.otf create mode 100644 public/static/plugs/awesome/fonts/webfont.eot create mode 100644 public/static/plugs/awesome/fonts/webfont.svg create mode 100644 public/static/plugs/awesome/fonts/webfont.ttf create mode 100644 public/static/plugs/awesome/fonts/webfont.woff create mode 100644 public/static/plugs/awesome/fonts/webfont.woff2 create mode 100644 public/static/plugs/ckeditor/ckeditor.js create mode 100644 public/static/plugs/ckeditor/config.js create mode 100644 public/static/plugs/ckeditor/contents.css create mode 100644 public/static/plugs/ckeditor/lang/en.js create mode 100644 public/static/plugs/ckeditor/lang/zh-cn.js create mode 100644 public/static/plugs/ckeditor/lang/zh.js create mode 100644 public/static/plugs/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js create mode 100644 public/static/plugs/ckeditor/plugins/a11yhelp/dialogs/lang/en.js create mode 100644 public/static/plugs/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js create mode 100644 public/static/plugs/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js create mode 100644 public/static/plugs/ckeditor/plugins/about/dialogs/about.js create mode 100644 public/static/plugs/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png create mode 100644 public/static/plugs/ckeditor/plugins/about/dialogs/logo_ckeditor.png create mode 100644 public/static/plugs/ckeditor/plugins/clipboard/dialogs/paste.js create mode 100644 public/static/plugs/ckeditor/plugins/colordialog/dialogs/colordialog.css create mode 100644 public/static/plugs/ckeditor/plugins/colordialog/dialogs/colordialog.js create mode 100644 public/static/plugs/ckeditor/plugins/copyformatting/cursors/cursor-disabled.svg create mode 100644 public/static/plugs/ckeditor/plugins/copyformatting/cursors/cursor.svg create mode 100644 public/static/plugs/ckeditor/plugins/copyformatting/styles/copyformatting.css create mode 100644 public/static/plugs/ckeditor/plugins/dialog/dialogDefinition.js create mode 100644 public/static/plugs/ckeditor/plugins/div/dialogs/div.js create mode 100644 public/static/plugs/ckeditor/plugins/find/dialogs/find.js create mode 100644 public/static/plugs/ckeditor/plugins/flash/dialogs/flash.js create mode 100644 public/static/plugs/ckeditor/plugins/flash/images/placeholder.png create mode 100644 public/static/plugs/ckeditor/plugins/forms/dialogs/button.js create mode 100644 public/static/plugs/ckeditor/plugins/forms/dialogs/checkbox.js create mode 100644 public/static/plugs/ckeditor/plugins/forms/dialogs/form.js create mode 100644 public/static/plugs/ckeditor/plugins/forms/dialogs/hiddenfield.js create mode 100644 public/static/plugs/ckeditor/plugins/forms/dialogs/radio.js create mode 100644 public/static/plugs/ckeditor/plugins/forms/dialogs/select.js create mode 100644 public/static/plugs/ckeditor/plugins/forms/dialogs/textarea.js create mode 100644 public/static/plugs/ckeditor/plugins/forms/dialogs/textfield.js create mode 100644 public/static/plugs/ckeditor/plugins/forms/images/hiddenfield.gif create mode 100644 public/static/plugs/ckeditor/plugins/icons.png create mode 100644 public/static/plugs/ckeditor/plugins/icons_hidpi.png create mode 100644 public/static/plugs/ckeditor/plugins/iframe/dialogs/iframe.js create mode 100644 public/static/plugs/ckeditor/plugins/iframe/images/placeholder.png create mode 100644 public/static/plugs/ckeditor/plugins/image/dialogs/image.js create mode 100644 public/static/plugs/ckeditor/plugins/image/images/noimage.png create mode 100644 public/static/plugs/ckeditor/plugins/link/dialogs/anchor.js create mode 100644 public/static/plugs/ckeditor/plugins/link/dialogs/link.js create mode 100644 public/static/plugs/ckeditor/plugins/link/images/anchor.png create mode 100644 public/static/plugs/ckeditor/plugins/link/images/hidpi/anchor.png create mode 100644 public/static/plugs/ckeditor/plugins/liststyle/dialogs/liststyle.js create mode 100644 public/static/plugs/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png create mode 100644 public/static/plugs/ckeditor/plugins/magicline/images/hidpi/icon.png create mode 100644 public/static/plugs/ckeditor/plugins/magicline/images/icon-rtl.png create mode 100644 public/static/plugs/ckeditor/plugins/magicline/images/icon.png create mode 100644 public/static/plugs/ckeditor/plugins/pagebreak/images/pagebreak.gif create mode 100644 public/static/plugs/ckeditor/plugins/pastefromword/filter/default.js create mode 100644 public/static/plugs/ckeditor/plugins/preview/preview.html create mode 100644 public/static/plugs/ckeditor/plugins/scayt/CHANGELOG.md create mode 100644 public/static/plugs/ckeditor/plugins/scayt/LICENSE.md create mode 100644 public/static/plugs/ckeditor/plugins/scayt/README.md create mode 100644 public/static/plugs/ckeditor/plugins/scayt/dialogs/dialog.css create mode 100644 public/static/plugs/ckeditor/plugins/scayt/dialogs/options.js create mode 100644 public/static/plugs/ckeditor/plugins/scayt/dialogs/toolbar.css create mode 100644 public/static/plugs/ckeditor/plugins/scayt/skins/moono-lisa/scayt.css create mode 100644 public/static/plugs/ckeditor/plugins/showblocks/images/block_address.png create mode 100644 public/static/plugs/ckeditor/plugins/showblocks/images/block_blockquote.png create mode 100644 public/static/plugs/ckeditor/plugins/showblocks/images/block_div.png create mode 100644 public/static/plugs/ckeditor/plugins/showblocks/images/block_h1.png create mode 100644 public/static/plugs/ckeditor/plugins/showblocks/images/block_h2.png create mode 100644 public/static/plugs/ckeditor/plugins/showblocks/images/block_h3.png create mode 100644 public/static/plugs/ckeditor/plugins/showblocks/images/block_h4.png create mode 100644 public/static/plugs/ckeditor/plugins/showblocks/images/block_h5.png create mode 100644 public/static/plugs/ckeditor/plugins/showblocks/images/block_h6.png create mode 100644 public/static/plugs/ckeditor/plugins/showblocks/images/block_p.png create mode 100644 public/static/plugs/ckeditor/plugins/showblocks/images/block_pre.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/dialogs/smiley.js create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/angel_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/angel_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/angry_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/angry_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/broken_heart.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/broken_heart.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/confused_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/confused_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/cry_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/cry_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/devil_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/devil_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/embaressed_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/embarrassed_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/embarrassed_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/envelope.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/envelope.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/heart.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/heart.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/kiss.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/kiss.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/lightbulb.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/lightbulb.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/omg_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/omg_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/regular_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/regular_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/sad_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/sad_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/shades_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/shades_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/teeth_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/teeth_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/thumbs_down.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/thumbs_down.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/thumbs_up.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/thumbs_up.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/tongue_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/tongue_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/tounge_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/wink_smile.gif create mode 100644 public/static/plugs/ckeditor/plugins/smiley/images/wink_smile.png create mode 100644 public/static/plugs/ckeditor/plugins/specialchar/dialogs/lang/en.js create mode 100644 public/static/plugs/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js create mode 100644 public/static/plugs/ckeditor/plugins/specialchar/dialogs/lang/zh.js create mode 100644 public/static/plugs/ckeditor/plugins/specialchar/dialogs/specialchar.js create mode 100644 public/static/plugs/ckeditor/plugins/table/dialogs/table.js create mode 100644 public/static/plugs/ckeditor/plugins/tableselection/styles/tableselection.css create mode 100644 public/static/plugs/ckeditor/plugins/tabletools/dialogs/tableCell.js create mode 100644 public/static/plugs/ckeditor/plugins/templates/dialogs/templates.css create mode 100644 public/static/plugs/ckeditor/plugins/templates/dialogs/templates.js create mode 100644 public/static/plugs/ckeditor/plugins/templates/templates/default.js create mode 100644 public/static/plugs/ckeditor/plugins/templates/templates/images/template1.gif create mode 100644 public/static/plugs/ckeditor/plugins/templates/templates/images/template2.gif create mode 100644 public/static/plugs/ckeditor/plugins/templates/templates/images/template3.gif create mode 100644 public/static/plugs/ckeditor/plugins/widget/images/handle.png create mode 100644 public/static/plugs/ckeditor/plugins/wsc/LICENSE.md create mode 100644 public/static/plugs/ckeditor/plugins/wsc/README.md create mode 100644 public/static/plugs/ckeditor/plugins/wsc/dialogs/ciframe.html create mode 100644 public/static/plugs/ckeditor/plugins/wsc/dialogs/tmpFrameset.html create mode 100644 public/static/plugs/ckeditor/plugins/wsc/dialogs/wsc.css create mode 100644 public/static/plugs/ckeditor/plugins/wsc/dialogs/wsc.js create mode 100644 public/static/plugs/ckeditor/plugins/wsc/dialogs/wsc_ie.js create mode 100644 public/static/plugs/ckeditor/plugins/wsc/skins/moono-lisa/wsc.css create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/dialog.css create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/dialog_ie.css create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/dialog_ie8.css create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/dialog_iequirks.css create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/editor.css create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/editor_gecko.css create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/editor_ie.css create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/editor_ie8.css create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/editor_iequirks.css create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/icons.png create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/icons_hidpi.png create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/images/arrow.png create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/images/close.png create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/images/hidpi/close.png create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/images/hidpi/lock-open.png create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/images/hidpi/lock.png create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/images/hidpi/refresh.png create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/images/lock-open.png create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/images/lock.png create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/images/refresh.png create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/images/spinner.gif create mode 100644 public/static/plugs/ckeditor/skins/moono-lisa/readme.md create mode 100644 public/static/plugs/ckeditor/styles.js create mode 100644 public/static/plugs/echarts/echarts.min.js create mode 100644 public/static/plugs/jquery/area/area.js create mode 100644 public/static/plugs/jquery/area/area.json create mode 100644 public/static/plugs/jquery/area/area.php create mode 100644 public/static/plugs/jquery/autocompleter.css create mode 100644 public/static/plugs/jquery/autocompleter.min.js create mode 100644 public/static/plugs/jquery/base64.min.js create mode 100644 public/static/plugs/jquery/jquery.min.js create mode 100644 public/static/plugs/jquery/json.min.js create mode 100644 public/static/plugs/jquery/less.min.js create mode 100644 public/static/plugs/jquery/masonry.min.js create mode 100644 public/static/plugs/jquery/md5.min.js create mode 100644 public/static/plugs/jquery/pace.min.js create mode 100644 public/static/plugs/jquery/pcasunzips.js create mode 100644 public/static/plugs/jquery/uploader.js create mode 100644 public/static/plugs/layui/css/layui.css create mode 100644 public/static/plugs/layui/css/layui.mobile.css create mode 100644 public/static/plugs/layui/css/modules/code.css create mode 100644 public/static/plugs/layui/css/modules/laydate/default/laydate.css create mode 100644 public/static/plugs/layui/css/modules/layer/default/icon-ext.png create mode 100644 public/static/plugs/layui/css/modules/layer/default/icon.png create mode 100644 public/static/plugs/layui/css/modules/layer/default/layer.css create mode 100644 public/static/plugs/layui/css/modules/layer/default/loading-0.gif create mode 100644 public/static/plugs/layui/css/modules/layer/default/loading-1.gif create mode 100644 public/static/plugs/layui/css/modules/layer/default/loading-2.gif create mode 100644 public/static/plugs/layui/font/iconfont.eot create mode 100644 public/static/plugs/layui/font/iconfont.svg create mode 100644 public/static/plugs/layui/font/iconfont.ttf create mode 100644 public/static/plugs/layui/font/iconfont.woff create mode 100644 public/static/plugs/layui/font/iconfont.woff2 create mode 100644 public/static/plugs/layui/images/face/0.gif create mode 100644 public/static/plugs/layui/images/face/1.gif create mode 100644 public/static/plugs/layui/images/face/10.gif create mode 100644 public/static/plugs/layui/images/face/11.gif create mode 100644 public/static/plugs/layui/images/face/12.gif create mode 100644 public/static/plugs/layui/images/face/13.gif create mode 100644 public/static/plugs/layui/images/face/14.gif create mode 100644 public/static/plugs/layui/images/face/15.gif create mode 100644 public/static/plugs/layui/images/face/16.gif create mode 100644 public/static/plugs/layui/images/face/17.gif create mode 100644 public/static/plugs/layui/images/face/18.gif create mode 100644 public/static/plugs/layui/images/face/19.gif create mode 100644 public/static/plugs/layui/images/face/2.gif create mode 100644 public/static/plugs/layui/images/face/20.gif create mode 100644 public/static/plugs/layui/images/face/21.gif create mode 100644 public/static/plugs/layui/images/face/22.gif create mode 100644 public/static/plugs/layui/images/face/23.gif create mode 100644 public/static/plugs/layui/images/face/24.gif create mode 100644 public/static/plugs/layui/images/face/25.gif create mode 100644 public/static/plugs/layui/images/face/26.gif create mode 100644 public/static/plugs/layui/images/face/27.gif create mode 100644 public/static/plugs/layui/images/face/28.gif create mode 100644 public/static/plugs/layui/images/face/29.gif create mode 100644 public/static/plugs/layui/images/face/3.gif create mode 100644 public/static/plugs/layui/images/face/30.gif create mode 100644 public/static/plugs/layui/images/face/31.gif create mode 100644 public/static/plugs/layui/images/face/32.gif create mode 100644 public/static/plugs/layui/images/face/33.gif create mode 100644 public/static/plugs/layui/images/face/34.gif create mode 100644 public/static/plugs/layui/images/face/35.gif create mode 100644 public/static/plugs/layui/images/face/36.gif create mode 100644 public/static/plugs/layui/images/face/37.gif create mode 100644 public/static/plugs/layui/images/face/38.gif create mode 100644 public/static/plugs/layui/images/face/39.gif create mode 100644 public/static/plugs/layui/images/face/4.gif create mode 100644 public/static/plugs/layui/images/face/40.gif create mode 100644 public/static/plugs/layui/images/face/41.gif create mode 100644 public/static/plugs/layui/images/face/42.gif create mode 100644 public/static/plugs/layui/images/face/43.gif create mode 100644 public/static/plugs/layui/images/face/44.gif create mode 100644 public/static/plugs/layui/images/face/45.gif create mode 100644 public/static/plugs/layui/images/face/46.gif create mode 100644 public/static/plugs/layui/images/face/47.gif create mode 100644 public/static/plugs/layui/images/face/48.gif create mode 100644 public/static/plugs/layui/images/face/49.gif create mode 100644 public/static/plugs/layui/images/face/5.gif create mode 100644 public/static/plugs/layui/images/face/50.gif create mode 100644 public/static/plugs/layui/images/face/51.gif create mode 100644 public/static/plugs/layui/images/face/52.gif create mode 100644 public/static/plugs/layui/images/face/53.gif create mode 100644 public/static/plugs/layui/images/face/54.gif create mode 100644 public/static/plugs/layui/images/face/55.gif create mode 100644 public/static/plugs/layui/images/face/56.gif create mode 100644 public/static/plugs/layui/images/face/57.gif create mode 100644 public/static/plugs/layui/images/face/58.gif create mode 100644 public/static/plugs/layui/images/face/59.gif create mode 100644 public/static/plugs/layui/images/face/6.gif create mode 100644 public/static/plugs/layui/images/face/60.gif create mode 100644 public/static/plugs/layui/images/face/61.gif create mode 100644 public/static/plugs/layui/images/face/62.gif create mode 100644 public/static/plugs/layui/images/face/63.gif create mode 100644 public/static/plugs/layui/images/face/64.gif create mode 100644 public/static/plugs/layui/images/face/65.gif create mode 100644 public/static/plugs/layui/images/face/66.gif create mode 100644 public/static/plugs/layui/images/face/67.gif create mode 100644 public/static/plugs/layui/images/face/68.gif create mode 100644 public/static/plugs/layui/images/face/69.gif create mode 100644 public/static/plugs/layui/images/face/7.gif create mode 100644 public/static/plugs/layui/images/face/70.gif create mode 100644 public/static/plugs/layui/images/face/71.gif create mode 100644 public/static/plugs/layui/images/face/8.gif create mode 100644 public/static/plugs/layui/images/face/9.gif create mode 100644 public/static/plugs/layui/layui.all.js create mode 100644 public/static/plugs/michat/chart.js create mode 100644 public/static/plugs/michat/image/bg.jpg create mode 100644 public/static/plugs/michat/michat.css create mode 100644 public/static/plugs/michat/michat.css.map create mode 100644 public/static/plugs/michat/michat.js create mode 100644 public/static/plugs/michat/michat.less create mode 100644 public/static/plugs/michat/mimc-min_1_0_2.js create mode 100644 public/static/plugs/michat/template.html create mode 100644 public/static/plugs/require/css.js create mode 100644 public/static/plugs/require/require.js create mode 100644 public/static/plugs/socket/swfobject.js create mode 100644 public/static/plugs/socket/websocket.js create mode 100644 public/static/plugs/socket/websocket.swf create mode 100644 public/static/plugs/supersized/progress.gif create mode 100644 public/static/plugs/supersized/supersized.3.2.7.min.js create mode 100644 public/static/plugs/supersized/supersized.css create mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/1_close.png create mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/1_open.png create mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/2.png create mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/3.png create mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/4.png create mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/5.png create mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/6.png create mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/7.png create mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/8.png create mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/9.png create mode 100644 public/static/plugs/ztree/zTreeStyle/img/line_conn.gif create mode 100644 public/static/plugs/ztree/zTreeStyle/img/loading.gif create mode 100644 public/static/plugs/ztree/zTreeStyle/img/zTreeStandard.gif create mode 100644 public/static/plugs/ztree/zTreeStyle/img/zTreeStandard.png create mode 100644 public/static/plugs/ztree/zTreeStyle/zTreeStyle.css create mode 100644 public/static/plugs/ztree/ztree.all.min.js create mode 100644 public/static/theme/css/console.css create mode 100644 public/static/theme/css/console.css.map create mode 100644 public/static/theme/css/console.custom.css create mode 100644 public/static/theme/css/console.custom.css.map create mode 100644 public/static/theme/css/console.custom.less create mode 100644 public/static/theme/css/console.form.css create mode 100644 public/static/theme/css/console.form.css.map create mode 100644 public/static/theme/css/console.form.less create mode 100644 public/static/theme/css/console.layout.css create mode 100644 public/static/theme/css/console.layout.css.map create mode 100644 public/static/theme/css/console.layout.less create mode 100644 public/static/theme/css/console.layui.css create mode 100644 public/static/theme/css/console.layui.css.map create mode 100644 public/static/theme/css/console.layui.less create mode 100644 public/static/theme/css/console.less create mode 100644 public/static/theme/css/icon/iconfont.eot create mode 100644 public/static/theme/css/icon/iconfont.svg create mode 100644 public/static/theme/css/icon/iconfont.ttf create mode 100644 public/static/theme/css/icon/iconfont.woff create mode 100644 public/static/theme/css/login.css create mode 100644 public/static/theme/css/login.css.map create mode 100644 public/static/theme/css/login.less create mode 100644 public/static/theme/css/mobile.css create mode 100644 public/static/theme/img/404_icon.png create mode 100644 public/static/theme/img/505_icon.png create mode 100644 public/static/theme/img/headimg.png create mode 100644 public/static/theme/img/ignore.png create mode 100644 public/static/theme/img/image.png create mode 100644 public/static/theme/img/login/bg1.jpg create mode 100644 public/static/theme/img/login/bg2.jpg create mode 100644 public/static/theme/img/notice.png create mode 100644 public/static/theme/img/wechat/index.png create mode 100644 public/static/theme/img/wechat/mobile_foot.png create mode 100644 public/static/theme/img/wechat/mobile_head.png create mode 100644 public/static/theme/img/wechat/qrc_pay_error.jpg create mode 100644 public/static/theme/img/wechat/qrc_payed.jpg create mode 100644 public/static/theme/index/css/base.css create mode 100644 public/static/theme/index/css/footer.css create mode 100644 public/static/theme/index/css/header.css create mode 100644 public/static/theme/index/css/iconfont.css create mode 100644 public/static/theme/index/css/layer.css create mode 100644 public/static/theme/index/css/login.css create mode 100644 public/static/theme/index/css/mine.css create mode 100644 public/static/theme/index/css/new/app.css create mode 100644 public/static/theme/index/css/new/iconfont.css create mode 100644 public/static/theme/index/css/new/iconfont.ttf create mode 100644 public/static/theme/index/css/register.css create mode 100644 public/static/theme/index/css/swiper.min.css create mode 100644 public/static/theme/index/img/about_notice.png create mode 100644 public/static/theme/index/img/add.png create mode 100644 public/static/theme/index/img/bitcoin.png create mode 100644 public/static/theme/index/img/bz.png create mode 100644 public/static/theme/index/img/choujiang.png create mode 100644 public/static/theme/index/img/czico.png create mode 100644 public/static/theme/index/img/deletes.png create mode 100644 public/static/theme/index/img/detailico.jpg create mode 100644 public/static/theme/index/img/down.png create mode 100644 public/static/theme/index/img/ethereum.png create mode 100644 public/static/theme/index/img/goback.png create mode 100644 public/static/theme/index/img/gold.gif create mode 100644 public/static/theme/index/img/hrefyou.png create mode 100644 public/static/theme/index/img/hy.png create mode 100644 public/static/theme/index/img/icon_aboutus_bank.png create mode 100644 public/static/theme/index/img/icon_aboutus_company.png create mode 100644 public/static/theme/index/img/icon_aboutus_help.png create mode 100644 public/static/theme/index/img/icon_aboutus_kf.png create mode 100644 public/static/theme/index/img/icon_aboutus_notice.png create mode 100644 public/static/theme/index/img/icon_aboutus_pay.png create mode 100644 public/static/theme/index/img/icon_aboutus_photo.png create mode 100644 public/static/theme/index/img/icon_aboutus_safe.png create mode 100644 public/static/theme/index/img/icon_aboutus_tel.png create mode 100644 public/static/theme/index/img/icon_add.png create mode 100644 public/static/theme/index/img/icon_alipay.png create mode 100644 public/static/theme/index/img/icon_back.png create mode 100644 public/static/theme/index/img/icon_bankCard_add.png create mode 100644 public/static/theme/index/img/icon_del.png create mode 100644 public/static/theme/index/img/icon_identity.png create mode 100644 public/static/theme/index/img/icon_index_1.png create mode 100644 public/static/theme/index/img/icon_index_10.png create mode 100644 public/static/theme/index/img/icon_index_11.png create mode 100644 public/static/theme/index/img/icon_index_12.png create mode 100644 public/static/theme/index/img/icon_index_2.png create mode 100644 public/static/theme/index/img/icon_index_3.png create mode 100644 public/static/theme/index/img/icon_index_4.png create mode 100644 public/static/theme/index/img/icon_index_5.png create mode 100644 public/static/theme/index/img/icon_index_6.png create mode 100644 public/static/theme/index/img/icon_index_7.png create mode 100644 public/static/theme/index/img/icon_index_8.png create mode 100644 public/static/theme/index/img/icon_index_9.png create mode 100644 public/static/theme/index/img/icon_my_1.png create mode 100644 public/static/theme/index/img/icon_my_2.png create mode 100644 public/static/theme/index/img/icon_my_3.png create mode 100644 public/static/theme/index/img/icon_my_4.png create mode 100644 public/static/theme/index/img/icon_my_5.png create mode 100644 public/static/theme/index/img/icon_my_6.png create mode 100644 public/static/theme/index/img/icon_my_7.png create mode 100644 public/static/theme/index/img/icon_my_8.png create mode 100644 public/static/theme/index/img/icon_my_9.png create mode 100644 public/static/theme/index/img/icon_success.png create mode 100644 public/static/theme/index/img/icon_tick.png create mode 100644 public/static/theme/index/img/icon_tick1.png create mode 100644 public/static/theme/index/img/icon_unionpay.png create mode 100644 public/static/theme/index/img/icon_untick.png create mode 100644 public/static/theme/index/img/indexwm.png create mode 100644 public/static/theme/index/img/invite_1.png create mode 100644 public/static/theme/index/img/invite_2.png create mode 100644 public/static/theme/index/img/invite_4.png create mode 100644 public/static/theme/index/img/jisuanqi.png create mode 100644 public/static/theme/index/img/jt.png create mode 100644 public/static/theme/index/img/kefu1.png create mode 100644 public/static/theme/index/img/listico1.png create mode 100644 public/static/theme/index/img/listico2.png create mode 100644 public/static/theme/index/img/listico3.png create mode 100644 public/static/theme/index/img/listico4.png create mode 100644 public/static/theme/index/img/listico5.png create mode 100644 public/static/theme/index/img/listico6.png create mode 100644 public/static/theme/index/img/listico7.png create mode 100644 public/static/theme/index/img/listico8.png create mode 100644 public/static/theme/index/img/litecoin.png create mode 100644 public/static/theme/index/img/login.jpg create mode 100644 public/static/theme/index/img/logout.png create mode 100644 public/static/theme/index/img/nico4.png create mode 100644 public/static/theme/index/img/notice.png create mode 100644 public/static/theme/index/img/over.png create mode 100644 public/static/theme/index/img/panbg.png create mode 100644 public/static/theme/index/img/passdel.png create mode 100644 public/static/theme/index/img/plistico1.png create mode 100644 public/static/theme/index/img/plistico2.png create mode 100644 public/static/theme/index/img/plistico3.png create mode 100644 public/static/theme/index/img/plistico5.png create mode 100644 public/static/theme/index/img/qd.png create mode 100644 public/static/theme/index/img/sc.png create mode 100644 public/static/theme/index/img/shang.png create mode 100644 public/static/theme/index/img/smrz.png create mode 100644 public/static/theme/index/img/sub.png create mode 100644 public/static/theme/index/img/success.png create mode 100644 public/static/theme/index/img/sy.png create mode 100644 public/static/theme/index/img/sytitl1.png create mode 100644 public/static/theme/index/img/sytitr1.png create mode 100644 public/static/theme/index/img/txico.png create mode 100644 public/static/theme/index/img/up.png create mode 100644 public/static/theme/index/img/user_credit.png create mode 100644 public/static/theme/index/img/user_prize.png create mode 100644 public/static/theme/index/img/userimg.png create mode 100644 public/static/theme/index/img/xia.png create mode 100644 public/static/theme/index/img/xx.png create mode 100644 public/static/theme/index/img/yclose.png create mode 100644 public/static/theme/index/img/ykjico.png create mode 100644 public/static/theme/index/img/yopen.png create mode 100644 public/static/theme/index/img/yq.png create mode 100644 public/static/theme/index/js/adaptive.js create mode 100644 public/static/theme/index/js/autorem.js create mode 100644 public/static/theme/index/js/awardRotate.js create mode 100644 public/static/theme/index/js/calculator.js create mode 100644 public/static/theme/index/js/clipboard.min.js create mode 100644 public/static/theme/index/js/config.js create mode 100644 public/static/theme/index/js/echarts.min.js create mode 100644 public/static/theme/index/js/font.js create mode 100644 public/static/theme/index/js/jquery.js create mode 100644 public/static/theme/index/js/layer.js create mode 100644 public/static/theme/index/js/public.js create mode 100644 public/static/theme/index/js/qrcode.js create mode 100644 public/static/theme/index/js/srcoll.js create mode 100644 public/static/theme/index/js/swiper.min.js create mode 100644 public/static/theme/index/js/yatongle.js create mode 100644 public/static/theme/news/css/app.css create mode 100644 public/static/theme/news/css/fake.css create mode 100644 public/static/theme/news/img/bg.jpg create mode 100644 public/static/theme/news/img/bottom_1.png create mode 100644 public/static/theme/news/img/bottom_2.png create mode 100644 public/static/theme/news/img/bottom_4.png create mode 100644 public/static/theme/news/img/bottom_5.png create mode 100644 public/static/theme/news/img/bottom_6.png create mode 100644 public/static/theme/news/img/close.png create mode 100644 public/static/theme/prize/animate.min.css create mode 100644 public/static/theme/prize/award.css create mode 100644 public/static/theme/prize/award.js create mode 100644 public/static/theme/prize/awardRotate.js create mode 100644 public/static/theme/prize/back.png create mode 100644 public/static/theme/prize/back1.png create mode 100644 public/static/theme/prize/bottom_shadow.png create mode 100644 public/static/theme/prize/component.css create mode 100644 public/static/theme/prize/img_1.png create mode 100644 public/static/theme/prize/img_2.png create mode 100644 public/static/theme/prize/jquery-2.1.4.min.js create mode 100644 public/static/theme/prize/mui.min.css create mode 100644 public/static/theme/prize/mui.min.js create mode 100644 public/static/theme/prize/rule_title.png create mode 100644 public/static/theme/prize/turnplate-pointer_2.png create mode 100644 public/static/wap/css/box_pay.css create mode 100644 public/static/wap/css/common.css create mode 100644 public/static/wap/css/element.css create mode 100644 public/static/wap/css/iconfont.css create mode 100644 public/static/wap/css/index.css create mode 100644 public/static/wap/css/ionic.css create mode 100644 public/static/wap/css/login.css create mode 100644 public/static/wap/css/personal.css create mode 100644 public/static/wap/css/sign.css create mode 100644 public/static/wap/css/style.css create mode 100644 public/static/wap/css/tabbar.css create mode 100644 public/static/wap/css/tipmask.css create mode 100644 public/static/wap/css/trade-history.css create mode 100644 public/static/wap/css/trade.css create mode 100644 public/static/wap/fonts/iconfont.eot create mode 100644 public/static/wap/fonts/iconfont.svg create mode 100644 public/static/wap/fonts/iconfont.ttf create mode 100644 public/static/wap/fonts/iconfont.woff create mode 100644 public/static/wap/fonts/ionicons.eot create mode 100644 public/static/wap/fonts/ionicons.svg create mode 100644 public/static/wap/fonts/ionicons.ttf create mode 100644 public/static/wap/fonts/ionicons.woff create mode 100644 public/static/wap/images/123background.png create mode 100644 public/static/wap/images/2943d289a1f14ca6a31c3389093655d6.png create mode 100644 public/static/wap/images/52e2f9b57a152889d532fff6bd525a67.png create mode 100644 public/static/wap/images/94fe48d1cbda7dc7fe30eb4742aa4f8e.png create mode 100644 public/static/wap/images/a1085bc31e04429c5fd3034111228b19.png create mode 100644 public/static/wap/images/accout_icon.png create mode 100644 public/static/wap/images/arrow_right.png create mode 100644 public/static/wap/images/back_logo.jpg create mode 100644 public/static/wap/images/background.png create mode 100644 public/static/wap/images/bg.png create mode 100644 public/static/wap/images/buydown.png create mode 100644 public/static/wap/images/buytop.png create mode 100644 public/static/wap/images/cb58e0e4b587409e00db872e50b27059.png create mode 100644 public/static/wap/images/ch1.png create mode 100644 public/static/wap/images/ch2.png create mode 100644 public/static/wap/images/ch3.png create mode 100644 public/static/wap/images/ch4.png create mode 100644 public/static/wap/images/ch5.png create mode 100644 public/static/wap/images/ch6.png create mode 100644 public/static/wap/images/charge.png create mode 100644 public/static/wap/images/chicang.png create mode 100644 public/static/wap/images/chicang2.png create mode 100644 public/static/wap/images/clock.png create mode 100644 public/static/wap/images/cz.png create mode 100644 public/static/wap/images/cz2.png create mode 100644 public/static/wap/images/dealBKG.png create mode 100644 public/static/wap/images/e499128dbb5a0c84fcb63f91c436ad29.png create mode 100644 public/static/wap/images/empty.png create mode 100644 public/static/wap/images/f5fa54b891ed0d02a0788f275d0f2464.png create mode 100644 public/static/wap/images/f_idcard.png create mode 100644 public/static/wap/images/gb11.png create mode 100644 public/static/wap/images/goback.png create mode 100644 public/static/wap/images/hold.png create mode 100644 public/static/wap/images/hq11.png create mode 100644 public/static/wap/images/hq12.png create mode 100644 public/static/wap/images/icon_eye.png create mode 100644 public/static/wap/images/icon_my_agency@2x.png create mode 100644 public/static/wap/images/icon_my_announcement@2x.png create mode 100644 public/static/wap/images/icon_my_bank_card@2x.png create mode 100644 public/static/wap/images/icon_my_cipher@2x.png create mode 100644 public/static/wap/images/icon_my_pull_out@2x.png create mode 100644 public/static/wap/images/icon_my_revenue_and_expenditure@2x.png create mode 100644 public/static/wap/images/icon_my_search@2x.png create mode 100644 public/static/wap/images/icon_my_vouchers@2x.png create mode 100644 public/static/wap/images/idcard.png create mode 100644 public/static/wap/images/idcard_f.png create mode 100644 public/static/wap/images/idcard_z.png create mode 100644 public/static/wap/images/idx1.png create mode 100644 public/static/wap/images/idx2.png create mode 100644 public/static/wap/images/idx3.png create mode 100644 public/static/wap/images/idx4.png create mode 100644 public/static/wap/images/index.png create mode 100644 public/static/wap/images/iright.png create mode 100644 public/static/wap/images/jindubkg.png create mode 100644 public/static/wap/images/jy11.png create mode 100644 public/static/wap/images/jy12.png create mode 100644 public/static/wap/images/left_circle1.png create mode 100644 public/static/wap/images/logow.png create mode 100644 public/static/wap/images/mine.png create mode 100644 public/static/wap/images/mine2.png create mode 100644 public/static/wap/images/my1.png create mode 100644 public/static/wap/images/my11.png create mode 100644 public/static/wap/images/my12.png create mode 100644 public/static/wap/images/my2.png create mode 100644 public/static/wap/images/my3.png create mode 100644 public/static/wap/images/my4.png create mode 100644 public/static/wap/images/myorderbkg.png create mode 100644 public/static/wap/images/mys1.png create mode 100644 public/static/wap/images/mys2.png create mode 100644 public/static/wap/images/mys3.png create mode 100644 public/static/wap/images/profit_logo.jpg create mode 100644 public/static/wap/images/right_circle1.png create mode 100644 public/static/wap/images/sele.png create mode 100644 public/static/wap/images/selection.png create mode 100644 public/static/wap/images/status_0.png create mode 100644 public/static/wap/images/status_1.png create mode 100644 public/static/wap/images/status_2.png create mode 100644 public/static/wap/images/status_3.png create mode 100644 public/static/wap/images/sy.png create mode 100644 public/static/wap/images/sy2.png create mode 100644 public/static/wap/images/wa11.png create mode 100644 public/static/wap/images/wa12.png create mode 100644 public/static/wap/images/yeb.png create mode 100644 public/static/wap/images/yeb1.png create mode 100644 public/static/wap/images/yeb2.png create mode 100644 public/static/wap/images/z_idcard.png create mode 100644 public/static/wap/images/zhanghubg.png create mode 100644 public/static/wap/js/base64.js create mode 100644 public/static/wap/js/chardata.js create mode 100644 public/static/wap/js/echarts.js create mode 100644 public/static/wap/js/function.js create mode 100644 public/static/wap/js/hold.js create mode 100644 public/static/wap/js/jquery-1.9.1.min.js create mode 100644 public/static/wap/js/jquery.datetimepicker.fulls.js create mode 100644 public/static/wap/js/lodash.min.js create mode 100644 public/static/wap/js/m.js create mode 100644 public/static/wap/js/order.js create mode 100644 public/upload/.gitignore create mode 100755 route/demo.php create mode 100644 safefile/3025674501bf9fe2/6e61beff4bf4f1b7.png create mode 100644 think create mode 100644 安装.txt diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..e69de29 diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..a45350d --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +composer.lock +.DS_Store +Thumbs.db +/phpunit.xml +/.idea +/.vscode +runtime +thinkphp +vendor +.env \ No newline at end of file diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/.htaccess @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.user.ini b/.user.ini new file mode 100644 index 0000000..4e2cdfb --- /dev/null +++ b/.user.ini @@ -0,0 +1 @@ +open_basedir=/www/wwwroot/weipan07_server/:/tmp/ \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000..a2f560c --- /dev/null +++ b/404.html @@ -0,0 +1,74 @@ + + + + + + 404 Not Found + + + +
+ +
404
+
Sorry, the page you visited does not exist.
It may be that the access link is wrong or the file does not exist.
+ +
+ + diff --git a/502.html b/502.html new file mode 100644 index 0000000..5f25659 --- /dev/null +++ b/502.html @@ -0,0 +1,74 @@ + + + + + + 502 Bad Gateway + + + +
+ +
502
+
Gateway error.
The website server has timed out in returning data, please wait a few minutes and try again.
+ +
+ + diff --git a/application/akszadmin/controller/Article.php b/application/akszadmin/controller/Article.php new file mode 100755 index 0000000..28fab97 --- /dev/null +++ b/application/akszadmin/controller/Article.php @@ -0,0 +1,140 @@ +title = '文章列表'; + $query = $this->_query($this->table)->alias('i')->field('i.*,t.name'); + $query->join('lc_article_type t','i.type=t.id')->equal('i.type#i_type')->like('i.title#i_title')->dateBetween('i.time#i_time')->order('i.sort asc,i.id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + $this->mlist = Db::name('LcArticleType')->select(); + } + + /** + * 添加文章 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->title = '添加文章'; + $this->assign('langss', [ + ['name' => '中文', 'value' => 'zh-cn'], + ['name' => '英文', 'value' => 'en'], + ['name' => '法文', 'value' => 'fr'], + ['name' => '德文', 'value' => 'de'], + ['name' => '西班牙文', 'value' => 'es'], + ['name' => '意大利文', 'value' => 'it'], + ['name' => '葡萄牙文', 'value' => 'pt'], + ['name' => '俄文', 'value' => 'ru'], + ['name' => '阿拉伯文', 'value' => 'ar'], + ]); + $this->_form($this->table, 'form'); + } + + /** + * 编辑文章 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '编辑文章'; + $this->assign('langss', [ + ['name' => '中文', 'value' => 'zh-cn'], + ['name' => '英文', 'value' => 'en'], + ['name' => '法文', 'value' => 'fr'], + ['name' => '德文', 'value' => 'de'], + ['name' => '西班牙文', 'value' => 'es'], + ['name' => '意大利文', 'value' => 'it'], + ['name' => '葡萄牙文', 'value' => 'pt'], + ['name' => '俄文', 'value' => 'ru'], + ['name' => '阿拉伯文', 'value' => 'ar'], + ]); + $this->_form($this->table, 'form'); + } + + /** + * 删除文章 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if ($this->request->isGet()) { + $this->class = Db::name("LcArticleType")->order('id asc')->select(); + if(!isset($vo['show'])) $vo['show'] = '1'; + } + if (empty($vo['time'])) $vo['time'] = date("Y-m-d H:i:s"); + } + +} diff --git a/application/akszadmin/controller/ArticleType.php b/application/akszadmin/controller/ArticleType.php new file mode 100755 index 0000000..185a719 --- /dev/null +++ b/application/akszadmin/controller/ArticleType.php @@ -0,0 +1,113 @@ +title = '文章分类管理'; + $query = $this->_query($this->table)->like('name'); + $query->order('sort asc,id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + + } + + /** + * 添加文章分类 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->title = '添加文章分类'; + $this->_form($this->table, 'form'); + } + + /** + * 编辑文章分类 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '编辑文章分类'; + $this->_form($this->table, 'form'); + } + + /** + * 删除文章分类 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->_delete($this->table); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if ($this->request->isPost()&&empty($vo['add_time'])) $vo['add_time'] = date("Y-m-d H:i:s"); + } + +} diff --git a/application/akszadmin/controller/Auth.php b/application/akszadmin/controller/Auth.php new file mode 100755 index 0000000..4fec23d --- /dev/null +++ b/application/akszadmin/controller/Auth.php @@ -0,0 +1,180 @@ +title = '系统权限管理'; + $query = $this->_query($this->table)->dateBetween('create_at'); + $query->like('title,desc')->equal('status')->order('sort desc,id desc')->page(); + } + + /** + * 权限配置节点 + * @auth true + * @throws \ReflectionException + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function apply() + { + $map = ['auth' => input('id', '0')]; + $action = strtolower(input('action', '')); + if ($action === 'get') { + $checkeds = Db::name('SystemAuthNode')->where($map)->column('node'); + $this->success('获取权限节点成功!', AdminService::instance()->getTree($checkeds)); + } elseif ($action === 'save') { + list($post, $data) = [$this->request->post(), []]; + foreach (isset($post['nodes']) ? $post['nodes'] : [] as $node) { + $data[] = ['auth' => $map['auth'], 'node' => $node]; + } + Db::name('SystemAuthNode')->where($map)->delete(); + Db::name('SystemAuthNode')->insertAll($data); + AdminService::instance()->apply(true); + $this->success('权限授权更新成功!', 'javascript:history.back()'); + } else { + $this->title = '权限配置节点'; + $this->_form($this->table, 'apply'); + } + } + + /** + * 添加系统权限 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->applyCsrfToken(); + $this->_form($this->table, 'form'); + } + + /** + * 编辑系统权限 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->applyCsrfToken(); + $this->_form($this->table, 'form'); + } + + /** + * 刷新系统权限 + * @auth true + */ + public function refresh() + { + try { + AdminService::instance()->apply(true); + $this->success('刷新系统授权成功!'); + } catch (\think\exception\HttpResponseException $exception) { + throw $exception; + } catch (\Exception $e) { + $this->error("刷新系统授权失败
{$e->getMessage()}"); + } + } + + /** + * 禁用系统权限 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function forbid() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['status' => '0']); + } + + /** + * 启用系统权限 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function resume() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['status' => '1']); + } + + /** + * 删除系统权限 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } + + /** + * 删除结果处理 + * @param boolean $result + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + protected function _remove_delete_result($result) + { + if ($result) { + $map = ['auth' => $this->request->post('id')]; + Db::name('SystemAuthNode')->where($map)->delete(); + $this->success("权限删除成功!", ''); + } else { + $this->error("权限删除失败,请稍候再试!"); + } + } + +} diff --git a/application/akszadmin/controller/Bank.php b/application/akszadmin/controller/Bank.php new file mode 100755 index 0000000..4a2da7e --- /dev/null +++ b/application/akszadmin/controller/Bank.php @@ -0,0 +1,100 @@ +title = '银行卡列表'; + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone,u.name as u_name'); + $query->join('lc_user u','i.uid=u.id')->like('i.account#i_account,u.phone#u_phone,u.name#u_name')->order('i.id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + + } + + /** + * 编辑银行卡 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '编辑银行卡'; + $this->_form($this->table, 'form'); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if($this->request->isGet()){ + $vo['phone'] = Db::name("LcUser")->where(['id'=>$vo['uid']])->value('phone'); + } + } + + /** + * 删除银行卡 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } +} diff --git a/application/akszadmin/controller/Cash.php b/application/akszadmin/controller/Cash.php new file mode 100755 index 0000000..f3009b3 --- /dev/null +++ b/application/akszadmin/controller/Cash.php @@ -0,0 +1,131 @@ +title = '提现记录'; + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone'); + $query->join('lc_user u','i.uid=u.id') + ->equal('i.status#i_status') + ->like('u.phone#u_phone,u.name#u_name') + ->dateBetween('i.time#i_time')->order('i.id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + + } + public function edit() + { + $this->applyCsrfToken(); + if($this->request->isPost()) { + $id = $this->request->param('id'); + $reaolae = $this->request->param('reaolae'); + $cash = Db::name($this->table)->find($id); + if(!$cash){ + $this->error('提现订单不存在'); + } + if($cash['status'] != 0){ + $this->error('提现订单已处理'); + } + addFinance($cash['uid'], $cash['money'],1, '提现失败,返还金额' . $cash['money'] . '元'); + setNumber('LcUser', 'money', $cash['money'], 1, "id = {$cash['uid']}"); + $this->_save($this->table, ['reaolae'=>$reaolae,'status' => '2', 'time2' => date('Y-m-d H:i:s')]); + }else{ + $this->title = '拒绝提现'; + $id = $this->request->param('id'); + $recharge = Db::name($this->table)->find($id); + + if($recharge){ + $recharge['username'] = Db::name("LcUser")->where(['id'=>$recharge['uid']])->value('phone'); + } + $this->_form($this->table, 'edit'); + } + } + /** + * 同意提现 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function agree() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['status' => '1', 'time2' => date('Y-m-d H:i:s')]); + } + + /** + * 拒绝提现 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function refuse() + { + $this->applyCsrfToken(); + $id = $this->request->param('id'); + $cash = Db::name($this->table)->find($id); + addFinance($cash['uid'], $cash['money'],1, '提现失败,返还金额' . $cash['money'] . '元'); + setNumber('LcUser', 'money', $cash['money'], 1, "id = {$cash['uid']}"); + $this->_save($this->table, ['status' => '2', 'time2' => date('Y-m-d H:i:s')]); + } + + /** + * 删除记录 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } +} diff --git a/application/akszadmin/controller/Config.php b/application/akszadmin/controller/Config.php new file mode 100755 index 0000000..1f4ace7 --- /dev/null +++ b/application/akszadmin/controller/Config.php @@ -0,0 +1,130 @@ + '华东 1 杭州', + 'oss-cn-shanghai.aliyuncs.com' => '华东 2 上海', + 'oss-cn-qingdao.aliyuncs.com' => '华北 1 青岛', + 'oss-cn-beijing.aliyuncs.com' => '华北 2 北京', + 'oss-cn-zhangjiakou.aliyuncs.com' => '华北 3 张家口', + 'oss-cn-huhehaote.aliyuncs.com' => '华北 5 呼和浩特', + 'oss-cn-shenzhen.aliyuncs.com' => '华南 1 深圳', + 'oss-cn-hongkong.aliyuncs.com' => '香港 1', + 'oss-us-west-1.aliyuncs.com' => '美国西部 1 硅谷', + 'oss-us-east-1.aliyuncs.com' => '美国东部 1 弗吉尼亚', + 'oss-ap-southeast-1.aliyuncs.com' => '亚太东南 1 新加坡', + 'oss-ap-southeast-2.aliyuncs.com' => '亚太东南 2 悉尼', + 'oss-ap-southeast-3.aliyuncs.com' => '亚太东南 3 吉隆坡', + 'oss-ap-southeast-5.aliyuncs.com' => '亚太东南 5 雅加达', + 'oss-ap-northeast-1.aliyuncs.com' => '亚太东北 1 日本', + 'oss-ap-south-1.aliyuncs.com' => '亚太南部 1 孟买', + 'oss-eu-central-1.aliyuncs.com' => '欧洲中部 1 法兰克福', + 'oss-eu-west-1.aliyuncs.com' => '英国 1 伦敦', + 'oss-me-east-1.aliyuncs.com' => '中东东部 1 迪拜', + ]; + + /** + * 系统参数配置 + * @auth true + * @menu true + */ + public function info() + { + $this->title = '系统参数配置'; + $this->fetch(); + } + + /** + * 修改系统能数配置 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function config() + { + $this->applyCsrfToken(); + if (Request::isGet()) { + $this->fetch('system-config'); + } + foreach (Request::post() as $key => $value) { + sysconf($key, $value); + } + $this->success('系统参数配置成功!'); + } + + /** + * 文件存储引擎 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function file() + { + $this->applyCsrfToken(); + if (Request::isGet()) { + $this->type = input('type', 'local'); + $this->fetch("storage-{$this->type}"); + } + $post = Request::post(); + if (isset($post['storage_type']) && isset($post['storage_local_exts'])) { + $exts = array_unique(explode(',', strtolower($post['storage_local_exts']))); + sort($exts); + if (in_array('php', $exts)) $this->error('禁止上传可执行文件到本地服务器!'); + $post['storage_local_exts'] = join(',', $exts); + } + foreach ($post as $key => $value) sysconf($key, $value); + if (isset($post['storage_type']) && $post['storage_type'] === 'oss') { + try { + $local = sysconf('storage_oss_domain'); + $bucket = $this->request->post('storage_oss_bucket'); + $domain = \library\File::instance('oss')->setBucket($bucket); + if (empty($local) || stripos($local, '.aliyuncs.com') !== false) { + sysconf('storage_oss_domain', $domain); + } + $this->success('阿里云OSS存储配置成功!'); + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $e) { + $this->error("阿里云OSS存储配置失效,{$e->getMessage()}"); + } + } else { + $this->success('文件存储配置成功!'); + } + } + +} diff --git a/application/akszadmin/controller/Finance.php b/application/akszadmin/controller/Finance.php new file mode 100755 index 0000000..0654f5e --- /dev/null +++ b/application/akszadmin/controller/Finance.php @@ -0,0 +1,63 @@ +title = '流水记录'; + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone,u.name'); + $query->join('lc_user u','i.uid=u.id')->equal('i.type#i_type')->like('i.reason#i_reason,u.phone#u_phone,u.name#u_name')->dateBetween('i.time#i_time')->valueBetween('i.money')->order('i.id desc')->page(); + + } + + /** + * 删除记录 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } +} diff --git a/application/akszadmin/controller/Goods.php b/application/akszadmin/controller/Goods.php new file mode 100755 index 0000000..303b85a --- /dev/null +++ b/application/akszadmin/controller/Goods.php @@ -0,0 +1,171 @@ +title = '产品列表'; + $query = $this->_query($this->table)->like('title'); + $query->order('sort asc,id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + + } + + /** + * 添加产品 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->title = '添加产品'; + $this->_form($this->table, 'form'); + } + + /** + * 编辑产品 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '编辑产品'; + $this->_form($this->table, 'form'); + } + /** + * 状态 开启或者关闭 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function iskqopen() + { + $this->applyCsrfToken(); + $id = $this->request->param('id'); + $iskq = $this->request->param('iskq'); + $this->_save($this->table, ['iskq' => $iskq]); + } + + public function showps(){ + $this->applyCsrfToken(); + $id = $this->request->param('id'); + $iskq = $this->request->param('do'); + $this->_save($this->table, ['showps' => $iskq]); + } + public function showps2(){ + $this->applyCsrfToken(); + $id = $this->request->param('id'); + $iskq = $this->request->param('do'); + $this->_save($this->table, ['showps2' => $iskq]); + } + /** + * 状态 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function proisopen() + { + $this->applyCsrfToken(); + $id = $this->request->param('id'); + $isopen = $this->request->param('isopen'); + + $this->_save($this->table, ['isopen' => $isopen]); + } + /** + * 删除产品 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if ($this->request->isGet()) { + + } + } + /** + * 风控管理 + * @auth true + * @menu true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function risk() + { + $this->title = '风控管理'; + $this->_form($this->risk_table, 'risk'); + } + +} diff --git a/application/akszadmin/controller/Index.php b/application/akszadmin/controller/Index.php new file mode 100755 index 0000000..bfa043a --- /dev/null +++ b/application/akszadmin/controller/Index.php @@ -0,0 +1,311 @@ +where("access_time > $now")->count(); + return json(['code' => 200, 'data' => $online_user]); + } + + /** + * 显示后台首页 + * @throws \ReflectionException + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function index() + { + $this->title = '系统管理后台'; + $auth = AdminService::instance()->apply(true); + if (!$auth->isLogin()) { + $this->redirect('@' . ADMIN_MODULE . '/login'); + } + $this->menus = MenuService::instance()->getTree(); + if (empty($this->menus) && !$auth->isLogin()) { + $this->redirect('@' . ADMIN_MODULE . '/login'); + } else { + $this->fetch(); + } + } + + /** + * Describe:查询充值提现记录 + * DateTime: 2020/5/15 0:54 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function check() + { + $auth = AdminService::instance()->apply(true); + if ($auth->isLogin()) { + $cash_count = Db::name("LcCash")->where(['status' => 0, 'warn' => 0])->count(); + $firstDate = time(); + $lastDate = time() + 300; + $Order_count = Db::name("LcOrder")->where("ostaus = 0 AND warn = 0 and kong_type = 0")->count(); + + $recharge_count = Db::name("LcRecharge")->where(['status' => 0, 'warn' => 0])->count(); + if ($Order_count > 0) { + $this->success("您有{$Order_count}条新的订单记录,请查看", + ["url" => "/static/mp3/order.mp3_{$recharge_count}@{$cash_count}&{$Order_count}"]); + } + if ($cash_count > 0 && $recharge_count > 0) { + $this->success("您有{$cash_count}条新的提现记录和{$recharge_count}条新的充值记录,请查看", + ["url" => "/static/mp3/cztx.mp3_{$recharge_count}@{$cash_count}&{$Order_count}"]); + } + if ($cash_count > 0 && $recharge_count == 0) { + $this->success("您有{$cash_count}条新的提现记录,请查看", + ["url" => "/static/mp3/tx.mp3_{$recharge_count}@{$cash_count}&{$Order_count}"]); + } + if ($cash_count == 0 && 0 < $recharge_count) { + $this->success("您有{$recharge_count}条新的充值记录,请查看", + ["url" => "/static/mp3/cz.mp3_{$recharge_count}@{$cash_count}&{$Order_count}"]); + } + $this->error("暂无记录"); + } + $this->error("请先登录"); + } + + /** + * Describe:忽略提醒 + * DateTime: 2020/5/15 0:56 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function system_ignore() + { + $auth = AdminService::instance()->apply(true); + if ($auth->isLogin()) { + Db::name("LcCash")->where(['warn' => 0])->update(['warn' => 1]); + Db::name("LcRecharge")->where(['warn' => 0])->update(['warn' => 1]); + Db::name("LcOrder")->where(['warn' => 0])->update(['warn' => 1]); + $this->success("操作成功"); + } + $this->error("请先登录"); + } + + /** + * 后台环境信息 + */ + public function main() + { + /*$this->think_ver = \think\App::VERSION; + $this->mysql_ver = Db::query('select version() as ver')[0]['ver'];*/ + $this->invest_count = Db::name('LcOrder')->sum('ploss'); + $this->user_count = Db::name('LcUser')->count(); + $this->recharge_sum = Db::name('LcRecharge')->where("status = 1")->sum('money'); + $this->cash_sum = Db::name('LcCash')->where("status = 1")->sum('money'); + $table = $this->finance_report(); + $this->month = $table['month']; + $this->last_month = $table['last_month']; + $this->day = $table['day']; + $this->today_key = array_search(date('Y-m-d'), array_column($this->day, 'date')); + $now = time() - 300; + $this->online_user = Db::name('LcUser')->where("logintime > $now")->count(); + $this->fetch(); + } + + private function finance_report() + { + $firstDate = strtotime(date('Y-m-01 00:00:00', strtotime(date("Y-m-d")))); + $lastDate = strtotime(date('Y-m-01 23:59:59', strtotime(date("Y-m-d"))) . " +1 month -1 day"); + $month['recharge'] = Db::name('LcRecharge')->where("UNIX_TIMESTAMP(time) BETWEEN $firstDate AND $lastDate AND status = 1")->sum('money'); + $month['cash'] = Db::name('LcCash')->where("UNIX_TIMESTAMP(time) BETWEEN $firstDate AND $lastDate AND status = 1")->sum('money'); + $month['invest_list'] = Db::name('LcRecharge')->where("UNIX_TIMESTAMP(time) BETWEEN $firstDate AND $lastDate AND status = 1")->group('uid')->count(); + $month['invest'] = Db::name('LcInvest')->where("UNIX_TIMESTAMP(time) BETWEEN $firstDate AND $lastDate")->count(); + $month['invest_sum'] = Db::name('LcOrder')->where(" buytime BETWEEN $firstDate AND $lastDate")->sum('ploss'); + + $lastMonthFirstDate = strtotime(date('Y-m-01 00:00:00', strtotime(date("Y-m-d"))) . " -1 month"); + $lastMonthLastDate = strtotime(date('Y-m-01 23:59:59', strtotime(date("Y-m-d"))) . " -1 day"); + $lastMonth['recharge'] = Db::name('LcRecharge')->where("UNIX_TIMESTAMP(time) BETWEEN $lastMonthFirstDate AND $lastMonthLastDate AND status = 1")->sum('money'); + $lastMonth['cash'] = Db::name('LcCash')->where("UNIX_TIMESTAMP(time) BETWEEN $lastMonthFirstDate AND $lastMonthLastDate AND status = 1")->sum('money'); + $lastMonth['invest_list'] = Db::name('LcRecharge')->where("UNIX_TIMESTAMP(time) BETWEEN $lastMonthFirstDate AND $lastMonthLastDate AND status = 1")->group('uid')->count(); + $lastMonth['invest'] = Db::name('LcInvest')->where("UNIX_TIMESTAMP(time) BETWEEN $lastMonthFirstDate AND $lastMonthLastDate")->count(); + $lastMonth['invest_sum'] = Db::name('LcOrder')->where(" buytime BETWEEN $lastMonthFirstDate AND $lastMonthLastDate")->sum('ploss'); + + $monthDays = $this->getMonthDays(); + foreach ($monthDays as $k => $v) { + $first = strtotime($v); + $last = $first + 86400 - 1; + $day[$k]['date'] = $v; + $day[$k]['recharge'] = Db::name('LcRecharge')->where("UNIX_TIMESTAMP(time) BETWEEN $first AND $last AND status = 1")->sum('money'); + $day[$k]['cash'] = Db::name('LcCash')->where("UNIX_TIMESTAMP(time) BETWEEN $first AND $last AND status = 1")->sum('money'); + $day[$k]['invest_list'] = Db::name('LcRecharge')->where("UNIX_TIMESTAMP(time) BETWEEN $first AND $last AND status = 1")->group('uid')->count(); + $day[$k]['new_user'] = Db::name('LcUser')->where("UNIX_TIMESTAMP(time) BETWEEN $first AND $last")->count(); + $day[$k]['invest'] = Db::name('LcInvest')->where("UNIX_TIMESTAMP(time) BETWEEN $first AND $last")->count(); + $day[$k]['invest_sum'] = Db::name('LcInvest')->where("UNIX_TIMESTAMP(time) BETWEEN $first AND $last")->sum('money'); + $day[$k]['expire'] = Db::name('LcOrder')->where(" buytime BETWEEN $first AND $last")->sum('ploss'); + $day[$k]['ordernumer'] = Db::name('LcOrder')->where(" buytime BETWEEN $first AND $last ")->count(); + $day[$k]['interest'] = Db::name('LcOrder')->where(" buytime BETWEEN $first AND $last")->sum('fee'); + } + return array('day' => $day, 'month' => $month, 'last_month' => $lastMonth); + } + + /** + * 获取当前月已过日期 + * @return array + */ + private function getMonthDays() + { + $monthDays = []; + $firstDay = date('Y-m-01', time()); + $i = 0; + $now_day = date('d'); + $lastDay = date('Y-m-d', strtotime("$firstDay +1 month -1 day")); + while (date('Y-m-d', strtotime("$firstDay +$i days")) <= $lastDay) { + // if($i>=$now_day) break; + $monthDays[] = date('Y-m-d', strtotime("$firstDay +$i days")); + $i++; + } + return $monthDays; + } + + /** + * 修改密码 + * @login true + * @param integer $id + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function pass($id) + { + $this->applyCsrfToken(); + if (intval($id) !== intval(session('user.id'))) { + $this->error('只能修改当前用户的密码!'); + } + if (!AdminService::instance()->isLogin()) { + $this->error('需要登录才能操作哦!'); + } + if ($this->request->isGet()) { + $this->verify = true; + $this->_form('SystemUser', 'admin@user/pass', 'id', [], ['id' => $id]); + } else { + $data = $this->_input([ + 'password' => $this->request->post('password'), + 'repassword' => $this->request->post('repassword'), + 'oldpassword' => $this->request->post('oldpassword'), + ], [ + 'oldpassword' => 'require', + 'password' => 'require|min:4', + 'repassword' => 'require|confirm:password', + ], [ + 'oldpassword.require' => '旧密码不能为空!', + 'password.require' => '登录密码不能为空!', + 'password.min' => '登录密码长度不能少于4位有效字符!', + 'repassword.require' => '重复密码不能为空!', + 'repassword.confirm' => '重复密码与登录密码不匹配,请重新输入!', + ]); + $user = Db::name('SystemUser')->where(['id' => $id])->find(); + if (md5($data['oldpassword']) !== $user['password']) { + $this->error('旧密码验证失败,请重新输入!'); + } + if (Data::save('SystemUser', ['id' => $user['id'], 'password' => md5($data['password'])])) { + $this->success('密码修改成功,下次请使用新密码登录!', ''); + } else { + $this->error('密码修改失败,请稍候再试!'); + } + } + } + + /** + * 修改用户资料 + * @login true + * @param integer $id 会员ID + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function info($id = 0) + { + + if (!AdminService::instance()->isLogin()) { + $this->error('需要登录才能操作哦!'); + } + $this->applyCsrfToken(); + if (intval($id) === intval(session('user.id'))) { + $this->_form('SystemUser', 'akszadmin@user/form', 'id', [], ['id' => $id]); + } else { + $this->error('只能修改登录用户的资料!'); + } + } + + /** + * 清理运行缓存 + * @auth true + */ + public function clearRuntime() + { + try { + Console::call('clear'); + Console::call('xclean:session'); + $this->success('清理运行缓存成功!'); + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $e) { + $this->error("清理运行缓存失败,{$e->getMessage()}"); + } + } + + /** + * 压缩发布系统 + * @auth true + */ + public function buildOptimize() + { + try { + Console::call('optimize:route'); + Console::call('optimize:schema'); + Console::call('optimize:autoload'); + Console::call('optimize:config'); + $this->success('压缩发布成功!'); + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $e) { + $this->error("压缩发布失败,{$e->getMessage()}"); + } + } + +} diff --git a/application/akszadmin/controller/Info.php b/application/akszadmin/controller/Info.php new file mode 100755 index 0000000..fa16e5b --- /dev/null +++ b/application/akszadmin/controller/Info.php @@ -0,0 +1,109 @@ +title = '网站设置'; + $this->_form($this->table, 'form'); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if ($this->request->isPost()&&isset($vo['ban_ip'])&&!empty($vo['ban_ip'])){ + $vo['ban_ip'] = trim(str_replace(',',',',$vo['ban_ip'])); + } + } + + /** + * 奖励设置 + * @auth true + * @menu true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function reward() + { + $this->title = '奖励设置'; + $this->_form($this->reward_table, 'reward'); + } + + /** + * 支付设置 + * @auth true + * @menu true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function pay() + { + $this->title = '支付设置'; + $this->_form($this->table, 'pay'); + } + + /** + * 图片设置 + * @auth true + * @menu true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function img() + { + $this->title = '支付设置'; + $this->_form($this->table, 'img'); + } +} diff --git a/application/akszadmin/controller/Invest.php b/application/akszadmin/controller/Invest.php new file mode 100755 index 0000000..9e6be5b --- /dev/null +++ b/application/akszadmin/controller/Invest.php @@ -0,0 +1,64 @@ +title = '已投项目管理'; + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone,u.name'); + $query->join('lc_user u','i.uid=u.id')->equal('i.type1#i_type1')->like('i.title#i_title,u.phone#u_phone')->dateBetween('i.time#i_time')->order('i.id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + $this->tlist = Db::name('LcItemType')->select(); + $this->profit = sprintf("%.2f",Db::name('LcInvestList')->where("status = 1 AND pay1 > 0")->sum('pay1')); + $this->un_profit = sprintf("%.2f",Db::name('LcInvestList')->where("status = 0 AND pay1 > 0")->sum('pay1')); + } +} diff --git a/application/akszadmin/controller/InvestList.php b/application/akszadmin/controller/InvestList.php new file mode 100755 index 0000000..490976c --- /dev/null +++ b/application/akszadmin/controller/InvestList.php @@ -0,0 +1,65 @@ +title = '已投项目管理'; + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone,u.name'); + $query->join('lc_user u','i.uid=u.id')->equal('i.iid#i_iid')->like('i.title#i_title,u.phone#u_phone')->dateBetween('i.time1#i_time1')->order('i.id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + $this->refund = sprintf("%.2f",Db::name('LcInvestList')->where("status = 1 AND pay1 > 0")->sum('pay1')); + foreach($data as &$vo){ + if($vo['status'] == '0') $vo['time2'] = '未返款'; + } + } +} diff --git a/application/akszadmin/controller/Item.php b/application/akszadmin/controller/Item.php new file mode 100755 index 0000000..6725470 --- /dev/null +++ b/application/akszadmin/controller/Item.php @@ -0,0 +1,132 @@ +title = '项目管理'; + $query = $this->_query($this->table)->equal('type,class')->like('title'); + $query->order('sort asc,id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + $this->mlist = Db::name('LcItemClass')->select(); + $this->tlist = Db::name('LcItemType')->select(); + foreach ($data as &$vo) { + list($vo['pay_type'], $vo['item_class']) = [[], []]; + foreach ($this->tlist as $type) if ($type['id'] == $vo['type']) $vo['pay_type'] = $type; + foreach ($this->mlist as $class) if ($class['id'] == $vo['class']) $vo['item_class'] = $class; + $vo['percent'] = model('akszadmin/item')->getProjectPercent($vo['id']); + } + } + + /** + * 添加项目 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->title = '添加项目'; + $this->_form($this->table, 'form'); + } + + /** + * 编辑项目 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '编辑项目'; + $this->_form($this->table, 'form'); + } + + /** + * 删除项目 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->_delete($this->table); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if ($this->request->isGet()) { + $vo['prize'] = isset($vo['prize'])?$vo['prize']:0; + $vo['integral'] = isset($vo['integral'])?$vo['integral']:0; + if (empty($vo['class']) && $this->request->get('class', '0')) $vo['class'] = $this->request->get('class', '0'); + if (empty($vo['type']) && $this->request->get('type', '0')) $vo['type'] = $this->request->get('type', '0'); + $this->class = Db::name("LcItemClass")->order('id asc')->select(); + $this->type = Db::name("LcItemType")->order('id asc')->select(); + } + if ($this->request->isPost()) { + if($vo['type']==2&&$vo['day']<7) $this->error("每周返息期限需大于等于7天"); + if($vo['type']==3&&$vo['day']<30) $this->error("每月返息期限需大于等于30天"); + } + if (empty($vo['add_time'])) $vo['add_time'] = date("Y-m-d H:i:s"); + } + +} diff --git a/application/akszadmin/controller/ItemClass.php b/application/akszadmin/controller/ItemClass.php new file mode 100755 index 0000000..cb49ecc --- /dev/null +++ b/application/akszadmin/controller/ItemClass.php @@ -0,0 +1,121 @@ +title = '项目分类管理'; + $query = $this->_query($this->table)->like('name'); + $query->order('sort asc,id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + $this->mlist = Db::name('LcUserMember')->select(); + foreach ($data as &$vo) { + list($vo['member']) = [[]]; + foreach ($this->mlist as $member) if ($member['id'] == $vo['member_id']) $vo['member'] = $member; + } + } + + /** + * 添加项目分类 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->title = '添加项目分类'; + $this->_form($this->table, 'form'); + } + + /** + * 编辑项目分类 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '编辑项目分类'; + $this->_form($this->table, 'form'); + } + + /** + * 删除项目分类 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->_delete($this->table); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if ($this->request->isGet()) { + if (empty($vo['member_id']) && $this->request->get('member_id', '0')) $vo['member_id'] = $this->request->get('member_id', '0'); + $this->member = Db::name("LcUserMember")->order('id desc')->select(); + } + if (empty($vo['add_time'])) $vo['add_time'] = date("Y-m-d H:i:s"); + } + +} diff --git a/application/akszadmin/controller/Login.php b/application/akszadmin/controller/Login.php new file mode 100755 index 0000000..702f7bc --- /dev/null +++ b/application/akszadmin/controller/Login.php @@ -0,0 +1,119 @@ +isLogin()) { + $this->redirect('@' . ADMIN_MODULE); + } else { + $this->title = '系统登录'; + $this->captcha_type = 'login_captcha'; + $this->captcha_token = Data::uniqidDateCode(18); + $this->app->session->set($this->captcha_type, $this->captcha_token); + $this->devmode = SystemService::instance()->checkRunMode('dev'); + $this->fetch(); + } + } else { + + $data = $this->_vali([ + 'username.require' => '登录账号不能为空!', + 'username.min:4' => '登录账号长度不能少于4位有效字符!', + 'password.require' => '登录密码不能为空!', + 'password.min:4' => '登录密码长度不能少于4位有效字符!', + 'verify.require' => '图形验证码不能为空!', + 'uniqid.require' => '图形验证标识不能为空!', + ]); + if (!CaptchaService::instance()->check($data['verify'], $data['uniqid'])) { + $this->error('图形验证码验证失败,请重新输入!'); + } + // 用户信息验证 + $map = ['is_deleted' => '0', 'username' => $data['username']]; + $user = Db::name('SystemUser')->where($map)->order('id desc')->find(); + if (empty($user)) { + $this->error('登录账号或密码错误,请重新输入1!'); + } + if (md5("{$user['password']}{$data['uniqid']}") !== $data['password']) { + $this->error('登录账号或密码错误,请重新输入2!'); + } + if (empty($user['status'])) { + $this->error('账号已经被禁用,请联系管理员!'); + } + Db::name('SystemUser')->where(['id' => $user['id']])->update([ + 'login_ip' => Request::ip(), + 'login_at' => Db::raw('now()'), + 'login_num' => Db::raw('login_num+1'), + ]); + $this->app->session->set('user', $user); + AdminService::instance()->apply(true); + sysoplog('系统管理', '用户登录系统后台成功'); + $this->success('登录成功', url('@' . ADMIN_MODULE)); + } + } + + /** + * 生成验证码 + * 需要指定类型及令牌 + */ + public function captcha() + { + $image = CaptchaService::instance(); + $this->type = input('type', 'captcha-type'); + $this->token = input('token', 'captcha-token'); + $captcha = ['image' => $image->getData(), 'uniqid' => $image->getUniqid()]; + if ($this->app->session->get($this->type) === $this->token) { + $captcha['code'] = $image->getCode(); + $this->app->session->delete($this->type); + } + $this->success('生成验证码成功', $captcha); + } + + /** + * 退出登录 + */ + public function out() + { + $this->app->session->clear(); + $this->app->session->destroy(); + $this->success('退出登录成功!', url('@' . ADMIN_MODULE . '/login')); + } + +} diff --git a/application/akszadmin/controller/Mall.php b/application/akszadmin/controller/Mall.php new file mode 100755 index 0000000..183a701 --- /dev/null +++ b/application/akszadmin/controller/Mall.php @@ -0,0 +1,116 @@ +title = '矿机管理'; + $query = $this->_query($this->table)->like('title'); + $query->order('sort asc,id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + + } + + /** + * 添加矿机 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->title = '添加矿机'; + $this->_form($this->table, 'form'); + } + + /** + * 编辑矿机 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '编辑矿机'; + $this->_form($this->table, 'form'); + } + + /** + * 删除矿机 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->_delete($this->table); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if ($this->request->isPost()) { + if($vo['total']<$vo['stock']) $this->error("矿机总量需大于剩余库存"); + if($vo['day_income']<$vo['cost']) $this->error("日总产出需大于日运维费"); + } + } + +} diff --git a/application/akszadmin/controller/MallInvest.php b/application/akszadmin/controller/MallInvest.php new file mode 100755 index 0000000..a0099b1 --- /dev/null +++ b/application/akszadmin/controller/MallInvest.php @@ -0,0 +1,61 @@ +title = '已投项目管理'; + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone,u.name'); + $query->join('lc_user u','i.uid=u.id')->equal('i.type1#i_type1')->like('i.title#i_title,u.phone#u_phone')->dateBetween('i.time#i_time')->order('i.id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + } +} diff --git a/application/akszadmin/controller/MallInvestList.php b/application/akszadmin/controller/MallInvestList.php new file mode 100755 index 0000000..f6696ac --- /dev/null +++ b/application/akszadmin/controller/MallInvestList.php @@ -0,0 +1,65 @@ +title = '已租矿机管理'; + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone,u.name'); + $query->join('lc_user u','i.uid=u.id')->equal('i.iid#i_iid')->like('i.title#i_title,u.phone#u_phone')->dateBetween('i.time1#i_time1')->order('i.id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + $this->refund = sprintf("%.2f",Db::name('LcInvestList')->where("status = 1 AND pay1 > 0")->sum('pay1')); + foreach($data as &$vo){ + if($vo['status'] == '0') $vo['time2'] = '挖矿中'; + } + } +} diff --git a/application/akszadmin/controller/Member.php b/application/akszadmin/controller/Member.php new file mode 100755 index 0000000..a7b72c7 --- /dev/null +++ b/application/akszadmin/controller/Member.php @@ -0,0 +1,93 @@ +title = '会员等级管理'; + $query = $this->_query($this->table)->like('name'); + $query->order('id asc')->page(); + } + + /** + * 添加会员组 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->title = '添加会员组'; + $this->_form($this->table, 'form'); + } + + /** + * 编辑会员组 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '编辑会员组'; + $this->_form($this->table, 'form'); + } + + /** + * 删除会员组 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } + +} diff --git a/application/akszadmin/controller/Menu.php b/application/akszadmin/controller/Menu.php new file mode 100755 index 0000000..0c62c26 --- /dev/null +++ b/application/akszadmin/controller/Menu.php @@ -0,0 +1,160 @@ +title = '系统菜单管理'; + $this->_page($this->table, false); + } + + /** + * 列表数据处理 + * @param array $data + */ + protected function _index_page_filter(&$data) + { + foreach ($data as &$vo) { + if ($vo['url'] !== '#') { + $vo['url'] = trim(url($vo['url']) . (empty($vo['params']) ? '' : "?{$vo['params']}"), '/\\'); + } + $vo['ids'] = join(',', Data::getArrSubIds($data, $vo['id'])); + } + $data = Data::arr2table($data); + } + + /** + * 添加系统菜单 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->applyCsrfToken(); + $this->_form($this->table, 'form'); + } + + /** + * 编辑系统菜单 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->applyCsrfToken(); + $this->_form($this->table, 'form'); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _form_filter(&$vo) + { + if ($this->request->isGet()) { + // 读取系统功能节点 + $this->nodes = MenuService::instance()->getList(); + // 选择自己的上级菜单 + if (empty($vo['pid']) && $this->request->get('pid', '0')) $vo['pid'] = $this->request->get('pid', '0'); + // 列出可选上级菜单 + $menus = Db::name($this->table)->where(['status' => '1'])->order('sort desc,id asc')->column('id,pid,url,title'); + $this->menus = Data::arr2table(array_merge($menus, [['id' => '0', 'pid' => '-1', 'url' => '#', 'title' => '顶部菜单']])); + if (isset($vo['id'])) foreach ($this->menus as $key => $menu) if ($menu['id'] === $vo['id']) $vo = $menu; + foreach ($this->menus as $key => &$menu) { + if ($menu['spt'] >= 3 || $menu['url'] !== '#') unset($this->menus[$key]); + if (isset($vo['spt']) && $vo['spt'] <= $menu['spt']) unset($this->menus[$key]); + } + } + } + + /** + * 启用系统菜单 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function resume() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['status' => '1']); + } + + /** + * 禁用系统菜单 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function forbid() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['status' => '0']); + } + + /** + * 删除系统菜单 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } + +} diff --git a/application/akszadmin/controller/Msg.php b/application/akszadmin/controller/Msg.php new file mode 100755 index 0000000..f8f219f --- /dev/null +++ b/application/akszadmin/controller/Msg.php @@ -0,0 +1,121 @@ +title = '站内信列表'; + $query = $this->_query($this->table)->like('phone'); + $query->dateBetween('add_time')->order('sort asc,id dasc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + foreach($data as &$vo){ + if(empty($vo['phone'])) $vo['phone'] = "所有人"; + } + } + + /** + * 添加站内信 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->title = '添加站内信'; + $this->_form($this->table, 'form'); + } + + /** + * 编辑站内信 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '编辑站内信'; + $this->_form($this->table, 'form'); + } + + /** + * 删除站内信 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if ($this->request->isGet()) { + if(!isset($vo['top'])) $vo['top'] = '0'; + } + if($this->request->isPost()) { + if($vo['phone']) $vo['uid'] = Db::name('LcUser')->where("phone = '{$vo['phone']}'")->value('id'); + } + if (empty($vo['add_time'])) $vo['add_time'] = date("Y-m-d H:i:s"); + } +} diff --git a/application/akszadmin/controller/Oplog.php b/application/akszadmin/controller/Oplog.php new file mode 100755 index 0000000..6d0aa24 --- /dev/null +++ b/application/akszadmin/controller/Oplog.php @@ -0,0 +1,94 @@ +title = '系统操作日志'; + $query = $this->_query($this->table)->like('action,node,content,username,geoip'); + $query->dateBetween('create_at')->order('id desc')->page(); + } + + /** + * 列表数据处理 + * @auth true + * @param array $data + * @throws \Exception + */ + protected function _index_page_filter(&$data) + { + $ip = new \Ip2Region(); + foreach ($data as &$vo) { + $result = $ip->btreeSearch($vo['geoip']); + $vo['isp'] = isset($result['region']) ? $result['region'] : ''; + $vo['isp'] = str_replace(['内网IP', '0', '|'], '', $vo['isp']); + } + } + + /** + * 清理系统日志 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function clear() + { + if (Db::name($this->table)->whereRaw('1=1')->delete() !== false) { + $this->success('日志清理成功!'); + } else { + $this->error('日志清理失败,请稍候再试!'); + } + } + + /** + * 删除系统日志 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } + +} diff --git a/application/akszadmin/controller/Order.php b/application/akszadmin/controller/Order.php new file mode 100755 index 0000000..21b2942 --- /dev/null +++ b/application/akszadmin/controller/Order.php @@ -0,0 +1,130 @@ +title = '持仓列表'; + $this->type = $this->request->param('type'); + + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone,u.name as u_name'); + $query->leftjoin('lc_user u','i.uid=u.id')->like('u.phone#u_phone,u.name#u_name')->dateBetween('i.time#i_time')->order('i.id desc')->page(); + } + + /** + * 编辑持仓 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '查看'; + $this->_form($this->table, 'form'); + } + public function edits() + { + if(\think\facade\Request::isPost()){ + $param = \think\facade\Request::param(); + $id=$param['id']; + if($param['pid']){ + $title=Db::name('LcProduct')->where(['id'=>$param['pid']])->value('title'); + }; + + $datac['uid']=$param['uid']; + $datac['pid']=$param['pid']; + $datac['ptitle']=$title; + $datac['ostyle']=$param['ostyle']; + $datac['buyprice']=$param['buyprice']; + $datac['sellprice']=$param['sellprice']; + $datac['ploss']=$param['ploss']; + $datac['buytime']=strtotime($param['buytime']); + $datac['selltime']=strtotime($param['selltime']); + $this->_save($this->table, $datac); + } + $this->title = '编辑订单信息'; + $this->goods = Db::name('LcProduct')->field("id,title")->order("sort asc,id desc")->select(); + $this->_form($this->table, 'edits'); + } + + /** + * 改平仓 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function gaipingcang() + { + // $this->applyCsrfToken(); + $id = $this->request->param('id'); + $sellprice = $this->request->param('sellprice'); + + $this->_save($this->table, ['sellprice' => $sellprice]); + } + + /*单控操作*/ + public function dankong(){ + $id = $this->request->param('oid'); + $kong_type = $this->request->param('kong_type'); + if($kong_type==3 ){ + $risk = Db::name('LcRisk')->find(); + $this->_save($this->table, ['kong_type' => $kong_type,'endloss'=>$risk['qybl']]); + }else if($kong_type==4){ + $risk = Db::name('LcRisk')->find(); + $this->_save($this->table, ['kong_type' => $kong_type,'lossrate'=>$risk['qkbl']]); + }else{ + $this->_save($this->table, ['kong_type' => $kong_type]); + } + } + + public function remove() + { + if (in_array('10000', explode(',', $this->request->post('id')))) { + $this->error('系统超级账号禁止删除!'); + } + + $this->_delete($this->table); + } +} diff --git a/application/akszadmin/controller/OrderLog.php b/application/akszadmin/controller/OrderLog.php new file mode 100755 index 0000000..2daa7ce --- /dev/null +++ b/application/akszadmin/controller/OrderLog.php @@ -0,0 +1,50 @@ +title = '平仓日志列表'; + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone,u.name as u_name'); + $query->leftjoin('lc_user u','i.uid=u.id')->like('u.phone#u_phone,u.name#u_name')->dateBetween('i.time#i_time')->order('i.id desc')->page(); + } +} diff --git a/application/akszadmin/controller/Prize.php b/application/akszadmin/controller/Prize.php new file mode 100755 index 0000000..ef1cfa0 --- /dev/null +++ b/application/akszadmin/controller/Prize.php @@ -0,0 +1,49 @@ +title = '抽奖设置'; + $this->_form($this->table, 'form'); + } +} diff --git a/application/akszadmin/controller/PrizeList.php b/application/akszadmin/controller/PrizeList.php new file mode 100755 index 0000000..14e3d55 --- /dev/null +++ b/application/akszadmin/controller/PrizeList.php @@ -0,0 +1,89 @@ +title = '抽奖记录'; + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone,u.name as u_name'); + $query->join('lc_user u','i.uid=u.id')->equal('i.type#i_type')->like('u.phone#u_phone,u.name#u_name')->dateBetween('i.time#i_time')->order('i.id desc')->page(); + } + + /** + * 增减余额 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function add(){ + $this->title = '添加抽奖记录'; + $this->_form($this->table, 'form'); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if($this->request->isPost()){ + if(!$vo['phone']) $this->error("用户账号必填"); + if(!$vo['name']) $this->error("奖品名称必填"); + $uid = Db::name("LcUser")->where(['phone'=>$vo['phone']])->value('id'); + if(!$uid) $this->error("暂无该用户"); + $vo['uid'] = $uid; + $vo['time'] = date('Y-m-d H:i:s'); + } + } + + /** + * 删除抽奖记录 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } +} diff --git a/application/akszadmin/controller/Queue.php b/application/akszadmin/controller/Queue.php new file mode 100755 index 0000000..b203d62 --- /dev/null +++ b/application/akszadmin/controller/Queue.php @@ -0,0 +1,144 @@ +message = Console::call('xtask:state')->fetch(); + $this->command = ProcessService::instance()->think('xtask:start'); + $this->listen = preg_match('/process.*?\d+.*?running/', $this->message, $attr); + } catch (\Exception $exception) { + $this->listen = false; + $this->message = $exception->getMessage(); + } + $this->title = '系统任务管理'; + $this->iswin = ProcessService::instance()->iswin(); + $query = $this->_query($this->table)->dateBetween('create_at,start_at,end_at'); + $query->like('title,preload')->equal('status')->order('id desc')->page(); + } + + /** + * 重启系统任务 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function redo() + { + $this->_save($this->table, ['status' => '1']); + } + + /** + * WIN开始监听任务 + * @auth true + */ + public function start() + { + try { + $message = nl2br(Console::call('xtask:start')->fetch()); + if (preg_match('/process.*?\d+/', $message, $attr)) { + $this->success('任务监听主进程启动成功!'); + } else { + $this->error($message); + } + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $e) { + $this->error($e->getMessage()); + } + } + + /** + * WIN停止监听任务 + * @auth true + */ + public function stop() + { + try { + $message = nl2br(Console::call('xtask:stop')->fetch()); + if (stripos($message, 'succeeded')) { + $this->success('停止任务监听主进程成功!'); + } elseif (stripos($message, 'finish')) { + $this->success('没有找到需要停止的进程!'); + } else { + $this->error($message); + } + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $e) { + $this->error($e->getMessage()); + } + } + + /** + * 清理3天前的记录 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function clear() + { + $map = [['time', '<', strtotime('-3days')]]; + $result = Db::name($this->table)->where($map)->delete(); + if ($result !== false) { + $this->success('成功清理3天前的任务记录!'); + } else { + $this->error('清理3天前的任务记录失败!'); + } + } + + /** + * 删除系统任务 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->_delete($this->table); + } + +} diff --git a/application/akszadmin/controller/Recharge.php b/application/akszadmin/controller/Recharge.php new file mode 100755 index 0000000..daa0d05 --- /dev/null +++ b/application/akszadmin/controller/Recharge.php @@ -0,0 +1,175 @@ +title = '充值记录'; + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone,u.name'); + $query->join('lc_user u','i.uid=u.id')->equal('i.status#i_status')->like('i.orderid#i_orderid,i.type#i_type,u.phone#u_phone,u.name#u_name')->dateBetween('i.time#i_time')->order('i.id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + $this->type = Db::name($this->table)->field('type')->group('type')->select(); + $this->rejected = sprintf("%.2f",Db::name($this->table)->where("status = 2")->sum('money')); + $this->finished = sprintf("%.2f",Db::name($this->table)->where("status = 1")->sum('money')); + $this->reviewed = sprintf("%.2f",Db::name($this->table)->where("status = 0")->sum('money')); + } + public function edit() + { + $this->applyCsrfToken(); + if($this->request->isPost()) { + $id = $this->request->param('id'); + $reaolae = $this->request->param('reaolae'); + $this->_save($this->table, ['reaolae'=>$reaolae,'status' => '2','time2' => date('Y-m-d H:i:s')]); + }else{ + $this->title = '拒绝充值'; + $id = $this->request->param('id'); + $recharge = Db::name($this->table)->find($id); + if($recharge){ + $recharge['username'] = Db::name("LcUser")->where(['id'=>$recharge['uid']])->value('phone'); + } + $this->_form($this->table, 'edit'); + } + } + /** + * 同意充值 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function agree() + { + $this->applyCsrfToken(); + $id = $this->request->param('id'); + $recharge = Db::name($this->table)->find($id); + if($recharge&&$recharge['status'] == 0){ + $money = $recharge['money']; + $uid = $recharge['uid']; + $type = $recharge['type']; + addFinance($uid, $money,1, $type . '入款' . $money . '元'); + setNumber('LcUser', 'money', $money, 1, "id = $uid"); + $rechargeMoney = Db::name('LcFinance')->where('uid = '.$uid.' and reason like "%入款%"')->sum('money'); + $level = Db::name('LcUserMember')->where('value <='.$rechargeMoney.' ')->order('level desc')->find(); + if (!empty($level)){ + Db::name('LcUser')->where('id', $uid)->update([ + 'level' => $level['level'], + 'member' => $level['id'], + ]); + } +// if($tid) setRechargeRebate($tid, $money); + if(getInfo('pay_bank_give') > 0 && $recharge['type'] == '银行入款'){ + $money = $money * getInfo('pay_bank_give') /100; + addFinance($uid, $money, 1, '通过'.$type . '奖励' . $money . '元'); + setNumber('LcUser', 'money', $money, 1, "id = $uid"); + } + if(getInfo('gz_bankz') > 0 && $recharge['type'] == '公账入款'){ + $money = $money * getInfo('gz_bankz') /100; + addFinance($uid, $money, 1, '通过'.$type . '奖励' . $money . '元'); + setNumber('LcUser', 'money', $money, 1, "id = $uid"); + } + if(getInfo('wx_bank_give') > 0 && $recharge['type'] == '微信转银行卡'){ + $money = $money * getInfo('wx_bank_give') /100; + addFinance($uid, $money, 1, '通过'.$type . '奖励' . $money . '元'); + setNumber('LcUser', 'money', $money, 1, "id = $uid"); + } + if(getInfo('alipay_bank_give') > 0 && $recharge['type'] == '支付宝转银行卡'){ + $money = $money * getInfo('alipay_bank_give') /100; + addFinance($uid, $money, 1, '通过'.$type . '奖励' . $money . '元'); + setNumber('LcUser', 'money', $money, 1, "id = $uid"); + } + $this->_save($this->table, ['status' => '1','time2' => date('Y-m-d H:i:s')]); + } + } + + /** + * 增减余额 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function change(){ + if(\think\facade\Request::isPost()){ + $data = $this->request->param(); + if(!$data['name']) $this->error("用户账号必填"); + if(!$data['money']) $this->error("增减金额必填"); + $uid = Db::name("LcUser")->where(['phone'=>$data['name']])->value('id'); + if(!$uid) $this->error("暂无该用户"); + addFinance($uid, $data['money'], $data['type'], $data['reason']); + setNumber('LcUser', 'money', $data['money'], $data['type'], "id = $uid"); + $this->success("操作成功"); + } + $this->fetch('form'); + } + + /** + * 拒绝充值 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function refuse() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['status' => '2','time2' => date('Y-m-d H:i:s')]); + } + + /** + * 删除充值记录 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } +} diff --git a/application/akszadmin/controller/Shop.php b/application/akszadmin/controller/Shop.php new file mode 100755 index 0000000..4051a0a --- /dev/null +++ b/application/akszadmin/controller/Shop.php @@ -0,0 +1,116 @@ +title = '商品列表'; + $query = $this->_query($this->table)->like('title'); + $query->order('sort asc,id desc')->page(); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + $this->mlist = Db::name('LcArticleType')->select(); + } + + /** + * 添加商品 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->title = '添加商品'; + $this->_form($this->table, 'form'); + } + + /** + * 编辑商品 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '编辑商品'; + $this->_form($this->table, 'form'); + } + + /** + * 删除商品 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if ($this->request->isGet()) { + if(!isset($vo['type'])) $vo['type'] = '1'; + } + } + +} diff --git a/application/akszadmin/controller/ShopOrder.php b/application/akszadmin/controller/ShopOrder.php new file mode 100755 index 0000000..5d16cfd --- /dev/null +++ b/application/akszadmin/controller/ShopOrder.php @@ -0,0 +1,62 @@ +title = '兑换列表'; + $query = $this->_query($this->table)->alias('i')->field('i.*,u.phone,u.name as u_name'); + $query->join('lc_user u','i.uid=u.id')->equal('i.type#i_type')->like('u.phone#u_phone,u.name#u_name')->dateBetween('i.time#i_time')->order('i.id desc')->page(); + } + + /** + * 删除兑换 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } +} diff --git a/application/akszadmin/controller/Slide.php b/application/akszadmin/controller/Slide.php new file mode 100755 index 0000000..24a8615 --- /dev/null +++ b/application/akszadmin/controller/Slide.php @@ -0,0 +1,103 @@ +title = '轮播图列表'; + $query = $this->_query($this->table); + $query->order('sort asc,id asc')->page(); + } + + /** + * 表单数据处理 + * @param array $vo + * @throws \ReflectionException + */ + protected function _form_filter(&$vo){ + if ($this->request->isGet()) { + if(!isset($vo['show'])) $vo['show'] = '1'; + } + } + + /** + * 添加轮播图 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->title = '添加轮播图'; + $this->_form($this->table, 'form'); + } + + /** + * 编辑轮播图 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->title = '编辑轮播图'; + $this->_form($this->table, 'form'); + } + + /** + * 删除轮播图 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } +} diff --git a/application/akszadmin/controller/Sms.php b/application/akszadmin/controller/Sms.php new file mode 100755 index 0000000..d6feca1 --- /dev/null +++ b/application/akszadmin/controller/Sms.php @@ -0,0 +1,90 @@ +title = '短信模板管理'; + $query = $this->_query($this->table)->like('type'); + $query->order('id asc')->page(); + } + + /** + * 编辑短信 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->applyCsrfToken(); + $this->_form($this->table, 'form'); + } + + /** + * 启用短信 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function resume() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['status' => '1']); + } + + /** + * 关闭短信 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function forbid() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['status' => '0']); + } + +} diff --git a/application/akszadmin/controller/User.php b/application/akszadmin/controller/User.php new file mode 100755 index 0000000..a1b7f73 --- /dev/null +++ b/application/akszadmin/controller/User.php @@ -0,0 +1,202 @@ +title = '系统用户管理'; + $query = $this->_query($this->table)->like('username,phone,mail')->equal('status'); + $query->dateBetween('login_at,create_at')->where(['is_deleted' => '0'])->order('id desc')->page(); + } + + /** + * 添加系统用户 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->applyCsrfToken(); + $this->_form($this->table, 'form'); + } + + /** + * 编辑系统用户 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->applyCsrfToken(); + $this->_form($this->table, 'form'); + } + + /** + * 修改用户密码 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function pass() + { + + $this->applyCsrfToken(); + if ($this->request->isGet()) { + $this->verify = false; + $this->_form($this->table, 'pass'); + } else { + $post = $this->request->post(); + if ($post['password'] !== $post['repassword']) { + $this->error('两次输入的密码不一致!'); + } + if (Data::save($this->table, ['id' => $_SESSION['fw']['user']['id'], 'password' => md5($post['password'])], 'id')) { + $this->success('密码修改成功,下次请使用新密码登录!', ''); + } else { + $this->error('密码修改失败,请稍候再试!'); + } + } + } + + /** + * 后台加密 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function suffix() { + $this->applyCsrfToken(); + $adminModuleFile = env('root_path') . '/admin_module.php'; + if ($this->request->isGet()) { + if (file_exists($adminModuleFile)) { + $this->adminModule = include $adminModuleFile; + } + return $this->fetch(); + } else { + $suffix = $this->request->post('suffix'); + if (!preg_match('/^([0-9a-zA-Z]+)$/', $suffix)) { + $this->error('后台加密后缀只能包含数字/大小写英文!'); + } + if (file_put_contents($adminModuleFile, "success('后台加密后缀修改成功!', url("@$suffix")); + } else { + $this->error('后台加密后缀修改失败,请稍候再试!'); + } + } + } + + /** + * 表单数据处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function _form_filter(&$data) + { + if ($this->request->isPost()) { + // 用户权限处理 + $data['authorize'] = (isset($data['authorize']) && is_array($data['authorize'])) ? join(',', $data['authorize']) : ''; + // 用户账号重复检查 + if (isset($data['id'])) unset($data['username']); + elseif (Db::name($this->table)->where(['username' => $data['username'], 'is_deleted' => '0'])->count() > 0) { + $this->error("账号{$data['username']}已经存在,请使用其它账号!"); + } + } else { + $data['authorize'] = explode(',', isset($data['authorize']) ? $data['authorize'] : ''); + $this->authorizes = Db::name('SystemAuth')->where(['status' => '1'])->order('sort desc,id desc')->select(); + } + } + + /** + * 禁用系统用户 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function forbid() + { + if (in_array('10000', explode(',', $this->request->post('id')))) { + $this->error('系统超级账号禁止操作!'); + } + $this->applyCsrfToken(); + $this->_save($this->table, ['status' => '0']); + } + + /** + * 启用系统用户 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function resume() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['status' => '1']); + } + + /** + * 删除系统用户 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + if (in_array('10000', explode(',', $this->request->post('id')))) { + $this->error('系统超级账号禁止删除!'); + } + $this->applyCsrfToken(); + $this->_delete($this->table); + } + +} diff --git a/application/akszadmin/controller/Users.php b/application/akszadmin/controller/Users.php new file mode 100755 index 0000000..990d192 --- /dev/null +++ b/application/akszadmin/controller/Users.php @@ -0,0 +1,281 @@ +title = '会员列表'; + $query = $this->_query($this->table)->alias('u')->field('u.*,m.name as m_name'); + if (input('get.online_user/d') === 1) { + $query->order('u.access_time', 'desc'); + } + $query->join('lc_user_member m', + 'u.member=m.id')->equal('u.auth#u_auth,u.clock#u_clock,u.member#u_member') + ->like('u.ip#i_orderid,u.phone#u_phone,u.name#u_name,u.ip#u_ip') + ->dateBetween('u.time#u_time') + ->order('u.id desc')->page(); + } + + /** + * 状态 开启或者关闭 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function iskqopen() + { + + $id = $this->request->param('id'); + $iskq = $this->request->param('iskq'); + $this->_save($this->table, ['isjy' => $iskq]); + } + + /** + * 数据列表处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + protected function _index_page_filter(&$data) + { + $this->member = Db::name("lc_user_member")->field('id,name')->select(); + $ip = new \Ip2Region(); + foreach ($data as &$vo) { + $vo['online'] = $vo['access_time'] > (time() - 300) ? 1 : 0; + $vo['top'] = Db::name("lc_user")->where("id = {$vo['top']}")->value('phone'); + $vo['cash_sum'] = Db::name("lc_cash")->where("uid = {$vo['id']} AND status = '1'")->sum('money'); + $vo['recharge_sum'] = Db::name("lc_recharge")->where("uid = {$vo['id']} AND status = '1'")->sum('money'); + $vo['invest_sum'] = Db::name('lc_invest')->where("uid = {$vo['id']}")->sum('money'); + $vo['wait_invest'] = Db::name('lc_invest_list')->where("uid = {$vo['id']} AND pay1 > 0 AND status = 0")->sum('money1'); + $vo['wait_money'] = Db::name('lc_invest_list')->where("uid = {$vo['id']} AND money2 > 0 AND status = 0")->sum('money2'); + $result = $ip->btreeSearch($vo['ip']); + $vo['isp'] = isset($result['region']) ? $result['region'] : ''; + $vo['isp'] = str_replace(['内网IP', '0', '|'], '', $vo['isp']); + $result2 = $ip->btreeSearch($vo['loginip']); + $vo['isp2'] = isset($result2['region']) ? $result2['region'] : ''; + $vo['isp2'] = str_replace(['内网IP', '0', '|'], '', $vo['isp2']); + } + } + + public function user_relation() + { + $this->title = '会员关系网'; + if ($this->request->isGet()) { + $list = []; + $phone = $this->request->param('phone'); + $type = $this->request->param('type'); + if ($type == 1) { + $top = Db::name('LcUser')->where(['phone' => $phone])->value('top'); + if ($top) { + $list = Db::name('LcUser')->where(['id' => $top])->select(); + } + } else { + $uid = Db::name('LcUser')->where(['phone' => $phone])->value('id'); + if ($uid) { + $list = Db::name('LcUser')->where(['top' => $uid])->select(); + } + } + if ($list) { + foreach ($list as &$v) { + $vo['top_phone'] = ''; + if ($v['top']) { + $vo['top_phone'] = Db::name('LcUser')->where(['id' => $v['top']])->value('phone'); + } + } + } + $this->assign('list', $list); + } + $this->fetch(); + } + + /** + * 表单数据处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function _form_filter(&$vo) + { + if ($this->request->isPost()) { + + if ($vo['mwpassword']) { + $vo['password'] = md5($vo['mwpassword']); + } + if ($vo['mwpassword2']) { + $vo['password2'] = md5($vo['mwpassword2']); + } + if (isset($vo['id'])) { + $money = Db::name($this->table)->where("id = {$vo['id']}")->value('money'); + if ($money && $money != $vo['money']) { + $handle_money = $money - $vo['money']; + $type = $handle_money > 0 ? 2 : 1; + model('akszadmin/Users')->addFinance($vo['id'], abs($handle_money), $type, '系统操作'); + } + if (!empty($vo['bank'])) { + Db::name("LcBank")->where('uid', $vo['id'])->update([ + 'bank' => $vo['bank'], + 'area' => $vo['area'], + 'account' => $vo['account'] + ]); + } + + } else { + $vo['time'] = date('Y-m-d H:i:s'); + } + } else { + if (!isset($vo['auth'])) { + $vo['auth'] = '0'; + } + $this->member = Db::name("LcUserMember")->order('id desc')->select(); + + } + } + + /** + * 添加用户 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function add() + { + $this->applyCsrfToken(); + $this->_form($this->table, 'form'); + } + + /** + * 编辑用户 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function edit() + { + $this->applyCsrfToken(); + + $uid = $this->request->param('id'); + + $this->bankinfo = Db::name("LcBank")->where("uid = {$uid}")->order('id desc')->find(); + + $this->_form($this->table, 'form'); + } + /** + * 实名认证审核 + * @auth true + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function review() + { + $this->title = '实名认证审核'; + $this->id = input('id'); + if ($this->request->isGet()) { + $user = Db::name("LcUser")->where("id = {$this->id}")->find(); + $this->assign('user', $user); + $this->fetch(); + }else{ + $id = input('id'); + $rz_status = input('rz_status'); + $name = input('name'); + $idcard = input('idcard'); + $res = Db::name("LcUser")->where("id = {$id}")->update(['name'=>$name,'idcard'=>$idcard,'rz_status'=>$rz_status]); + if($res){ + $this->success('审核成功'); + }else{ + $this->error('审核失败'); + } + } + } + + /** + * 禁用用户 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function forbid() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['clock' => '0']); + } + + /** + * 启用用户 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function resume() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['clock' => '1']); + } + + public function setrobot() + { + $this->applyCsrfToken(); + $this->_save($this->table, ['robot' => $_POST['clock']]); + } + + /** + * 删除用户 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function remove() + { + $this->applyCsrfToken(); + $this->_delete($this->table); + } +} diff --git a/application/akszadmin/controller/Yuebao.php b/application/akszadmin/controller/Yuebao.php new file mode 100755 index 0000000..8e34ffa --- /dev/null +++ b/application/akszadmin/controller/Yuebao.php @@ -0,0 +1,220 @@ +where('id',">",0)->select(); + $query = $this->_query('lc_yuebao')->where("id > 0 and status < 5"); + $query->order('id desc')->page(); + //$this->assign('list',$list); + $this->fetch(); + + } + + /** + * 删除记录 + * @auth true + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function lists() + { + $list=Db::name('lc_yuebao_lists')->where("status < 5")->order('id desc')->select(); + $lists=array(); + foreach($list as $x=>$v){ + $v['start_time']=date('Y-m-d H:i:s',$v['start_time']); + $v['end_time']=date('Y-m-d H:i:s',$v['end_time']); + $lists[$x]=$v; + } + $counttotal=count($list); + $counttotalmoney=Db::name('lc_yuebao_lists')->where("status = 1")->sum('money'); + $countdoing=Db::name('lc_yuebao_lists')->where("status = 1")->count(); + $countnosend=Db::name('lc_yuebao_lists')->where("status = 1")->sum('nowprofit'); + $countsended=Db::name('lc_yuebao_log')->where("status = 2")->sum('nowprofit'); + //$list=$lists; + $this->assign('list',$lists); + $this->assign('counttotal',$counttotal); + $this->assign('counttotalmoney',round($counttotalmoney,4)); + $this->assign('countdoing',$countdoing); + $this->assign('countnosend',round($countnosend,4)); + $this->assign('countsended',round($countsended,4)); + $query = $this->_query('lc_yuebao_lists')->where("status < 5"); + $query->order('id desc')->page(); + //var_dump($list);die; + + + $this->fetch(); + //$this->fetch(); + } + public function yebdel(){ + if($_SESSION['fw']['user']['username']=="admin"){ + Db::name('lc_yuebao')->where("id = ".$_GET['id'])->update(['status'=>9]); + return "OK"; + }else{ + return "false"; + } + + } + public function yebstop(){ + if($_SESSION['fw']['user']['username']=="admin"){ + $getstatus=Db::name('lc_yuebao')->where("id = ".$_GET['id'])->find(); + if($getstatus['status']==0) Db::name('lc_yuebao')->where("id = ".$_GET['id'])->update(['status'=>1]); + if($getstatus['status']==1) Db::name('lc_yuebao')->where("id = ".$_GET['id'])->update(['status'=>0]); + //Db::name('lc_yuebao')->where("id = ".$_GET['id'])->update(['status'=>0]); + return "OK"; + }else{ + return "false"; + } + + } + public function yebadd(){ + if($_SESSION['fw']['user']['username']!="admin"){return "非法访问";exit;die;} + if(empty($_POST)){return "数据错误!";exit;die;} + $adddata=array( + 'title'=>$_POST['title'], + 'lily'=>$_POST['lily'], + 'days'=>$_POST['days'], + 'advise'=>0, + 'lowmoney'=>$_POST['lowmoney'], + 'stars'=>$_POST['stars'], + 'addtime'=>time(), + 'status'=>$_POST['status'], + ); + $ok=Db::name('lc_yuebao')->insert($adddata); + return $ok==1?"OK":"false";die; + } + public function yebedit(){ + if($_SESSION['fw']['user']['username']!="admin"){return "非法访问";exit;die;} + if(empty($_POST)){return "数据错误!";exit;die;} + $adddata=array( + 'title'=>$_POST['title'], + 'lily'=>$_POST['lily'], + 'days'=>$_POST['days'], + 'advise'=>0, + 'lowmoney'=>$_POST['lowmoney'], + 'stars'=>$_POST['stars'], + 'addtime'=>time(), + 'status'=>$_POST['status'], + ); + $ok=Db::name('lc_yuebao')->where('id = '.$_POST['yebid'])->update($adddata); + return $ok==1?"OK":"false";die; + } + public function yebgetbyid(){ + $res=Db::name('lc_yuebao')->where('id = '.$_GET['id'])->find(); + return $res; + } + + public function listclear(){ + if($_SESSION['fw']['user']['username']!="admin"){return "非法访问";exit;die;} + if(empty($_POST)){return "数据错误!";exit;die;} + + $getlistinfo=Db::table('lc_yuebao_lists')->where('id='.$_POST['id'])->find(); + if($getlistinfo['status']!=1 or empty($getlistinfo)){return "操作失败:订单无法操作!";die;} + + $getuserinfo=Db::table('lc_user')->where('id='.$getlistinfo['uid'])->find(); + if(!empty($getuserinfo)){ + Db::table('lc_yuebao_lists')->where('id='.$_POST['id'])->update(['status'=>2,'end_time'=>time()]); + //记录日志! + unset($getlistinfo['id']); + $getlistinfo['status']=2; + $getlistinfo['end_time']=time(); + $getlistinfo['balance']=$getuserinfo['money']; + $getlistinfo['closetime']=time(); + $getlistinfo['remarks']="管理员".$_SESSION['fw']['user']['username']."人工结算"; + Db::table('lc_yuebao_log')->insert($getlistinfo); + //更新用户余额 + $newbalance=$getuserinfo['money']+$getlistinfo['nowprofit']+$getlistinfo['money']; + Db::table('lc_user')->where('id='.$getlistinfo['uid'])->update(['money'=>$newbalance]); + + //更新UC + $where['uid']=$getlistinfo['uid']; + $yebucinfo=Db::table('lc_yuebao_uc')->where($where)->find(); + $newbalance=$yebucinfo['balance']-$getlistinfo['money']; + Db::table('lc_yuebao_uc')->where($where)->update(['balance'=>$newbalance]); + + //再做UCLOG + $yebuclog=array( + 'uid'=>$getlistinfo['uid'], + 'balance'=>$yebucinfo['balance'], + 'money'=>$getlistinfo['money'], + 'addtime'=>time(), + 'remarks'=>"用户购买理财方案:".$getlistinfo['yebtitle'] + ); + Db::table('lc_yuebao_uclog')->insert($yebuclog); + + return "ok"; + + }else{ + return "操作失败:订单无法操作!"; + } + die; + + + //更新参保状态。 + + } + + public function listkeep(){ + if($_SESSION['fw']['user']['username']!="admin"){return "非法访问";exit;die;} + if(empty($_POST)){return "数据错误!";exit;die;} + $getlistinfo=Db::table('lc_yuebao_lists')->where('id='.$_POST['id'])->find(); + if($getlistinfo['status']==2){ + $getlistinfo['start_time']=time(); + $getlistinfo['end_time']=time()+$getlistinfo['days']*86400; + $getlistinfo['status']=1; + $getlistinfo['nowprofit']=0; + }elseif($getlistinfo['status']==1){ + $getlistinfo['end_time']=$getlistinfo['end_time']+$getlistinfo['days']*86400; + } + unset($getlistinfo['id']); + Db::table('lc_yuebao_lists')->where('id='.$_POST['id'])->update($getlistinfo); + return "操作成功";die; + } + public function listdel(){ + if($_SESSION['fw']['user']['username']!="admin"){return "非法访问";exit;die;} + if(empty($_POST)){return "数据错误!";exit;die;} + Db::name('lc_yuebao')->where("id = ".$_GET['id'])->update(['status'=>9]); + return "OK";die; + + } +} diff --git a/application/akszadmin/controller/api/Plugs.php b/application/akszadmin/controller/api/Plugs.php new file mode 100755 index 0000000..d718d39 --- /dev/null +++ b/application/akszadmin/controller/api/Plugs.php @@ -0,0 +1,150 @@ +title = '图标选择器'; + $this->field = input('field', 'icon'); + $this->fetch(); + } + + /** + * 获取文件上传参数 + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function check() + { + $diff1 = explode(',', strtolower(input('exts', ''))); + $diff2 = explode(',', strtolower(sysconf('storage_local_exts'))); + $exts = array_intersect($diff1, $diff2); + $this->success('获取文件上传参数', [ + 'exts' => join('|', $exts), + 'mime' => File::mine($exts), + 'type' => $this->getUploadType(), + 'data' => $this->getUploadData(), + ]); + } + + /** + * 后台通用文件上传 + * @login true + * @return \think\response\Json + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function upload() + { + if (!($file = $this->getUploadFile()) || empty($file)) { + return json(['uploaded' => false, 'error' => ['message' => '文件上传异常,文件可能过大或未上传']]); + } + if (!$file->checkExt(strtolower(sysconf('storage_local_exts')))) { + return json(['uploaded' => false, 'error' => ['message' => '文件上传类型受限,请在后台配置']]); + } + if ($file->checkExt('php,sh')) { + return json(['uploaded' => false, 'error' => ['message' => '可执行文件禁止上传到本地服务器']]); + } + $this->safe = boolval(input('safe')); + $this->uptype = $this->getUploadType(); + $this->extend = pathinfo($file->getInfo('name'), PATHINFO_EXTENSION); + if ($this->uptype === 'local' && GdImageClass::isSupportSuffix($this->extend)) { + try { + (new GdImageClass($file->getRealPath(),$this->extend))->convertTo($file->getRealPath(), 'webp'); + $file= new \think\File($file->getRealPath()); + $this->extend = 'webp'; + } catch (\Exception $exception) { + return json(['uploaded' => false, 'error' => ['message' => '文件处理失败: ' . $exception->getMessage()]]); + } + } + /** @noinspection DuplicatedCode */ + $name = File::name($file->getPathname(), $this->extend, '', 'md5_file'); + $info = File::instance($this->uptype)->save($name, file_get_contents($file->getRealPath()), $this->safe); + if (is_array($info) && isset($info['url'])) { + return json(['uploaded' => true, 'filename' => $name, 'url' => $this->safe ? $name : $info['url']]); + } else { + return json(['uploaded' => false, 'error' => ['message' => '文件处理失败,请稍候再试!']]); + } + } + + /** + * 生成文件上传参数 + * @return array + * @throws \think\Exception + */ + private function getUploadData() + { + if ($this->getUploadType() === 'qiniu') { + $file = File::instance('qiniu'); + return [ + 'url' => $file->upload(true), + 'token' => $file->buildUploadToken(), + 'uptype' => $this->getUploadType() + ]; + } else { + return [ + 'url' => '?s=' . ADMIN_MODULE . '/api.plugs/upload', + 'token' => uniqid('local_upload_'), + 'uptype' => $this->getUploadType() + ]; + } + } + + /** + * 获取文件上传方式 + * @return string + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + private function getUploadType() + { + $this->uptype = input('uptype'); + if (!in_array($this->uptype, ['local', 'oss', 'qiniu'])) { + $this->uptype = sysconf('storage_type'); + } + return $this->uptype; + } + + /** + * 获取本地文件对象 + * @return \think\File + */ + private function getUploadFile() + { + try { + return $this->request->file('file'); + } catch (\Exception $e) { + $this->error(lang($e->getMessage())); + } + } + +} diff --git a/application/akszadmin/controller/api/Update.php b/application/akszadmin/controller/api/Update.php new file mode 100755 index 0000000..30dc0f1 --- /dev/null +++ b/application/akszadmin/controller/api/Update.php @@ -0,0 +1,60 @@ +success('获取当前文件列表成功!', $sync->build()); + } + + /** + * 读取线上文件数据 + * @param string $encode + */ + public function read($encode) + { + $this->file = env('root_path') . decode($encode); + if (file_exists($this->file)) { + $this->success('读取文件成功!', [ + 'format' => 'base64', + 'content' => base64_encode(file_get_contents($this->file)), + ]); + } else { + $this->error('获取文件内容失败!'); + } + } + +} diff --git a/application/akszadmin/model/Item.php b/application/akszadmin/model/Item.php new file mode 100755 index 0000000..5ed7975 --- /dev/null +++ b/application/akszadmin/model/Item.php @@ -0,0 +1,53 @@ +item_table)->find($id); + if($item['auto']>0){ + $xc=$this->diffBetweenTwoDays($item['time'],date('Y-m-d H:i:s')); + if($xc>$item['auto']){ + $total=100; + }else{ + $total= round($xc/$item['auto']*100); + } + }else{ + $pid = $item['id']; + $percent = $item['percent']; + $investMoney = Db::name($this->invest_table)->where('pid', $pid)->sum('money'); + $actual = $investMoney / ($item['total'] * 10000) * 100; + $total = $actual + $percent; + } + if (100 < $total) return 100; + return $total; + } + + public function diffBetweenTwoDays ($day1, $day2) + { + $second1 = strtotime($day1); + $second2 = strtotime($day2); + if ($second1 < $second2) { + $tmp = $second2; + $second2 = $second1; + $second1 = $tmp; + } + return ($second1 - $second2) / 86400; + } +} diff --git a/application/akszadmin/model/Users.php b/application/akszadmin/model/Users.php new file mode 100755 index 0000000..94dc345 --- /dev/null +++ b/application/akszadmin/model/Users.php @@ -0,0 +1,48 @@ +user_table)->find($uid); + if($user['money']<0) return false; + if(!$user) return false; + $data = array( + 'uid' => $uid, + 'money' => $money, + 'type' => $type, + 'reason' => $reason, + 'before' => $user['money'], + 'time' => date('Y-m-d H:i:s') + ); + Db::startTrans(); + $re = Db::name($this->finance_table)->insert($data); + if($re){ + Db::commit(); + return true; + }else{ + Db::rollback(); + return false; + } + } +} diff --git a/application/akszadmin/sys.php b/application/akszadmin/sys.php new file mode 100755 index 0000000..7ada068 --- /dev/null +++ b/application/akszadmin/sys.php @@ -0,0 +1,195 @@ +check($node); + } +} + +if (!function_exists('sysdata')) { + /** + * JSON 数据读取与存储 + * @param string $name 数据名称 + * @param mixed $value 数据内容 + * @return mixed + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + function sysdata($name, $value = null) + { + if (is_null($value)) { + return SystemService::instance()->getData($name); + } else { + return SystemService::instance()->setData($name, $value); + } + } +} + +if (!function_exists('sysoplog')) { + /** + * 写入系统日志 + * @param string $action 日志行为 + * @param string $content 日志内容 + * @return boolean + */ + function sysoplog($action, $content) + { + return SystemService::instance()->setOplog($action, $content); + } +} + +if (!function_exists('sysqueue')) { + /** + * 创建异步处理任务 + * @param string $title 任务名称 + * @param string $loade 执行内容 + * @param integer $later 延时执行时间 + * @param array $data 任务附加数据 + * @param integer $double 任务多开 + * @return boolean + * @throws \think\Exception + */ + function sysqueue($title, $loade, $later = 0, $data = [], $double = 1) + { + $map = [['title', 'eq', $title], ['status', 'in', [1, 2]]]; + if (empty($double) && Db::name('SystemQueue')->where($map)->count() > 0) { + throw new \think\Exception('该任务已经创建,请耐心等待处理完成!'); + } + $result = Db::name('SystemQueue')->insert([ + 'title' => $title, 'preload' => $loade, + 'data' => json_encode($data, JSON_UNESCAPED_UNICODE), + 'time' => $later > 0 ? time() + $later : time(), + 'double' => intval($double), 'create_at' => date('Y-m-d H:i:s'), + ]); + return $result !== false; + } +} + +if (!function_exists('local_image')) { + /** + * 下载远程文件到本地 + * @param string $url 远程图片地址 + * @param boolean $force 是否强制重新下载 + * @param integer $expire 强制本地存储时间 + * @return string + */ + function local_image($url, $force = false, $expire = 0) + { + $result = File::down($url, $force, $expire); + if (isset($result['url'])) { + return $result['url']; + } else { + return $url; + } + } +} + +if (!function_exists('base64_image')) { + /** + * base64 图片上传接口 + * @param string $content 图片base64内容 + * @param string $dirname 图片存储目录 + * @return string + */ + function base64_image($content, $dirname = 'base64/') + { + try { + if (preg_match('|^data:image/(.*?);base64,|i', $content)) { + list($ext, $base) = explode('|||', preg_replace('|^data:image/(.*?);base64,|i', '$1|||', $content)); + $info = File::save($dirname . md5($base) . '.' . (empty($ext) ? 'tmp' : $ext), base64_decode($base)); + return $info['url']; + } else { + return $content; + } + } catch (\Exception $e) { + return $content; + } + } +} + +/** + * @description:充值奖励 + * @date: 2020/5/14 0014 + * @param $tid + * @param $money + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ +function setRechargeRebate($tid, $money) +{ + $reward = Db::name('LcReward')->where(['id'=>1])->value("recharge"); + $rebate = round($reward * $money / 100, 2); + if (0 < $rebate) { + addFinance($tid, $rebate, 1, '推荐会员充值' . $money . '元,获得佣金' . $rebate . '元'); + setNumber('LcUser', 'money', $rebate, 1, "id = $tid"); + setNumber('LcUser', 'income', $rebate, 1, "id = $tid"); + } +} + +// 访问权限检查中间键 +Middleware::add(function (Request $request, \Closure $next) { + if (AdminService::instance()->check()) { + return $next($request); + } elseif (AdminService::instance()->isLogin()) { + return json(['code' => 0, 'msg' => '抱歉,没有访问该操作的权限!']); + } else { + return json(['code' => 0, 'msg' => '抱歉,需要登录获取访问权限!', 'url' => url('@akszadmin/login')]); + } +}); + function curl2post($url,$data){ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); //设置访问的url地址 + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); + $data && curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $tmpInfo = curl_exec($ch); + if (curl_errno($ch)) { + return curl_error($ch); + } + curl_close($ch); + return $tmpInfo; + } + +// ThinkAdmin 图形验证码 +Route::get('/think/akszadmin/captcha', function () { + $image = CaptchaService::instance(); + return json(['code' => '1', 'info' => '生成验证码', 'data' => [ + 'uniqid' => $image->getUniqid(), 'image' => $image->getData() + ]]); +}); diff --git a/application/akszadmin/view/api/plugs/icon.html b/application/akszadmin/view/api/plugs/icon.html new file mode 100755 index 0000000..d7dd5f2 --- /dev/null +++ b/application/akszadmin/view/api/plugs/icon.html @@ -0,0 +1,3659 @@ + + + + + {block name="title"}{$title|default=''}{if !empty($title)} · {/if}{:sysconf('site_name')}{/block} + + + + + + + + + + + + + + + + + + + + diff --git a/application/akszadmin/view/article/form.html b/application/akszadmin/view/article/form.html new file mode 100755 index 0000000..be2a7ee --- /dev/null +++ b/application/akszadmin/view/article/form.html @@ -0,0 +1,92 @@ +{extend name='akszadmin@main'} + +{block name="content"} + +
+ +
+ +
+ + + +
+ +
+ + +
+ +
+ 文章内容 + +
+ +
+ {notempty name='vo.id'}{/notempty} + + +
+ +
+
+{/block} + +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/article/index.html b/application/akszadmin/view/article/index.html new file mode 100755 index 0000000..52bad78 --- /dev/null +++ b/application/akszadmin/view/article/index.html @@ -0,0 +1,88 @@ +{extend name='akszadmin@main'} + +{block name="button"} +{if auth("akszadmin/article/add")} + +{/if} +{if auth("akszadmin/article/remove")} + +{/if} +{/block} + +{block name="content"} +
+ {include file='article/index_search'} + + {notempty name='list'} + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + {/foreach} + +
+ + + + 文章标题文章类型语言文章状态发布时间
+ + + + + {$vo.title|default='--'} + + {$vo.name|default='--'} + + {$vo.lang|default='--'} + + {if $vo.show == 1} + 显示 + {/if} + {if $vo.show == 0} + 不显示 + {/if} + + {$vo.time|default='--'} + + +
+ {if auth("akszadmin/article/edit")} + 编 辑 + {else} + 编 辑 + {/if} + {if auth("akszadmin/article/remove")} + 删 除 + {else} + 删 除 + {/if} + +
+ +
+ + {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} + +
+{/block} diff --git a/application/akszadmin/view/article/index_search.html b/application/akszadmin/view/article/index_search.html new file mode 100755 index 0000000..68848fb --- /dev/null +++ b/application/akszadmin/view/article/index_search.html @@ -0,0 +1,33 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/article_type/class_search.html b/application/akszadmin/view/article_type/class_search.html new file mode 100755 index 0000000..d32a606 --- /dev/null +++ b/application/akszadmin/view/article_type/class_search.html @@ -0,0 +1,15 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/article_type/form.html b/application/akszadmin/view/article_type/form.html new file mode 100755 index 0000000..ffd1957 --- /dev/null +++ b/application/akszadmin/view/article_type/form.html @@ -0,0 +1,32 @@ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+{block name='script'} + +{/block} diff --git a/application/akszadmin/view/article_type/index.html b/application/akszadmin/view/article_type/index.html new file mode 100755 index 0000000..c9e9252 --- /dev/null +++ b/application/akszadmin/view/article_type/index.html @@ -0,0 +1,61 @@ +{extend name='akszadmin@main'} + +{block name="button"} +{if auth("akszadmin/article_type/add")} + +{/if} +{if auth("remove")} + +{/if} +{/block} + +{block name="content"} +
+ {include file='article_type/class_search'} + + {notempty name='list'} + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + {/foreach} + +
+ + + + 分类名称添加时间
+ + + + + {$vo.name|default=''} + {$vo.add_time} + + {if auth("akszadmin/article_type/edit")} + 编 辑 + {/if} + + {if auth("akszadmin/article_type/remove")} + 删 除 + {/if} + +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/auth/apply.html b/application/akszadmin/view/auth/apply.html new file mode 100755 index 0000000..fd07add --- /dev/null +++ b/application/akszadmin/view/auth/apply.html @@ -0,0 +1,116 @@ +{extend name='main'} + +{block name="button"} + +{if auth("akszadmin/auth/refresh")} + +{/if} + +{/block} + +{block name="content"} +
+ +
+
+ + +
+
+{/block} + +{block name="script"} + +{/block} + +{block name="style"} + + + +{/block} \ No newline at end of file diff --git a/application/akszadmin/view/auth/form.html b/application/akszadmin/view/auth/form.html new file mode 100755 index 0000000..58387dd --- /dev/null +++ b/application/akszadmin/view/auth/form.html @@ -0,0 +1,30 @@ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ {notempty name='vo.id'}{/notempty} + +
+ + +
+
\ No newline at end of file diff --git a/application/akszadmin/view/auth/index.html b/application/akszadmin/view/auth/index.html new file mode 100755 index 0000000..af11a73 --- /dev/null +++ b/application/akszadmin/view/auth/index.html @@ -0,0 +1,80 @@ +{extend name='main'} + +{block name="button"} + +{if auth("akszadmin/auth/add")} + +{/if} + +{if auth("akszadmin/auth/remove")} + +{/if} + +{/block} + +{block name="content"} + +
+ {include file='auth/index_search'} + + {notempty name='list'} + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + {/foreach} + +
+ + 权限信息创建时间使用状态
+ + + 权限名称:{$vo.title|default='-'}
+

权限描述:{$vo.desc|default="没有写描述哦!"}

+
+ 日期:{$vo.create_at|format_datetime|str_replace=' ','
时间:',###|raw} +
+ {eq name='vo.status' value='0'}已禁用{else}使用中{/eq} + + + {if auth("akszadmin/auth/edit")} + | + 编 辑 + {/if} + + {if auth("akszadmin/auth/apply")} + 授 权 + {/if} + + {if $vo.status eq 1 and auth("akszadmin/auth/forbid")} + 禁 用 + {elseif $vo.status eq 0 and auth("akszadmin/auth/resume")} + 启 用 + {/if} + + {if auth("akszadmin/auth/remove")} + 删 除 + {/if} + +
+ + {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} + +
+ +{/block} diff --git a/application/akszadmin/view/auth/index_search.html b/application/akszadmin/view/auth/index_search.html new file mode 100755 index 0000000..2547555 --- /dev/null +++ b/application/akszadmin/view/auth/index_search.html @@ -0,0 +1,42 @@ +
+ 条件搜索 + +
+ + \ No newline at end of file diff --git a/application/akszadmin/view/bank/form.html b/application/akszadmin/view/bank/form.html new file mode 100755 index 0000000..0a951fe --- /dev/null +++ b/application/akszadmin/view/bank/form.html @@ -0,0 +1,24 @@ +
+ +
+
+ + +
+ +
+ +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+{block name='script'} + +{/block} diff --git a/application/akszadmin/view/bank/index.html b/application/akszadmin/view/bank/index.html new file mode 100755 index 0000000..4bd42fd --- /dev/null +++ b/application/akszadmin/view/bank/index.html @@ -0,0 +1,69 @@ +{extend name='akszadmin@main'} +{block name="button"} +{if auth("remove")} + +{/if} +{/block} +{block name="content"} +
+ {include file='bank/index_search'} + + {notempty name='list'} + + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + + {/foreach} + +
+ + 编号会员ID用户名开户姓名所属银行支行名称银行卡号操作
+ + + {$vo.id|default='--'} + + {$vo.uid|default='--'} + + {$vo.phone|default='--'} + + {$vo.u_name|default='--'} + + {$vo.bank|default='--'} + + {$vo.area|default='--'} + + {$vo.account|default='--'} + + {if auth("akszadmin/article_type/edit")} + 编 辑 + {/if} + {if auth("remove")} + 删 除 + {/if} +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/bank/index_search.html b/application/akszadmin/view/bank/index_search.html new file mode 100755 index 0000000..c08aeba --- /dev/null +++ b/application/akszadmin/view/bank/index_search.html @@ -0,0 +1,27 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/cash/edit.html b/application/akszadmin/view/cash/edit.html new file mode 100755 index 0000000..e03b2a3 --- /dev/null +++ b/application/akszadmin/view/cash/edit.html @@ -0,0 +1,50 @@ +{extend name='akszadmin@main'} +{block name="content"} +
+
+ +
+ +
+
+ +
+ +
+ 拒绝理由 + + +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+
+{/block} +{block name='script'} + +{/block} \ No newline at end of file diff --git a/application/akszadmin/view/cash/index.html b/application/akszadmin/view/cash/index.html new file mode 100755 index 0000000..6c8415e --- /dev/null +++ b/application/akszadmin/view/cash/index.html @@ -0,0 +1,122 @@ +{extend name='akszadmin@main'} +{block name="button"} +{if auth("remove")} + +{/if} +{/block} +{block name="content"} +
+ {include file='cash/index_search'} + + + {notempty name='list'} + + + + + + + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + + + + + + + + {/foreach} + +
+ + 编号账户姓名提现金额(元)手续费实际到账(元)开户银行拒绝原因提交时间处理进度操作
+ + + {$vo.id|default='--'} + + {$vo.phone|default='--'} + + {$vo.name|default='--'} + + {$vo.money|default='--'} + + {$vo.sxfbfb|default='--'}% + + {$vo.dzje|default='--'} + + 账户名称:{$vo.name|default='--'} + {if $vo.bid == 0} +
{$vo.bank|default='--'} +
支付宝账号:{$vo.account|default='--'} + {else/} +
开户银行:{$vo.bank|default='--'} +
支行名称:{$vo.area|default='--'} +
银行账号:{$vo.account|default='--'} + {/if} +
+ + {$vo.reaolae|default='审核通过'} + + + {$vo.time|default='--'} + + {if $vo.status == 0} + 待审核 + {/if} + {if $vo.status == 1} + 已完成 + {/if} + {if $vo.status == 2} + 已拒绝 + {/if} + + {if auth("akszadmin/invest_list/detail")} + 查看详情 + {/if} + {if $vo.status eq 0} + {if auth("agree")} + 同 意 + {/if} + {if auth("refuse")} + 拒 绝 + + {/if} + {else} + 删 除 + {/if} + + +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/cash/index_search.html b/application/akszadmin/view/cash/index_search.html new file mode 100755 index 0000000..27e8821 --- /dev/null +++ b/application/akszadmin/view/cash/index_search.html @@ -0,0 +1,41 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/config/info.html b/application/akszadmin/view/config/info.html new file mode 100755 index 0000000..b363c50 --- /dev/null +++ b/application/akszadmin/view/config/info.html @@ -0,0 +1,88 @@ +{extend name="main"} + +{block name="button"} + +{if auth('config')} +修改系统配置 +{/if} + +{/block} + +{block name="content"} + +
+ 文件存储引擎: + {foreach ['local'=>'本地服务器存储','qiniu'=>'七牛云对象存储','oss'=>'阿里云OSS存储'] as $k=>$v} + {if sysconf('storage_type') eq $k} + {if auth('file')}{$v}{else}{$v}{/if} + {elseif auth('file')}{$v}{/if} + {/foreach} +
+ +
+
+ 平台邀请码 + +

平台邀请码(可修改)

+
+
+ 网站名称 Website + +

网站名称及网站图标,将显示在浏览器的标签上

+
+
+ 管理程序名称 Name + +

管理程序名称,将显示在后台左上角标题

+
+
+ 管理程序版本 Version + +

管理程序版本,将显示在后台左上角标题

+
+ +
+ 网站备案号 Miitbeian + +

网站备案号,可以在备案管理中心查询获取,将显示在登录页面下面

+
+
+ 网站版权信息 Copyright + +

网站版权信息,在后台登录页面显示版本信息并链接到备案到信息备案管理系统

+
+
+{/block} + +{block name='style'} + +{/block} \ No newline at end of file diff --git a/application/akszadmin/view/config/storage-local.html b/application/akszadmin/view/config/storage-local.html new file mode 100755 index 0000000..84b802d --- /dev/null +++ b/application/akszadmin/view/config/storage-local.html @@ -0,0 +1,20 @@ +
+
+
+

文件将存储在本地服务器,需确保服务器的 public/upload 目录有写入权限,有足够的存储空间!

+
+
+ +
+ +

设置系统允许上传文件的后缀,多个以英文逗号隔开。如:png,jpg,rar,doc

+
+
+
+
+ + + +
+
+
\ No newline at end of file diff --git a/application/akszadmin/view/config/storage-oss.html b/application/akszadmin/view/config/storage-oss.html new file mode 100755 index 0000000..7496bbf --- /dev/null +++ b/application/akszadmin/view/config/storage-oss.html @@ -0,0 +1,80 @@ +
+
+
+

文件将上传到阿里云OSS空间,需要配置OSS公开访问及跨域策略!

+ 目前已实现自动创建空间及配置访问策略!我要免费申请 +
+
+ +
+ +

设置系统允许上传文件的后缀,多个以英文逗号隔开。如:png,jpg,rar,doc

+
+
+
+ +
+ {foreach ['http','https','auto'] as $pro} + + {/foreach} +

阿里云对象存储访问协议(http、https、auto),其中 https 需要配置证书才能使用,auto 为相对协议自动根据域名切换http与https。

+
+
+
+ +
+ +

填写OSS存储空间名称,如:think-admin-oss(需要是全区唯一的值,不存在时会自动创建)

+
+
+
+ +
+ +

请选择OSS数据中心访问节点,有效值如:oss-cn-shenzhen.aliyuncs.com

+
+
+
+ +
+ +

可以在 [ 阿里云 > 个人中心 ] 设置并获取到访问密钥。

+
+
+
+ +
+ +

可以在 [ 阿里云 > 个人中心 ] 设置并获取到安全密钥。

+
+
+
+ +
+ +

填写OSS存储外部访问域名,如:think-admin-oss.oss-cn-shenzhen.aliyuncs.com(正常情况下是自动获取的)

+
+
+
+
+ + + +
+
+ +
diff --git a/application/akszadmin/view/config/storage-qiniu.html b/application/akszadmin/view/config/storage-qiniu.html new file mode 100755 index 0000000..7b5c5f6 --- /dev/null +++ b/application/akszadmin/view/config/storage-qiniu.html @@ -0,0 +1,80 @@ +
+
+
+

文件将上传到七牛云存储,对象存储需要配置为公开访问的Bucket空间!

+ 完成实名认证后可获得10G免费存储空间哦!我要免费申请 +
+
+ +
+ +

设置系统允许上传文件的后缀,多个以英文逗号隔开。如:png,jpg,rar,doc

+
+
+
+ +
+ {foreach ['http','https','auto'] as $pro} + + {/foreach} +

七牛云存储访问协议,其中 https 需要配置证书才能使用,auto 为相对协议。

+
+
+
+ +
+ {foreach ['华东','华北','华南','北美'] as $area} + + {/foreach} +

七牛云存储空间所在区域,需要严格对应储存所在区域才能上传文件。

+
+
+
+ +
+ +

填写七牛云存储空间名称,如:static

+
+
+
+ +
+ +

填写七牛云存储访问域名,如:static.ctolog.cc

+
+
+
+ +
+ +

可以在 [ 七牛云 > 个人中心 ] 设置并获取到访问密钥。

+
+
+
+ +
+ +

可以在 [ 七牛云 > 个人中心 ] 设置并获取到安全密钥。

+
+
+
+
+ + + +
+
+
\ No newline at end of file diff --git a/application/akszadmin/view/config/system-config.html b/application/akszadmin/view/config/system-config.html new file mode 100755 index 0000000..8a0d64a --- /dev/null +++ b/application/akszadmin/view/config/system-config.html @@ -0,0 +1,28 @@ +
+
+ +
+ +

平台邀请码

+
+
+ +

网站名称,将在浏览器的标签上显示名称

+
+ +
+ +
+ + +
+
+ +
+ diff --git a/application/akszadmin/view/finance/index.html b/application/akszadmin/view/finance/index.html new file mode 100755 index 0000000..a10addf --- /dev/null +++ b/application/akszadmin/view/finance/index.html @@ -0,0 +1,65 @@ +{extend name='akszadmin@main'} +{block name="button"} +{if auth("remove")} + +{/if} +{/block} +{block name="content"} +
+ {include file='finance/index_search'} + + {notempty name='list'} + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + + {/foreach} + +
+ + 流水编号交易对象真实姓名交易金额(元)交易前余额(元)详情流水时间
+ + + {$vo.id} + + {$vo.phone} + + {$vo.name} + + {if $vo.type == 1} + +{$vo.money} + {else} + -{$vo.money} + {/if} + + {$vo.before} + + {$vo.reason} + + {$vo.time} +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/finance/index_search.html b/application/akszadmin/view/finance/index_search.html new file mode 100755 index 0000000..a3bc2f0 --- /dev/null +++ b/application/akszadmin/view/finance/index_search.html @@ -0,0 +1,47 @@ +
+ 条件搜索 + + +
\ No newline at end of file diff --git a/application/akszadmin/view/goods/form.html b/application/akszadmin/view/goods/form.html new file mode 100755 index 0000000..d064b14 --- /dev/null +++ b/application/akszadmin/view/goods/form.html @@ -0,0 +1,218 @@ +{extend name='akszadmin@main'} +{block name="content"} +
+
+
+ +
+
+ +
+
+ +
+
+ 产品图标 + + + + + + +
+ +
+ +
+
+

注意: 客户订单在条件范围内时,会根据订单的涨或跌,自动减或加最小值与最大值之间的随机数,留空或者0则为不开启

+
+ + +
+
+
+

注意: 产品获取接口值后,会加上+-此处的值。如5,则在接口获取的数据中加上-5~5之间的随机数。

+
+ +
+
+
+

注意: 填0表示不显示

+
+ + + + +
+
+
+

投资金额【以 | 符号隔开】

+
+ + + + +
+
+
+

注意: 填入比例区间,例如:2或者2.1-2.2

+
+ + + + +
+
+
+

注意: 填入比例区间,例如:2或者2.1-2.2

+
+ + + + +
+
+
+

注意: 填入比例区间,例如:0.01-0.10

+
+ + + +
+
+
+

注意:开市时间,精准到秒,如:00:00:00~03:00:00|08:00:00~23:59:59 不得出现中文符号,全天不开市请留空

+
+ + + + + + + +
+
+ 产品备注 + +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+
+{/block} +{block name='script'} + +{/block} \ No newline at end of file diff --git a/application/akszadmin/view/goods/index.html b/application/akszadmin/view/goods/index.html new file mode 100755 index 0000000..5157da3 --- /dev/null +++ b/application/akszadmin/view/goods/index.html @@ -0,0 +1,97 @@ +{extend name='akszadmin@main'} + +{block name="button"} +{if auth("akszadmin/goods/add")} + +{/if} +{if auth("akszadmin/goods/remove")} + +{/if} +{/block} + +{block name="content"} +
+ {include file='goods/index_search'} + + {notempty name='list'} + + + + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + + + {/foreach} + +
+ + + + 产品标题门槛产品代码状态随机值风控最小值风控最大值操作
+ + + + + {$vo.title|default='--'} + + {$vo.min|default='0'} + + {$vo.code|default='--'} + + {if $vo.isopen == 1} 开市 {else /} 休市 {/if} + + {$vo.rands|default='--'} + + {$vo.point_low|default='--'} + + {$vo.point_top|default='--'} + +
+ {if auth("akszadmin/goods/edit")} + {if $vo.iskq == 1} + 开启 + {else /} + 关闭 + {/if} + + {if $vo.isopen == 1} + 点击休市 + {else /} + 点击开市 + {/if} + 编 辑 + {/if} + {if auth("akszadmin/goods/remove")} + 删 除 + {/if} + {$vo.showps==1?"隐盈":"显盈"} + {$vo.showps2==1?"隐亏":"显亏"} +
+
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} + +
+{/block} diff --git a/application/akszadmin/view/goods/index_search.html b/application/akszadmin/view/goods/index_search.html new file mode 100755 index 0000000..643142a --- /dev/null +++ b/application/akszadmin/view/goods/index_search.html @@ -0,0 +1,15 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/goods/risk.html b/application/akszadmin/view/goods/risk.html new file mode 100755 index 0000000..0331439 --- /dev/null +++ b/application/akszadmin/view/goods/risk.html @@ -0,0 +1,86 @@ +{extend name='akszadmin@main'} +{block name="content"} +
+
+
+
+

说明:比如设置几点到几点稳赢,如:14:20-15:30

+
+ +
+
+
+

说明:比如设置几点到几点稳输,如:18:10-18:30

+
+ +
+
+ + +
+
+ + +
+
+
+

说明: 此处设置会员ID(如:8888),多个用户用|符号分开(如:8888|9999)设置之后该会员所有订单都会亏损,请谨慎操作。如停止该功能请在上面留空或者填0,并提交。

+
+ +
+
+
+

说明: 此处设置会员ID(如:8888),多个用户用|符号分开(如:8888|9999)设置之后该会员所有订单都会赢利,请谨慎操作。如停止该功能请在上面留空或者填0,并提交。

+
+ +
+
+
+

说明: 下单达到此金额,则会受到下面风控影响。

+
+ +
+
+
+

说明: 输入金额区间,在金额区间之内会根据此概率盈亏。不在此区间则不受风控影响

+

格式: 区间开始-区间结束:客户赢利概率|  符号必须为英文符号,如0-100:50|100-200:30

+
+ +
+ +
+ {notempty name='vo.id'}{/notempty} + +
+
+
+{/block} +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/index/index.html b/application/akszadmin/view/index/index.html new file mode 100755 index 0000000..9c925df --- /dev/null +++ b/application/akszadmin/view/index/index.html @@ -0,0 +1,242 @@ + + + + {block name="title"}{$title|default=''}{if !empty($title)} · {/if}{:sysconf('site_name')}{/block} + + + + + + + + + + + + {block name="style"}{/block} + + + + + + + +{block name='body'} +
+ +
+
+ + +
+ + + +
+ + + +
+
+ + {foreach $menus as $oneMenu} + {notempty name='oneMenu.sub'} + + {/notempty} + {/foreach} +
+
+ + + +
{block name='content'}{/block}
+ + +
+ +{/block} + + + + + +{block name='script'}{/block} + + + diff --git a/application/akszadmin/view/index/main.html b/application/akszadmin/view/index/main.html new file mode 100755 index 0000000..be54e6b --- /dev/null +++ b/application/akszadmin/view/index/main.html @@ -0,0 +1,200 @@ +{extend name='main'} + +{block name='content'} + + + +
+
数据统计
+
+
+
+
总盈亏
+
{:number_format($invest_count)}
+
当前盈亏总数
+
+ +
+
+
+
用户总量
+
{:number_format($user_count)}
+
当前用户总数量(人)
+
+ +
+
+
+
充值总额
+
{:number_format($recharge_sum)}
+
已支付充值订单总金额(元)
+
+ +
+
+
+
提现总额
+
{:number_format($cash_sum)}
+
已完成提现订单总金额(元)
+
+ +
+
+
+ +
+
实时概况
+
+
+
+
+ +
+
+
今日充值
+
{:number_format($day[$today_key]['recharge'],2)}
+
今日充值成功金额(元)
+
+
+
今日提现
+
{:number_format($day[$today_key]['cash'],2)}
+
今日提现成功金额(元)
+
+
+
+
+
+
+ +
+
+
今日新增
+
{$day[$today_key]['new_user']}
+
今日新增会员数(人)
+
+
+
在线人数
+
{$online_user}
+
当前在线会员数(人)
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
综合报表
备注入款出款首冲人数活跃人数客户盈亏
上月¥{:number_format($last_month['recharge'],2)}元¥{:number_format($last_month['cash'],2)}元{:$last_month['invest_list']}人0人¥{:number_format($last_month['invest_sum'],2)}元
本月{:number_format($month['recharge'],2)}元{:number_format($month['cash'],2)}元{:$month['invest_list']}人0人{:number_format($month['invest_sum'],2)}元
总计where('status = 1')->sum('money'),2);?>元where('status = 1')->sum('money'),2);?>元0人
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + {volist name="day" id="v"} + + + + + + + + + + + + {/volist} + +
本月明细
日期新增用户入款出款首冲人数活跃人数订单数量客户盈亏流水
{$v['date']}{$v['new_user']}人¥{:number_format($v['recharge'],2)}元{:number_format($v['cash'],2)}元{:$v['invest_list']}人0人{:$v['ordernumer']}条¥{:number_format($v['expire'],2)}元¥{:number_format($v['interest'],2)}元
+
+
+
+{/block} diff --git a/application/akszadmin/view/info/form.html b/application/akszadmin/view/info/form.html new file mode 100755 index 0000000..8e2d1b5 --- /dev/null +++ b/application/akszadmin/view/info/form.html @@ -0,0 +1,285 @@ +{extend name='akszadmin@main'} +{block name="content"} +
+
+
+ + + +
+
+ + +
+
+ +
+ +
+ + + + + + +
+ +
+ + + + + + + +
+ + + + + + + + + +
+ + + + + + + +
+
+ + + + +
+
+ + + +
+
+ + +
+
+ + + + +
+ +
+ +
+ + + +
+ {notempty name='vo.id'}{/notempty} + +
+
+
+{/block} +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/info/img.html b/application/akszadmin/view/info/img.html new file mode 100755 index 0000000..70a85cf --- /dev/null +++ b/application/akszadmin/view/info/img.html @@ -0,0 +1,202 @@ +{extend name='akszadmin@main'} + +{block name="content"} + +
+
+
    +
  • 系统图片
  • + + +
+
+
+
+
+ 网站首页LOGO + + + + + + + + + +
260x70像素
+ +
+ +
+
+ APP图标 + + + + + + + + + +
100x100像素
+ +
+ +
+
+ 登录图标 + + + + + + + + + +
100x100像素
+ +
+ +
+
+ 新闻页面底部图标,png格式 + + + + + + + + + +
100x100像素
+ +
+ +
+
+ 公司章 + + + + + + + + + +
500x500像素,png格式
+ +
+ +
+
+ 保险章 + + + + + + + + + +
500x500像素,png格式
+ +
+ +
+
+
+ +
+
+
+ 活动图片 + + + + + + + + + +
活动图片地址
+ +
+
+ + +
+
+
+ +
+
+
+ 活动图片 + + + + + + + + + +
活动图片地址
+ +
+
+ + +
+
+
+ +
+ +
+ {notempty name='vo.id'}{/notempty} + +
+
+
+{/block} + +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/info/pay.html b/application/akszadmin/view/info/pay.html new file mode 100755 index 0000000..6b25b86 --- /dev/null +++ b/application/akszadmin/view/info/pay.html @@ -0,0 +1,329 @@ +{extend name='akszadmin@main'} + +{block name="content"} + +
+
+
    +
  • 银行入款
  • + +
+
+
+
+
+ + + +
+
+ + + +
+
+ +
+
+
+ + + + +
+ +
+ {notempty name='vo.id'}{/notempty} + +
+
+
+{/block} + +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/info/reward.html b/application/akszadmin/view/info/reward.html new file mode 100755 index 0000000..b6b146f --- /dev/null +++ b/application/akszadmin/view/info/reward.html @@ -0,0 +1,94 @@ +{extend name='akszadmin@main'} +{block name="content"} +
+
+
+ + + +
+ +
+ + + +
+ +
+ + + +
+ + + + +
+ {notempty name='vo.id'}{/notempty} + +
+
+
+{/block} +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/invest/index.html b/application/akszadmin/view/invest/index.html new file mode 100755 index 0000000..eeaf381 --- /dev/null +++ b/application/akszadmin/view/invest/index.html @@ -0,0 +1,51 @@ +{extend name='akszadmin@main'} + +{block name="content"} +
+ {include file='invest/index_search'} + + {notempty name='list'} + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + {/foreach} + +
投资信息投资人投资数据投资时间
+ 项目名称:{$vo.title|default='--'}
+ 合同编号:{$vo.number|default='--'}
+ 还款类型:{$vo.type2|default='--'}
+
+ 投资人ID:{$vo.uid|default='--'}
+ 投资人姓名:{$vo.name|default='--'}
+ 投资人电话:{$vo.phone|default='--'}
+
+ 投资金额:{$vo.money|default='--'} 元
+ 费率:{$vo.rate|default='--'} %
+ 期限:{$vo.day|default='--'} 天
+
+ 投资时间:{$vo.time|default='--'}
+ +
+ {if auth("akszadmin/invest_list/detail")} + 查看详情 + {/if} +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/invest/index_search.html b/application/akszadmin/view/invest/index_search.html new file mode 100755 index 0000000..465bea5 --- /dev/null +++ b/application/akszadmin/view/invest/index_search.html @@ -0,0 +1,49 @@ +
+ 条件搜索 + + +
\ No newline at end of file diff --git a/application/akszadmin/view/invest_list/index.html b/application/akszadmin/view/invest_list/index.html new file mode 100755 index 0000000..e417ed5 --- /dev/null +++ b/application/akszadmin/view/invest_list/index.html @@ -0,0 +1,43 @@ +{extend name='akszadmin@main'} + +{block name="content"} +
+ {include file='invest_list/index_search'} + + {notempty name='list'} + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + {/foreach} + +
投资信息投资人投资数据投资时间
+ 项目名称:{$vo.title|default='--'}
+ 返款编号:{$vo.id|default='--'}
+
+ 投资人ID:{$vo.uid|default='--'}
+ 投资人姓名:{$vo.name|default='--'}
+ 投资人电话:{$vo.phone|default='--'}
+
+ 预计返款金额:{$vo.pay1|default='--'} 元
+ 实际返款金额:{$vo.pay2|default='--'} 元
+
+ 预计返款:{$vo.time1|default='--'}
+ 实际返款:{$vo.time2|default='--'}
+
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/invest_list/index_search.html b/application/akszadmin/view/invest_list/index_search.html new file mode 100755 index 0000000..203bbd2 --- /dev/null +++ b/application/akszadmin/view/invest_list/index_search.html @@ -0,0 +1,30 @@ +
+ 条件搜索 + + +
\ No newline at end of file diff --git a/application/akszadmin/view/item/form.html b/application/akszadmin/view/item/form.html new file mode 100755 index 0000000..b541f0b --- /dev/null +++ b/application/akszadmin/view/item/form.html @@ -0,0 +1,236 @@ +{extend name='akszadmin@main'} + +{block name="content"} + + +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ +
+ + + +
+ +
+ + + +
+ + +
+ 项目封面图片 + + + + + + + + + +
项目封面
+ +
+ +
+ 产品详情 + +
+ +
+ {notempty name='vo.id'}{/notempty} + + +
+ +
+
+{/block} + +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/item/index.html b/application/akszadmin/view/item/index.html new file mode 100755 index 0000000..8644f18 --- /dev/null +++ b/application/akszadmin/view/item/index.html @@ -0,0 +1,81 @@ +{extend name='akszadmin@main'} + +{block name="button"} +{if auth("akszadmin/item/add")} + +{/if} +{if auth("akszadmin/item/remove")} + +{/if} +{/block} + +{block name="content"} +
+ {include file='item/index_search'} + + {notempty name='list'} + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + {/foreach} + +
+ + + + 项目信息项目分类项目配置其他配置
+ {$vo.title|default='--'}
+ 开始时间:{$vo.time|default='--'}
+
+ 所属分类:{$vo.item_class.name|default='--'}
+ 还款方式:{$vo.pay_type.name|default='--'}
+
+ 项目金额:{$vo.total|default='--'}万元
+ 收益率:{$vo.rate|default='--'}%
+ 项目期限:{$vo.day|default='--'}天
+
+ 项目进度:{$vo.percent|default='--'}%
+ 起投金额:{$vo.min|default='--'}元
+ 投资次数:{$vo.num|default='--'}次
+
+ +
+ {if auth("akszadmin/item/edit")} + 编 辑 + {else} + 编 辑 + {/if} + {if auth("akszadmin/item/remove")} + 删 除 + {else} + 删 除 + {/if} + +
+ +
+ + {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} + +
+{/block} diff --git a/application/akszadmin/view/item/index_search.html b/application/akszadmin/view/item/index_search.html new file mode 100755 index 0000000..4bb4a1a --- /dev/null +++ b/application/akszadmin/view/item/index_search.html @@ -0,0 +1,45 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/item_class/class_search.html b/application/akszadmin/view/item_class/class_search.html new file mode 100755 index 0000000..d32a606 --- /dev/null +++ b/application/akszadmin/view/item_class/class_search.html @@ -0,0 +1,15 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/item_class/form.html b/application/akszadmin/view/item_class/form.html new file mode 100755 index 0000000..de5eb41 --- /dev/null +++ b/application/akszadmin/view/item_class/form.html @@ -0,0 +1,47 @@ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+{block name='script'} + +{/block} diff --git a/application/akszadmin/view/item_class/index.html b/application/akszadmin/view/item_class/index.html new file mode 100755 index 0000000..7ff26e8 --- /dev/null +++ b/application/akszadmin/view/item_class/index.html @@ -0,0 +1,62 @@ +{extend name='akszadmin@main'} + +{block name="button"} +{if auth("akszadmin/item_class/add")} + +{/if} +{/block} + +{block name="content"} +
+ {include file='item_class/class_search'} + + {notempty name='list'} + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + {/foreach} + +
+ + + + 分类名称会员分组添加时间
+ + + + + {$vo.name|default=''} + + {$vo.member.name|default=''} + {$vo.add_time|format_datetime} + + {if auth("akszadmin/item_class/edit")} + 编 辑 + {/if} + + {if auth("akszadmin/item_class/remove")} + 删 除 + {/if} + +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/login/index.html b/application/akszadmin/view/login/index.html new file mode 100755 index 0000000..9612bf8 --- /dev/null +++ b/application/akszadmin/view/login/index.html @@ -0,0 +1,57 @@ +{extend name="index/index"} + +{block name="body"} +
+
+ {:sysconf('app_name')}{:sysconf('app_version')} + {notempty name='devmode'} + + Fork me on Gitee + + {/notempty} +
+
+

系统管理

+
    +
  • + +
  • +
  • + +
  • +
  • + + +
  • +
  • + +
  • +
+
+ +
+{/block} + +{block name='style'} + + + +{/block} + +{block name='script'} + + +{/block} diff --git a/application/akszadmin/view/main.html b/application/akszadmin/view/main.html new file mode 100755 index 0000000..b548b60 --- /dev/null +++ b/application/akszadmin/view/main.html @@ -0,0 +1,11 @@ +
+ {block name='style'}{/block} + {notempty name='title'} +
+ {$title|default=''} +
{block name='button'}{/block}
+
+ {/notempty} +
{block name='content'}{/block}
+ {block name='script'}{/block} +
\ No newline at end of file diff --git a/application/akszadmin/view/mall/form.html b/application/akszadmin/view/mall/form.html new file mode 100755 index 0000000..a2f4103 --- /dev/null +++ b/application/akszadmin/view/mall/form.html @@ -0,0 +1,118 @@ +{extend name='akszadmin@main'} + +{block name="content"} + + +
+ +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ 矿机封面图片 + + + + + + + + + +
矿机封面
+ +
+ +
+ 矿机详情 + +
+ +
+ {notempty name='vo.id'}{/notempty} + + +
+ +
+
+{/block} + +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/mall/index.html b/application/akszadmin/view/mall/index.html new file mode 100755 index 0000000..a2c3421 --- /dev/null +++ b/application/akszadmin/view/mall/index.html @@ -0,0 +1,77 @@ +{extend name='akszadmin@main'} + +{block name="button"} +{if auth("akszadmin/mall/add")} + +{/if} +{if auth("akszadmin/mall/remove")} + +{/if} +{/block} + +{block name="content"} +
+ {include file='mall/index_search'} + + {notempty name='list'} + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + {/foreach} + +
+ + + + 矿机信息矿机配置其他配置
+ {$vo.title|default='--'}
+ 添加时间:{$vo.time|default='--'}
+ 使用期限:{$vo.day|default='--'}
+
+ 保证金:{$vo.min|default='--'}元
+ 日总产出:{$vo.day_income|default='--'} BTC/天
+ 日运维费:{$vo.cost|default='--'} BTC/天
+
+ 算力:{$vo.power|default='--'}TH/s
+ 矿机总量:{$vo.total|default='--'}份
+ 剩余矿机:{$vo.stock|default='--'}份
+
+ +
+ {if auth("akszadmin/mall/edit")} + 编 辑 + {else} + 编 辑 + {/if} + {if auth("akszadmin/mall/remove")} + 删 除 + {else} + 删 除 + {/if} + +
+ +
+ + {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} + +
+{/block} diff --git a/application/akszadmin/view/mall/index_search.html b/application/akszadmin/view/mall/index_search.html new file mode 100755 index 0000000..adcb1e0 --- /dev/null +++ b/application/akszadmin/view/mall/index_search.html @@ -0,0 +1,15 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/mall_invest/index.html b/application/akszadmin/view/mall_invest/index.html new file mode 100755 index 0000000..1095b68 --- /dev/null +++ b/application/akszadmin/view/mall_invest/index.html @@ -0,0 +1,50 @@ +{extend name='akszadmin@main'} + +{block name="content"} +
+ {include file='mall_invest/index_search'} + + {notempty name='list'} + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + {/foreach} + +
租赁信息投资人投资数据时间
+ 矿机名称:{$vo.title|default='--'}
+ 日运维费:{$vo.cost|default='--'}
+
+ 投资人ID:{$vo.uid|default='--'}
+ 投资人姓名:{$vo.name|default='--'}
+ 投资人电话:{$vo.phone|default='--'}
+
+ 保证金:{$vo.money|default='--'} 元
+ 日净收益:{$vo.profit|default='--'} BTC
+ 使用期限:{$vo.day|default='--'} 天
+
+ 租赁时间:{$vo.time|default='--'}
+ 结束时间:{$vo.time2|default='--'}
+
+ {if auth("akszadmin/invest_list/detail")} + 查看详情 + {/if} +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/mall_invest/index_search.html b/application/akszadmin/view/mall_invest/index_search.html new file mode 100755 index 0000000..7d8d7ee --- /dev/null +++ b/application/akszadmin/view/mall_invest/index_search.html @@ -0,0 +1,27 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/mall_invest_list/index.html b/application/akszadmin/view/mall_invest_list/index.html new file mode 100755 index 0000000..fc7b505 --- /dev/null +++ b/application/akszadmin/view/mall_invest_list/index.html @@ -0,0 +1,43 @@ +{extend name='akszadmin@main'} + +{block name="content"} +
+ {include file='mall_invest_list/index_search'} + + {notempty name='list'} + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + {/foreach} + +
投资信息投资人投资数据投资时间
+ 矿机名称:{$vo.title|default='--'}
+ 挖矿编号:{$vo.id|default='--'}
+
+ 投资人ID:{$vo.uid|default='--'}
+ 投资人姓名:{$vo.name|default='--'}
+ 投资人电话:{$vo.phone|default='--'}
+
+ 预计收益:{$vo.pay1|default='--'} BTC
+ 实际收益:{$vo.pay2|default='--'} BTC
+
+ 预计收益时间:{$vo.time1|default='--'}
+ 实际收益时间:{$vo.time2|default='--'}
+
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/mall_invest_list/index_search.html b/application/akszadmin/view/mall_invest_list/index_search.html new file mode 100755 index 0000000..a80fa70 --- /dev/null +++ b/application/akszadmin/view/mall_invest_list/index_search.html @@ -0,0 +1,30 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/member/form.html b/application/akszadmin/view/member/form.html new file mode 100755 index 0000000..720b481 --- /dev/null +++ b/application/akszadmin/view/member/form.html @@ -0,0 +1,35 @@ +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+{block name='script'} + +{/block} diff --git a/application/akszadmin/view/member/index.html b/application/akszadmin/view/member/index.html new file mode 100755 index 0000000..8a79d14 --- /dev/null +++ b/application/akszadmin/view/member/index.html @@ -0,0 +1,60 @@ +{extend name='akszadmin@main'} + +{block name="button"} +{if auth("akszadmin/member/add")} + +{/if} +{if auth("remove")} + +{/if} +{/block} + +{block name="content"} +
+ + {notempty name='list'} + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + {/foreach} + +
+ + 会员组编号等级名称充值限制
+ + + {$vo.id|default=''} + + {$vo.name|default=''} + + {$vo.value|default=''} + + {if auth("akszadmin/member/edit")} + 编 辑 + {/if} + + {if auth("akszadmin/member/remove")} + 删 除 + {/if} +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/menu/form.html b/application/akszadmin/view/menu/form.html new file mode 100755 index 0000000..5aded12 --- /dev/null +++ b/application/akszadmin/view/menu/form.html @@ -0,0 +1,89 @@ +
+ +
+ +
+ +
+ +

必选,请选择上级菜单或顶级菜单(目前最多支持三级菜单)

+
+
+ +
+ +
+ +

必填,请填写菜单名称(如:系统管理),建议字符不要太长,一般4-6个汉字

+
+
+ +
+ +
+ +

+ 必填,请填写系统节点(如:admin/user/index),节点加入权限管理时菜单才会自动隐藏,非规则内的不会隐藏; +
正常情况下,在输入的时候会有自动提示。如果是上级菜单时,请填写"#"符号,不要填写地址或节点地址 +

+
+
+ +
+ +
+ +

可选,设置菜单链接的GET访问参数(如:name=1&age=3)

+
+
+ +
+ +
+
+ +
+ + + + +

可选,设置菜单选项前置图标,目前只支持 Font Awesome 5.2.0 字体图标

+
+
+ +
+ +
+ {notempty name='vo.id'}{/notempty} + +
+ + +
+ +
+ +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/menu/index.html b/application/akszadmin/view/menu/index.html new file mode 100755 index 0000000..43b0ffc --- /dev/null +++ b/application/akszadmin/view/menu/index.html @@ -0,0 +1,80 @@ +{extend name='main'} + +{block name="button"} + +{if auth("add")} + +{/if} + +{if auth("remove")} + +{/if} + +{/block} + +{block name="content"} +
+ {empty name='list'} +
没 有 记 录 哦!
+ {else} + + + + + + + + + + + + + {foreach $list as $key=>$vo} + + + + + + + + + + {/foreach} + +
+ + + +
+ + + + {$vo.spl|raw}{$vo.title}{$vo.url}{eq name='vo.status' value='0'}已禁用{else}使用中{/eq} + + {if auth("add")} + | + + 添 加 + + 添 加 + + {/if} + + {if auth("edit")} + 编 辑 + {/if} + + {if $vo.status eq 1 and auth("forbid")} + 禁 用 + {elseif auth("resume")} + 启 用 + {/if} + + {if auth("remove")} + 删 除 + {/if} + +
+ {/empty} +
+{/block} diff --git a/application/akszadmin/view/msg/form.html b/application/akszadmin/view/msg/form.html new file mode 100755 index 0000000..37bf128 --- /dev/null +++ b/application/akszadmin/view/msg/form.html @@ -0,0 +1,72 @@ +{extend name='akszadmin@main'} + +{block name="content"} + +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ 站内信内容 + +
+ +
+ {notempty name='vo.id'}{/notempty} + + +
+ +
+
+{/block} + +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/msg/index.html b/application/akszadmin/view/msg/index.html new file mode 100755 index 0000000..1101a44 --- /dev/null +++ b/application/akszadmin/view/msg/index.html @@ -0,0 +1,75 @@ +{extend name='akszadmin@main'} + +{block name="button"} +{if auth("akszadmin/article/add")} + +{/if} +{if auth("akszadmin/article/remove")} + +{/if} +{/block} + +{block name="content"} +
+ {include file='msg/index_search'} + + {notempty name='list'} + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + {/foreach} + +
+ + + + 信息标题接收账号发布时间
+ + + + + {$vo.title|default='--'} + + {$vo.phone|default='--'} + + {$vo.add_time|default='--'} + + +
+ {if auth("akszadmin/msg/edit")} + 编 辑 + {else} + 编 辑 + {/if} + {if auth("akszadmin/msg/remove")} + 删 除 + {else} + 删 除 + {/if} + +
+ +
+ + {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} + +
+{/block} diff --git a/application/akszadmin/view/msg/index_search.html b/application/akszadmin/view/msg/index_search.html new file mode 100755 index 0000000..68cb9c7 --- /dev/null +++ b/application/akszadmin/view/msg/index_search.html @@ -0,0 +1,21 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/oplog/index.html b/application/akszadmin/view/oplog/index.html new file mode 100755 index 0000000..dfe3e41 --- /dev/null +++ b/application/akszadmin/view/oplog/index.html @@ -0,0 +1,68 @@ +{extend name='main'} + +{block name="button"} + +{if auth("clear")} + +{/if} + +{if auth("remove")} + +{/if} + +{/block} + +{block name="content"} +
+ {include file='oplog/index_search'} + + {notempty name='list'} + + + + + + + + + + + + {foreach $list as $key=>$vo} + + + + + + + + + {/foreach} + + {/notempty} +
+ + 操作权限操作行为地理位置操作时间
+ + + {$vo.username|default='-'}
+ {$vo.node|default='-'} +
+

{$vo.action|default='-'}

+

{$vo.content|default='-'}

+
+

{$vo.geoip|default='-'}

+

{$vo.isp|default='-'}

+
+ 日期:{$vo.create_at|format_datetime|str_replace=' ','
时间:',###|raw} +
+ {if auth("remove")} + 删 除 + {/if} +
+ + {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} + +
+ +{/block} diff --git a/application/akszadmin/view/oplog/index_search.html b/application/akszadmin/view/oplog/index_search.html new file mode 100755 index 0000000..54341bb --- /dev/null +++ b/application/akszadmin/view/oplog/index_search.html @@ -0,0 +1,56 @@ +
+ + 条件搜索 + + + +
+ + \ No newline at end of file diff --git a/application/akszadmin/view/order/edits.html b/application/akszadmin/view/order/edits.html new file mode 100755 index 0000000..f14cd4b --- /dev/null +++ b/application/akszadmin/view/order/edits.html @@ -0,0 +1,95 @@ +
+ +
+ + +
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+{block name='script'} + +{/block} + + diff --git a/application/akszadmin/view/order/form.html b/application/akszadmin/view/order/form.html new file mode 100755 index 0000000..ea35640 --- /dev/null +++ b/application/akszadmin/view/order/form.html @@ -0,0 +1,71 @@ +{extend name='akszadmin@main'} + +{block name="content"} + +
+
+ +
+

{$vo.uid|default=''}

+
+
+ +
+ +
+

{$vo.orderno|default=''}

+
+
+
+ +
+

{$vo.ptitle|default=''}

+
+
+
+ +
+

{if $vo.ostaus == 1}平仓{else/}建仓{/if}

+
+
+
+ +
+

{$vo.buyprice}

+
+
+
+ +
+

{$vo.sellprice}

+
+
+
+ +
+

{$vo.fee}

+
+
+
+ +
+

{:date('Y-m-d H:i:s',$vo.buytime)}

+
+
+
+ +
+

{:date('Y-m-d H:i:s',$vo.selltime)}

+
+
+
+ +
+

{$vo.ploss}

+
+
+
+ +{/block} + + diff --git a/application/akszadmin/view/order/index.html b/application/akszadmin/view/order/index.html new file mode 100755 index 0000000..11d88a9 --- /dev/null +++ b/application/akszadmin/view/order/index.html @@ -0,0 +1,170 @@ +{extend name='akszadmin@main'} +{block name="content"} + +
+ {include file='order/index_search'} + + {notempty name='list'} + + + + + + + + + + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + {if $vo.ostyle == 0} + + {elseif $vo.ostyle == 1/} + + {/if} + + + + + {if $vo.ploss == 0} + + {else /} + + {/if} + + {if $vo.ploss != 0} + + {else /} + + {/if} + + + + + + + {/foreach} + +
订单编号会员ID用户名订单时间产品信息状态方向时间/点数建仓点位平仓点位委托余额无效委托余额有效委托余额实际盈亏买后余额单控操作详情
+ {$vo.id|default='--'} + + {$vo.uid|default='--'} + + {$vo.phone|default='--'} + + {:date('Y-m-d H:i:s',$vo.buytime)} + + {$vo.ptitle|default='--'} + + {if $vo.ostaus==1}平仓{else/}建仓{/if} + 买涨买跌 + {$vo.endprofit|default='--'}{if $vo.eid==1}点{else/}秒{/if} + + {$vo.buyprice|default='--'} + + + + ¥{$vo.fee} + + ¥{$vo.fee} + + ¥0 + + ¥{$vo.fee} + + ¥0 + 0} class="color_red text-center nowrap" {else /} class="color_green text-center nowrap" {/if}> + ¥{$vo.ploss} + + ¥{$vo.commission} + + {if $vo.ostaus!=1} + + {else/}已平仓{/if} + + 查 看 + {if $vo.ostaus==1} + 删 除 + {/if} +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+ +{/block} +{block name='script'} + +{/block} + + diff --git a/application/akszadmin/view/order/index_search.html b/application/akszadmin/view/order/index_search.html new file mode 100755 index 0000000..6b66aec --- /dev/null +++ b/application/akszadmin/view/order/index_search.html @@ -0,0 +1,29 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/order_log/index.html b/application/akszadmin/view/order_log/index.html new file mode 100755 index 0000000..4262b04 --- /dev/null +++ b/application/akszadmin/view/order_log/index.html @@ -0,0 +1,53 @@ +{extend name='akszadmin@main'} +{block name="content"} +
+ {include file='order_log/index_search'} + + {notempty name='list'} + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + {/foreach} + +
编号会员ID用户名订单ID增加金额增加积分平仓后余额时间
+ {$vo.id|default='--'} + + {$vo.uid|default='--'} + + {$vo.phone|default='--'} + + {$vo.oid|default='--'} + + {$vo.addprice|default='--'} + + {$vo.addpoint|default='--'} + + {$vo.user_money|default='--'} + + {:date('Y-m-d H:i:s',$vo.time)} +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/order_log/index_search.html b/application/akszadmin/view/order_log/index_search.html new file mode 100755 index 0000000..6ce0881 --- /dev/null +++ b/application/akszadmin/view/order_log/index_search.html @@ -0,0 +1,21 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/prize/form.html b/application/akszadmin/view/prize/form.html new file mode 100755 index 0000000..9e94b6d --- /dev/null +++ b/application/akszadmin/view/prize/form.html @@ -0,0 +1,270 @@ +{extend name='akszadmin@main'} + +{block name="content"} + +
+
+
    +
  • 抽奖配置
  • +
  • 一等奖
  • +
  • 二等奖
  • +
  • 三等奖
  • +
  • 四等奖
  • +
  • 五等奖
  • +
  • 六等奖
  • +
+
+
+
+
+ +
+
+ 活动规则 + +
+
+
+
+
+
+ + + +
+
+ + +
+
+
+ +
+
+
+ + + +
+
+ + +
+
+
+ +
+
+
+ + + +
+
+ + +
+
+
+ +
+
+
+ + + +
+
+ + +
+
+
+ +
+
+
+ + + +
+
+ + +
+
+
+ +
+
+
+ + + +
+
+ + +
+
+
+ +
+ +
+ {notempty name='vo.id'}{/notempty} + +
+
+
+{/block} + +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/prize_list/form.html b/application/akszadmin/view/prize_list/form.html new file mode 100755 index 0000000..05004aa --- /dev/null +++ b/application/akszadmin/view/prize_list/form.html @@ -0,0 +1,50 @@ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+{block name='script'} + +{/block} diff --git a/application/akszadmin/view/prize_list/index.html b/application/akszadmin/view/prize_list/index.html new file mode 100755 index 0000000..79b0c04 --- /dev/null +++ b/application/akszadmin/view/prize_list/index.html @@ -0,0 +1,72 @@ +{extend name='akszadmin@main'} +{block name="button"} +{if auth("add")} + +{/if} +{if auth("remove")} + +{/if} +{/block} +{block name="content"} +
+ {include file='prize_list/index_search'} + + {notempty name='list'} + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + {/foreach} + +
+ + 编号会员ID用户名奖品类型奖品名称抽奖日期操作
+ + + {$vo.id|default='--'} + + {$vo.uid|default='--'} + + {$vo.phone|default='--'} + + {if $vo.type == 1} + 现金 + {/if} + {if $vo.type == 2} + 实物 + {/if} + + {$vo.name|default='--'} + + {$vo.time|default='--'} + + {if auth("akszadmin/shop_order/remove")} + 删 除 + {else} + 删 除 + {/if} +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/prize_list/index_search.html b/application/akszadmin/view/prize_list/index_search.html new file mode 100755 index 0000000..31b8694 --- /dev/null +++ b/application/akszadmin/view/prize_list/index_search.html @@ -0,0 +1,35 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/queue/index.html b/application/akszadmin/view/queue/index.html new file mode 100755 index 0000000..ec95f24 --- /dev/null +++ b/application/akszadmin/view/queue/index.html @@ -0,0 +1,94 @@ +{extend name='main'} + +{block name="button"} + +{if auth("start") && $iswin} + +{/if} + +{if auth("stop") && $iswin} + +{/if} + +{if auth("remove")} + +{/if} + +{if auth("clear")} + +{/if} + +{/block} + +{block name="content"} + +
+ {include file='queue/index_search'} + + {notempty name='list'} + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + {/foreach} + +
+ + 任务信息任务时间任务状态
+ + + 任务名称:{$vo.title}
+ 任务指令:{$vo.preload} +
+ 计划时间:{$vo.time|format_datetime} {if isset($vo.exec_pid) and $vo.exec_pid>0}( 进程 {$vo.exec_pid|default='-'} ){/if}
+ {if $vo.status eq 3 or $vo.status eq 4} + 执行时间:{$vo.start_at|format_datetime}( 耗时 {:sprintf("%.4f",strtotime($vo.end_at)-strtotime($vo.start_at))} 秒 ) + {elseif $vo.status eq 2} 开始时间:{$vo.start_at|format_datetime} + {else} 创建时间:{$vo.create_at|format_datetime} {/if} +
+
+ {eq name='vo.double' value='1'} + + {else} + + {/eq} + + {eq name='vo.status' value='1'} + 待处理 + {elseif $vo.status eq 2} + 处理中 + {elseif $vo.status eq 3} + 处理完成 + {elseif $vo.status eq 4} + 处理失败 + + + + {/eq} + + {if auth("akszadmin/queue/remove") and in_array($vo.status,[1,3,4])} + + + + {/if} +
+
{$vo.desc|raw|default="没有获取到状态描述"}
+
+ + {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} + +
+{/block} diff --git a/application/akszadmin/view/queue/index_search.html b/application/akszadmin/view/queue/index_search.html new file mode 100755 index 0000000..114cca6 --- /dev/null +++ b/application/akszadmin/view/queue/index_search.html @@ -0,0 +1,70 @@ +{if session('user.username') eq 'admin'} +
+ 守护状态 +
+

守护进程运行状态

+ {if $listen} + {$message|raw|default='--'} + {else} + {$message|raw|default='--'} + {/if} +

配置定时任务来检查并启动进程(建议每分钟执行)

+

{$command|default='--'}

+
+
+{/if} + +
+ 条件搜索 + +
+ + diff --git a/application/akszadmin/view/recharge/edit.html b/application/akszadmin/view/recharge/edit.html new file mode 100755 index 0000000..c72f6c6 --- /dev/null +++ b/application/akszadmin/view/recharge/edit.html @@ -0,0 +1,58 @@ +{extend name='akszadmin@main'} +{block name="content"} +
+
+ +
+ +
+
+ +
+
+ +
+ + +
+ 拒绝理由 + + +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+
+{/block} +{block name='script'} + +{/block} \ No newline at end of file diff --git a/application/akszadmin/view/recharge/form.html b/application/akszadmin/view/recharge/form.html new file mode 100755 index 0000000..95718a4 --- /dev/null +++ b/application/akszadmin/view/recharge/form.html @@ -0,0 +1,50 @@ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+{block name='script'} + +{/block} diff --git a/application/akszadmin/view/recharge/index.html b/application/akszadmin/view/recharge/index.html new file mode 100755 index 0000000..d3ca107 --- /dev/null +++ b/application/akszadmin/view/recharge/index.html @@ -0,0 +1,83 @@ +{extend name='akszadmin@main'} +{block name="button"} +{if auth("change")} + +{/if} +{if auth("remove")} + +{/if} +{/block} +{block name="content"} +
+ {include file='recharge/index_search'} + + {notempty name='list'} + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + + {/foreach} + +
+ + 账户充值金额(元)支付方式提交时间状态拒绝理由操作
+ + + {$vo.phone} + + {$vo.money} + + {$vo.type} + + {$vo.time} + + {if $vo.status == 0} + 待审核 + {/if} + {if $vo.status == 1} + 已完成 + {/if} + {if $vo.status == 2} + 已拒绝 + {/if} + + {$vo.reaolae} + + {if $vo.status eq 0} + {if auth("agree")} + 同 意 + {/if} + {if auth("refuse")} + + 拒 绝 + + {/if} + {else} + 删 除 + {/if} +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/recharge/index_search.html b/application/akszadmin/view/recharge/index_search.html new file mode 100755 index 0000000..e6fe0f9 --- /dev/null +++ b/application/akszadmin/view/recharge/index_search.html @@ -0,0 +1,71 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/shop/form.html b/application/akszadmin/view/shop/form.html new file mode 100755 index 0000000..70589ab --- /dev/null +++ b/application/akszadmin/view/shop/form.html @@ -0,0 +1,91 @@ +{extend name='akszadmin@main'} + +{block name="content"} + +
+ +
+ +
+ + +
+ +
+ + + +
+ +
+ 商品大图 + + + + + + + + + +
商品封面
+ +
+ +
+ 商品详情 + +
+ +
+ {notempty name='vo.id'}{/notempty} + + +
+ +
+
+{/block} + +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/shop/index.html b/application/akszadmin/view/shop/index.html new file mode 100755 index 0000000..9654e52 --- /dev/null +++ b/application/akszadmin/view/shop/index.html @@ -0,0 +1,90 @@ +{extend name='akszadmin@main'} + +{block name="button"} +{if auth("akszadmin/shop/add")} + +{/if} +{if auth("akszadmin/shop/remove")} + +{/if} +{/block} + +{block name="content"} +
+ {include file='shop/index_search'} + + {notempty name='list'} + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + {/foreach} + +
+ + + + 商品图商品标题商品类型商品库存所需积分
+ + + + + {notempty name='vo.img'} + + {/notempty} + + {$vo.title|default='--'} + + {if $vo.type == 1} + 现金 + {/if} + {if $vo.type == 2} + 实物 + {/if} + + {$vo.num|default='--'} + + {$vo.integral|default='--'} + + +
+ {if auth("akszadmin/shop/edit")} + 编 辑 + {else} + 编 辑 + {/if} + {if auth("akszadmin/shop/remove")} + 删 除 + {else} + 删 除 + {/if} + +
+ +
+ + {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} + +
+{/block} diff --git a/application/akszadmin/view/shop/index_search.html b/application/akszadmin/view/shop/index_search.html new file mode 100755 index 0000000..3682735 --- /dev/null +++ b/application/akszadmin/view/shop/index_search.html @@ -0,0 +1,15 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/shop_order/index.html b/application/akszadmin/view/shop_order/index.html new file mode 100755 index 0000000..6a90d20 --- /dev/null +++ b/application/akszadmin/view/shop_order/index.html @@ -0,0 +1,69 @@ +{extend name='akszadmin@main'} +{block name="button"} +{if auth("akszadmin/shop_order/remove")} + +{/if} +{/block} +{block name="content"} +
+ {include file='shop_order/index_search'} + + {notempty name='list'} + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + {/foreach} + +
+ + 编号会员ID用户名商品类型商品名称兑换日期操作
+ + + {$vo.id|default='--'} + + {$vo.uid|default='--'} + + {$vo.phone|default='--'} + + {if $vo.type == 1} + 现金 + {/if} + {if $vo.type == 2} + 实物 + {/if} + + {$vo.goods|default='--'} + + {$vo.time|default='--'} + + {if auth("akszadmin/shop_order/remove")} + 删 除 + {else} + 删 除 + {/if} +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/shop_order/index_search.html b/application/akszadmin/view/shop_order/index_search.html new file mode 100755 index 0000000..3f947ab --- /dev/null +++ b/application/akszadmin/view/shop_order/index_search.html @@ -0,0 +1,35 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/slide/form.html b/application/akszadmin/view/slide/form.html new file mode 100755 index 0000000..2f96600 --- /dev/null +++ b/application/akszadmin/view/slide/form.html @@ -0,0 +1,52 @@ +
+
+
+ + +
+ +
+ 图片 + + + + + + + + + +
750x300像素
+ +
+ +
+ +
+ +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+{block name='script'} + +{/block} diff --git a/application/akszadmin/view/slide/index.html b/application/akszadmin/view/slide/index.html new file mode 100755 index 0000000..47907d8 --- /dev/null +++ b/application/akszadmin/view/slide/index.html @@ -0,0 +1,85 @@ +{extend name='akszadmin@main'} + +{block name="button"} +{if auth("akszadmin/slide/add")} + +{/if} +{if auth("akszadmin/slide/remove")} + +{/if} +{/block} + +{block name="content"} +
+ + {notempty name='list'} + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + {/foreach} + +
+ + + + 图片图片路径链接地址状态
+ + + + + {notempty name='vo.path'} + + {/notempty} + + {$vo.path|default='--'} + + {$vo.url|default='--'} + + {if $vo.show == 0} + 隐藏 + {/if} + {if $vo.show == 1} + 显示 + {/if} + + +
+ {if auth("akszadmin/slide/edit")} + 编 辑 + {else} + 编 辑 + {/if} + {if auth("akszadmin/slide/remove")} + 删 除 + {else} + 删 除 + {/if} + +
+ +
+ + {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} + +
+{/block} diff --git a/application/akszadmin/view/sms/class_search.html b/application/akszadmin/view/sms/class_search.html new file mode 100755 index 0000000..8f6732d --- /dev/null +++ b/application/akszadmin/view/sms/class_search.html @@ -0,0 +1,15 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/sms/form.html b/application/akszadmin/view/sms/form.html new file mode 100755 index 0000000..d6ffa65 --- /dev/null +++ b/application/akszadmin/view/sms/form.html @@ -0,0 +1,32 @@ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ {notempty name='vo.id'}{/notempty} + + +
+
+{block name='script'} + +{/block} diff --git a/application/akszadmin/view/sms/index.html b/application/akszadmin/view/sms/index.html new file mode 100755 index 0000000..70bc9ab --- /dev/null +++ b/application/akszadmin/view/sms/index.html @@ -0,0 +1,53 @@ +{extend name='akszadmin@main'} + +{block name="content"} +
+ {include file='sms/class_search'} + + {notempty name='list'} + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + {/foreach} + +
短信名称短信内容状态备注操作
+ {$vo.type|default=''} + {$vo.msg} + {if $vo.status == 0} + 已关闭 + {/if} + {if $vo.status == 1} + 已开启 + {/if} + {$vo.code} + + {if $vo.status eq 1 and auth("forbid")} + 关 闭 + {elseif auth("resume")} + 启 用 + {/if} + + {if auth("edit")} + 编 辑 + {/if} + +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/user/form.html b/application/akszadmin/view/user/form.html new file mode 100755 index 0000000..0751aff --- /dev/null +++ b/application/akszadmin/view/user/form.html @@ -0,0 +1,73 @@ +
+
+
+ +

登录用户账号创建后,不允许再次修改。

+
+
+ +

可选,用户联系手机号码,需要填写正确的格式

+
+
+ +

可选,用户联系电子邮箱,需要填写正确的格式

+
+ + {notempty name='authorizes'} +
+ 角色访问授权 + Authorization +
+ {if isset($vo.username) and $vo.username eq 'admin'} + 超级用户不需要配置权限 + {elseif empty($authorizes)} + 未配置权限 + {else} + {foreach $authorizes as $authorize} + + {/foreach} + {/if} +
+
+ {/notempty} + +
+ +
+
+ +
+ {notempty name='vo.id'}{/notempty} + +
+ + +
+ +
diff --git a/application/akszadmin/view/user/index.html b/application/akszadmin/view/user/index.html new file mode 100755 index 0000000..3550623 --- /dev/null +++ b/application/akszadmin/view/user/index.html @@ -0,0 +1,77 @@ +{extend name='main'} + +{block name="button"} + +{if auth("add")} + +{/if} + +{if auth("remove")} + +{/if} + +{/block} + +{block name="content"} +
+ {include file='user/index_search'} + + {notempty name='list'} + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + {/foreach} + +
+ + 用户账号联系手机登录次数使用状态创建时间登录时间
+ + {$vo.username|default=''}{$vo.phone|default='-'}{$vo.login_num|default=0}{eq name='vo.status' value='0'}已禁用{else}使用中{/eq}{$vo.create_at|format_datetime}{if $vo.login_num>0}{$vo.login_at|format_datetime}{else} - {/if} + + {if auth("pass")} + 密 码 + {/if} + + {if auth("edit")} + 编 辑 + {/if} + + {if $vo.status eq 1 and auth("forbid")} + 禁 用 + {elseif $vo.status eq 0 and auth("resume")} + 启 用 + {/if} + + {if auth("remove")} + 删 除 + {/if} + +
+ + {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} + +
+ +{/block} diff --git a/application/akszadmin/view/user/index_search.html b/application/akszadmin/view/user/index_search.html new file mode 100755 index 0000000..b2d26a1 --- /dev/null +++ b/application/akszadmin/view/user/index_search.html @@ -0,0 +1,57 @@ +
+ + 条件搜索 + + + +
+ + diff --git a/application/akszadmin/view/user/pass.html b/application/akszadmin/view/user/pass.html new file mode 100755 index 0000000..bc60936 --- /dev/null +++ b/application/akszadmin/view/user/pass.html @@ -0,0 +1,57 @@ +
+ +
+ + + + + + + + + + + + + + + +
+ +

请输入旧密码来验证修改权限,旧密码不限制格式。

+
+ + +
+ +

密码必需包含大小写字母、数字、符号的任意两者组合。

+
+ +
+ +

密码必需包含大小写字母、数字、符号的任意两者组合。

+
+ +
+ +
+ {notempty name='vo.id'}{/notempty} + +
+ + +
+ +
diff --git a/application/akszadmin/view/user/suffix.html b/application/akszadmin/view/user/suffix.html new file mode 100755 index 0000000..113283d --- /dev/null +++ b/application/akszadmin/view/user/suffix.html @@ -0,0 +1,17 @@ +
+
+
+ +

请输入后台加密后缀!

+
+
+
+
+ + +
+
\ No newline at end of file diff --git a/application/akszadmin/view/users/form.html b/application/akszadmin/view/users/form.html new file mode 100755 index 0000000..f6702ba --- /dev/null +++ b/application/akszadmin/view/users/form.html @@ -0,0 +1,74 @@ +
+
+
+ + + +
+
+ + + + + +
+ + + + {if !empty($bankinfo)} +
+ +
+ + +
+
+ +{/if} +
+ +
+ {notempty name='vo.id'}{/notempty} + +
+ + +
+
+ +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/users/index.html b/application/akszadmin/view/users/index.html new file mode 100755 index 0000000..8f513f0 --- /dev/null +++ b/application/akszadmin/view/users/index.html @@ -0,0 +1,123 @@ +{extend name='main'} + +{block name="button"} + +{if auth("add")} + +{/if} + +{if auth("forbid")} + +{/if} + +{if auth("remove")} + +{/if} + +{/block} + +{block name="content"} +
+ {include file='users/index_search'} + + {notempty name='list'} + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + {/foreach} + +
+ + 用户信息用户资料用户资金(点击金额查看)用户详情时间
+ + + ID:{$vo.id|default='--'}
+ 姓名:{$vo.phones|default='--'}
+ 用户名:{$vo.phone|default='--'}
+ 状态: + {eq name='vo.online' value='false'} + 离线 + {else} + 在线 + {/eq} +
+ 实名: + {eq name='vo.rz_status' value='0'} + {$vo.robot==1?'假人':'未实名'} + {elseif $vo.rz_status == 1} + {$vo.robot==1?'假人':'待审核'} + {elseif $vo.rz_status == 2} + {$vo.robot==1?'假人':'已实名'} + {elseif $vo.rz_status == 3} + {$vo.robot==1?'假人':'已驳回'} + {/eq}
+ +
+ 会员等级:{$vo.m_name|default='--'}
+ 推荐人:{$vo.top|default='--'}
+ IP:{$vo.ip|default='--'}
+ ISP:{$vo.isp|default='--'}
+ 注册来源:{$vo.zcly|default='--'}
+
+ 账户余额:{$vo.money|default='--'} 元
+ 提现总额:{$vo.cash_sum|default='--'} 元
+ 充值总额:{$vo.recharge_sum|default='--'} 元
+ 投资总额:{$vo.invest_sum|default='--'} 元
+
+ 待收利息:{$vo.wait_invest|default='--'} 元
+ 待收本金:{$vo.wait_money|default='--'} 元
+ 成长值:{$vo.value|default='--'}
+
+ 用户状态: + {eq name='vo.clock' value='0'} + 已冻结 + {else} + 正常 + {/eq}
+ 注册时间:{$vo.time}
+ 最近操作:{$vo.logintime|format_datetime}
+ 登陆IP:{$vo.loginip|default='--'}
+ ISP:{$vo.isp2|default='--'}
+
+ {if $vo.isjy == 1} + 交易关闭 + {else /} + 交易开启 + {/if} + {if auth("review")} + 实名认证审核 + {/if} + {if auth("edit")} + 编 辑 + {/if} + {if $vo.clock eq 1 and auth("forbid")} + 冻 结 + {elseif $vo.clock eq 0 and auth("resume")} + 解 冻 + {/if} +
{$vo.robot==1?"设置成真人":"设置成假人"} +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+ +{/block} diff --git a/application/akszadmin/view/users/index_search.html b/application/akszadmin/view/users/index_search.html new file mode 100755 index 0000000..d0bd797 --- /dev/null +++ b/application/akszadmin/view/users/index_search.html @@ -0,0 +1,88 @@ +
+ + 条件搜索 + + + +
+ + diff --git a/application/akszadmin/view/users/relation_search.html b/application/akszadmin/view/users/relation_search.html new file mode 100755 index 0000000..179aef7 --- /dev/null +++ b/application/akszadmin/view/users/relation_search.html @@ -0,0 +1,29 @@ +
+ 条件搜索 + + +
diff --git a/application/akszadmin/view/users/review.html b/application/akszadmin/view/users/review.html new file mode 100755 index 0000000..17a1175 --- /dev/null +++ b/application/akszadmin/view/users/review.html @@ -0,0 +1,55 @@ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ +
+ {notempty name='$id'}{/notempty} + +
+ + +
+
+ +{block name='script'} + +{/block} diff --git a/application/akszadmin/view/users/user_relation.html b/application/akszadmin/view/users/user_relation.html new file mode 100755 index 0000000..6e4b94e --- /dev/null +++ b/application/akszadmin/view/users/user_relation.html @@ -0,0 +1,54 @@ +{extend name='akszadmin@main'} +{block name="content"} +
+ {include file='users/relation_search'} + + {notempty name='list'} + + + + + + + + + + + + + {foreach $list as $key=>$vo} + + + + + + + + + + {/foreach} + {/notempty} + +
会员ID用户名姓名余额是否认证推荐人用户名编号
+ {$vo.id|default='--'} + + {$vo.phone|default='--'} + + {$vo.name|default='--'} + + {$vo.money|default='--'} + + {if $vo.auth == 1} + 已认证 + {/if} + {if $vo.auth == 0} + 未认证 + {/if} + + {$vo.top_phone|default='--'} + + 查看详情 +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+{/block} diff --git a/application/akszadmin/view/yuebao/index.html b/application/akszadmin/view/yuebao/index.html new file mode 100755 index 0000000..b241145 --- /dev/null +++ b/application/akszadmin/view/yuebao/index.html @@ -0,0 +1,217 @@ +{extend name='main'} + +{block name="button"} + + +{/block} + +{block name="content"} + +
+ 余额宝理财 +
+ + +
+
+
+ + + {notempty name='list'} + + + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + + + {/foreach} + +
+ + 序号余额宝名称收益率(%)锁定天数最低金额(天)推荐添加时间状态
+ + + {$vo.id} + + {$vo.title} + + {$vo.lily} + + {$vo.days} + + {$vo.lowmoney} + + + {$vo.stars==0?"未推荐":""} + {$vo.stars==1?"已推荐":""} + + {$vo.addtime} + + {$vo.status==0?"已下架":""} + {$vo.status==1?"已上线":""} + + / / +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+ + + + + +{/block} diff --git a/application/akszadmin/view/yuebao/lists.html b/application/akszadmin/view/yuebao/lists.html new file mode 100755 index 0000000..2a81f88 --- /dev/null +++ b/application/akszadmin/view/yuebao/lists.html @@ -0,0 +1,157 @@ +{extend name='main'} + +{block name="button"} + + + + +{/block} + +{block name="content"} +
+ 余额宝--用户购买记录 +
+ + +
+
+
+
+ 进行中(记录数)
{$countdoing} +
+
+ 资金池总额(元)
{$counttotalmoney} +
+
+ 待分红金额(元)
{$countnosend} +
+
+ 已分红金额(元)
{$countsended} +
+
+ 总参加人次
{$counttotal} +
+
+
+ + + {notempty name='list'} + + + + + + + + + + + + + + + + + + {/notempty} + + {foreach $list as $key=>$vo} + + + + + + + + + + + + + + + + {/foreach} + +
+ + 序号用户账号余额宝名称收益率(%)锁定天数金额(元)当前收益(元)预期收益(元)开始时间结束时间状态
+ + + {$vo.id} + + {$vo.username} + + {$vo.yebtitle} + + {$vo.lily} + + {$vo.days} + + {$vo.money} + + {$vo.nowprofit} + + {$vo.finishprofit} + + {$vo.start_time} + + {$vo.end_time} + + {$vo.status==0?"未生效":""} + {$vo.status==1?"进行中":""} + {$vo.status==2?"已结束":""} + {$vo.status==9?"已删除":""} + + +
+ {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} +
+ +{/block} diff --git a/application/common.php b/application/common.php new file mode 100644 index 0000000..bb86423 --- /dev/null +++ b/application/common.php @@ -0,0 +1,26 @@ +where('id', $uid)->limit(1)->update(['access_time' => time()]); + } + } catch (\Exception $e) { + die('error'); + } + } +} \ No newline at end of file diff --git a/application/index/controller/Index.php b/application/index/controller/Index.php new file mode 100755 index 0000000..0f9ea1e --- /dev/null +++ b/application/index/controller/Index.php @@ -0,0 +1,1894 @@ +redirect('/h5'); + $uid = $this->app->session->get('uid'); + if (!$uid) { + if (true) { // true:开启线路;false:关闭线路 + return $this->fetch(); + } + // $this->redirect('/index/login'); + } + $this->redirect('/index/index/home'); + } + + + /** + * @description:未登录新闻页 + * @date: 2020/5/14 0014 + */ + public function news() + { + $this->fetch('new_index'); + } + + /** + * Describe: 新闻页面 + * DateTime: 2020/5/14 1:16 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function my_news() + { + $this->login = 0; + if (!isLogin()) $this->login = 1; + $this->conf = Db::name('LcReward')->get(1); + $this->fetch('my_news'); + } + + /** + * Describe: 信息详情 + * DateTime: 2020/5/14 0:31 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function msg_view() + { + $id = $this->request->param('id'); + $uid = $this->app->session->get('uid'); + if (!$id || !$uid) + msg('系统忙碌!', 2, '/index/user/index'); + $where['uid'] = $this->app->session->get('uid'); + $where['mid'] = $id; + $ret = Db::name('LcMsgIs')->where($where)->find(); + if (!$ret) + Db::name('LcMsgIs')->insertGetId(['uid' => $uid, 'mid' => $id]); + $this->msg = Db::name('LcMsg')->find($id); + $this->fetch(); + } + + /** + * Describe: 新闻奖励 + * DateTime: 2020/5/14 1:27 + * @throws \think\Exception + * @throws \think\Exception\DbException + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\PDOException + */ + public function news_reward() + { + if (isLogin()) { + $uid = $this->app->session->get('uid'); + $reward = Db::name('LcReward')->get(1); + $start_time = strtotime(date("Y-m-d", time())); + $end_time = $start_time + 60 * 60 * 24; + $reward['newsmoney'] = round($this->randFloat($reward['newsmoney'], $reward['newsmoneytwo']), 2); + $todaynum = Db::name('LcSeeLog')->where('uid=\'' . $uid . '\' and dateline > \'' . $start_time . '\' and dateline < \'' . $end_time . '\'')->count(); + if ($todaynum < $reward['getnum']) { + addFinance($uid, $reward['newsmoney'], 1, '浏览新闻,系统赠送' . $reward['newsmoney'] . '元'); + setNumber('LcUser', 'money', $reward['newsmoney'], 1, "id = $uid"); + setNumber('LcUser', 'income', $reward['newsmoney'], 1, "id = $uid"); + $add = array('uid' => $uid, 'dateline' => time(), 'money' => $reward['newsmoney']); + Db::name('LcSeeLog')->insert($add); + $morenum = $reward['getnum'] - $todaynum - 1; + $this->success('奖励领取成功', ['more' => $morenum, 'times' => $reward['seetime'] * 60]); + } else { + $this->error('今日领取次数用尽'); + } + } + } + + private function randFloat($min = 0, $max = 1) + { + return $min + mt_rand() / mt_getrandmax() * ($max - $min); + } + + /** + * @description:首页 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function home() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $this->ater = Db::name('LcArticle')->where(['type' => 17, 'show' => 1])->find(); + + $this->banner = Db::name('LcSlide')->where(['show' => 1])->order("sort asc,id desc")->select(); + $allproducts = Db::name('LcProduct')->where(['isdelete' => 0, 'iskq' => 1])->order("sort asc,id desc")->select(); + //判断是否开市 + $weekday = date("w"); + $newallproducts = array(); + if ($weekday == 0) $weekday = 7; + foreach ($allproducts as $x => $p) { + if (strpos($p['code'], "btc") !== false || strpos($p['code'], "usdt") !== false) { + $p['isclosetime'] = 0; + $ttimes = $p['opentime_' . $weekday]; + if (empty($ttimes)) { + $p['isclosetime'] = 1; + + continue; + }; + //var_dump($this->info['opentime_'.$weekday],$weekday);die; + if (!empty($ttimes)) { + $optime = 0; + $ttimesarr = explode("|", $ttimes); + foreach ($ttimesarr as $t) { + $t = explode('~', $t); + if (time() > strtotime(date('Y-m-d ' . $t[0])) and time() < strtotime(date('Y-m-d ' . $t[1]))) $optime = $optime + 1; + } + if ($optime == 0) $p['isclosetime'] = 1; + } + $newallproducts[$x] = $p; + } + } + + //var_dump($newallproducts); + $this->product = $newallproducts; + $this->fetch(); + } + + /** + * 全局平仓 + * @return void [type] [description] + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function order() + { + $nowtime = time(); + //订单列表 + $map[] = ['ostaus', '=', 0]; + $map[] = ['status', '=', 0]; + $map[] = ['selltime', '<', $nowtime]; + $orderlist = Db::name('LcOrder')->where($map)->limit(0, 50)->select(); + if (!$orderlist) { + exit(dump('没有订单需要处理!')); + die; + } + Db::name('LcOrder')->where($map)->update(['status' => 1]); + //风控参数 + $risk = Db::name('LcRisk')->find(); + $to_win = explode('|', $risk['to_win']); + $to_loss = explode('|', $risk['to_loss']); + $chance = $risk["chance"]; + $wenyin = explode('-', $risk['wenyin']); //稳赢时间 + $wenshu = explode('-', $risk['wenshu']);//稳输时间 + + $is_to_loss = array(); + $is_to_win = array(); + //买涨金额,计算过盈亏比例以后的 + $up_price = 0; + //买跌金额,计算过盈亏比例以后的 + $min_buyprice = 0; + //买入最低价 + $down_price = 0; + //买入最高价 + $max_buyprice = 0; + //下单最大金额 + $max_fee = 0; + + + //此刻产品价格 + $pro = Db::name('LcProduct')->field('id as pid,Price,downps,upps')->where(array('isdelete' => 0))->select(); + $upps = array(); + $downps = array(); + + $data_info = Db::name('LcProduct'); + $prodata = array(); + foreach ($pro as $k => $v) { + $prodata[$v['pid']] = $v['Price']; + $upps[$v['pid']] = $v['upps']; + $downps[$v['pid']] = $v['downps']; + } + + + //循环处理订单 + $nowtime = time(); + $kt = count($orderlist); + $h = date("H:i"); + //var_dump($orderlist);die; + foreach ($orderlist as $k => $v) { + $uid = $v['uid']; + $pid = $v['pid']; + $sellprice = isset($prodata[$v['pid']]) ? $prodata[$v['pid']] : 0; + $sellprice = $v['sellprice'] == 0 ? $sellprice : $v['sellprice']; + + //单控 赢利 + if ($v['kong_type'] == '1' || $v['kong_type'] == '3') { + $dankong_ying = $v; + } + //单控 亏损 + if ($v['kong_type'] == '2' | $v['kong_type'] == '4') { + $dankong_kui = $v; + } + //是否存在指定盈利 + if (in_array($v['uid'], $to_win)) { + $is_to_win = $v; + } + //是否存在指定亏损 + if (in_array($v['uid'], $to_loss)) { + $is_to_loss = $v; + } + //买涨买跌累加 + if ($v['ostyle'] == 0) { + $up_price += $v['fee'] * $v['endloss'] / 100; + } else { + $down_price += $v['fee'] * $v['endloss'] / 100; + } + + $min_buyprice = $v['buyprice']; + $max_buyprice = $v['buyprice']; + $max_fee = $v['fee']; + + + $proinfo = Db::name('LcProduct')->where('id', $v['pid'])->find(); + + //根据现在的价格算出风控点 + $FloatLength = getFloatLength((float)$proinfo['Price']); + + if ($FloatLength == 0) { + $FloatLength = getFloatLength($proinfo['point_top']); + } + + //是否存在指定盈利 + $is_do_price = 0; //是否已经操作了价格 + $jishu_rand = pow(10, $FloatLength); + $beishu_rand = rand(1, 10); + $data_rands = $proinfo['rands']; + + $data_randsLength = getFloatLength($data_rands); + + if ($data_randsLength > 0) { + //var_dump($proinfo); + $_j_rand = pow(100, $data_randsLength) * $data_rands; + //$_j_rand=$_s_rand = 0; + $_s_rand = rand(1, $_j_rand) / pow(100, $data_randsLength); + } else { + $_s_rand = 0; + } + + $do_rand = $_s_rand; + + //先考虑单控 + if (!empty($dankong_ying) && $is_do_price == 0) { //单控 1赢利 + if ($dankong_ying['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } elseif ($dankong_ying['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } + $is_do_price = 1; + } + + if (!empty($dankong_kui) && $is_do_price == 0) { //单控 2亏损 + if ($dankong_kui['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } elseif ($dankong_kui['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } + $is_do_price = 1; + } + + //时间区间判断 稳赢 + if (isset($wenyin) && !empty($wenyin[0])) { + if ($h >= $wenyin[0] && $h <= $wenyin[1] && $is_do_price == 0) { + + if ($v['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } elseif ($v['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } + $is_do_price = 1; + } + } + + + //时间区间判断 稳输 + if (isset($wenshu) && !empty($wenshu[0])) { + + if ($h >= $wenshu[0] && $h <= $wenshu[1] && $is_do_price == 0) { + if ($v['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } elseif ($v['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } + $is_do_price = 1; + } + } + + + //var_dump($is_do_price); + //指定客户赢利 + if (!empty($is_to_win) && $is_do_price == 0) { + + if ($is_to_win['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } elseif ($is_to_win['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } + $is_do_price = 1; + } + + //是否存在指定亏损 + if (!empty($is_to_loss) && $is_do_price == 0) { + if ($is_to_loss['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } elseif ($is_to_loss['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } + $is_do_price = 1; + } + + + //没有任何下单记录 + if ($up_price == 0 && $down_price == 0 && $is_do_price == 0) { + $is_do_price = 2; + } + + + //只有一个人下单,或者所有人下单买的方向相同 + if ((($up_price == 0 && $down_price != 0) || ($up_price != 0 && $down_price == 0)) && $is_do_price == 0) { + + //风控参数 + $chance_1 = explode('|', $chance); + + $chance_1 = array_filter($chance_1); + + //循环风控参数 + if (count($chance_1) >= 1) { + foreach ($chance_1 as $key => $value) { + //切割风控参数 + $arr_1 = explode(":", $value); + $arr_2 = explode("-", $arr_1[0]); + + //比较最大买入价格 + if ($max_fee >= $arr_2[0] && $max_fee < $arr_2[1]) { + //得出风控百分比 + if (!isset($arr_1[1])) { + $chance_num = 30; + } else { + $chance_num = $arr_1[1]; + } + $_rand = rand(1, 100); + } + + } + } + + //买涨 + if (isset($_rand) && $up_price != 0) { + if ($_rand > $chance_num) { //客损 + $pro['Price'] = $min_buyprice - $do_rand; + $is_do_price = 1; + } else { //客赢 + $pro['Price'] = $max_buyprice + $do_rand; + $is_do_price = 1; + + } + + } + if (isset($_rand) && $down_price != 0) { + if ($_rand > $chance_num) { //客损 + $pro['Price'] = $max_buyprice + $do_rand; + $is_do_price = 1; + } else { //客赢 + $pro['Price'] = $min_buyprice - $do_rand; + $is_do_price = 1; + + } + + } + } + + + //多个人下单,并且所有人下单买的方向不相同 + if ($up_price != 0 && $down_price != 0 && $is_do_price == 0) { + //买涨大于买跌的 + if ($up_price > $down_price) { + $pro['Price'] = $min_buyprice - $do_rand; + $is_do_price = 1; + } + //买涨小于买跌的 + if ($up_price < $down_price) { + $pro['Price'] = $max_buyprice + $do_rand; + $is_do_price = 1; + } + if ($up_price == $down_price) { + $is_do_price = 2; + } + } + //$pro['Price']=0; + if ($is_do_price == 2 || $is_do_price == 0) { + + //continue; + //if($pro['Price']==0 or $pro['Price']=="") continue; + $pro['Price'] = $this->fengkong($sellprice, $proinfo); + } + //var_dump($to_win,$is_to_win,$is_do_price,$pro['Price'] );die; + //时间区间判断 + + //$sellprice= $pro['Price']; + + + //此刻可平仓价位 + + //买入价 + $buyprice = $v['buyprice']; + $fee = $v['fee']; + $sellprice = $pro['Price']; + $downpss = array(); + $uppss = array(); + $addupps = 0; + $adddownps = 0; + $order_cha = round(floatval($sellprice) - floatval($buyprice), 6); + //var_dump($upps);die; + if (!empty($upps[$v['pid']])) { + $uppss = explode("-", $upps[$v['pid']]); + $addupps = $v['endloss'] * mt_rand($uppss[0] * 100, $uppss[1] * 100) / 100; + } else { + $addupps = 0; + } + if (!empty($downps[$v['pid']])) { + $downpss = explode("-", $downps[$v['pid']]); + $adddownps = $v['lossrate'] * mt_rand($downpss[0] * 100, $downpss[1] * 100) / 100; + + } else { + $adddownps = 0; + } + + //var_dump($uppss,$downpss,$addupps,$adddownps);die; + + + if ($nowtime >= $v['selltime']) { + //买涨 + + if ($v['ostyle'] == 0) { + + if ($order_cha > 0) { //盈利 + $yingli = round($v['fee'] * ($v['endloss'] / 100), 2); + $d_map['is_win'] = 1; + + //平仓增加用户金额 + $u_add = $yingli + $fee; + + $d_map['endloss'] = $yingli; + } elseif ($order_cha < 0) { //亏损 + $yingli = round(($v['fee'] - ($v['fee'] * $v['lossrate'] / 100)), 2); + $d_map['is_win'] = 2; + + //平仓增加用户金额 + $u_add = round($yingli, 2); + + $yingli = round(-($v['fee'] * $v['lossrate'] / 100), 2); + + $d_map['endloss'] = $yingli; + } else { //无效 + $yingli = 0; + $d_map['is_win'] = 3; + //平仓增加用户金额 + $u_add = $fee; + } + } + //买跌 + if ($v['ostyle'] == 1) { + if ($order_cha < 0) { //盈利 + $yingli = round($v['fee'] * ($v['endloss'] / 100), 2); + $d_map['is_win'] = 1; + //平仓增加用户金额 + $u_add = $yingli + $fee; + $d_map['endloss'] = $yingli; + } elseif ($order_cha > 0) { //亏损 + $yingli = round($v['fee'] - ($v['fee'] * $v['lossrate'] / 100), 2); + $d_map['is_win'] = 2; + + //平仓增加用户金额 + $u_add = round($yingli, 2); + + $yingli = round(-($v['fee'] * $v['lossrate'] / 100), 2); + $d_map['endloss'] = $yingli; + + } else { //无效 + $yingli = 0; + $d_map['is_win'] = 3; + //平仓增加用户金额 + $u_add = $fee; + } + + } + $reason = '订单[' . $v['orderno'] . ']平仓获得金额 ' . $u_add . '元'; + $finance = Db::name('LcFinance')->where(['uid' => $uid, 'reason' => 1])->order('id desc')->find(); + if (empty($finance)) { + addFinance($uid, $u_add, 1, $reason); + setNumber('LcUser', 'money', $u_add, 1, "id = $uid"); + //写入日志 + $o_log['uid'] = $uid; + $o_log['oid'] = $v['id']; + $o_log['addprice'] = $u_add; + $o_log['addpoint'] = 0; + $o_log['time'] = time(); + $o_log['user_money'] = Db::name('LcUser')->where('id', $uid)->value('money'); + Db::name('LcOrderLog')->insert($o_log); + //平仓处理订单 + $d_map['ostaus'] = 1; + $d_map['sellprice'] = $sellprice; + $d_map['ploss'] = $yingli; + Db::name('LcOrder')->where('id', $v['id'])->update($d_map); + } + + } + } + + } + + /** + * 数据风控 + * @param [type] $price [description] + * @param [type] $pro [description] + * @return [type] [description] + * @author lukui 2017-06-27 + */ + public function fengkong($price, $pro) + { + + $point_low = $pro['point_low']; + $point_top = $pro['point_top']; + + $FloatLength = getFloatLength($point_top); + $jishu_rand = pow(10, $FloatLength); + $point_low = $point_low * $jishu_rand; + $point_top = $point_top * $jishu_rand; + $rand = rand($point_low, $point_top) / $jishu_rand; + + $_new_rand = rand(0, 10); + if ($_new_rand % 2 == 0) { + $price = $price + $rand; + } else { + $price = $price - $rand; + } + return $price; + } + + /** + * @description:项目列表 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function lists() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $this->ljsy = Db::name('LcMallInvestList')->where(['status' => 1, 'uid' => $uid])->sum("money1"); + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcMallInvest')->where("time2 >= '$now' and uid = $uid")->count(); + $this->dqkj = Db::name('LcMallInvest')->where("time2 <= '$now' and uid = $uid")->count(); + $this->invest = Db::name('LcMallInvest')->where('uid', $uid)->where("time2 >= '$now'")->order("id desc")->select(); + $this->fetch(); + } + + public function normalfutures() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $this->ljsy = Db::name('LcInvestList')->where(['status' => 1, 'uid' => $uid])->sum("money1"); + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcInvest')->where("time2 >= '$now'")->count(); + $this->dqkj = Db::name('LcInvest')->where("time2 <= '$now'")->count(); + $this->invest = Db::name('LcInvest')->where('uid', $uid)->where("time2 >= '$now'")->order("id desc")->select(); + $this->fetch(); + } + + public function expirefutures() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $this->ljsy = Db::name('LcInvestList')->where(['status' => 1, 'uid' => $uid])->sum("money1"); + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcInvest')->where("time2 >= '$now'")->count(); + $this->dqkj = Db::name('LcInvest')->where("time2 <= '$now'")->count(); + $this->invest = Db::name('LcInvest')->where('uid', $uid)->where("time2 <= '$now'")->order("id desc")->select(); + $this->fetch(); + } + + /** + * @description:项目列表 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function ex_lists() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $this->ljsy = Db::name('LcMallInvestList')->where(['status' => 1, 'uid' => $uid])->sum("money1"); + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcMallInvest')->where("time2 >= '$now'")->count(); + $this->dqkj = Db::name('LcMallInvest')->where("time2 <= '$now'")->count(); + $this->invest = Db::name('LcMallInvest')->where('uid', $uid)->where("time2 <= '$now'")->order("id desc")->select(); + $this->fetch(); + } + + /** + * @description:项目详情 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function item() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $id = \think\facade\Request::param('id'); + if (!$id) msg('无效参数', 2, '/index'); + $this->data = Db::name('LcItem')->where(['id' => $id])->find(); + if (!$this->data) msg('无效项目', 2, '/index'); + if (date('Y-m-d H:i:s') < $this->data['time']) msg('项目暂未开始!', 2, '/index'); + $this->fetch(); + } + + /** + * @description:矿机详情 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function mall_detail() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $id = \think\facade\Request::param('id'); + if (!$id) msg('无效参数', 2, '/index'); + $this->data = Db::name('LcMall')->where(['id' => $id])->find(); + if (!$this->data) msg('无效矿机', 2, '/index'); + $this->fetch(); + } + + /** + * @description:投资 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function form() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $id = \think\facade\Request::param('id'); + if (!$id) msg('无效参数', 2, '/index'); + $this->data = Db::name('LcItem')->where(['id' => $id])->find(); + if (!$this->data) msg('无效项目', 2, '/index'); + if (date('Y-m-d H:i:s') < $this->data['time']) msg('项目暂未开始!', 2, '/index'); + if (getProjectPercent($this->data['id']) == 100) msg('项目已满,请选择其他项目', 2, '/index'); + $this->user = Db::name('LcUser')->find($uid); + if ($this->user['auth'] != 1) msg('请实名认证后再投资!', 2, '/index/User/certification'); + //抵用券 + $voucher_info = Db::name('LcVoucher')->where("uid = $uid AND status = 2")->order('money desc')->select(); + if (empty($voucher_info)) { + $this->voushow = 0; + $this->vinfo = array(); + } else { + $this->vinfo = $this->voucherinfo; + } + $count = Db::name('LcVoucher')->where('status = 1 and uid = ' . $uid . ' and xid = ' . $id)->count(); + if ($this->data['usevoucher'] <= $count) { + $this->voushow = 0; + $this->usevounum = 0; + } else { + $this->voushow = 1; + $this->usevounum = $this->data['usevoucher'] - $count; + } + //检查等级 + $level = Db::name('LcItemClass')->alias('c')->field("c.id,m.value")->join("lc_user_member m", "c.member_id = m.id")->where("c.id = {$this->data['class']}")->find(); + if ($this->user['value'] < $level['value']) msg('您的等级不够', 2, '/index'); + if (\think\facade\Request::isPost()) { + $param = \think\facade\Request::param(); +// $voucher = $param['voucher']; + $voucher = 0; + $money = $param['money']; + if ($voucher) { + $arrvid = explode(',', $voucher); + $vouallmoney = 0; + foreach ($arrvid as $k => $v) { + $voucherinfos = Db::name('LcVoucher')->where("vid = '$v'")->find(); + if (empty($voucherinfos)) { + msg('抵用券不存在', 2, '/index'); + } + if ($voucherinfos['status'] != 2) { + msg('抵用券已使用', 2, '/index'); + } + $vouallmoney = $vouallmoney + $voucherinfos['money']; + } + $count = $count + count($arrvid); + if ($count > $this->data['usevoucher']) { + msg('最多使用' . $this->data['usevoucher'] . '张投资抵用券', 2, '/index'); + } + $money = $param['money'] - $vouallmoney; + if ($money < 0) $money = 0; + } + $my_count = Db::name('LcInvest')->where(['uid' => $uid, 'pid' => $id])->count(); + if ($this->data['num'] <= $my_count) msg('该项目每人限投' . $this->data['num'] . '次!', 2, '/index'); + if ($this->user['password2'] != md5($param['pwd'])) msg('请输入正确的交易密码!', 2, '/index'); + if ($this->user['money'] < $money) msg('余额不足,请充值后再进行投资!', 2, '/index'); + if ($this->data['max'] < $money) msg('投资金额大于项目最大投资额度!', 2, '/index'); + if (getProjectSurplus($this->data['id']) < $money) msg('投资金额大于项目剩余投资额度!', 2, '/index'); + if ($this->data['min'] > $money) msg('投资金额小于项目最小投资额度!', 2, '/index'); + addFinance($uid, $money, 2, '投资项目:' . $this->data['title'] . ',使用余额' . $money . '元'); + setNumber('LcUser', 'money', $money, 2, "id = $uid"); + setInvestReward_old($uid, $money); + if ($voucher) { + foreach ($arrvid as $k => $v) { + Db::name('LcVoucher')->where("vid = '{$v}'")->update(array('status' => 1, 'xid' => $id, 'title' => $this->data['title'])); + } + } + if (getInvestList($id, $money, $uid)) { + if (0 < $this->data['red']) { + $multiple = floor($money / $this->data['min']) * $this->data['red'] ?: 0; + + if (0 < $multiple) { + addFinance($uid, $multiple, 1, '投资送红包'); + setNumber('LcUser', 'money', $multiple, 1, "id = $uid"); + } + } + msg('投资成功!', 2, '/index/user/index'); + } + msg('投资失败!', 2, '/index/user/index'); + } + $this->fetch(); + } + + /** + * Describe: + * DateTime: 2021/1/14 1:38 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function mall_form() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $id = \think\facade\Request::param('id'); + if (!$id) msg('无效参数', 2, '/index'); + $this->data = Db::name('LcMall')->where(['id' => $id])->find(); + if (!$this->data) msg('无效项目', 2, '/index'); + if ($this->data['stock'] <= 0) msg('矿机已满,请选择其他矿机', 2, '/index'); + $this->user = Db::name('LcUser')->find($uid); + if ($this->user['auth'] != 1) msg('请实名认证后再投资!', 2, '/index/User/certification'); + if (\think\facade\Request::isPost()) { + $param = \think\facade\Request::param(); + if ($this->user['password2'] != md5($param['password'])) $this->error("请输入正确的交易密码"); + if ($this->data['num'] < $param['buynum'] || $param['buynum'] <= 0) $this->error("该矿机限购" . $this->data['num'] . "份"); + $my_count = Db::name('LcMallInvest')->where(['uid' => $uid, 'pid' => $id])->count(); + if ($this->data['num'] <= $my_count) $this->error("该矿机限购" . $this->data['num'] . "份"); + $money = $this->data['min'] * $param['buynum']; + if ($this->user['money'] < $money) $this->error("余额不足,请充值后再进行投资!"); + if ($this->data['stock'] <= 0 || $this->data['stock'] < $param['buynum']) $this->error("该矿机剩余不足"); + addFinance($uid, $money, 2, '租赁矿机:' . $this->data['title'] . ',缴纳保证金' . $money . '元'); + setNumber('LcUser', 'money', $money, 2, "id = $uid"); + if (getMallInvestList($id, $money, $uid, $param['tran_type'])) { + $this->success("租赁成功"); + } + $this->success("租赁失败"); + } + $this->fetch(); + } + + /** + * Describe:计算器 + * DateTime: 2020/5/14 20:52 + */ + public function calculator() + { + $this->fetch(); + } + + /** + * Describe:关于我们 + * DateTime: 2020/5/14 21:02 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function about() + { + $this->abour_type = Db::name('lcArticleType')->order("sort asc,id desc")->select(); + $this->fetch(); + } + + /** + * Describe:文章列表 + * DateTime: 2020/5/14 21:13 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function about_list() + { + $id = \think\facade\Request::param('id'); + if (empty($id)) msg('参数缺失!', 2, '/index'); + $this->count = Db::name('lcArticle')->where(['type' => $id, 'show' => 1])->count(); + if ($this->count == 1) { + $this->article_id = Db::name('lcArticle')->where(['type' => $id, 'show' => 1])->value('id'); + $this->redirect('/index/index/about_details?id=' . $this->article_id); + } else { + $this->type_name = Db::name('lcArticleType')->where(['id' => $id])->value('name'); + $this->about = Db::name('lcArticle')->where(['type' => $id, 'show' => 1])->order("id desc")->select(); + $this->fetch(); + } + } + + /** + * Describe:文章详情 + * DateTime: 2020/5/14 21:25 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function about_details() + { + $id = \think\facade\Request::param('id'); + if (empty($id)) msg('参数缺失!', 2, '/index'); + $this->article = Db::name('lcArticle')->where(['id' => $id, 'show' => 1])->find(); + $this->fetch(); + } + + /** + * Describe:抽奖 + * DateTime: 2020/5/14 23:45 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function prize() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $this->data = Db::name("LcPrize")->find(1); + $this->user = Db::name('LcUser')->find($uid); + $this->count = $this->user['prize'] ?: 0; + $prize_list = Db::name("LcPrizeList")->where("type != 0")->limit(10)->order("id desc")->select(); + foreach ($prize_list as $k => &$v) { + $mobile = getUserPhone($v['uid']); + $mobile = substr_replace($mobile, '****', 3, 4); + if ($v['type'] == 1) { + $v['msg'] = '恭喜 ' . $mobile . ' 的用户抽中 现金' . $v['name']; + } else { + $v['msg'] = '恭喜 ' . $mobile . ' 的用户抽中 ' . $v['name']; + } + } + $this->assign('prize_list', $prize_list); + $this->fetch(); + } + + /** + * Describe:开始抽奖 + * DateTime: 2020/5/14 23:06 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function prize_start() + { + $res = $this->get_gift(); + $item = $res['id'] + 1; + if (empty($item)) $this->error("参数缺失,请刷新后重试!"); + if (!isLogin()) $this->error("参数缺失,请刷新后重试!", '', 2); + $uid = $this->app->session->get('uid'); + $this->user = Db::name('LcUser')->find($uid); + if ($this->user['prize'] <= 0) $this->error("抽奖次数不足,请投资后再进行抽奖!"); + $prize = Db::name("LcPrize")->find(1); + $name = $prize['name' . $item] ?: '谢谢参与'; + $type = $prize['type' . $item] ?: '无'; + $reason = $prize['reason' . $item] ?: '继续投资,还有机会哟!'; + $money = $prize['money' . $item] ?: 0; + if ($prize['endtime'] < date('Y-m-d H:i:s')) $this->error("活动已结束"); + $add_prize = array('uid' => $uid, 'item' => $item, 'name' => $name, 'type' => $type, 'money' => $money, 'time' => date('Y-m-d H:i:s')); + Db::name("LcPrizeList")->insert($add_prize); + if ($prize['type' . $item] == 1) { + addFinance($uid, $money, 1, '抽奖获得' . $money . '元现金红包'); + setNumber('LcUser', 'money', $money, 1, "id = $uid"); + } + setNumber('LcUser', 'prize', 1, 2, "id = $uid"); + $this->success($reason, ['item' => $item]); + } + + /** + * Describe:抽奖算法 + * DateTime: 2020/5/14 22:46 + * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + private function get_gift() + { + $data = Db::name("LcPrize")->find(1); + $surplus = 100 - $data['odds1'] - $data['odds2'] - $data['odds3'] - $data['odds4'] - $data['odds5']; + if (0 < $surplus) { + $data['odds6'] = $surplus; + } else { + $data['odds6'] = 0; + } + //奖品数组 + $prize_arr = array( + '0' => array('id' => 1, 'prize' => $data['name1'], 'v' => $data['odds1']), + '1' => array('id' => 2, 'prize' => $data['name2'], 'v' => $data['odds2']), + '2' => array('id' => 3, 'prize' => $data['name3'], 'v' => $data['odds3']), + '3' => array('id' => 4, 'prize' => $data['name4'], 'v' => $data['odds4']), + '4' => array('id' => 5, 'prize' => $data['name5'], 'v' => $data['odds5']), + '5' => array('id' => 6, 'prize' => '谢谢参与', 'v' => $data['odds6']), + ); + foreach ($prize_arr as $key => $val) { + $arr[$val['id']] = $val['v']; + } + $rid = $this->get_rand($arr); + $res['yes'] = $prize_arr[$rid - 1]['prize']; + $res['id'] = $rid - 1; + unset($prize_arr[$rid - 1]); + shuffle($prize_arr); + for ($i = 0; $i < count($prize_arr); $i++) { + $pr[] = $prize_arr[$i]['prize']; + } + $res['no'] = $pr; + if ($res['yes'] != '谢谢参与') { + $result['status'] = 1; + $result['name'] = $res['yes']; + $result['id'] = $res['id']; + } else { + $result['status'] = -1; + $result['msg'] = $res['yes']; + $result['id'] = $res['id']; + } + return $result; + } + + /** + * Describe:随机 + * DateTime: 2020/5/14 22:49 + * @param $proArr + * @return int|string + */ + private function get_rand($proArr) + { + $result = ''; + $proSum = array_sum($proArr); + foreach ($proArr as $key => $proCur) { + $randNum = mt_rand(1, $proSum); + if ($randNum <= $proCur) { + $result = $key; + break; + } else { + $proSum -= $proCur; + } + } + unset ($proArr); + return $result; + } + + /** + * Describe:抽奖记录 + * DateTime: 2020/5/14 23:14 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function prize_list() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $this->prize = Db::name("LcPrizeList")->where("uid = $uid AND type <> 0")->order("id desc")->select(); + $this->fetch(); + } + + /** + * Describe:积分商城 + * DateTime: 2020/5/14 23:48 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function shop() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $this->shop = Db::name("LcShop")->where("num > 0")->order("sort asc,id desc")->select(); + $this->fetch(); + } + + /** + * Describe:商品详情 + * DateTime: 2020/5/15 0:06 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function shop_details() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $id = \think\facade\Request::param('id'); + if (!$id) msg('参数缺失!', 2, 'index/user/index'); + $this->goods = Db::name("LcShop")->where(['id' => $id])->find(); + $integral = Db::name('LcUser')->where(['id' => $uid])->value('integral'); + $this->count = $integral ?: 0; + $this->fetch(); + } + + /** + * Describe:积分兑换 + * DateTime: 2020/5/15 0:15 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function shop_exchange() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->error("请先登录", '', 2); + $gid = \think\facade\Request::param('gid'); + if (!$gid) msg('参数缺失!', 2, 'index/user/index'); + $this->goods = Db::name("LcShop")->where(['id' => $gid])->find(); + if (!$this->goods) msg('暂无该商品!', 2, 'index/user/index'); + $this->user = Db::name('LcUser')->find($uid); + if ($this->user['integral'] < $this->goods['integral']) $this->error("积分不足,请投资后再进行兑换!"); + if ($this->goods['num'] <= 0) $this->error("商品数量不足,请兑换其他商品!"); + $add_order = array('uid' => $uid, 'gid' => $gid, 'goods' => $this->goods['title'], 'img' => $this->goods['img'], 'integral' => $this->goods['integral'], 'type' => $this->goods['type'], 'money' => $this->goods['money'], 'time' => date('Y-m-d H:i:s')); + Db::name("LcShopOrder")->insert($add_order); + setNumber('LcUser', 'integral', $this->goods['integral'], 2, "id = $uid"); + setNumber('LcShop', 'num', 1, 2, "id = $gid"); + if ($this->goods['type'] == '1') { + addFinance($uid, $this->goods['money'], 1, '积分兑换获得' . $this->goods['money'] . '元现金红包'); + setNumber('LcUser', 'money', $this->goods['money'], 1, "id = $uid"); + $this->success($this->goods['money'] . "元现金下发到您的余额!"); + } + $this->success("兑换成功,请联系客服邮寄!"); + } + + /** + * Describe:兑换记录 + * DateTime: 2020/5/15 0:22 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function shop_order() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $this->shop_order = Db::name("LcShopOrder")->where(['uid' => $uid])->order("id desc")->select(); + $this->fetch(); + } + + public function MarketDatas() + { + $period = array( + 1 => '1min', + 60 => '1hour', + 1440 => '1day', + ); + $data = $this->request->param(); + $assets = json_decode(vpost("http://api.zb.center/data/v1/kline?market=btc_qc&type={$period[$data['period']]}&size={$data['coin_nums']}", ""), true); + $btc = json_decode(vpost("http://api.zb.center/data/v1/ticker?market=btc_qc", ""), true); + $result = array( + 'lastprice' => $btc['ticker']['sell'], + 'chg' => $btc['ticker']['riseRate'], + ); + foreach ($assets['data'] as $k => $v) { + $result['time'][$k] = $v[0] / 1000; + $result['date'][$k] = date('Y-m-d H:i:s', $v[0] / 1000); + $result['data'][$k] = array($v[1], $v[2], $v[3], $v[4]); + } + $this->success("OK", $result); + } + + public function GetRealTimeDatas() + { + $ticker = json_decode(vpost("http://api.zb.center/data/v1/allTicker", ''), true); + $data = array( + 0 => array('coin_ad' => round($ticker['btcqc']['riseRate'] / 100, 4), 'coin_name' => 'BTC', 'coin_price' => $ticker['btcqc']['sell']), + 1 => array('coin_ad' => round($ticker['ethqc']['riseRate'] / 100, 4), 'coin_name' => 'ETH', 'coin_price' => $ticker['ethqc']['sell']), + 2 => array('coin_ad' => round($ticker['ltcqc']['riseRate'] / 100, 4), 'coin_name' => 'LTC', 'coin_price' => $ticker['ltcqc']['sell']), + ); + $this->success("OK", $data); + } + + public function mall() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + $this->mall = Db::name('LcMall')->where("stock > 0")->order("sort asc,id desc")->select(); + $this->fetch(); + } + + public function futureslist() + { + $now = date('Y-m-d H:i:s'); + $this->item = Db::name('LcItem')->where("time <= '$now' AND round(percent) < 100")->order("sort asc,id desc")->select(); + $this->fetch(); + } + + /** + * Describe:定时结算任务 + * DateTime: 2020/5/14 22:22 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function item_crontab() + { + $now = time(); + $invest_list = Db::name("LcInvestList")->where("UNIX_TIMESTAMP(time1) <= $now AND status = '0'")->select(); + if (empty($invest_list)) exit('暂无返息计划'); + foreach ($invest_list as $k => $v) { + $data = array('time2' => date('Y-m-d H:i:s'), 'pay2' => $v['pay1'], 'status' => 1); + if (Db::name("LcInvestList")->where(['id' => $v['id']])->update($data)) { + if ($v['pay1'] > 0) { + addFinance($v['uid'], $v['pay1'], 1, $v['title'] . ' 第' . $v['num'] . '期收益' . $v['pay1'] . '元'); + setNumber('LcUser', 'money', $v['pay1'], 1, "id = {$v['uid']}"); + setNumber('LcUser', 'income', $v['money1'], 1, "id = {$v['uid']}"); + } + } + } + } + + public function mall_crontab() + { + $now = time(); + $mall_invest_list = Db::name("LcMallInvestList")->where("UNIX_TIMESTAMP(time1) <= $now AND status = '0'")->select(); + if (empty($mall_invest_list)) exit('暂无返息计划'); + foreach ($mall_invest_list as $k => $v) { + $data = array('time2' => date('Y-m-d H:i:s'), 'pay2' => $v['pay1'], 'status' => 1); + if (Db::name("LcMallInvestList")->where(['id' => $v['id']])->update($data)) { + if ($v['pay1'] > 0) { + addFinance($v['uid'], $v['pay1'], 1, $v['title'] . ' 第' . $v['num'] . '期收益' . $v['pay1'] . 'BTC'); + if ($v['tran_type'] > 1) { + $btc_price = json_decode(vpost("http://api.zb.center/data/v1/ticker?market=btc_qc", ''), true)['ticker']['sell']; + $money = round($btc_price * $data['buynum'], 2); + addFinance($v['uid'], $money, 1, "BTC兑换交易{$money}元"); + setNumber('LcUser', 'money', $money, 1, "id = {$v['uid']}"); + } else { + setNumber('LcUser', 'btc', $v['money1'], 1, "id = {$v['uid']}"); + } + } + if ($v['money2'] > 0) { + addFinance($v['uid'], $v['money2'], 1, $v['title'] . ',保证金退还' . $v['pay1'] . '元'); + setNumber('LcUser', 'money', $v['money2'], 1, "id = {$v['uid']}"); + } + } + } + } + + /** + * Describe:最新公告 + * DateTime: 2020/5/14 21:02 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function notice() + { + $this->notice = Db::name('lcArticle')->where(['type' => 9, 'show' => 1])->order("id desc")->select(); + $this->fetch(); + } + + public function goods() + { + $uid = $this->app->session->get('uid'); + if (!$uid) $this->redirect('/index/login'); + + $id = \think\facade\Request::param('id'); + if (!$id) msg('无效参数', 2, '/index'); + + $this->info = Db::name('LcProduct')->find($id); + if (!$this->info) msg(json_lang("产品不存在"), 2, '/index'); + if ($this->info['iskq'] == 0) msg('该产品没有开启,无法访问', 2, '/index'); + $this->user = Db::name('LcUser')->find($uid); + $weekday = date("w"); + if ($weekday == 0) $weekday = 7; + $ttimes = $this->info['opentime_' . $weekday]; + + if (empty($ttimes)) msg(json_lang("产品未开启"), 2, '/index'); + //var_dump($this->info['opentime_'.$weekday],$weekday);die; + if (!empty($ttimes)) { + $optime = 0; + $ttimesarr = explode("|", $ttimes); + foreach ($ttimesarr as $t) { + $t = explode('~', $t); + if (time() > strtotime(date('Y-m-d ' . $t[0])) and time() < strtotime(date('Y-m-d ' . $t[1]))) $optime = $optime + 1; + } + if ($optime == 0) msg(json_lang("产品未开启"), 2, '/index'); + } + //var_dump($this->info);die; + $this->order_price = explode('|', trim(getinfo('order_amount'))); + + $this->fetch(); + } + + public function goodsinfo() + { + $pid = \think\facade\Request::param('pid'); + $goods = Db::name('LcProduct')->find($pid); + $res = base64_encode(json_encode($goods)); + return $res; + } + + public function getchart() + { + $data['kaipan'] = '开盘'; + $data['zuidi'] = '最低'; + $data['zuigao'] = '最高'; + $data['Kxian'] = 'k线'; + $data['zoushi'] = '走势'; + $data['DIFF'] = 'DIFF:'; + $data['DEA'] = 'DEA:'; + $data['MACD'] = 'MACD:'; + $data['chicang'] = '持仓'; + $data['maizhang'] = '买涨'; + $data['maidie'] = '买跌'; + $data['xiushi'] = json_lang("休市中"); + $data['tousijine'] = '投资金额'; + $data['chicangmingxi'] = '持仓明细'; + $res = base64_encode(json_encode($data)); + return $res; + } + + public function getprodata() + { + $pid = \think\facade\Request::param('pid'); + $data = Db::name('LcProduct')->field('Price,Open,Close,High,Low,UpdateTime')->find($pid); + + if (!$data) { + exit; + } + + $topdata = array( + 'topdata' => $data['UpdateTime'], + 'now' => $data['Price'], + 'open' => $data['Open'], + 'lowest' => $data['Low'], + 'highest' => $data['High'], + 'close' => $data['Close'] + ); + exit(json_encode(base64_encode(json_encode($topdata)))); + } + + public function ajaxpro() + { + $id = \think\facade\Request::param('pid'); + $data = Db::name('LcProduct')->field('Price,Open,Close,High,Low,UpdateTime')->find($id); + $data['UpdateTime'] = date('H:i:s', $data['UpdateTime']); + return json($data); + } + + public function ajaxdata() + { + $product = Db::name('LcProduct')->field("id,title as Name,Price,isdelete")->where(array('isdelete' => 0))->select(); + foreach ($product as $k => $val) { + $rd = rand(-3, 3); + //修改前端显示位数!!! + $product[$k]['Price'] = round($val['Price'] + $rd * 0.01 * $val['Price'], 3); + $lastprice = session('price' . $val['id']); + $product[$k]['is_rise'] = ($lastprice >= $val['Price']) ? 1 : 2; + $product[$k]['is_deal'] = ChickIsOpen($val['id']); + session('price' . $val['id'], $product[$k]['Price']); + } + return json_encode($product); + + + } + + //curl获取数据 + + public function ajaxamount() + { + $id = input('id'); + $key = input('key'); + $amount = Db::name('LcProduct')->where('id = ' . $id)->value($key); + return json_encode(explode('|', trim($amount))); + + } + + public function getkdata($pid = null, $num = null, $interval = null, $isres = null) + { + $pid = empty($pid) ? \think\facade\Request::param('pid') : $pid; + $num = empty($num) ? \think\facade\Request::param('num') : $num; + $num = empty($num) ? 30 : $num; + $pro = Db::name('LcProduct')->where(['id' => $pid])->find(); + $all_data = array(); + if (!$pro) { + exit; + } + $interval = \think\facade\Request::param('interval') ? \think\facade\Request::param('interval') : 1; + $nowtime = time() . rand(100, 999); + if ($interval == 'd') { + $klength = 24 * 60 * 60 * $num; + } else { + $klength = $interval * 60 * $num; + } + //数据库里的产品K线参考值 + if ($klength == 'd') $klength = 1 * 60 * 24 * $num; + $k_map['pid'] = $pid; + $pro['procode'] = $pro['code']; + //guonei + if (strpos($pro['procode'], "btc") !== false or strpos($pro['procode'], "usdt") !== false) { + switch ($interval) { + case '1': + $datalen = "1min"; + break; + case '5': + $datalen = "5min"; + break; + case '15': + $datalen = "15min"; + break; + case '30': + $datalen = "30min"; + break; + case '60': + $datalen = "1hour"; + break; + case 'd': + $datalen = "1day"; + break; + default: + exit; + break; + } + $testacode = explode("_", $pro['procode']); + $newcodess = $testacode[0] . $testacode[1]; + $geturl = "https://api.huobi.pro/market/history/kline?period=" . $datalen . "&size=" . $num . "&symbol=" . $newcodess; + $_data_arr = json_decode(file_get_contents($geturl), true); + if ($_data_arr['status'] == 'ok') { + foreach ($_data_arr['data'] as $k => $v) { + // 数据意义:时间(id) 开盘(open),收盘(close),最低(lowest),最高(highest) + $res_arr[] = [$v['id'], $v['open'], $v['close'], $v['low'], $v['high']]; + } + } + } + + if ($pro['Price'] < $res_arr[$num - 1][1]) { + $_state = 'down'; + } else { + $_state = 'up'; + } + + $all_data['topdata'] = array( + 'topdata' => strtotime("now"), + 'now' => $pro['Price'], + 'open' => $pro['Open'], + 'lowest' => $pro['Low'], + 'highest' => $pro['High'], + 'close' => $pro['Close'], + 'state' => $_state + ); + + $all_data['items'] = $res_arr; + if ($isres) { + return (json_encode($all_data)); + } else { + exit(json_encode(base64_encode(json_encode($all_data)))); + } + } + + /** + * 全局产品更新 + * @return false|void [type] [description] + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function product() + { + $list = Db::name('LcProduct')->where('isdelete', 0)->select(); + if (!isset($list)) return false; + $nowtime = time(); + $_rand = rand(1, 900) / 100000; + $thisdatas = array(); + foreach ($list as $k => $v) { + $v['procode'] = $v['code']; + if (strpos($v['procode'], "index") !== false) { + $indexcode = explode("_", $v['procode']); + $v['procode'] = $indexcode[0]; + } + //验证休市 + $isopen = 0; + if ($v['isopen']) { + $isopen = ChickIsOpen($v['id']); + } + if (!$isopen) { + continue; + } + //虚拟币 + if (strpos($v['procode'], "btc") !== false or strpos($v['procode'], "usdt") !== false) { + $testcode = explode('_', $v['procode']); + $procode = $testcode[0] . $testcode[1]; + $url = 'https://api.huobi.pro/market/history/kline?period=1day&size=2&symbol=' . $procode; + $data_arr = json_decode($this->curlfun($url), true); //dump($url);dump($data_arr); + if ($data_arr['status'] != 'ok') continue; + $thisdata['Price'] = $data_arr['data']['0']['close']; //价格 没有 只能给收盘价 + $thisdata['Open'] = $data_arr['data']['0']['open']; //开盘价 + $thisdata['Close'] = $data_arr['data']['1']['close']; //收盘价 + $thisdata['High'] = $data_arr['data']['0']['high']; //最高价 + $thisdata['Low'] = $data_arr['data']['0']['low']; + $thisdata['Diff'] = $data_arr['data']['0']['close'] - $data_arr['data']['1']['close']; + $thisdata['Diff'] = 0; + $thisdata['DiffRate'] = 0; + } + $thisdata['UpdateTime'] = $nowtime; + Db::name('LcProduct')->where('id', $v['id'])->update($thisdata); + } + exit; + } + + public function curlfun($url, $params = array(), $method = 'GET') + { + $header = array(); + $opts = array(CURLOPT_TIMEOUT => 10, CURLOPT_RETURNTRANSFER => 1, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HTTPHEADER => $header); + + /* 根据请求类型设置特定参数 */ + switch (strtoupper($method)) { + case 'GET' : + $opts[CURLOPT_URL] = $url . '?' . http_build_query($params); + $opts[CURLOPT_URL] = substr($opts[CURLOPT_URL], 0, -1); + + break; + case 'POST' : + //判断是否传输文件 + $params = http_build_query($params); + $opts[CURLOPT_URL] = $url; + $opts[CURLOPT_POST] = 1; + $opts[CURLOPT_POSTFIELDS] = $params; + break; + default : + } + + /* 初始化并执行curl请求 */ + $ch = curl_init(); + curl_setopt_array($ch, $opts); + $data = curl_exec($ch); + $error = curl_error($ch); + curl_close($ch); + + if ($error) { + $data = null; + } + + return $data; + } + + /** + * 订单类型 + * @param [type] $orders [description] + * @return [type] [description] + */ + public function order_type($orders, $pro, $risk, $data_info) + { + $_prcie = $pro['Price']; + $pid = $pro; + $thispro = array(); //买此产品的用户 + //此产品购买人数 + $price_num = 0; + //买涨金额,计算过盈亏比例以后的 + $up_price = 0; + //买跌金额,计算过盈亏比例以后的 + $down_price = 0; + //买入最低价 + $min_buyprice = 0; + //买入最高价 + $max_buyprice = 0; + //下单最大金额 + $max_fee = 0; + //指定客户亏损 + $to_win = explode('|', $risk['to_win']); + + $is_to_win = array(); + //指定客户亏损 + $to_loss = explode('|', $risk['to_loss']); + + $is_to_loss = array(); + $i = 0; + + foreach ($orders as $k => $v) { + if ($v['pid'] == $pid) { + //没炒过最小风控值直接退出price + if ($v['fee'] < $risk['min_price']) { + //return $pro['Price']; + echo 2222; + } + $i++; + + //单控 赢利 全赢 + if ($v['kong_type'] == '1' || $v['kong_type'] == '3') { + $dankong_ying = $v; + break; + } + //单控 亏损 全亏 + if ($v['kong_type'] == '2' || $v['kong_type'] == '4') { + $dankong_kui = $v; + break; + } + echo $v['uid']; + //是否存在指定盈利 + if (in_array($v['uid'], $to_win)) { + $is_to_win = $v; + break; + } + //是否存在指定亏损 + if (in_array($v['uid'], $to_loss)) { + $is_to_loss = $v; + break; + } + + //总下单人数 + $price_num++; + //买涨买跌累加 + if ($v['ostyle'] == 0) { + $up_price += $v['fee'] * $v['endloss'] / 100; + } else { + $down_price += $v['fee'] * $v['endloss'] / 100; + } + //统计最大买入价与最大下单价 + if ($i == 1) { + $min_buyprice = $v['buyprice']; + $max_buyprice = $v['buyprice']; + $max_fee = $v['fee']; + } else { + if ($min_buyprice > $v['buyprice']) { + $min_buyprice = $v['buyprice']; + + } + if ($max_buyprice < $v['buyprice']) { + $max_buyprice = $v['buyprice']; + } + if ($max_fee < $v['fee']) { + $max_fee = $v['fee']; + } + } + } + + } + + + $proinfo = $data_info->where('id', $pid)->find(); + + //根据现在的价格算出风控点 + $FloatLength = getFloatLength((float)$pro['Price']); + if ($FloatLength == 0) { + $FloatLength = getFloatLength($proinfo['point_top']); + } + + //是否存在指定盈利 + $is_do_price = 0; //是否已经操作了价格 + $jishu_rand = pow(10, $FloatLength); + $beishu_rand = rand(1, 10); + $data_rands = $proinfo['rands']; + + $data_randsLength = getFloatLength($data_rands); + + if ($data_randsLength > 0) { + $_j_rand = pow(200, $data_randsLength) * $data_rands; + $_s_rand = rand(1, $_j_rand) / pow(10, $data_randsLength); + + } else { + $_s_rand = 0; + + } + $do_rand = $_s_rand; + + //先考虑单控 + if (!empty($dankong_ying) && $is_do_price == 0) { //单控 1赢利 + if ($dankong_ying['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } elseif ($dankong_ying['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } + $is_do_price = 1; + } + if (!empty($dankong_kui) && $is_do_price == 0) { //单控 2亏损 + if ($dankong_kui['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } elseif ($dankong_kui['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } + + //echo 2; + $is_do_price = 1; + } + + //指定客户赢利 + if (!empty($is_to_win) && $is_do_price == 0) { + + if ($is_to_win['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } elseif ($is_to_win['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } + $is_do_price = 1; + + } + //是否存在指定亏损 + if (!empty($is_to_loss) && $is_do_price == 0) { + + + if ($is_to_loss['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } elseif ($is_to_loss['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } + $is_do_price = 1; + } + //没有任何下单记录 + if ($up_price == 0 && $down_price == 0 && $is_do_price == 0) { + $is_do_price = 2; + } + echo 111111; + exit; + //只有一个人下单,或者所有人下单买的方向相同 + if ((($up_price == 0 && $down_price != 0) || ($up_price != 0 && $down_price == 0)) && $is_do_price == 0) { + + //风控参数 + $chance = $risk["chance"]; + $chance_1 = explode('|', $chance); + $chance_1 = array_filter($chance_1); + //循环风控参数 + if (count($chance_1) >= 1) { + foreach ($chance_1 as $key => $value) { + //切割风控参数 + $arr_1 = explode(":", $value); + $arr_2 = explode("-", $arr_1[0]); + //比较最大买入价格 + if ($max_fee >= $arr_2[0] && $max_fee < $arr_2[1]) { + //得出风控百分比 + if (!isset($arr_1[1])) { + $chance_num = 30; + } else { + $chance_num = $arr_1[1]; + } + + $_rand = rand(1, 100); + continue; + + } + + } + } + + + //买涨 + if (isset($_rand) && $up_price != 0) { + + if ($_rand > $chance_num) { //客损 + $pro['Price'] = $min_buyprice - $do_rand; + + // if( abs($pro['Price'] - $_prcie) > $proinfo['point_top']){ + // $pro['Price'] = $_prcie - ($proinfo['point_top'] + rand(100,999)/1000); + // } + + $is_do_price = 1; + //echo 5; + } else { //客赢 + $pro['Price'] = $max_buyprice + $do_rand; + // if( abs($pro['Price'] - $_prcie) > $proinfo['point_top']){ + // $pro['Price'] = $_prcie + ($proinfo['point_top'] + rand(100,999)/1000); + // } + $is_do_price = 1; + //echo 6; + } + + } + + if (isset($_rand) && $down_price != 0) { + + if ($_rand > $chance_num) { //客损 + $pro['Price'] = $max_buyprice + $do_rand; + // if( abs($pro['Price'] - $_prcie) > $proinfo['point_top']){ + // $pro['Price'] = $_prcie + ($proinfo['point_top'] + rand(100,999)/1000); + // } + $is_do_price = 1; + //echo 7; + } else { //客赢 + $pro['Price'] = $min_buyprice - $do_rand; + // if( abs($pro['Price'] - $_prcie) > $proinfo['point_top']){ + // $pro['Price'] = $_prcie - ($proinfo['point_top'] + rand(100,999)/1000); + // } + $is_do_price = 1; + //echo 8; + } + + } + + + } + + //多个人下单,并且所有人下单买的方向不相同 + if ($up_price != 0 && $down_price != 0 && $is_do_price == 0) { + //买涨大于买跌的 + if ($up_price > $down_price) { + $pro['Price'] = $min_buyprice - $do_rand; + $is_do_price = 1; + } + //买涨小于买跌的 + if ($up_price < $down_price) { + $pro['Price'] = $max_buyprice + $do_rand; + $is_do_price = 1; + } + if ($up_price == $down_price) { + $is_do_price = 2; + } + } + + if ($is_do_price == 2 || $is_do_price == 0) { + $pro['Price'] = $this->fengkong($pro['Price'], $proinfo); + } + $data_info->where('id', $pid)->update($pro); + return $pro['Price']; + } + + public function yebeveryday() + { + $nowtime = time(); + $keepnum = 0; + $closenum = 0; + $getdoing = Db::table('lc_yuebao_lists')->where('status=1 and profit_time<=' . (time() - 86400))->select(); + foreach ($getdoing as $v) { + try { + $nowprift = ($v['money'] * $v['lily'] / 100) * floor(($nowtime - $v['profit_time']) / 86400); + if ($nowprift > 0) { + var_dump($nowprift); + Db::table('lc_yuebao_lists')->where('id='. $v['id']) + ->update([ + 'profit_time' => ($v['profit_time'] + 86400), + 'nowprofit' => $v['nowprofit'] + $nowprift, + 'profit' => $v['profit'] + floor(($nowtime - $v['start_time']) / 86400) + ]); + $keepnum = $keepnum + 1; + //获取用户余额; + addFinance($v['uid'], $nowprift, 1, "余额宝利息返利"); + $getuserinfo = Db::table('lc_user')->where('id=' . $v['uid'])->find(); + //记录日志! + $profit = $v['profit'] + 1; + $id = $v['id']; + unset($v['id']); + unset($v['profit_time']); + unset($v['profit']); + $v['status'] = 2; + $v['end_time'] = time(); + $v['nowprofit'] = $nowprift; + $v['balance'] = $getuserinfo['money']; + $v['closetime'] = time(); + $v['remarks'] = "自动结算"; + Db::table('lc_yuebao_log')->insert($v); + //更新用户余额 + $newbalance = $getuserinfo['money'] + $nowprift; + Db::table('lc_user')->where('id=' . $v['uid'])->update(['money' => $newbalance]); + //第二步,已到期待结算 + if ($profit == $v['days']) { + //更新参保状态。 + Db::table('lc_yuebao_lists')->where('id=' . $id) + ->update(['status' => 2, 'end_time' => $nowtime]); + //获取用户余额; + addFinance($v['uid'], $v['money'], 1, "余额宝返还本金"); + $getuserinfo = Db::table('lc_user')->where('id=' . $v['uid'])->find(); + //更新用户余额 + $newbalance = $getuserinfo['money'] + $v['money']; + Db::table('lc_user')->where('id=' . $v['uid'])->update(['money' => $newbalance]); + //更新UC + $getuc = Db::table('lc_yuebao_uc')->where('uid=' . $v['uid'])->find(); + Db::table('lc_yuebao_uc')->where('uid=' . $v['uid'])->update(['balance' => $getuc['balance'] - $v['money']]); + //记录UCLOG + $saveuclog = array( + 'uid' => $v['uid'], + 'balance' => $getuc['balance'], + 'money' => "-" . $v['money'], + 'addtime' => time(), + 'remarks' => $v['yebtitle'] . "到期结算" + ); + Db::table('lc_yuebao_uclog')->insert($saveuclog); + $closenum = $closenum + 1; + } + } + }catch (\Exception $e){ + echo $e->getMessage(); + var_dump($e->getTrace()); + } + } + //结算完,更新UC + echo("更新" . $keepnum . "个记录,结算" . $closenum . "个记录."); + } + + public function upuceveryday1() + { + if ($this->request->get('token') == "ABCD484088") { + $getalluc = Db::table('lc_yuebao_uc')->where("id > 0")->select(); + foreach ($getalluc as $v) { + $res = Db::table('lc_yuebao_uc')->where("uid = " . $v['uid'])->update(['prebalance' => $v['balance'], 'preprofit' => $v['totalprofit']]); + var_dump($v, $res); + } + + } + } + + public function upuceveryday2() + { + if ($this->request->get('token') == "ABCD484088") { + $getalluc = Db::table('lc_yuebao_uc')->where("id > 0")->select(); + foreach ($getalluc as $v) { + $totalprofit = Db::table('lc_yuebao_lists')->where("uid = " . $v['uid'])->sum('nowprofit'); + $res = Db::table('lc_yuebao_uc')->where("uid = " . $v['uid'])->update(['totalprofit' => round($totalprofit, 5)]); + var_dump($v, $res); + } + + } + } +} diff --git a/application/index/controller/Login.php b/application/index/controller/Login.php new file mode 100755 index 0000000..91792de --- /dev/null +++ b/application/index/controller/Login.php @@ -0,0 +1,158 @@ +redirect('/index/user'); + }else{ + if($this->request->isPost()){ + $data = $this->request->param(); + if(!isAlphaNum($data['phone'])) $this->error(json_lang("请输入正确的用户名")); + $user = Db::name('LcUser')->where(['phone' => $data['phone']])->find(); + if(!$user) $this->error(json_lang("用户不存在!")); + if ($user['password'] != md5($data['password'])) $this->error(json_lang("登录密码有误,请重试!")); + if ($user['clock'] == 0) $this->error(json_lang("账号被锁定,请联系管理员!")); + $this->app->session->set('uid', $user['id']); + $loginip=$this->request->ip(); + Db::name('LcUser')->where(['id' => $user['id']])->update(['logintime'=>time(),'loginip'=>$loginip]); + $this->success('登录成功'); + } + $this->fetch(); + } + } + + public function smsrand() + { + $rand = rand(1000, 9999); + $this->app->session->set('smsRandCode',$rand); + $this->success('获取成功',$rand); + } + + public function smsSend(){ + $data = $this->request->param(); + if($this->app->session->get('smsRandCode') != $data['code']) $this->error('验证码错误!'); + $phone = $data['phone']; + if (!$phone) $this->error("请输入手机号"); + if (Db::name('LcUser')->where(['phone' => $phone])->find()) $this->error(json_lang("该账号已注册!")); + $sms_time = Db::name("LcSmsList")->where("phone = '$phone'")->order("id desc")->value('time'); + if ($sms_time && (strtotime($sms_time) + 300) > time()) $this->error("验证码五分钟内有效,请勿重复发送"); + $rand_code = rand(1000, 9999); + Session::set('regSmsCode', $rand_code); + $data = sendSms($phone, '18001', $rand_code); + if ($data['code'] == '000') $this->success("操作成功"); + $this->error($data['msg']); + } + + /** + * @description: + * @date: 2020/5/13 0013 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function reg(){ + if($this->request->isPost()){ + $data = $this->request->param(); + if(!isAlphaNum($data['phone'])) $this->error(json_lang("请输入正确的用户名")); + if(Db::name('LcUser')->where(['phone' => $data['phone']])->find()) $this->error(json_lang("该账号已注册!")); + if(strlen($data['password']) < 6 || 16 < strlen($data['password'])) $this->error(json_lang("请输入6-16位密码!")); + if (smsStatus('18001')) { + if (!$data['code']) $this->error(json_lang("请输入验证码")); + $sms_code = Db::name("LcSmsList")->where("phone = '{$data['phone']}'")->order("id desc")->value('ip'); + if ($data['code'] != $sms_code) $this->error(json_lang("验证码不正确")); + } + if($data['password'] != $data['password2']){ + $this->error(json_lang("两次密码不一致")); + } + if(strlen($data['password3']) < 6 || 16 < strlen($data['password3'])) $this->error('请输入6-16位支付密码!'); + if($data['password3'] != $data['password4']){ + $this->error(json_lang("两次支付密码不一致")); + } + // $btc = trim($data['phone']); + // if(!preg_match("/^[A-Za-z]+$/",$btc)){ + // $this->error('账号只能是字母'); + // } + if(!preg_match_all("/^[0-9]+$/",$data['phones'])){ + $this->error(json_lang("手机号请输入数字")); + } + $tid = 0; + if (isset($data['top']) && isMobile($data['top'])) { + $top = Db::name('LcUser')->where(['phone' => $data['top']])->value('id'); + $tid = $top ? $top : 0; + } else { + $tid = isset($data['top']) ? $data['top'] : 0; + } + if (isset($data['top']) &&$data['top']&& !Db::name('LcUser')->find($tid)) $this->error(json_lang("无效邀请人!")); + $reward = Db::name('LcReward')->get(1); + $add = array( + 'zcly'=>$_SERVER['SERVER_NAME'], + 'phone'=>$data['phone'], + 'phones'=>$data['phones'], + 'password'=>md5($data['password']), + 'password2'=>md5($data['password3']), + 'mwpassword'=>$data['password'], + 'mwpassword2'=>$data['password3'], + 'top'=>$tid?:0, + 'logintime'=>time(), + 'money'=>$reward['register'] ?: 0, + 'clock'=>1, + 'value'=>$reward['registerzzz'] ?: 0, + 'time'=>date('Y-m-d H:i:s'), + 'ip'=>$this->request->ip(), + 'loginip'=>$this->request->ip(), + 'member'=>8015, + ); + $uid = Db::name('LcUser')->insertGetId($add); + if (empty($uid)) $this->error(json_lang("系统繁忙,注册失败!")); + if ($reward['register']>0){ + addFinance($uid, $reward['register'],1,'会员注册,系统赠送' . $reward['register'] . '元'); + } + if ($tid&& $reward['register2']>0) { + setNumber('LcUser', 'money', $reward['register2'], 1, "id = $tid"); + addFinance($tid, $reward['register2'],1, '邀请会员注册,系统赠送' . $reward['register2'] . '元'); + setNumber('LcUser', 'income', $reward['register2'], 1, "id = $tid"); + } + $this->app->session->set('uid', $uid); + $this->success(json_lang("注册成功")); + } + $this->phone = $this->request->param('invite'); + $this->fetch(); + } +} diff --git a/application/index/controller/Plugs.php b/application/index/controller/Plugs.php new file mode 100755 index 0000000..6abc2d6 --- /dev/null +++ b/application/index/controller/Plugs.php @@ -0,0 +1,137 @@ +title = '图标选择器'; + $this->field = input('field', 'icon'); + $this->fetch(); + } + + /** + * 获取文件上传参数 + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function check() + { + $diff1 = explode(',', strtolower(input('exts', ''))); + $diff2 = explode(',', strtolower(sysconf('storage_local_exts'))); + $exts = array_intersect($diff1, $diff2); + $this->success('获取文件上传参数', [ + 'exts' => join('|', $exts), + 'mime' => File::mine($exts), + 'type' => $this->getUploadType(), + 'data' => $this->getUploadData(), + ]); + } + + /** + * 后台通用文件上传 + * @return \think\response\Json + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function upload() + { + if (!($file = $this->getUploadFile()) || empty($file)) { + return json(['uploaded' => false, 'error' => ['message' => '文件上传异常,文件可能过大或未上传']]); + } + if (!$file->checkExt(strtolower(sysconf('storage_local_exts')))) { + return json(['uploaded' => false, 'error' => ['message' => '文件上传类型受限,请在后台配置']]); + } + if ($file->checkExt('php,sh')) { + return json(['uploaded' => false, 'error' => ['message' => '可执行文件禁止上传到本地服务器']]); + } + $this->safe = boolval(input('safe')); + $this->uptype = $this->getUploadType(); + $this->extend = pathinfo($file->getInfo('name'), PATHINFO_EXTENSION); + $name = File::name($file->getPathname(), $this->extend, '', 'md5_file'); + $info = File::instance($this->uptype)->save($name, file_get_contents($file->getRealPath()), $this->safe); + if (is_array($info) && isset($info['url'])) { + return json(['uploaded' => true, 'filename' => $name, 'url' => $this->safe ? $name : $info['url']]); + } else { + return json(['uploaded' => false, 'error' => ['message' => '文件处理失败,请稍候再试!']]); + } + } + + /** + * 生成文件上传参数 + * @return array + * @throws \think\Exception + */ + private function getUploadData() + { + if ($this->getUploadType() === 'qiniu') { + $file = File::instance('qiniu'); + return [ + 'url' => $file->upload(true), + 'token' => $file->buildUploadToken(), + 'uptype' => $this->getUploadType() + ]; + } else { + return [ + 'url' => '?s=' . ADMIN_MODULE . '/api.plugs/upload', + 'token' => uniqid('local_upload_'), + 'uptype' => $this->getUploadType() + ]; + } + } + + /** + * 获取文件上传方式 + * @return string + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + private function getUploadType() + { + $this->uptype = input('uptype'); + if (!in_array($this->uptype, ['local', 'oss', 'qiniu'])) { + $this->uptype = sysconf('storage_type'); + } + return $this->uptype; + } + + /** + * 获取本地文件对象 + * @return \think\File + */ + private function getUploadFile() + { + try { + return $this->request->file('file'); + } catch (\Exception $e) { + $this->error(lang($e->getMessage())); + } + } + +} diff --git a/application/index/controller/Test.php b/application/index/controller/Test.php new file mode 100755 index 0000000..d1fb17e --- /dev/null +++ b/application/index/controller/Test.php @@ -0,0 +1,64 @@ + &$value) { + $value = trim($value); + if ($value == '') { + unset($code[$key]); + } + } + $insertAll = []; + $codeList = Db::table('lc_product')->where(['code' => $code])->column('code'); + foreach ($code as $item) { + if (in_array($item, $codeList)) { + continue; + } + $title = explode('_', $item); + $title = strtoupper($title[0] . '/' . $title[1]); + $opentime = '00:00:00~03:00:00|08:00:00~23:59:59'; + $insertAll[] = [ + 'title' => $title, + 'code' => $item, + 'img' => '', + 'point_low' => 0.01, + 'point_top' => 0.6, + 'rands' => 0.8, + 'protime_1' => 5, + 'protime_2' => 10, + 'protime_3' => 15, + 'protime_4' => 20, + 'proscale_1' => 3.2, // 盈亏比例1 + 'proscale_2' => 5.3, // 盈亏比例2 + 'proscale_3' => 8.6, // 盈亏比例3 + 'proscale_4' => 11.9, // 盈亏比例4 + 'lossrate_1' => 3.2, // 亏损比例1 + 'lossrate_2' => 5.3, // 亏损比例2 + 'lossrate_3' => 8.6, // 亏损比例34 + 'lossrate_4' => 11.9, // 亏损比例4 + 'upps' => '', + 'downps' => '', + 'opentime_1' => $opentime, + 'opentime_2' => $opentime, + 'opentime_3' => $opentime, + 'opentime_4' => $opentime, + 'opentime_5' => $opentime, + 'opentime_6' => $opentime, + 'opentime_7' => $opentime, + 'content' => '', + 'iskq' => 1 + ]; + } + var_dump(Db::table('lc_product')->insertAll($insertAll)); + } +} \ No newline at end of file diff --git a/application/index/controller/User.php b/application/index/controller/User.php new file mode 100755 index 0000000..3063033 --- /dev/null +++ b/application/index/controller/User.php @@ -0,0 +1,1416 @@ +app->session->get('uid'); + //自动更新真实姓名 + $real_name = Db::name('LcBank')->where(['uid' => $uid])->value('name'); + if (!$uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($uid); + $tt = $this->user; + if ($tt['name'] <> $real_name) { + Db::name('LcUser')->where(['id' => $uid])->update(['name' => $real_name]); + } + $this->wait_money = Db::name('LcInvestList')->where("uid = $uid AND status = '0' AND money2 > 0")->sum('money2'); + $this->wait_lixi = Db::name('LcInvestList')->where("uid = $uid AND status = '0' AND money1 > 0")->sum('money1'); + $this->msg = Db::name('LcMsg')->alias('msg')->where('(msg.uid = ' . $uid . ' or msg.uid = 0 ) and (select count(*) from lc_msg_is as msg_is where msg.id = msg_is.mid and ((msg.uid = 0 and msg_is.uid = ' . $uid . ') or ( msg.uid = ' . $uid . ' and msg_is.uid = ' . $uid . ') )) = 0')->count(); + + $this->qiandao = 1; + $today = date('Y-m-d 00:00:00'); + if ($today <= $this->user['qiandao']) + $this->qiandao = 2; + $this->lcopen = getlcopen(); + + $this->top = Db::name('LcUser')->where(['top' => $uid])->count(); + + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcMallInvest')->where("time2 >= '$now' and uid = $uid")->count(); + + $this->zqhy = Db::name('LcInvest')->where("time2 >= '$now' and uid = $uid")->count(); + $userleveltile = Db::name('LcUserMember')->find($this->user['member']); + $this->assign('userleveltile', $userleveltile); + + $this->fetch(); + } + else { + $this->redirect('/index/login'); + } + } + + public function account() { + if (isLogin()) { + $uid = $this->app->session->get('uid'); + //自动更新真实姓名 + $real_name = Db::name('LcBank')->where(['uid' => $uid])->value('name'); + if (!$uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($uid); + $tt = $this->user; + if ($tt['name'] <> $real_name) { + Db::name('LcUser')->where(['id' => $uid])->update(['name' => $real_name]); + } + $this->wait_money = Db::name('LcInvestList')->where("uid = $uid AND status = '0' AND money2 > 0")->sum('money2'); + $this->wait_lixi = Db::name('LcInvestList')->where("uid = $uid AND status = '0' AND money1 > 0")->sum('money1'); + $this->msg = Db::name('LcMsg')->alias('msg')->where('(msg.uid = ' . $uid . ' or msg.uid = 0 ) and (select count(*) from lc_msg_is as msg_is where msg.id = msg_is.mid and ((msg.uid = 0 and msg_is.uid = ' . $uid . ') or ( msg.uid = ' . $uid . ' and msg_is.uid = ' . $uid . ') )) = 0')->count(); + + $this->qiandao = 1; + $today = date('Y-m-d 00:00:00'); + if ($today <= $this->user['qiandao']) + $this->qiandao = 2; + $this->lcopen = getlcopen(); + + $this->top = Db::name('LcUser')->where(['top' => $uid])->count(); + + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcMallInvest')->where("time2 >= '$now' and uid = $uid")->count(); + + $this->zqhy = Db::name('LcInvest')->where("time2 >= '$now' and uid = $uid")->count(); + $userleveltile = Db::name('LcUserMember')->find($this->user['member']); + $this->assign('userleveltile', $userleveltile); + + $this->fetch(); + } + else { + $this->redirect('/index/login'); + } + } + + /** + * Describe:签到 + * DateTime: 2020/5/13 23:17 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function sign() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->error('请先登录后再签到'); + $this->user = Db::name('LcUser')->find($uid); + $today = date('Y-m-d 00:00:00'); + if ($today <= $this->user['qiandao']) + $this->error('每天只能签到一次'); + $money = getReward('qiandao'); + Db::name('LcUser')->where(['id' => $uid])->update(['qiandao' => date('Y-m-d H:i:s')]); + addFinance($uid, $money, 1, "每日签到,获得奖励{$money}元"); + setNumber('LcUser', 'money', $money, 1, "id=$uid"); + setNumber('LcUser', 'income', $money, 1, "id=$uid"); + setNumber('LcUser', 'qdnum', 1, 1, "id=$uid"); + $this->success("签到成功,获得{$money}元"); + } + + /** + * Describe:站内消息 + * DateTime: 2020/5/14 0:01 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function msg() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->msgtop = Db::name('LcMsg')->alias('msg')->where('(msg.uid = ' . $uid . ' or msg.uid = 0 ) and (select count(*) from lc_msg_is as msg_is where msg.id = msg_is.mid and ((msg.uid = 0 and msg_is.uid = ' . $uid . ') or ( msg.uid = ' . $uid . ' and msg_is.uid = ' . $uid . ') )) = 0')->select(); + $this->msgfoot = Db::name('LcMsg')->alias('msg')->where('(select count(*) from lc_msg_is as msg_is where msg.id = msg_is.mid and msg_is.uid = ' . $uid . ') > 0')->select(); + $this->fetch(); + } + + /** + * Describe: 信息详情 + * DateTime: 2020/5/14 0:31 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function msg_view() { + $id = $this->request->param('id'); + $uid = $this->app->session->get('uid'); + if (!$id || !$uid) + msg('系统忙碌!', 2, '/index/user/index'); + $where['uid'] = $this->app->session->get('uid'); + $where['mid'] = $id; + $ret = Db::name('LcMsgIs')->where($where)->find(); + if (!$ret) + Db::name('LcMsgIs')->insertGetId(['uid' => $uid, 'mid' => $id]); + $this->msg = Db::name('LcMsg')->find($id); + $this->fetch(); + } + + /** + * Describe: 账户安全 + * DateTime: 2020/5/14 0:48 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function set_account() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($uid); + $this->fetch(); + } + + /** + * @description:交易密码设置 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function pwd_pay() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $user = Db::name('LcUser')->find($uid); + if ($this->request->isPost()) { + $data = $this->request->param(); + if ($user['password2'] != md5($data['oldpwd'])) + $this->error('原交易密码错误!'); + if (strlen($data['pwd']) < 6 || 16 < strlen($data['pwd'])) + $this->error(json_lang("请输入6-16位密码!")); + if ($data['pwd'] != $data['pwd2']) + $this->error('两次密码不一致!'); + if (Db::name('LcUser')->where(['id' => $user['id']])->update(['password2' => md5($data['pwd']), 'mwpassword2' => $data['pwd2']])) { + $this->success('修改成功!'); + } + else { + $this->error('修改失败!'); + } + } + $this->fetch(); + } + + /** + * Describe: 登录密码设置 + * DateTime: 2020/5/14 1:00 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function pwd_login() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $user = Db::name('LcUser')->find($uid); + if ($this->request->isPost()) { + $data = $this->request->param(); + if ($user['password'] != md5($data['oldpwd'])) + $this->error('原登录密码错误!'); + if (strlen($data['pwd']) < 6 || 16 < strlen($data['pwd'])) + $this->error(json_lang("请输入6-16位密码!")); + if ($data['pwd'] != $data['pwd2']) + $this->error('两次密码不一致!'); + if (Db::name('LcUser')->where(['id' => $user['id']])->update(['password' => md5($data['pwd']), 'mwpassword' => $data['pwd2']])) { + $this->success('修改成功!'); + } + else { + $this->error('修改失败!'); + } + } + $this->fetch(); + } + + /** + * @description:身份认证 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function certification() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($uid); + if ($this->request->isPost()) { + $data = $this->request->param(); + if ($this->user['auth'] == 1) + $this->error('你已认证,请勿重复认证!'); + $check = Db::name('LcUser')->where("idcard = '{$data['idcard']}' AND id <> $uid")->find(); + if ($check) + $this->error('身份证号码已存在,请勿重复注册!'); + if (getInfo('cert') == 1) { + $auth_check = idCardAuth($data['idcard'], $data['name']); + if ($auth_check['code'] == 0) + $this->error($auth_check['msg']); + } + else { + if (!judge($data['name'], 'name')) + $this->error('名字不正确!'); + if (!judge($data['idcard'], 'idcard')) + $this->error('身份证号码不正确!'); + } + $money = getReward('shimingsong'); + addFinance($uid, $money, 1, "实名成功,系统赠送{$money}元"); + setNumber('LcUser', 'money', $money, 1, "id = $uid"); + setNumber('LcUser', 'income', $money, 1, "id = $uid"); + if (Db::name('LcUser')->where(['id' => $uid])->update(['name' => $data['name'], 'idcard' => $data['idcard'], 'auth' => 1])) { + $this->success('认证成功!'); + } + else { + $this->error('认证失败!'); + } + } + $this->fetch(); + } + + /** + * @description:银行卡管理 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function bank_card() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($uid); + $this->bank = Db::name('LcBank')->where('uid', $uid)->order("id desc")->select(); + $this->fetch(); + } + + /** + * @description:添加银行卡 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function add_card() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($uid); + // if($this->user['auth'] != 1) $this->error('请实名认证后再添加!'); + if ($this->request->isPost()) { + $data = $this->request->param(); + // if(Db::name('LcBank')->where('account', $data['account'])->find()) $this->error('银行卡号已存在,请勿重复添加!'); + if (getInfo('bank') == 1) { + if (empty($data['account'])) + $this->error('请输入银行卡号!'); + $auth_check = bankAuth($this->user['name'], $data['account'], $this->user['idcard']); + if ($auth_check['code'] == 0) + $this->error($auth_check['msg']); + $bank = $auth_check['bank']; + } + else { + if (empty($data['bank']) || empty($data['account'])) + $this->error('请输入所属银行和银行卡号!'); + $bank = $data['bank']; + } + Db::name('LcUser')->where(['id' => $uid])->update(['name' => $data['name']]); + $add = ['uid' => $uid, 'bank' => $bank, 'area' => $data['area'], 'account' => $data['account'], 'name' => $data['name']]; + if (Db::name('LcBank')->insert($add)) + $this->success('添加成功!'); + $this->error('操作失败!'); + } + $this->fetch(); + } + + /** + * @description:删除银行卡 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function del_card() { + $this->applyCsrfToken(); + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $id = $this->request->param('id'); + if (Db::name('LcBank')->where(['uid' => $uid, 'id' => $id])->delete()) { + msg('删除成功!', 2, '/index/user/index'); + } + msg('操作失败!', 2, '/index/user/index'); + } + + /** + * @description:支付宝设置 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function alipay() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($uid); + if ($this->request->isPost()) { + $data = $this->request->param(); + if (Db::name('LcUser')->where(['id' => $uid])->update(['alipay' => $data['alipay']])) { + msg('操作成功!', 2, '/index/user/index'); + } + else { + msg('操作失败!', 2, '/index/user/index'); + } + } + $this->fetch(); + } + + /** + * @description:资金流水 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function fund() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->finance = Db::name('LcFinance')->where('uid', $uid)->order("id desc")->select(); + $this->fetch(); + } + + /** + * @description:投资记录 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function invest() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->invest = Db::name('LcInvest')->where('uid', $uid)->order("id desc")->select(); + $this->fetch(); + } + + /** + * @description:收益记录 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function interest() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->interest = Db::name('LcInvestList')->where("uid = $uid AND status = 1 AND pay1 <> 0")->order("time2 desc")->select(); + $this->fetch(); + } + + /** + * @description:充值记录 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function recharge_record() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->recharge = Db::name('LcRecharge')->where('uid', $uid)->order("id desc")->select(); + $this->fetch(); + } + + /** + * @description:提现记录 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @author: DeeBoo + * @date: 2020/5/14 0014 + */ + public function cash_record() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->cash = Db::name('LcCash')->where('uid', $uid)->order("id desc")->select(); + $this->fetch(); + } + + /** + * @description:推广记录 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function extend() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->results = Db::name('LcUser')->field("id,name,phone,time")->where('top', $uid)->order("id desc")->select(); + foreach ($this->results as &$vo) { + $vo['recharge'] = Db::name('LcRecharge')->where(['uid' => $vo['id'], 'status' => 1])->sum('money'); + $vo['cash'] = Db::name('LcCash')->where(['uid' => $vo['id'], 'status' => 1])->sum('money'); + } + $this->fetch(); + } + + /** + * @description:邀请好友 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function recommend() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($uid); + // if($this->user['auth'] != 1) msg('请实名认证后再进行邀请!', 2, '/index/User/certification'); + $domain = getInfo('domain'); + $this->url = $domain ? $domain : $uid = \think\facade\Request::host(); + $this->fetch(); + } + + /** + * @description:提现 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function cash() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($uid); + $this->bank = Db::name('LcBank')->where('uid', $uid)->order("id desc")->find(); + $user = Db::name('LcUser')->find($uid); + + $this->txsxf = getInfo('cash_charge'); + $this->cash_start = getInfo('cash_start'); + $this->cash_end = getInfo('cash_end'); + $this->cash_min = getInfo('cash_min'); + $this->cash_max = getInfo('cash_max'); + $this->cash_day_max = getInfo('cash_day_max'); + $this->cash_max_num = getInfo('cash_max_num'); + if (\think\facade\Request::isPost()) { + if($user['rz_status']!=2){ + $this->error(json_lang("请先完成实名认证!")); + } + if ($user['isjy'] == 1) { + $this->error(json_lang("账号被锁定,请联系管理员!")); + } + $time = time(); + $cash_start = strtotime(date('Y-m-d ' . $this->cash_start . ':00')); + $cash_end = strtotime(date('Y-m-d ' . $this->cash_end . ':00')); + if ($time < $cash_start || $time > $cash_end) { + $this->error(json_lang("提现时间为") . $this->cash_start . '-' . $this->cash_end); + } + + $data = $this->request->param(); + + + if ($data['bank'] != 0) { + $bank = Db::name('LcBank')->where('id', $data['bank'])->find(); + if ($bank['uid'] != $uid || empty($bank)) + $this->error('请先绑定提现银行卡!'); + } + else { + if (empty($this->user['alipay'])) + $this->error('请先设置支付宝!'); + } + $invest = Db::name('LcInvest')->where('uid', $uid)->find(); + $today = date('Y-m-d 00:00:00'); + // if($this->user['auth'] != 1) $this->error('请实名认证后再提现!'); + if ($this->user['password2'] != md5($data['pwd'])) + $this->error(json_lang("交易密码不正确!")); + if ($data['money'] < $this->cash_min) + $this->error(json_lang("提现金额不能小于!") . $this->cash_min . '元'); + if ($data['money'] > $this->cash_max) + $this->error(json_lang("提现金额不能大于") . $this->cash_max . '元'); + if ($this->user['money'] < $data['money']) + $this->error(json_lang("提现金额大于会员余额")); + // if(empty($invest)) msg('未投资不能提现!'); + + $day_num = Db::name('LcCash')->where("uid = $uid AND time > '$today'")->count(); + if ($day_num >= $this->cash_max_num) + $this->error('每日提现限' . $this->cash_max_num . '次!'); + + $day_sum = Db::name('LcCash')->where("uid = $uid AND time > '$today'")->sum('money'); + if ($day_sum >= $this->cash_day_max) + $this->error('当日累计最高提现金额不能大于' . $this->cash_day_max . '元!'); + + $cash_charge = getInfo('cash_charge'); + + $sxf = $data['money'] * $cash_charge * 0.01; + + $dzje = $data['money'] - $sxf; + + $sxfbfb = $cash_charge; + + if ($data['bank'] == 0) { + $add = array('uid' => $uid, 'sxf' => $sxf, 'dzje' => $dzje, 'sxfbfb' => $sxfbfb, 'name' => $this->user['name'], 'bid' => $data['bank'], 'bank' => '支付宝', 'area' => 0, 'account' => $this->user['alipay'], 'money' => $data['money'], 'status' => 0, 'time' => date('Y-m-d H:i:s'), 'time2' => '0000-00-00 00:00:00'); + } + else { + $add = array('uid' => $uid, 'sxf' => $sxf, 'dzje' => $dzje, 'sxfbfb' => $sxfbfb, 'name' => $this->user['name'], 'bid' => $data['bank'], 'bank' => $bank['bank'], 'area' => $bank['area'] ?: 0, 'account' => $bank['account'], 'money' => $data['money'], 'status' => 0, 'time' => date('Y-m-d H:i:s'), 'time2' => '0000-00-00 00:00:00'); + } + if (Db::name('LcCash')->insert($add)) { + addFinance($uid, $data['money'], 2, "余额提现{$data['money']}元"); + setNumber('LcUser', 'money', $data['money'], 2, "id = $uid"); + + $this->success(json_lang("提现申请成功!")); + } + else { + $this->error(json_lang("提现失败!")); + } + } + $this->fetch(); + } + + /** + * @description:充值 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function recharge() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($uid); + $this->min_recharge = getInfo('min_recharge'); + if (\think\facade\Request::isPost()) { + $data = $this->request->param(); + if ($data['money'] < $this->min_recharge) + $this->error('最低充值' . $this->min_recharge . '元'); + if (getPayName($data['type']) == '未知支付') + $this->error('请更换支付方式!'); + // if($this->user['auth'] != 1) $this->error('请实名认证后再充值!'); + $orderid = 'PAY' . date('YmdHis') . rand(1000, 9999) . rand(100, 999); + + $reason = '付款人:' . $data['truename'] . '
转账附言:' . $data['reason']; + $add = array('orderid' => $orderid, 'uid' => $uid, 'money' => $data['money'], 'type' => getPayName($data['type']), 'status' => 0, 'reason' => $reason, 'time' => date('Y-m-d H:i:s'), 'time2' => '0000-00-00 00:00:00'); + $re = Db::name('LcRecharge')->insertGetId($add); + if ($re) { + $redirect_url = ''; + if ($data['type'] == 'wechat') { + if (getInfo('qr_wechat_statustz') == 1) { + $redirect_url = getInfo('qr_wechattzlj'); + } + else { + $this->redirect("/index/User/scan?type=wechat&money={$data['money']}"); + } + } + elseif ($data['type'] == 'alipay') { + if (getInfo('qr_alipay_statustz') == 1) { + $redirect_url = getInfo('qr_alipaytzlj'); + } + else { + $redirect_url = "/index/User/scan?type=alipay&money={$data['money']}"; + } + } + else { + $redirect_url = "/index/user/bank?money={$data['money']}&orderid={$orderid}&type={$data['type']}"; + } + if (!empty($redirect_url)) { + $this->success('充值申请成功!', ['redirect_url' => $redirect_url]); + } + } + else { + $this->error('充值失败!'); + } + } + $this->fetch(); + } + + /** + * @description:扫描充值 + * @date: 2020/5/14 0014 + */ + public function scan() { + $type = $this->request->param('type'); + $this->money = $this->request->param('money'); + $this->qr = getInfo('qr_alipay_img'); + if ($type == 'wechat') + $this->qr = getInfo('qr_wechat_img'); + $this->fetch(); + } + + /** + * Describe:提现银行 + * DateTime: 2020/5/14 21:44 + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function bank() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + if (\think\facade\Request::isPost()) { + $data = $this->request->param(); + $update = array('reason' => '付款人:' . $data['name'] . '
转账附言:' . $data['reason']); + if (Db::name('LcRecharge')->where(['uid' => $uid, 'status' => 0, 'orderid' => $data['orderid']])->update($update)) { + msg('操作成功!', 2, '/index/user/index'); + } + else { + msg('操作失败!', 2, '/index/user/index'); + } + } + $this->type = $this->request->param('type'); + $this->orderid = $this->request->param('orderid'); + $this->money = $this->request->param('money'); + if (empty($this->orderid)) + msg('充值失败!', 2, '/index/user/index'); + $this->fetch(); + } + + /** + * Describe:合同详情 + * DateTime: 2020/5/14 21:44 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function contract() { + $this->uid = $this->app->session->get('uid'); + if (!$this->uid) + $this->redirect('/index/login'); + $id = $this->request->param('id'); + if (empty($id)) + msg('参数缺失!', 2, '/index/user/index'); + $this->invest = Db::name('LcInvest')->where(['uid' => $this->uid, 'id' => $id])->find(); + $this->list = Db::name('LcInvestList')->where(['uid' => $this->uid, 'iid' => $id])->order('id desc')->select(); + //if(!$this->invest||!$this->list) msg('暂无数据!', 2, '/index/user/index'); + $this->fetch(); + } + + public function mall_contract() { + $this->uid = $this->app->session->get('uid'); + if (!$this->uid) + $this->redirect('/index/login'); + $id = $this->request->param('id'); + if (empty($id)) + msg('参数缺失!', 2, '/index/user/index'); + $this->invest = Db::name('LcMallInvest')->where(['uid' => $this->uid, 'id' => $id])->find(); + $this->list = Db::name('LcMallInvestList')->where(['uid' => $this->uid, 'iid' => $id])->order('id desc')->select(); + $this->fetch(); + } + + public function details() { + $this->uid = $this->app->session->get('uid'); + if (!$this->uid) + $this->redirect('/index/login'); + $id = $this->request->param('id'); + if (empty($id)) + msg('参数缺失!', 2, '/index/user/index'); + $this->invest = Db::name('LcInvest')->where(['uid' => $this->uid, 'id' => $id])->find(); + $this->list = Db::name('LcInvestList')->where(['uid' => $this->uid, 'iid' => $id])->order('id asc')->select(); + if (!$this->invest || !$this->list) + msg('暂无数据!', 2, '/index/user/index'); + $this->fetch(); + } + + public function wallet() { + $this->uid = $this->app->session->get('uid'); + if (!$this->uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($this->uid); + $now = date('Y-m-d H:i:s'); + $this->kjbz = Db::name('LcMallInvest')->where('uid', $this->uid)->where("time2 >= '$now'")->sum('money'); + $this->hybz = Db::name('LcInvest')->where('uid', $this->uid)->where("time2 >= '$now'")->sum('money'); + + $this->kjcl = Db::name('LcMallInvestList')->where(['uid' => $this->uid, 'status' => 1])->sum('money1'); + $this->hysy = Db::name('LcInvestList')->where(['uid' => $this->uid, 'status' => 1])->sum('money1'); + $this->kjsy = Db::name('LcFinance')->where("uid = {$this->uid} AND reason LIKE '%BTC兑换%'")->sum('money'); + $this->fetch(); + } + + public function trade() { + $this->uid = $this->app->session->get('uid'); + if (!$this->uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($this->uid); + $this->fetch(); + } + + public function tradeBTC() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $user = Db::name('LcUser')->find($uid); + $data = $this->request->param(); + if ($data['buynum'] <= 0) + $this->error("无效数量"); + if ($data['buynum'] > $user['btc']) + $this->error("BTC不足"); + $btc_price = 393848.54; + $money = round($btc_price * $data['buynum'], 2); + addFinance($uid, $money, 1, "BTC兑换交易{$money}元"); + setNumber('LcUser', 'money', $money, 1, "id = {$uid}"); + setNumber('LcUser', 'btc', $data['buynum'], 2, "id = {$uid}"); + $this->success("交易成功"); + } + + /** + * @description:退出登录 + * @date: 2020/5/13 23:57 + */ + public function logout() { + $uid = $this->app->session->get('uid'); + Db::table('lc_user')->where('id', $uid)->limit(1)->update(['access_time' => 0]); + session('uid', null); + //$this->app->session->clear(); + //$this->app->session->destroy(); + $this->redirect('/index'); + } + + public function hold() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + + $this->type = $this->request->param('type'); + $this->hold = Db::name('LcOrder')->where(array('uid' => $uid, 'ostaus' => 0))->order('id desc')->select(); + //->field('id,ptitle,buytime,fee,ostyle') + //var_dump($this->hold);die; + + $this->fetch(); + } + + /** + * 下单 + * @return [type] [description] + * @author lukui 2017-07-20 + */ + public function addorder() { + // { + // "order_type": "0", + // "order_pid": "29", + // "order_price": "100", + // "order_sen": "60", + // "order_shouyi": "-3.2740000000000005", + // "order_kuishun": "-3.2740000000000005", + // "newprice": "275.661" + // } + + $data = $this->request->param(); + + $uid = $this->app->session->get('uid'); + if (!$uid) + return WPreturn('请先登录', -1); + + //用户信息 + $user = Db::name('LcUser')->find($uid); + //验证用户是否被冻结 + if ($user['clock'] == 1) { + // return WPreturn('您的账户已被冻结',-1); + } + if ($user['isjy'] == 1) { + return WPreturn(json_lang("账号被锁定,请联系管理员!"), -1); + } + + $adddata['uid'] = $data['uid'] = $uid; + + $pro = Db::name('LcProduct')->find($data['order_pid']); + if (!$pro) + return WPreturn(json_lang("产品未找到"), -1); + + //验证是否开市 + if ($pro['isopen']) { + $isopen = ChickIsOpen($pro['id']); + if ($isopen == 0) { + return WPreturn(json_lang("休市中"), -1); + } + } + else { + return WPreturn(json_lang("休市中"), -1); + } + + //持仓限制 + if (getinfo('order_max_amount') > 0) { + $allfee = Db::name('LcOrder')->where(array('ostaus' => 0, 'uid' => $data['uid']))->sum('fee'); + $allfee = $allfee ? $allfee : 0; + + if ($allfee + $data['order_price'] > getinfo('order_max_amount')) { + return WPreturn(json_lang("持仓最大金额为") . getinfo('order_max_amount') . '!', -1); + } + } + if (getinfo('order_max_count') > 0) { + $allcount = Db::name('LcOrder')->where(array('ostaus' => 0, 'uid' => $data['uid']))->count(); + // if($allcount > getinfo('order_max_count')){ + // return WPreturn('最大持仓单数为'.$conf['order_max_count'].'!',-1); + // } + } + + if ($data['order_price'] > getinfo('order_max')) { + return WPreturn('单笔持仓金额最大为' . getinfo('order_max') . '!', -1); + } + if ($data['order_price'] < getinfo('order_min')) { + return WPreturn('单笔持仓金额最小为' . getinfo('order_min') . '!', -1); + } + + //手续费 + $web_poundage = 0; + if (getinfo('order_charge') > 0) { + $web_poundage = round($data['order_price'] * getinfo('order_charge') / 100, 2); + } + $moneyfrom = 1; + //验证余额是否够 + if ($user['money'] < $data['order_price'] + $web_poundage) { + return WPreturn(json_lang("账户余额不足,请确认"), -1); + // $getyebuc=Db::table('lc_yuebao_uc')->where('uid = '.$uid)->find(); + // if($getyebuc['balance'] < $data['order_price'] + $web_poundage){ + // if($getyebuc['balance'] + $user['money']< $data['order_price'] + $web_poundage){ + // return WPreturn(json_lang("账户余额不足,请确认"),-1); + // };$moneyfrom=3; + + // };$moneyfrom=2; + + } + if (floatval($data['newprice']) <= 0) { + return WPreturn(json_lang("操作失败"), -1); + } + + //建仓 + $adddata['buytime'] = time(); + $adddata['endprofit'] = $data['order_sen']; + $adddata['pid'] = $data['order_pid']; + $adddata['ostyle'] = $data['order_type']; + $adddata['buyprice'] = $data['newprice']; + $adddata['endloss'] = $data['order_shouyi']; + $adddata['lossrate'] = $data['order_kuishun']; + $adddata['eid'] = 2; + $adddata['selltime'] = $adddata['buytime'] + $adddata['endprofit']; + $adddata['fee'] = $data['order_price']; + $adddata['ptitle'] = $pro['title']; + $adddata['ostaus'] = '0'; + $adddata['sx_fee'] = $web_poundage; + // $adddata['limit_points'] = $data['limit_points']; + // $adddata['stop_points'] = $data['stop_points']; + + $allfee = $adddata['fee'] + $adddata['sx_fee']; + + //会员建仓后金额 + $adddata['commission'] = $user['money'] - $allfee; + //订单号 + $adddata['orderno'] = date('YmdHis') . $uid . rand(1111, 9999); + //var_dump($adddata); + //下单 + $id = Db::name('LcOrder')->insertGetId($adddata); + if ($id) { + //下单成功减用户余额 + if ($moneyfrom == 1) { + addFinance($uid, $allfee, 2, '下单[' . $adddata['orderno'] . ']从账户扣除金额 ' . $allfee . '元'); + setNumber('LcUser', 'money', $allfee, 2, "id = $uid"); + } + if ($moneyfrom == 2) { + addFinance($uid, $allfee, 2, '下单[' . $adddata['orderno'] . ']从余额宝扣除金额 ' . $allfee . '元'); + setNumber('LcUser', 'money', $allfee, 2, "id = $uid"); + //Db::table('lc_yuebao_uc')->where('uid = '.$uid)->update(['balance']) + } + + + $nowmoney = $adddata['commission']; + if ($nowmoney < 0) { + $nowmoney = 0; + } + + $adddata['oid'] = $id; + $order_rand = rand(1, 1000); + + $adddata['order_rand'] = $order_rand; + $res = base64_encode(json_encode($adddata)); + return WPreturn($res, 1); + } + else { + return WPreturn(json_lang("操作失败"), -1); + } + } + + public function goorder() { + // { + // "price": "275.661", + // "oid": "463", + // "order_rand": "547" + // } + $data = $this->request->param(); + $oid = $data['oid']; + $price = $data['price']; + $order_rand = $data['order_rand']; + + $static = 1; //1成功返回并继续运行 0失败返回不运行 2 失败返回继续轮询 + if (!$oid || !$price || !$order_rand) { + die('0' . $oid . '-' . $price . '-' . $order_rand); + } + + $order = Db::name('LcOrder')->find($oid); + + //没有此订单 + if (!$order) { + die('1' . $oid . '-' . $price . '-' . $order_rand); + } + + //没有平仓 + if (isset($order['ostyle']) && $order['ostaus'] == 0) { + die('2'); + } + + //已平仓 但是价格相同 + if (isset($order['sellprice']) && $order['sellprice'] == $price) { + cache('goorder_' . $order['id'], null); + die('1'); + } + + //已平仓 但是无效交易 + if (isset($order['is_win']) && $order['is_win'] == 3) { + cache('goorder_' . $order['id'], null); + die('1'); + } + //该订单指定赢亏 + if (isset($order['kong_type']) && $order['kong_type'] != 0) { + cache('goorder_' . $order['id'], null); + die('1'); + } + die('1'); + } + + public function get_price() { + //此刻产品价格 + $pro = Db::name('LcProduct')->field('id,Price')->where(array('isdelete' => 0))->select(); + $prodata = array(); + foreach ($pro as $k => $v) { + $prodata[$v['id']] = $v['Price']; + } + return base64_encode(json_encode($prodata));; + } + + /** + * ajax 通过产品id 获取用户订单, + * @return [type] [description] + * @author lukui 2017-07-22 + */ + public function ajaxorder() { + $uid = $this->app->session->get('uid'); + $pid = $this->request->param('pid'); + if (empty($uid) || empty($pid)) { + return false; + } + //持仓信息 + $map = []; + $map[] = ['uid', '=', $uid]; + $map[] = ['pid', '=', $pid]; + $map[] = ['ostaus', '=', 0]; + $map[] = ['selltime', '>', time()]; + + $list = Db::name('LcOrder')->where($map)->order('id desc')->select(); + foreach ($list as $key => $value) { + $list[$key]['time'] = time(); + } + if ($list) { + return base64_encode(json_encode($list)); + // return json_encode($list); + } + else { + return false; + } + + } + + /** + * ajax 通过产品id 平仓后弹框提示, + * @return [type] [description] + * @author lukui 2017-07-22 + */ + public function ajaxalert() { + $uid = $this->app->session->get('uid'); + $pid = $this->request->param('pid'); + if (empty($uid) || empty($pid)) { + return false; + } + //持仓信息 + $hold = Db::name('LcOrder')->field('id,ploss,fee,eid')->where(array('uid' => $uid, 'ostaus' => 1, 'pid' => $pid, 'isshow' => 0))->order('id desc')->find(); + //修改持仓信息 + $isedit = Db::name('LcOrder')->where('id', $hold['id'])->setField('isshow', '1'); + if ($hold && $isedit) { + return $hold; + } + else { + return false; + } + } + + public function ajaxorder_list() { + $uid = $this->app->session->get('uid'); + if (empty($uid)) { + return false; + } + //持仓信息 + $map = []; + $map[] = ['uid', '=', $uid]; + $map[] = ['ostaus', '=', 0]; + //$map[] = ['selltime','>',time()]; + + $list = Db::name('LcOrder')->where($map)->order('id desc')->select(); + foreach ($list as $key => $value) { + $list[$key]['time'] = time(); + } + if ($list) { + return base64_encode(json_encode($list)); + } + else { + return false; + } + } + + public function getchart() { + $data['hangqing'] = '商品行情'; + $data['jiaoyijilu'] = '交易记录'; + $data['jiaoyilishi'] = '历史委托'; + $data['chicangmingxi'] = '持仓明细'; + $data['lishimingxi'] = '历史明细'; + $data['gendanjiaoyi'] = '跟单交易'; + $res = base64_encode(json_encode($data)); + return $res; + } + + public function orderlist() { + $uid = $this->app->session->get('uid'); + if (empty($uid)) { + return false; + } + $map = []; + $map[] = ['uid', '=', $uid]; + $map[] = ['ostaus', '=', 1]; + + $hold = Db::name('LcOrder')->where($map)->order('id desc')->paginate(20); + return base64_encode(json_encode($hold)); + } + + /** + * 已平仓订单详情 + * @return [type] [description] + * @author lukui 2017-07-21 + */ + public function orderinfo() { + $uid = $this->app->session->get('uid'); + $oid = $this->request->param('oid'); + if (!$oid) { + $this->redirect('orderlist'); + } + $order = Db::name('LcOrder')->where('id', $oid)->find(); + $this->assign($order); + return $this->fetch(); + + } + + /** + * 实时获取以平仓订单 + * @return [type] [description] + */ + public function get_this_order() { + $oid = $this->request->param('oid'); + $map['id'] = $oid; + $map['ostaus'] = 1; + $order = Db::name('LcOrder')->where($map)->find(); + + return base64_encode(json_encode($order)); + } + + /** + * 实时获取以平仓订单 + * @return [type] [description] + */ + public function get_hold_order() { + $oid = $this->request->param('oid'); + $map['id'] = $oid; + $map['ostaus'] = 1; + + $order = Db::name('LcOrder')->where($map)->find(); + + return base64_encode(json_encode($order)); + } + + public function inquiries() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + + $map['uid'] = $uid; + $map['ostaus'] = 1; + + $this->list = Db::name('LcOrder')->where($map)->order('id desc')->select(); + + $this->fetch(); + } + + public function yeb() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + + //var_dump($uid);die; + $where['id'] = $uid; + $userinfo = Db::table('lc_user')->where($where)->find(); + $userbalance = $userinfo['money']; + $map['uid'] = $uid; + $yuebaouc = Db::name('lc_yuebao_uc')->where($map)->find(); + // + if (empty($yuebaouc)) { + $yuebaoucdata = array('uid' => $uid, 'remarks' => time() . "系统自动开户"); + Db::name('lc_yuebao_uc')->insert($yuebaoucdata); + Db::name('lc_yuebao_uclog')->insert($yuebaoucdata); + $yuebaouc = Db::name('lc_yuebao_uc')->where($map)->find(); + }; + $map['status'] = 1; + $yuebao = Db::name('lc_yuebao')->where('status = 1')->order('id desc')->select(); + $yuebaolist = array(); + foreach ($yuebao as $x => $v) { + $v['finishprofit'] = round($v['lowmoney'] * $v['lily'] * $v['days'] / 100 / 365, 4); + $yuebaolist[$x] = $v; + }; + $yuebao = $yuebaolist; + $useryebdoing = Db::name('lc_yuebao_lists')->where($map)->order('id desc')->select(); + $doinglist = array(); + foreach ($useryebdoing as $x => $v) { + $v['start_time'] = date('Y-m-d H:i:s', $v['start_time']); + $v['end_time'] = date('Y-m-d H:i:s', $v['end_time']); + $doinglist[$x] = $v; + }; + $map['status'] = 2; + $useryebclosed = Db::name('lc_yuebao_lists')->where($map)->order('id desc')->select(); + $closedlist = array(); + foreach ($useryebclosed as $x => $v) { + $v['start_time'] = date('Y-m-d H:i:s', $v['start_time']); + $v['end_time'] = date('Y-m-d H:i:s', $v['end_time']); + $closedlist[$x] = $v; + }; + $this->assign('userbalance', $userbalance); + $this->assign('yuebao', $yuebao); + $this->assign('yuebaouc', $yuebaouc); + $this->assign('doinglist', $doinglist); + $this->assign('closedlist', $closedlist); + $this->fetch(); + } + + public function yebtrans() { + Db::startTrans(); + try { + $uid = $this->app->session->get('uid'); + $money = (float)input('post.money'); + if ($money <= 0) { + return json(['code' => 500, 'msg' => '转出金额错误!']); + } + $uc = Db::table('lc_yuebao_uc')->lock(true)->where('uid', $uid)->find(); + if ($money > $uc['trans_balance']) { + return json(['code' => 500, 'msg' => '大于可转出金额!']); + } + Db::table('lc_yuebao_uc')->where('id', $uc['id'])->limit(1)->update(['trans_balance' => round($uc['trans_balance'] - $money, 1)]); + $userMoney = DB::table('lc_user')->where('id', $uid)->value('money'); + Db::table('lc_user')->where('id', $uid)->limit(1)->update(['money' => round($userMoney + $money, 1)]); + DB::table('lc_finance')->insert(['uid' => $uid, 'money' => $money, 'type' => 1, 'reason' => '利息宝转出', 'before' => $userMoney, 'time' => date('Y-m-d H:i:s')]); + return json(['code' => 200, 'msg' => '转出成功!']); + Db::commit(); + } catch (Exception $e) { + Db::rollback(); + return json(['code' => 500, 'msg' => '转出失败!']); + } + } + + public function yebjoinnow() { + // + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + //优先核对账户余额,并扣减。 + $where['id'] = $uid; + $userinfo = Db::table('lc_user')->where($where)->find(); + if ($userinfo['money'] < $_POST['money']) { + return "账户余额不足,请确认"; + die; + }; + + //查找余额宝理财方案信息,并校检。 + $where['id'] = $_POST['yebid']; + $yebinfo = Db::table('lc_yuebao')->where($where)->find(); + if ($yebinfo['lowmoney'] > $_POST['money']) { + return "您办理的方案有最低存入:" . $yebinfo['lowmoney'] . "元,请确认"; + die; + }; + $newmoney = $userinfo['money'] - $_POST['money']; + $res = Db::table('lc_user')->where('id', $userinfo['id'])->update(['money' => $newmoney]); + if (!$res) { + $this->error(json_lang("网络异常,请稍后再试:")); + } + $res = DB::table('lc_finance')->insert(['uid' => $userinfo['id'], 'money' => $_POST['money'], 'type' => 2, 'reason' => '利息宝转入', 'before' => $userinfo['money'], 'time' => date('Y-m-d H:i:s')]); + if (!$res) { + $this->error(json_lang("网络异常,请稍后再试:")); + } + //保存办理记录。 + $savelist = array('uid' => $uid, 'username' => $userinfo['phone'], 'yuebaoid' => $yebinfo['id'], 'yebtitle' => $yebinfo['title'], 'lily' => $yebinfo['lily'], 'money' => $_POST['money'], 'days' => $yebinfo['days'], 'start_time' => time(), 'end_time' => time() + $yebinfo['days'] * 86400, 'nowprofit' => 0, 'finishprofit' => round(($_POST['money'] * $yebinfo['lily'] / 100 / 365) * $yebinfo['days'], 4), 'status' => 1); + $newid = Db::table('lc_yuebao_lists')->insertGetId($savelist); + if (!$newid) { + $this->error(json_lang("网络异常,请稍后再试:")); + } + //再做UC + unset($where['id']); + $where['uid'] = $uid; + $yebucinfo = Db::table('lc_yuebao_uc')->where($where)->find(); + $newbalance = $yebucinfo['balance'] + $_POST['money']; + Db::table('lc_yuebao_uc')->where($where)->update(['balance' => $newbalance]); + //再做UCLOG + $yebuclog = array('uid' => $uid, 'balance' => $yebucinfo['balance'], 'money' => $_POST['money'], 'addtime' => time(), 'remarks' => "用户购买理财方案:" . $yebinfo['title']); + Db::table('lc_yuebao_uclog')->insert($yebuclog); + return "ok"; + die; + //扣减余额 + + var_dump($_POST); + die; + + } + + public function yebstop() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + + $getlistinfo = Db::table('lc_yuebao_lists')->where('id=' . $_POST['id'])->find(); + + if ($getlistinfo['status'] != 1 or empty($getlistinfo)) { + return "操作失败:订单无法操作!"; + die; + } + + $getuserinfo = Db::table('lc_user')->where('id=' . $getlistinfo['uid'])->find(); + //var_dump($getlistinfo,$getuserinfo);die; + if (!empty($getuserinfo)) { + Db::table('lc_yuebao_lists')->where('id=' . $_POST['id'])->update(['status' => 2, 'end_time' => time()]); + //记录日志! + unset($getlistinfo['id']); + $getlistinfo['status'] = 2; + $getlistinfo['end_time'] = time(); + $getlistinfo['balance'] = $getuserinfo['money']; + $getlistinfo['closetime'] = time(); + $getlistinfo['remarks'] = "客户手动结算"; + Db::table('lc_yuebao_log')->insert($getlistinfo); + //更新用户余额 + $newbalance = $getuserinfo['money'] + $getlistinfo['nowprofit'] + $getlistinfo['money']; + Db::table('lc_user')->where('id=' . $getlistinfo['uid'])->update(['money' => $newbalance]); + //更新UC + $where['uid'] = $uid; + $yebucinfo = Db::table('lc_yuebao_uc')->where($where)->find(); + $newbalance = $yebucinfo['balance'] - $getlistinfo['money']; + Db::table('lc_yuebao_uc')->where($where)->update(['balance' => $newbalance]); + //再做UCLOG + $yebuclog = array('uid' => $uid, 'balance' => $yebucinfo['balance'], 'money' => $getlistinfo['money'], 'addtime' => time(), 'remarks' => "用户购买理财方案:" . $getlistinfo['title']); + Db::table('lc_yuebao_uclog')->insert($yebuclog); + + return "ok"; + die; + + } + else { + return "操作失败:订单无法操作!"; + die; + } + + } + + public function yebkeep() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $getlistinfo = Db::table('lc_yuebao_lists')->where('id=' . $_POST['id'])->find(); + if ($getlistinfo['status'] == 2) { + return "操作失败:订单无法操作!"; + die; + } + elseif ($getlistinfo['status'] == 1) { + $getlistinfo['end_time'] = $getlistinfo['end_time'] + $getlistinfo['days'] * 86400; + } + unset($getlistinfo['id']); + Db::table('lc_yuebao_lists')->where('id=' . $_POST['id'])->update(['end_time' => $getlistinfo['end_time']]); + return "操作成功"; + die; + } + /** + * @description:身份认证 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function verified() { + $uid = $this->app->session->get('uid'); + if (!$uid) + $this->redirect('/index/login'); + $this->user = Db::name('LcUser')->find($uid); + if ($this->request->isPost()) { + $data = $this->request->param(); + $check = Db::name('LcUser')->where("idcard = '{$data['idcard']}' AND id <> $uid")->find(); + if ($check) + $this->error('身份证号码已被其他账号绑定!'); + if (getInfo('cert') == 1) { + $auth_check = idCardAuth($data['idcard'], $data['name']); + if ($auth_check['code'] == 0) + $this->error($auth_check['msg']); + } + else { + if (!judge($data['name'], 'name')) + $this->error('名字不正确!'); + if (!judge($data['idcard'], 'idcard')) + $this->error('身份证号码不正确!'); + } + if (Db::name('LcUser')->where(['id' => $uid])->update(['name' => $data['name'], 'idcard' => $data['idcard'],'z_id_card' => $data['z_id_card'],'f_id_card' => $data['f_id_card'], 'rz_status' => 1])) { + $this->success('认证信息提交成功!'); + } + else { + $this->error('认证信息提交失败!'); + } + } + $this->fetch(); + } +} diff --git a/application/index/controller/api/Index.php b/application/index/controller/api/Index.php new file mode 100644 index 0000000..d89d79e --- /dev/null +++ b/application/index/controller/api/Index.php @@ -0,0 +1,1580 @@ +where(['token' => $token])->value('id'); + if (!$uid) { + $this->error('', '', 1002); + } else { + Db::name('LcUser')->where(['token' => $token])->update([ + 'access_time' => time(), + ]); + $this->uid = $uid; + } + } + + /** + * @description:首页 + * @date: 2020/5/13 0013 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function index() + { + $uid = $this->uid; + if (!$uid) { + if (true) { // true:开启线路;false:关闭线路 + return $this->fetch(); + } + } + } + + + /** + * @description:未登录新闻页 + * @date: 2020/5/14 0014 + */ + public function news() + { + $this->fetch('new_index'); + } + + /** + * Describe: 新闻页面 + * DateTime: 2020/5/14 1:16 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function my_news() + { + $this->login = 0; + if (!isLogin()) $this->login = 1; + $this->conf = Db::name('LcReward')->get(1); + $this->fetch('my_news'); + } + + /** + * Describe: 关于我们 + * DateTime: 2020/5/14 0:31 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function aboutUs() + { + $id = input('id', 2); + $uid = $this->uid; + $where['uid'] = $uid; + $where['mid'] = $id; + $ret = Db::name('LcMsgIs')->where($where)->find(); + if (!$ret) Db::name('LcMsgIs')->insertGetId(['uid' => $uid, 'mid' => $id]); + $msg = Db::name('LcMsg')->find($id); + if ($msg) { + $this->success(json_lang("操作成功"), $msg); + } else { + $this->error('暂无数据'); + } + } + public function msg() + { + $uid = $this->uid; + $list = Db::name('LcMsg')->where(['uid' => $uid])->order('id desc')->select(); + $this->success(json_lang("操作成功"), $list); + } + public function msgInfo() + { + $uid = $this->uid; + $list = Db::name('LcMsg')->where(['uid' => $uid,'id'=>Request::param('id')])->find(); + if (!empty($list)){ + Db::name('LcMsg')->where(['uid' => $uid,'id'=>Request::param('id')])->update(['status' => 1]); + } + $this->success(json_lang("操作成功"), $list); + } + /** + * Describe: 隐私政策 + * DateTime: 2020/5/14 0:31 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function privacyPolicy() + { + $id = input('id', 1); + $uid = $this->uid; + + $where['uid'] = $uid; + $where['mid'] = $id; + $ret = Db::name('LcMsgIs')->where($where)->find(); + if (!$ret) Db::name('LcMsgIs')->insertGetId(['uid' => $uid, 'mid' => $id]); + $msg = Db::name('LcMsg')->find($id); + if ($msg) { + $this->success(json_lang("操作成功"), $msg); + } else { + $this->error('暂无数据'); + } + } + + /** + * Describe: 帮助中心 + * DateTime: 2020/5/14 0:31 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function helpCenter() + { + $id = input('id', 3); + $uid = $this->uid; + + $where['uid'] = $uid; + $where['mid'] = $id; + $ret = Db::name('LcMsgIs')->where($where)->find(); + if (!$ret) Db::name('LcMsgIs')->insertGetId(['uid' => $uid, 'mid' => $id]); + $msg = Db::name('LcMsg')->find($id); + if ($msg) { + $this->success(json_lang("操作成功"), $msg); + } else { + $this->error('暂无数据'); + } + } + + + /** + * Describe: 新闻奖励 + * DateTime: 2020/5/14 1:27 + * @throws \think\Exception + * @throws \think\Exception\DbException + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\PDOException + */ + public function news_reward() + { + $uid = $this->uid; + $reward = Db::name('LcReward')->get(1); + $start_time = strtotime(date("Y-m-d", time())); + $end_time = $start_time + 60 * 60 * 24; + $reward['newsmoney'] = round($this->randFloat($reward['newsmoney'], $reward['newsmoneytwo']), 2); + $todaynum = Db::name('LcSeeLog')->where('uid=\'' . $uid . '\' and dateline > \'' . $start_time . '\' and dateline < \'' . $end_time . '\'')->count(); + if ($todaynum < $reward['getnum']) { + addFinance($uid, $reward['newsmoney'], 1, '浏览新闻,系统赠送' . $reward['newsmoney'] . '元'); + setNumber('LcUser', 'money', $reward['newsmoney'], 1, "id = $uid"); + setNumber('LcUser', 'income', $reward['newsmoney'], 1, "id = $uid"); + $add = array('uid' => $uid, 'dateline' => time(), 'money' => $reward['newsmoney']); + Db::name('LcSeeLog')->insert($add); + $morenum = $reward['getnum'] - $todaynum - 1; + $this->success('奖励领取成功', ['more' => $morenum, 'times' => $reward['seetime'] * 60]); + } else { + $this->error('今日领取次数用尽'); + } + } + + private function randFloat($min = 0, $max = 1) + { + return $min + mt_rand() / mt_getrandmax() * ($max - $min); + } + + /** + * @description:首页 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function home() + { +// $this->ater = Db::name('LcArticle')->where(['type'=>17,'show'=>1])->find(); +// $this->banner = Db::name('LcSlide')->where(['show'=>1])->order("sort asc,id desc")->select(); + $allproducts = Db::name('LcProduct')->where(['isdelete' => 0, 'iskq' => 1])->order("sort asc,id desc")->select(); + //判断是否开市 + $weekday = date("w"); + $newallproducts = array(); + if ($weekday == 0) $weekday = 7; + foreach ($allproducts as $x => $p) { + if (strpos($p['code'], "btc") !== false || strpos($p['code'], "usdt") !== false) { + $p['isclosetime'] = 0; + $ttimes = $p['opentime_' . $weekday]; + if (empty($ttimes)) { + $p['isclosetime'] = 1; + continue; + }; + //var_dump($this->info['opentime_'.$weekday],$weekday);die; + if (!empty($ttimes)) { + $optime = 0; + $ttimesarr = explode("|", $ttimes); + foreach ($ttimesarr as $t) { + $t = explode('~', $t); + if (time() > strtotime(date('Y-m-d ' . $t[0])) and time() < strtotime(date('Y-m-d ' . $t[1]))) $optime = $optime + 1; + } + if ($optime == 0) $p['isclosetime'] = 1; + } + $newallproducts[$x] = $p; + } + } + $data['products'] = $newallproducts; +// $data['ater'] = Db::name('LcArticle')->where(['type'=>17,'show'=>1])->find(); + $data['banner'] = Db::name('LcSlide')->where(['show' => 1])->order("sort asc,id desc")->select(); + $this->success(json_lang("操作成功"), $data); + } + + /** + * @description:首页底部交易对信息 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function getProducts() + { + $allproducts = Db::name('LcProduct')->where(['isdelete' => 0, 'iskq' => 1])->order("sort asc,id asc")->select(); + //判断是否开市 + $weekday = date("w"); + $newallproducts = array(); + if ($weekday == 0) $weekday = 7; + foreach ($allproducts as $x => $p) { + if (strpos($p['code'], "btc") !== false || strpos($p['code'], "usdt") !== false) { + $p['isclosetime'] = 0; + $ttimes = $p['opentime_' . $weekday]; + if (empty($ttimes)) { + $p['isclosetime'] = 1; + continue; + }; + //var_dump($this->info['opentime_'.$weekday],$weekday);die; + if (!empty($ttimes)) { + $optime = 0; + $ttimesarr = explode("|", $ttimes); + foreach ($ttimesarr as $t) { + $t = explode('~', $t); + if (time() > strtotime(date('Y-m-d ' . $t[0])) and time() < strtotime(date('Y-m-d ' . $t[1]))) $optime = $optime + 1; + } + if ($optime == 0) $p['isclosetime'] = 1; + } + $newallproducts[$x] = $p; + } + } + $data = $newallproducts; + $this->success(json_lang('操作成功'), $data); + } + + /** + * @description:首页轮播图信息 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function getBanner() + { + $data = Db::name('LcSlide')->where(['show' => 1])->order("sort asc,id desc")->select(); + $this->success(json_lang('操作成功'), $data); + } + + /** + * @description:项目列表 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function lists() + { + $uid = $this->uid; + if (!$uid) $this->redirect('/index/login'); + $this->ljsy = Db::name('LcMallInvestList')->where(['status' => 1, 'uid' => $uid])->sum("money1"); + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcMallInvest')->where("time2 >= '$now' and uid = $uid")->count(); + $this->dqkj = Db::name('LcMallInvest')->where("time2 <= '$now' and uid = $uid")->count(); + $this->invest = Db::name('LcMallInvest')->where('uid', $uid)->where("time2 >= '$now'")->order("id desc")->select(); + $this->fetch(); + } + + public function normalfutures() + { + $uid = $this->uid; + if (!$uid) $this->redirect('/index/login'); + $this->ljsy = Db::name('LcInvestList')->where(['status' => 1, 'uid' => $uid])->sum("money1"); + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcInvest')->where("time2 >= '$now'")->count(); + $this->dqkj = Db::name('LcInvest')->where("time2 <= '$now'")->count(); + $this->invest = Db::name('LcInvest')->where('uid', $uid)->where("time2 >= '$now'")->order("id desc")->select(); + $this->fetch(); + } + + public function expirefutures() + { + $uid = $this->uid; + if (!$uid) $this->redirect('/index/login'); + $this->ljsy = Db::name('LcInvestList')->where(['status' => 1, 'uid' => $uid])->sum("money1"); + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcInvest')->where("time2 >= '$now'")->count(); + $this->dqkj = Db::name('LcInvest')->where("time2 <= '$now'")->count(); + $this->invest = Db::name('LcInvest')->where('uid', $uid)->where("time2 <= '$now'")->order("id desc")->select(); + $this->fetch(); + } + + /** + * @description:项目列表 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function ex_lists() + { + $uid = $this->uid; + if (!$uid) $this->redirect('/index/login'); + $this->ljsy = Db::name('LcMallInvestList')->where(['status' => 1, 'uid' => $uid])->sum("money1"); + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcMallInvest')->where("time2 >= '$now'")->count(); + $this->dqkj = Db::name('LcMallInvest')->where("time2 <= '$now'")->count(); + $this->invest = Db::name('LcMallInvest')->where('uid', $uid)->where("time2 <= '$now'")->order("id desc")->select(); + $this->fetch(); + } + + /** + * @description:项目详情 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function item() + { + $uid = $this->uid; + if (!$uid) $this->redirect('/index/login'); + $id = Request::param('id'); + if (!$id) msg('无效参数', 2, '/index'); + $this->data = Db::name('LcItem')->where(['id' => $id])->find(); + if (!$this->data) msg('无效项目', 2, '/index'); + if (date('Y-m-d H:i:s') < $this->data['time']) msg('项目暂未开始!', 2, '/index'); + $this->fetch(); + } + + /** + * @description:矿机详情 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function mall_detail() + { + $uid = $this->uid; + if (!$uid) $this->redirect('/index/login'); + $id = Request::param('id'); + if (!$id) msg('无效参数', 2, '/index'); + $this->data = Db::name('LcMall')->where(['id' => $id])->find(); + if (!$this->data) msg('无效矿机', 2, '/index'); + $this->fetch(); + } + + /** + * @description:投资 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function investment() + { + $arr = array(); + $uid = $this->uid; + + $id = input('id', ''); + if (!$id) $this->error(json_lang("产品不存在")); + $data = Db::name('LcItem')->where(['id' => $id])->find(); + if (!$data) $this->error(json_lang("产品不存在")); + if (date('Y-m-d H:i:s') < $data['time']) $this->error('项目暂未开始!'); + if (getProjectPercent($data['id']) == 100) $this->error('项目已满,请选择其他项目!'); + $user = Db::name('LcUser')->find($uid); + if ($user['auth'] != 1) $this->error('请实名认证后再投资!'); + //抵用券 + $voucher_info = Db::name('LcVoucher')->where("uid = $uid AND status = 2")->order('money desc')->select(); + if (empty($voucher_info)) { + $arr['vinfo'] = array(); + } else { + $arr['vinfo'] = $voucher_info; + } + $count = Db::name('LcVoucher')->where('status = 1 and uid = ' . $uid . ' and xid = ' . $id)->count(); + if ($data['usevoucher'] <= $count) { + $arr['voushow'] = 0; + $arr['usevounum'] = 0; + } else { + $arr['voushow'] = 1; + $arr['usevounum'] = $data['usevoucher'] - $count; + } + $arr['item'] = $data; + $arr['user'] = $user; + //检查等级 + $level = Db::name('LcItemClass')->alias('c')->field("c.id,m.value")->join("lc_user_member m", "c.member_id = m.id")->where("c.id = {$data['class']}")->find(); + if ($user['value'] < $level['value']) $this->error('您的等级不够!'); + if (Request::isPost()) { + $param = Request::param(); +// $voucher = $param['voucher']; + $voucher = 0; + $money = $param['money']; + if ($voucher) { + $arrvid = explode(',', $voucher); + $vouallmoney = 0; + foreach ($arrvid as $k => $v) { + $voucherinfos = Db::name('LcVoucher')->where("vid = '$v'")->find(); + if (empty($voucherinfos)) { + msg('抵用券不存在', 2, '/index'); + } + if ($voucherinfos['status'] != 2) { + msg('抵用券已使用', 2, '/index'); + } + $vouallmoney = $vouallmoney + $voucherinfos['money']; + } + $count = $count + count($arrvid); + if ($count > $data['usevoucher']) { + msg('最多使用' . $data['usevoucher'] . '张投资抵用券', 2, '/index'); + } + $money = $param['money'] - $vouallmoney; + if ($money < 0) $money = 0; + } + $my_count = Db::name('LcInvest')->where(['uid' => $uid, 'pid' => $id])->count(); + if ($data['num'] <= $my_count) msg('该项目每人限投' . $data['num'] . '次!', 2, '/index'); + if ($user['password2'] != md5($param['pwd'])) msg('请输入正确的交易密码!', 2, '/index'); + if ($user['money'] < $money) msg('余额不足,请充值后再进行投资!', 2, '/index'); + if ($data['max'] < $money) msg('投资金额大于项目最大投资额度!', 2, '/index'); + if (getProjectSurplus($data['id']) < $money) msg('投资金额大于项目剩余投资额度!', 2, '/index'); + if ($data['min'] > $money) msg('投资金额小于项目最小投资额度!', 2, '/index'); + addFinance($uid, $money, 2, '投资项目:' . $data['title'] . ',使用余额' . $money . '元'); + setNumber('LcUser', 'money', $money, 2, "id = $uid"); + setInvestReward_old($uid, $money); + if ($voucher) { + foreach ($arrvid as $k => $v) { + Db::name('LcVoucher')->where("vid = '{$v}'")->update(array('status' => 1, 'xid' => $id, 'title' => $data['title'])); + } + } + if (getInvestList($id, $money, $uid)) { + if (0 < $data['red']) { + $multiple = floor($money / $data['min']) * $data['red'] ?: 0; + + if (0 < $multiple) { + addFinance($uid, $multiple, 1, '投资送红包'); + setNumber('LcUser', 'money', $multiple, 1, "id = $uid"); + } + } + msg('投资成功!', 2, '/index/user/index'); + } + msg('投资失败!', 2, '/index/user/index'); + } + $this->success($arr); + } + + + /** + * Describe:文章列表 + * DateTime: 2020/5/14 21:13 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function about_list() + { + $id = Request::param('id'); + $list = Db::name('lcArticle')->where(['type' => $id,'lang' => Lang::detect(), 'show' => 1])->select(); + $this->success('', ['list' => $list]); + } + public function home_article() + { + $article = Db::name('lcArticle')->where(['type' => 17,'lang' => Lang::detect(), 'show' => 1])->order('id desc')->find(); + $this->success('', $article); + } + /** + * Describe:文章详情 + * DateTime: 2020/5/14 21:25 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function about_details() + { + $id = Request::param('id'); + $article = Db::name('lcArticle')->where(['id' => $id, 'show' => 1])->find(); + $this->success('', $article); + } + + + /** + * Describe:开始抽奖 + * DateTime: 2020/5/14 23:06 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function prize_start() + { + $res = $this->get_gift(); + $item = $res['id'] + 1; + if (empty($item)) $this->error("参数缺失,请刷新后重试!"); + if (!isLogin()) $this->error("参数缺失,请刷新后重试!", '', 2); + $uid = $this->uid; + $this->user = Db::name('LcUser')->find($uid); + if ($this->user['prize'] <= 0) $this->error("抽奖次数不足,请投资后再进行抽奖!"); + $prize = Db::name("LcPrize")->find(1); + $name = $prize['name' . $item] ?: '谢谢参与'; + $type = $prize['type' . $item] ?: '无'; + $reason = $prize['reason' . $item] ?: '继续投资,还有机会哟!'; + $money = $prize['money' . $item] ?: 0; + if ($prize['endtime'] < date('Y-m-d H:i:s')) $this->error("活动已结束"); + $add_prize = array('uid' => $uid, 'item' => $item, 'name' => $name, 'type' => $type, 'money' => $money, 'time' => date('Y-m-d H:i:s')); + Db::name("LcPrizeList")->insert($add_prize); + if ($prize['type' . $item] == 1) { + addFinance($uid, $money, 1, '抽奖获得' . $money . '元现金红包'); + setNumber('LcUser', 'money', $money, 1, "id = $uid"); + } + setNumber('LcUser', 'prize', 1, 2, "id = $uid"); + $this->success($reason, ['item' => $item]); + } + + /** + * Describe:抽奖记录 + * DateTime: 2020/5/14 23:14 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function prize_list() + { + $uid = $this->uid; + if (!$uid) $this->redirect('/index/login'); + $this->prize = Db::name("LcPrizeList")->where("uid = $uid AND type <> 0")->order("id desc")->select(); + $this->fetch(); + } + + /** + * Describe:积分商城 + * DateTime: 2020/5/14 23:48 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function shop() + { + $uid = $this->uid; + if (!$uid) $this->redirect('/index/login'); + $this->shop = Db::name("LcShop")->where("num > 0")->order("sort asc,id desc")->select(); + $this->fetch(); + } + + /** + * Describe:商品详情 + * DateTime: 2020/5/15 0:06 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function shop_details() + { + $uid = $this->uid; + if (!$uid) $this->redirect('/index/login'); + $id = Request::param('id'); + if (!$id) msg('参数缺失!', 2, 'index/user/index'); + $this->goods = Db::name("LcShop")->where(['id' => $id])->find(); + $integral = Db::name('LcUser')->where(['id' => $uid])->value('integral'); + $this->count = $integral ?: 0; + $this->fetch(); + } + + /** + * Describe:积分兑换 + * DateTime: 2020/5/15 0:15 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function shop_exchange() + { + $uid = $this->uid; + if (!$uid) $this->error("请先登录", '', 2); + $gid = Request::param('gid'); + if (!$gid) msg('参数缺失!', 2, 'index/user/index'); + $this->goods = Db::name("LcShop")->where(['id' => $gid])->find(); + if (!$this->goods) msg('暂无该商品!', 2, 'index/user/index'); + $this->user = Db::name('LcUser')->find($uid); + if ($this->user['integral'] < $this->goods['integral']) $this->error("积分不足,请投资后再进行兑换!"); + if ($this->goods['num'] <= 0) $this->error("商品数量不足,请兑换其他商品!"); + $add_order = array('uid' => $uid, 'gid' => $gid, 'goods' => $this->goods['title'], 'img' => $this->goods['img'], 'integral' => $this->goods['integral'], 'type' => $this->goods['type'], 'money' => $this->goods['money'], 'time' => date('Y-m-d H:i:s')); + Db::name("LcShopOrder")->insert($add_order); + setNumber('LcUser', 'integral', $this->goods['integral'], 2, "id = $uid"); + setNumber('LcShop', 'num', 1, 2, "id = $gid"); + if ($this->goods['type'] == '1') { + addFinance($uid, $this->goods['money'], 1, '积分兑换获得' . $this->goods['money'] . '元现金红包'); + setNumber('LcUser', 'money', $this->goods['money'], 1, "id = $uid"); + $this->success($this->goods['money'] . "元现金下发到您的余额!"); + } + $this->success("兑换成功,请联系客服邮寄!"); + } + + /** + * Describe:兑换记录 + * DateTime: 2020/5/15 0:22 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function shop_order() + { + $uid = $this->uid; + if (!$uid) $this->redirect('/index/login'); + $this->shop_order = Db::name("LcShopOrder")->where(['uid' => $uid])->order("id desc")->select(); + $this->fetch(); + } + + /** + * Describe:抽奖算法 + * DateTime: 2020/5/14 22:46 + * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + private function get_gift() + { + $data = Db::name("LcPrize")->find(1); + $surplus = 100 - $data['odds1'] - $data['odds2'] - $data['odds3'] - $data['odds4'] - $data['odds5']; + if (0 < $surplus) { + $data['odds6'] = $surplus; + } else { + $data['odds6'] = 0; + } + //奖品数组 + $prize_arr = array( + '0' => array('id' => 1, 'prize' => $data['name1'], 'v' => $data['odds1']), + '1' => array('id' => 2, 'prize' => $data['name2'], 'v' => $data['odds2']), + '2' => array('id' => 3, 'prize' => $data['name3'], 'v' => $data['odds3']), + '3' => array('id' => 4, 'prize' => $data['name4'], 'v' => $data['odds4']), + '4' => array('id' => 5, 'prize' => $data['name5'], 'v' => $data['odds5']), + '5' => array('id' => 6, 'prize' => '谢谢参与', 'v' => $data['odds6']), + ); + foreach ($prize_arr as $key => $val) { + $arr[$val['id']] = $val['v']; + } + $rid = $this->get_rand($arr); + $res['yes'] = $prize_arr[$rid - 1]['prize']; + $res['id'] = $rid - 1; + unset($prize_arr[$rid - 1]); + shuffle($prize_arr); + for ($i = 0; $i < count($prize_arr); $i++) { + $pr[] = $prize_arr[$i]['prize']; + } + $res['no'] = $pr; + if ($res['yes'] != '谢谢参与') { + $result['status'] = 1; + $result['name'] = $res['yes']; + $result['id'] = $res['id']; + } else { + $result['status'] = -1; + $result['msg'] = $res['yes']; + $result['id'] = $res['id']; + } + return $result; + } + + /** + * Describe:随机 + * DateTime: 2020/5/14 22:49 + * @param $proArr + * @return int|string + */ + private function get_rand($proArr) + { + $result = ''; + $proSum = array_sum($proArr); + foreach ($proArr as $key => $proCur) { + $randNum = mt_rand(1, $proSum); + if ($randNum <= $proCur) { + $result = $key; + break; + } else { + $proSum -= $proCur; + } + } + unset ($proArr); + return $result; + } + + public function MarketDatas() + { + $period = array( + 1 => '1min', + 60 => '1hour', + 1440 => '1day', + ); + $data = $this->request->param(); + $assets = json_decode(vpost("http://api.zb.center/data/v1/kline?market=btc_qc&type={$period[$data['period']]}&size={$data['coin_nums']}", ""), true); + $btc = json_decode(vpost("http://api.zb.center/data/v1/ticker?market=btc_qc", ""), true); + $result = array( + 'lastprice' => $btc['ticker']['sell'], + 'chg' => $btc['ticker']['riseRate'], + ); + foreach ($assets['data'] as $k => $v) { + $result['time'][$k] = $v[0] / 1000; + $result['date'][$k] = date('Y-m-d H:i:s', $v[0] / 1000); + $result['data'][$k] = array($v[1], $v[2], $v[3], $v[4]); + } + $this->success("OK", $result); + } + + public function GetRealTimeDatas() + { + $ticker = json_decode(vpost("http://api.zb.center/data/v1/allTicker", ''), true); + $data = array( + 0 => array('coin_ad' => round($ticker['btcqc']['riseRate'] / 100, 4), 'coin_name' => 'BTC', 'coin_price' => $ticker['btcqc']['sell']), + 1 => array('coin_ad' => round($ticker['ethqc']['riseRate'] / 100, 4), 'coin_name' => 'ETH', 'coin_price' => $ticker['ethqc']['sell']), + 2 => array('coin_ad' => round($ticker['ltcqc']['riseRate'] / 100, 4), 'coin_name' => 'LTC', 'coin_price' => $ticker['ltcqc']['sell']), + ); + $this->success("OK", $data); + } + + public function mall() + { + $uid = $this->uid; + if (!$uid) $this->redirect('/index/login'); + $this->mall = Db::name('LcMall')->where("stock > 0")->order("sort asc,id desc")->select(); + $this->fetch(); + } + + public function futureslist() + { + $now = date('Y-m-d H:i:s'); + $this->item = Db::name('LcItem')->where("time <= '$now' AND round(percent) < 100")->order("sort asc,id desc")->select(); + $this->fetch(); + } + + /** + * Describe:定时结算任务 + * DateTime: 2020/5/14 22:22 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function item_crontab() + { + $now = time(); + $invest_list = Db::name("LcInvestList")->where("UNIX_TIMESTAMP(time1) <= $now AND status = '0'")->select(); + if (empty($invest_list)) exit('暂无返息计划'); + foreach ($invest_list as $k => $v) { + $data = array('time2' => date('Y-m-d H:i:s'), 'pay2' => $v['pay1'], 'status' => 1); + if (Db::name("LcInvestList")->where(['id' => $v['id']])->update($data)) { + if ($v['pay1'] > 0) { + addFinance($v['uid'], $v['pay1'], 1, $v['title'] . ' 第' . $v['num'] . '期收益' . $v['pay1'] . '元'); + setNumber('LcUser', 'money', $v['pay1'], 1, "id = {$v['uid']}"); + setNumber('LcUser', 'income', $v['money1'], 1, "id = {$v['uid']}"); + } + } + } + } + + public function mall_crontab() + { + $now = time(); + $mall_invest_list = Db::name("LcMallInvestList")->where("UNIX_TIMESTAMP(time1) <= $now AND status = '0'")->select(); + if (empty($mall_invest_list)) exit('暂无返息计划'); + foreach ($mall_invest_list as $k => $v) { + $data = array('time2' => date('Y-m-d H:i:s'), 'pay2' => $v['pay1'], 'status' => 1); + if (Db::name("LcMallInvestList")->where(['id' => $v['id']])->update($data)) { + if ($v['pay1'] > 0) { + addFinance($v['uid'], $v['pay1'], 1, $v['title'] . ' 第' . $v['num'] . '期收益' . $v['pay1'] . 'BTC'); + if ($v['tran_type'] > 1) { + $btc_price = json_decode(vpost("http://api.zb.center/data/v1/ticker?market=btc_qc", ''), true)['ticker']['sell']; + $money = round($btc_price * $data['buynum'], 2); + addFinance($v['uid'], $money, 1, "BTC兑换交易{$money}元"); + setNumber('LcUser', 'money', $money, 1, "id = {$v['uid']}"); + } else { + setNumber('LcUser', 'btc', $v['money1'], 1, "id = {$v['uid']}"); + } + } + if ($v['money2'] > 0) { + addFinance($v['uid'], $v['money2'], 1, $v['title'] . ',保证金退还' . $v['pay1'] . '元'); + setNumber('LcUser', 'money', $v['money2'], 1, "id = {$v['uid']}"); + } + } + } + } + + + /** + * Describe:最新公告 + * DateTime: 2020/5/14 21:02 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function notice() + { + $this->notice = Db::name('lcArticle')->where(['type' => 9, 'show' => 1])->order("id desc")->select(); + $this->fetch(); + } + + public function goods() + { + $uid = $this->uid; + if (!$uid) $this->error(json_lang("用户不存在")); + $id = input('id', ''); + if (!$id) $this->error(json_lang("产品不存在")); + $this->info = Db::name('LcProduct')->find($id); + if (!$this->info) $this->error(json_lang("产品不存在")); + if ($this->info['iskq'] == 0) $this->error(json_lang("产品未开启")); + $this->user = Db::name('LcUser')->find($uid); + if (!$this->user) $this->error(json_lang("用户不存在")); + $weekday = date("w"); + if ($weekday == 0) $weekday = 7; + $ttimes = $this->info['opentime_' . $weekday]; + + if (empty($ttimes)) $this->error(json_lang("产品未开启")); + //var_dump($this->info['opentime_'.$weekday],$weekday);die; + if (!empty($ttimes)) { + $optime = 0; + $ttimesarr = explode("|", $ttimes); + foreach ($ttimesarr as $t) { + $t = explode('~', $t); + if (time() > strtotime(date('Y-m-d ' . $t[0])) and time() < strtotime(date('Y-m-d ' . $t[1]))) $optime = $optime + 1; + } + if ($optime == 0) $this->error(json_lang("产品未开启")); + } + //var_dump($this->info);die; + if ($this->info['protime_1'] > 0) { + $this->info['order_price'][] = ['time' => $this->info['protime_1'], 'prices' => explode('|', trim($this->info['order_amount_1'])), 'shouyi' => $this->info['proscale_1'], 'kuisun' => $this->info['lossrate_1']]; + } + unset($this->info['protime_1']); + unset($this->info['order_amount_1']); + if ($this->info['protime_2'] > 0) { + $this->info['order_price'][] = ['time' => $this->info['protime_2'] , 'prices' => explode('|', trim($this->info['order_amount_2'])), 'shouyi' => $this->info['proscale_2'], 'kuisun' => $this->info['lossrate_2']]; + } + unset($this->info['protime_2']); + unset($this->info['order_amount_2']); + if ($this->info['protime_3'] > 0) { + $this->info['order_price'][] = ['time' => $this->info['protime_3'], 'prices' => explode('|', trim($this->info['order_amount_3'])), 'shouyi' => $this->info['proscale_3'], 'kuisun' => $this->info['lossrate_3']]; + } + unset($this->info['protime_3']); + unset($this->info['order_amount_3']); + if ($this->info['protime_4'] > 0) { + $this->info['order_price'][] = ['time' => $this->info['protime_4'], 'prices' => explode('|', trim($this->info['order_amount_4'])), 'shouyi' => $this->info['proscale_4'], 'kuisun' => $this->info['lossrate_4']]; + } + unset($this->info['protime_4']); + unset($this->info['order_amount_4']); + $this->info['fee'] = getinfo('order_charge'); + $this->success(json_lang("操作成功"), ['info' => $this->info, 'user' => $this->user]); + } + + public function goodsinfo() + { + $pid = Request::param('pid'); + $goods = Db::name('LcProduct')->find($pid); + $res = base64_encode(json_encode($goods)); + return $res; + } + + public function getchart() + { + $data['kaipan'] = '开盘'; + $data['zuidi'] = '最低'; + $data['zuigao'] = '最高'; + $data['Kxian'] = 'k线'; + $data['zoushi'] = '走势'; + $data['DIFF'] = 'DIFF:'; + $data['DEA'] = 'DEA:'; + $data['MACD'] = 'MACD:'; + $data['chicang'] = '持仓'; + $data['maizhang'] = '买涨'; + $data['maidie'] = '买跌'; + $data['xiushi'] = json_lang("休市中"); + $data['tousijine'] = '投资金额'; + $data['chicangmingxi'] = '持仓明细'; + $res = base64_encode(json_encode($data)); + return $res; + } + + public function getprodata() + { + $pid = input('pid', 1); + $data = Db::name('LcProduct')->field('Price,Open,Close,High,Low,UpdateTime')->find($pid); + + if (!$data) { + exit; + } + + $topdata = array( + 'topdata' => $data['UpdateTime'], + 'now' => $data['Price'], + 'open' => $data['Open'], + 'lowest' => $data['Low'], + 'highest' => $data['High'], + 'close' => $data['Close'] + ); + $this->success(json_lang("操作成功"), $topdata); + } + + public function ajaxpro() + { + $id = Request::param('pid'); + $data = Db::name('LcProduct')->field('Price,Open,Close,High,Low,UpdateTime')->find($id); + $data['UpdateTime'] = date('H:i:s', $data['UpdateTime']); + $this->success(json_lang("操作成功"), $data); + } + + public function ajaxdata() + { + $product = Db::name('LcProduct')->field("id,title as Name,Price,isdelete")->where(array('isdelete' => 0))->select(); + foreach ($product as $k => $val) { + $rd = rand(-3, 3); + //修改前端显示位数!!! + $product[$k]['Price'] = round($val['Price'] + $rd * 0.01 * $val['Price'], 3); + $lastprice = session('price' . $val['id']); + $product[$k]['is_rise'] = ($lastprice >= $val['Price']) ? 1 : 2; + $product[$k]['is_deal'] = ChickIsOpen($val['id']); + session('price' . $val['id'], $product[$k]['Price']); + } + $this->success(json_lang("操作成功"), $product); + } + + + public function getkdata() + { + $pid = Request::param('pid'); + if (!$pid) $this->error(json_lang("产品不存在")); + $num = Request::param('num', 200); + if (!$num) $this->error(json_lang("产品不存在")); + $pro = Db::name('LcProduct')->where(['id' => $pid])->find(); + $all_data = array(); + if (!$pro) { + $this->error(json_lang("产品不存在")); + } + $interval = input('interval', '1'); + $nowtime = time() . rand(100, 999); + if ($interval == 'd') { + $klength = 24 * 60 * 60 * $num; + } else { + $klength = $interval * 60 * $num; + } + + //数据库里的产品K线参考值 + + if ($klength == 'd') $klength = 1 * 60 * 24 * $num; + + $k_map['pid'] = $pid; + $pro['procode'] = $pro['code']; + if (strpos($pro['procode'], "btc") !== false or strpos($pro['procode'], "usdt") !== false) { + switch ($interval) { + case '1': + $datalen = "1min"; + break; + case '5': + $datalen = "5min"; + break; + case '15': + $datalen = "15min"; + break; + case '30': + $datalen = "30min"; + break; + case '60': + $datalen = "1hour"; + break; + case 'd': + $datalen = "1day"; + break; + default: + exit; + break; + } + $testacode = explode("_", $pro['procode']); + $newcodess = $testacode[0] . $testacode[1]; + $geturl = "https://api.huobi.pro/market/history/kline?period=" . $datalen . "&size=" . $num . "&symbol=" . $newcodess; + $_data_arr = json_decode(file_get_contents($geturl), true); + if ($_data_arr['status'] == 'ok') { + foreach ($_data_arr['data'] as $k => $v) { + // 数据意义:时间(id) 开盘(open),收盘(close),最低(lowest),最高(highest) + $res_arr[] = [$v['id'], $v['open'], $v['close'], $v['low'], $v['high']]; + } + } + } + + //以下是整体处理。 + //var_dump($pro);die; + + if ($pro['Price'] < $res_arr[$num - 1][1]) { + $_state = 'down'; + } else { + $_state = 'up'; + } + + $all_data['topdata'] = array( + 'topdata' => strtotime("now"), + 'now' => $pro['Price'], + 'open' => $pro['Open'], + 'lowest' => $pro['Low'], + 'highest' => $pro['High'], + 'close' => $pro['Close'], + 'state' => $_state + ); + + $all_data['items'] = $res_arr; + $this->success(json_lang("操作成功"), $all_data); + } + + //curl获取数据 + public function curlfun($url, $params = array(), $method = 'GET') + { + $header = array(); + $opts = array(CURLOPT_TIMEOUT => 10, CURLOPT_RETURNTRANSFER => 1, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HTTPHEADER => $header); + + /* 根据请求类型设置特定参数 */ + switch (strtoupper($method)) { + case 'GET' : + $opts[CURLOPT_URL] = $url . '?' . http_build_query($params); + $opts[CURLOPT_URL] = substr($opts[CURLOPT_URL], 0, -1); + + break; + case 'POST' : + //判断是否传输文件 + $params = http_build_query($params); + $opts[CURLOPT_URL] = $url; + $opts[CURLOPT_POST] = 1; + $opts[CURLOPT_POSTFIELDS] = $params; + break; + default : + } + + /* 初始化并执行curl请求 */ + $ch = curl_init(); + curl_setopt_array($ch, $opts); + $data = curl_exec($ch); + $error = curl_error($ch); + curl_close($ch); + + if ($error) { + $data = null; + } + + return $data; + } + + /** + * 数据风控 + * @param [type] $price [description] + * @param [type] $pro [description] + * @return [type] [description] + * @author lukui 2017-06-27 + */ + public function fengkong($price, $pro) + { + + $point_low = $pro['point_low']; + $point_top = $pro['point_top']; + + $FloatLength = getFloatLength($point_top); + $jishu_rand = pow(10, $FloatLength); + $point_low = $point_low * $jishu_rand; + $point_top = $point_top * $jishu_rand; + $rand = rand($point_low, $point_top) / $jishu_rand; + + $_new_rand = rand(0, 10); + if ($_new_rand % 2 == 0) { + $price = $price + $rand; + } else { + $price = $price - $rand; + } + return $price; + } + + /** + * 全局产品更新 + * @return false|void [type] [description] + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function product() + { + $list = Db::name('LcProduct')->where('isdelete', 0)->select(); + + if (!isset($list)) return false; + + $nowtime = time(); + $_rand = rand(1, 900) / 100000; + $thisdatas = array(); + + foreach ($list as $k => $v) { + $v['procode'] = $v['code']; + + if (strpos($v['procode'], "index") !== false) { + $indexcode = explode("_", $v['procode']); + $v['procode'] = $indexcode[0]; + } + //验证休市 + $isopen = 0; + if ($v['isopen']) { + $isopen = ChickIsOpen($v['id']); + + //var_dump($v);exit(); + } + if (!$isopen) { + continue; + } + + //腾讯证券 + if (strpos($v['procode'], "btc") !== false or strpos($v['procode'], "usdt") !== false) { + $testcode = explode('_', $v['procode']); + $procode = $testcode[0] . $testcode[1]; + $minute = date('i', $nowtime); + if ($minute >= 0 && $minute < 15) { + $minute = 0; + } elseif ($minute >= 15 && $minute < 30) { + $minute = 15; + } elseif ($minute >= 30 && $minute < 45) { + $minute = 30; + } elseif ($minute >= 45 && $minute < 60) { + $minute = 45; + } + $url = 'https://api.huobi.pro/market/history/kline?period=1day&size=2&symbol=' . $procode; + $data_arr = json_decode($this->curlfun($url), true); //dump($url);dump($data_arr); + if ($data_arr['status'] != 'ok') continue; + $thisdata['Price'] = $data_arr['data']['0']['close']; //价格 没有 只能给收盘价 + $thisdata['Open'] = $data_arr['data']['0']['open']; //开盘价 + $thisdata['Close'] = $data_arr['data']['1']['close']; //收盘价 + $thisdata['High'] = $data_arr['data']['0']['high']; //最高价 + $thisdata['Low'] = $data_arr['data']['0']['low']; + $thisdata['Diff'] = $data_arr['data']['0']['close'] - $data_arr['data']['1']['close']; + $thisdata['Diff'] = 0; + $thisdata['DiffRate'] = 0; + } + $thisdata['UpdateTime'] = $nowtime; + $ids = Db::name('LcProduct')->where('id', $v['id'])->update($thisdata); + } + exit; + + } + /** + * 订单类型 + * @param [type] $orders [description] + * @return [type] [description] + */ + public function order_type($orders, $pro, $risk, $data_info) + { + $_prcie = $pro['Price']; + $pid = $pro; + $thispro = array(); //买此产品的用户 + //此产品购买人数 + $price_num = 0; + //买涨金额,计算过盈亏比例以后的 + $up_price = 0; + //买跌金额,计算过盈亏比例以后的 + $down_price = 0; + //买入最低价 + $min_buyprice = 0; + //买入最高价 + $max_buyprice = 0; + //下单最大金额 + $max_fee = 0; + //指定客户亏损 + $to_win = explode('|', $risk['to_win']); + + $is_to_win = array(); + //指定客户亏损 + $to_loss = explode('|', $risk['to_loss']); + + $is_to_loss = array(); + $i = 0; + + foreach ($orders as $k => $v) { + if ($v['pid'] == $pid) { + //没炒过最小风控值直接退出price + if ($v['fee'] < $risk['min_price']) { + //return $pro['Price']; + echo 2222; + } + $i++; + + //单控 赢利 全赢 + if ($v['kong_type'] == '1' || $v['kong_type'] == '3') { + $dankong_ying = $v; + break; + } + //单控 亏损 全亏 + if ($v['kong_type'] == '2' || $v['kong_type'] == '4') { + $dankong_kui = $v; + break; + } + echo $v['uid']; + //是否存在指定盈利 + if (in_array($v['uid'], $to_win)) { + $is_to_win = $v; + break; + } + //是否存在指定亏损 + if (in_array($v['uid'], $to_loss)) { + $is_to_loss = $v; + break; + } + + //总下单人数 + $price_num++; + //买涨买跌累加 + if ($v['ostyle'] == 0) { + $up_price += $v['fee'] * $v['endloss'] / 100; + } else { + $down_price += $v['fee'] * $v['endloss'] / 100; + } + //统计最大买入价与最大下单价 + if ($i == 1) { + $min_buyprice = $v['buyprice']; + $max_buyprice = $v['buyprice']; + $max_fee = $v['fee']; + } else { + if ($min_buyprice > $v['buyprice']) { + $min_buyprice = $v['buyprice']; + + } + if ($max_buyprice < $v['buyprice']) { + $max_buyprice = $v['buyprice']; + } + if ($max_fee < $v['fee']) { + $max_fee = $v['fee']; + } + } + } + + } + + + $proinfo = $data_info->where('id', $pid)->find(); + + //根据现在的价格算出风控点 + $FloatLength = getFloatLength((float)$pro['Price']); + if ($FloatLength == 0) { + $FloatLength = getFloatLength($proinfo['point_top']); + } + + //是否存在指定盈利 + $is_do_price = 0; //是否已经操作了价格 + $jishu_rand = pow(10, $FloatLength); + $beishu_rand = rand(1, 10); + $data_rands = $proinfo['rands']; + + $data_randsLength = getFloatLength($data_rands); + + if ($data_randsLength > 0) { + $_j_rand = pow(200, $data_randsLength) * $data_rands; + $_s_rand = rand(1, $_j_rand) / pow(10, $data_randsLength); + + } else { + $_s_rand = 0; + + } + $do_rand = $_s_rand; + + //先考虑单控 + if (!empty($dankong_ying) && $is_do_price == 0) { //单控 1赢利 + if ($dankong_ying['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } elseif ($dankong_ying['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } + $is_do_price = 1; + } + if (!empty($dankong_kui) && $is_do_price == 0) { //单控 2亏损 + if ($dankong_kui['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } elseif ($dankong_kui['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } + + //echo 2; + $is_do_price = 1; + } + + //指定客户赢利 + if (!empty($is_to_win) && $is_do_price == 0) { + + if ($is_to_win['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } elseif ($is_to_win['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } + $is_do_price = 1; + + } + //是否存在指定亏损 + if (!empty($is_to_loss) && $is_do_price == 0) { + + + if ($is_to_loss['ostyle'] == 0) { + $pro['Price'] = $v['buyprice'] - $do_rand; + } elseif ($is_to_loss['ostyle'] == 1) { + $pro['Price'] = $v['buyprice'] + $do_rand; + } + $is_do_price = 1; + } + //没有任何下单记录 + if ($up_price == 0 && $down_price == 0 && $is_do_price == 0) { + $is_do_price = 2; + } + echo 111111; + exit; + //只有一个人下单,或者所有人下单买的方向相同 + if ((($up_price == 0 && $down_price != 0) || ($up_price != 0 && $down_price == 0)) && $is_do_price == 0) { + + //风控参数 + $chance = $risk["chance"]; + $chance_1 = explode('|', $chance); + $chance_1 = array_filter($chance_1); + //循环风控参数 + if (count($chance_1) >= 1) { + foreach ($chance_1 as $key => $value) { + //切割风控参数 + $arr_1 = explode(":", $value); + $arr_2 = explode("-", $arr_1[0]); + //比较最大买入价格 + if ($max_fee >= $arr_2[0] && $max_fee < $arr_2[1]) { + //得出风控百分比 + if (!isset($arr_1[1])) { + $chance_num = 30; + } else { + $chance_num = $arr_1[1]; + } + + $_rand = rand(1, 100); + continue; + + } + + } + } + + + //买涨 + if (isset($_rand) && $up_price != 0) { + + if ($_rand > $chance_num) { //客损 + $pro['Price'] = $min_buyprice - $do_rand; + + // if( abs($pro['Price'] - $_prcie) > $proinfo['point_top']){ + // $pro['Price'] = $_prcie - ($proinfo['point_top'] + rand(100,999)/1000); + // } + + $is_do_price = 1; + //echo 5; + } else { //客赢 + $pro['Price'] = $max_buyprice + $do_rand; + // if( abs($pro['Price'] - $_prcie) > $proinfo['point_top']){ + // $pro['Price'] = $_prcie + ($proinfo['point_top'] + rand(100,999)/1000); + // } + $is_do_price = 1; + //echo 6; + } + + } + + if (isset($_rand) && $down_price != 0) { + + if ($_rand > $chance_num) { //客损 + $pro['Price'] = $max_buyprice + $do_rand; + // if( abs($pro['Price'] - $_prcie) > $proinfo['point_top']){ + // $pro['Price'] = $_prcie + ($proinfo['point_top'] + rand(100,999)/1000); + // } + $is_do_price = 1; + //echo 7; + } else { //客赢 + $pro['Price'] = $min_buyprice - $do_rand; + // if( abs($pro['Price'] - $_prcie) > $proinfo['point_top']){ + // $pro['Price'] = $_prcie - ($proinfo['point_top'] + rand(100,999)/1000); + // } + $is_do_price = 1; + //echo 8; + } + + } + + + } + + //多个人下单,并且所有人下单买的方向不相同 + if ($up_price != 0 && $down_price != 0 && $is_do_price == 0) { + //买涨大于买跌的 + if ($up_price > $down_price) { + $pro['Price'] = $min_buyprice - $do_rand; + $is_do_price = 1; + } + //买涨小于买跌的 + if ($up_price < $down_price) { + $pro['Price'] = $max_buyprice + $do_rand; + $is_do_price = 1; + } + if ($up_price == $down_price) { + $is_do_price = 2; + } + } + + if ($is_do_price == 2 || $is_do_price == 0) { + $pro['Price'] = $this->fengkong($pro['Price'], $proinfo); + } + $data_info->where('id', $pid)->update($pro); + return $pro['Price']; + } + + public function yebeveryday() + { + if ($this->request->get('token') == "ABCD484088") { + $nowtime = time(); + $keepnum = 0; + $closenum = 0; + $nowprift = 0; + $getdoing = Db::table('lc_yuebao_lists')->where('status=1')->select(); + + foreach ($getdoing as $n => $v) { + //第一步,计算未到期 + if ($v['end_time'] > $nowtime) { + $nowprift = ($v['money'] * $v['lily'] / 100 / 365) * round(($nowtime - $v['start_time']) / 86400, 1); + $nowprift = number_format($nowprift, 5); + Db::table('lc_yuebao_lists')->where('id=' . $v['id'])->update(['nowprofit' => $nowprift]); + $keepnum = $keepnum + 1; + } + //第二步,已到期待结算 + if ($nowtime > $v['end_time']) { + //更新参保状态。 + $nowprift = ($v['money'] * $v['lily'] / 100 / 365) * round(($nowtime - $v['start_time']) / 86400, 1); + $nowprift = number_format($nowprift, 5); + Db::table('lc_yuebao_lists')->where('id=' . $v['id'])->update(['status' => 2, 'end_time' => $nowtime, 'nowprofit' => $nowprift]); + + //获取用户余额; + $getuserinfo = Db::table('lc_user')->where('id=' . $v['uid'])->find(); + //记录日志! + unset($v['id']); + $v['status'] = 2; + $v['end_time'] = time(); + $v['nowprofit'] = $nowprift; + $v['balance'] = $getuserinfo['money']; + $v['closetime'] = time(); + $v['remarks'] = "自动结算"; + Db::table('lc_yuebao_log')->insert($v); + //更新用户余额 + /*$newbalance=$getuserinfo['money']+$nowprift+$v['money']; + Db::table('lc_user')->where('id='.$v['uid'])->update(['money'=>$newbalance]); + //更新UC + $getuc=Db::table('lc_yuebao_uc')->where('uid='.$v['uid'])->find(); + Db::table('lc_yuebao_uc')->where('uid='.$v['uid'])->update(['balance'=>$getuc['balance']-$v['money']]);*/ + $getuc = Db::table('lc_yuebao_uc')->where('uid=' . $v['uid'])->find(); + Db::table('lc_yuebao_uc')->where('uid=' . $v['uid'])->update([ + 'balance' => $getuc['balance'] - $v['money'], + 'trans_balance' => round($getuc['trans_balance'] + $nowprift + $v['money'], 1), + 'totalprofit' => round($getuc['totalprofit'] + $nowprift, 1) + ]); + //记录UCLOG + $saveuclog = array( + 'uid' => $v['uid'], + 'balance' => $getuc['balance'], + 'money' => "-" . $v['money'], + 'addtime' => time(), + 'remarks' => $v['yebtitle'] . "到期结算" + ); + Db::table('lc_yuebao_uclog')->insert($saveuclog); + $closenum = $closenum + 1; + } + } + //结算完,更新UC + + echo("更新" . $keepnum . "个记录,结算" . $closenum . "个记录."); + return json_encode("ABCD484088"); + die; + } + } + + public function upuceveryday1() + { + if ($this->request->get('token') == "ABCD484088") { + $getalluc = Db::table('lc_yuebao_uc')->where("id > 0")->select(); + foreach ($getalluc as $v) { + $res = Db::table('lc_yuebao_uc')->where("uid = " . $v['uid'])->update(['prebalance' => $v['balance'], 'preprofit' => $v['totalprofit']]); + var_dump($v, $res); + } + + } + } + + public function upuceveryday2() + { + if ($this->request->get('token') == "ABCD484188") { + $getalluc = Db::table('lc_yuebao_uc')->where("id > 0")->select(); + foreach ($getalluc as $v) { + $totalprofit = Db::table('lc_yuebao_lists')->where("uid = " . $v['uid'])->sum('nowprofit'); + $res = Db::table('lc_yuebao_uc')->where("uid = " . $v['uid'])->update(['totalprofit' => round($totalprofit, 5)]); + var_dump($v, $res); + } + + } + } + + /** + * 余利宝列表 + */ + public function yeblist() + { + $uid = $this->uid; + $param = Request::param(); + $page = $param['page']; + $limit = $param['limit']; + if ($uid) { + $map['uid'] = $uid; + } + $list = Db::table('lc_yuebao_lists')->where($map)->limit(($page - 1) * $limit, $limit)->order('id desc')->select(); + $this->success(json_lang('操作成功'), [ + 'list' => $list, + 'count' => Db::table('lc_yuebao_lists')->where($map)->count(), + 'page' => $page, + 'limit' => $limit + ]); + } +} diff --git a/application/index/controller/api/Login.php b/application/index/controller/api/Login.php new file mode 100644 index 0000000..2a8ac5f --- /dev/null +++ b/application/index/controller/api/Login.php @@ -0,0 +1,132 @@ +request->isPost()){ + $data = $this->request->param(); +// if(!isset($data['phone'])||!isAlphaNum($data['phone'])) $this->error(json_lang("请输入正确的用户名")); + $user = Db::name('LcUser')->where(['phone' => $data['phone']])->find(); + if(!$user) $this->error(json_lang("用户不存在").'!'); + if (!isset($data['password']) || $user['password'] != md5($data['password'])) $this->error(json_lang("登录密码有误,请重试!")); + if ($user['clock'] == 0) $this->error(json_lang("账号被锁定,请联系管理员!")); + $loginip=$this->request->ip(); + $token = md5($user['id'] . $user['phone'] . time() . $loginip); + Db::name('LcUser')->where(['id' => $user['id']])->update(['access_time'=>time(),'logintime'=>time(),'loginip'=>$loginip,'token'=>$token]); + $user['token'] = $token; + $this->success(json_lang("登录成功"),$user); + } + } + /** + * Describe: 客服链接 + * DateTime: 2020/5/14 0:31 + */ + public function service() + { + $msg = getInfo('service'); + if ($msg) { + $this->success(json_lang("操作成功"), $msg); + } else { + $this->error('暂无数据'); + } + } + + public function smsrand() + { + $rand = rand(1000, 9999); + $this->app->session->set('smsRandCode',$rand); + $this->success('获取成功',$rand); + } + + public function smsSend(){ + $data = $this->request->param(); + if($this->app->session->get('smsRandCode') != $data['code']) $this->error('验证码错误!'); + $phone = $data['phone']; + if (!$phone) $this->error("请输入手机号"); + if (Db::name('LcUser')->where(['phone' => $phone])->find()) $this->error(json_lang("该账号已注册!")); + $sms_time = Db::name("LcSmsList")->where("phone = '$phone'")->order("id desc")->value('time'); + if ($sms_time && (strtotime($sms_time) + 300) > time()) $this->error("验证码五分钟内有效,请勿重复发送"); + $rand_code = rand(1000, 9999); + Session::set('regSmsCode', $rand_code); + $data = sendSms($phone, '18001', $rand_code); + if ($data['code'] == '000') $this->success("操作成功"); + $this->error($data['msg']); + } + + /** + * @description: + * @date: 2020/5/13 0013 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function reg(){ + if(Request::isPost()){ + $data = Request::param(); + if(Db::name('LcUser')->where(['phone' => $data['phone']])->find()) $this->error(json_lang("该账号已注册!")); + if(strlen($data['password']) < 6 || 16 < strlen($data['password'])) $this->error(json_lang("请输入6-16位密码!")); + + if($data['password'] != $data['password2']){ + $this->error(json_lang("两次密码不一致")); + } + + if(strlen($data['password3']) < 6 || 16 < strlen($data['password3'])) $this->error('请输入6-16位支付密码!'); + if($data['password3'] != $data['password4']){ + $this->error(json_lang("两次支付密码不一致")); + } + $top = Db::name('SystemConfig')->where(['value' => $data['top'],'name'=>'inviter_code'])->find(); + if (empty($top)) { + $this->error(json_lang("邀请人不存在")); + } + $reward = Db::name('LcReward')->get(1); + $add = array( + 'zcly'=>$_SERVER['SERVER_NAME'], + 'phone'=>$data['phone'], + 'phones'=>$data['phones'], + 'password'=>md5($data['password']), + 'password2'=>md5($data['password3']), + 'mwpassword'=>$data['password'], + 'mwpassword2'=>$data['password3'], + 'top'=>0, + 'logintime'=>time(), + 'money'=>$reward['register'] ?: 0, + 'clock'=>1, + 'value'=>$reward['registerzzz'] ?: 0, + 'time'=>date('Y-m-d H:i:s'), + 'ip'=>$this->request->ip(), + 'loginip'=>$this->request->ip(), + 'member'=>8016, + ); + $uid = Db::name('LcUser')->insertGetId($add); + if (empty($uid)) $this->error(json_lang("系统繁忙,注册失败!")); + if ($reward['register']>0){ + addFinance($uid, $reward['register'],1,'会员注册,系统赠送' . $reward['register'] . '元'); + } + $this->app->session->set('uid', $uid); + $this->success(json_lang("注册成功"),$uid); + } + } +} diff --git a/application/index/controller/api/User.php b/application/index/controller/api/User.php new file mode 100644 index 0000000..755b27e --- /dev/null +++ b/application/index/controller/api/User.php @@ -0,0 +1,1410 @@ +where(['token' => $token])->value('id'); + if (!$uid) { + $this->error('', '', 1002); + } else { + Db::name('LcUser')->where(['token' => $token])->update([ + 'access_time' => time(), + ]); + $this->uid = $uid; + } + } + + /** + * @description:个人中心 + * @date: 2020/5/13 0013 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function index() + { + $uid = $this->uid;; + //自动更新真实姓名 + $real_name = Db::name('LcBank')->where(['uid' => $uid])->value('name'); + $user = Db::name('LcUser')->find($uid); + $tt = $user; + if ($tt['name'] <> $real_name) { + Db::name('LcUser')->where(['id' => $uid])->update(['name' => $real_name]); + } + $this->chicang = Db::name('LcOrder')->where("uid = $uid AND ostaus = 0")->sum('fee'); + $this->wait_money = $user['money'] + $this->chicang; + $this->msg = Db::name('LcMsg')->alias('msg')->where('(msg.uid = ' . $uid . ' or msg.uid = 0 ) and (select count(*) from lc_msg_is as msg_is where msg.id = msg_is.mid and ((msg.uid = 0 and msg_is.uid = ' . $uid . ') or ( msg.uid = ' . $uid . ' and msg_is.uid = ' . $uid . ') )) = 0')->count(); + + $this->qiandao = 1; + $today = date('Y-m-d 00:00:00'); + if ($today <= $user['qiandao']) + $this->qiandao = 2; + $this->lcopen = getlcopen(); + + $this->top = Db::name('LcUser')->where(['top' => $uid])->count(); + + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcMallInvest')->where("time2 >= '$now' and uid = $uid")->count(); + + $this->zqhy = Db::name('LcInvest')->where("time2 >= '$now' and uid = $uid")->count(); + $userleveltile = Db::name('LcUserMember')->find($user['member']); + $this->assign('userleveltile', $userleveltile); + $this->success(json_lang("操作成功"), [ + 'user' => $user, + 'wait_money' => $this->wait_money, + 'chicang' => $this->chicang, + 'yingkui' => 0, + 'qiandao' => $this->qiandao, + 'userleveltile' => $userleveltile + ]); + } + + public function account() + { + $uid = $this->uid; + $user = Db::name('LcUser')->find($uid); + if (!$user) $this->error(json_lang("用户不存在")); + //自动更新真实姓名 +// $real_name = Db::name('LcBank')->where(['uid' => $uid])->value('name'); +// $tt = $user; +// if ($tt['name'] <> $real_name) { +// Db::name('LcUser')->where(['id' => $uid])->update(['name' => $real_name]); +// } + + $this->chicang = Db::name('LcOrder')->where("uid = $uid AND ostaus = 0")->sum('fee'); + $this->wait_money = $user['money'] + $this->chicang; + $this->msg = Db::name('LcMsg')->alias('msg')->where('(msg.uid = ' . $uid . ' or msg.uid = 0 ) and (select count(*) from lc_msg_is as msg_is where msg.id = msg_is.mid and ((msg.uid = 0 and msg_is.uid = ' . $uid . ') or ( msg.uid = ' . $uid . ' and msg_is.uid = ' . $uid . ') )) = 0')->count(); + + $this->qiandao = 1; + $today = date('Y-m-d 00:00:00'); + if ($today <= $user['qiandao']) + $this->qiandao = 2; + $this->lcopen = getlcopen($uid); + $this->top = Db::name('LcUser')->where(['top' => $uid])->count(); + $now = date('Y-m-d H:i:s'); + $this->yxkj = Db::name('LcMallInvest')->where("time2 >= '$now' and uid = $uid")->count(); + $this->zqhy = Db::name('LcInvest')->where("time2 >= '$now' and uid = $uid")->count(); + $userleveltile = Db::name('LcUserMember')->find($user['member']); + $this->success(json_lang("操作成功"), [ + 'user' => $user, + 'wait_money' => $this->wait_money, + 'chicang' => $this->chicang, + 'yingkui' => 0, + 'msg' => Db::name('LcMsg')->where(['uid' => $uid, 'status' => 0])->count(), + 'qiandao' => $this->qiandao, + 'lcopen' => $this->lcopen, + 'userleveltile' => $userleveltile, + 'todayincome' => round( Db::name('LcOrder')->where([ + ['buytime', '>', strtotime(date('Y-m-d 00:00:00'))], + ['buytime', '<', strtotime(date('Y-m-d 23:59:59'))], + ['uid', '=', $user['id']] + ])->sum('ploss'),3), + 'yesterdayincome' =>round( Db::name('LcOrder')->where([ + ['buytime', '>', strtotime(date('Y-m-d 00:00:00')) - 86400], + ['buytime', '<', strtotime(date('Y-m-d 23:59:59')) - 86400], + ['uid', '=', $user['id']] + ])->sum('ploss'),3), + 'yueincome' => round(Db::name('lc_yuebao_lists')->where([ + ['uid', '=', $user['id']] + ])->sum('nowprofit'),3), + ]); + } + + /** + * Describe:签到 + * DateTime: 2020/5/13 23:17 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function sign() + { + $uid = $this->uid; + $this->error('请先登录后再签到'); + $user = Db::name('LcUser')->find($uid); + $today = date('Y-m-d 00:00:00'); + if ($today <= $user['qiandao']) + $this->error('每天只能签到一次'); + $money = getReward('qiandao'); + Db::name('LcUser')->where(['id' => $uid])->update(['qiandao' => date('Y-m-d H:i:s')]); + addFinance($uid, $money, 1, "每日签到,获得奖励{$money}元"); + setNumber('LcUser', 'money', $money, 1, "id=$uid"); + setNumber('LcUser', 'income', $money, 1, "id=$uid"); + setNumber('LcUser', 'qdnum', 1, 1, "id=$uid"); + $this->success("签到成功,获得{$money}元"); + } + + /** + * Describe:站内消息 + * DateTime: 2020/5/14 0:01 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function msg() + { + $uid = $this->uid; + + + $this->msgtop = Db::name('LcMsg')->alias('msg')->where('(msg.uid = ' . $uid . ' or msg.uid = 0 ) and (select count(*) from lc_msg_is as msg_is where msg.id = msg_is.mid and ((msg.uid = 0 and msg_is.uid = ' . $uid . ') or ( msg.uid = ' . $uid . ' and msg_is.uid = ' . $uid . ') )) = 0')->select(); + $this->msgfoot = Db::name('LcMsg')->alias('msg')->where('(select count(*) from lc_msg_is as msg_is where msg.id = msg_is.mid and msg_is.uid = ' . $uid . ') > 0')->select(); + $this->fetch(); + } + + /** + * Describe: 信息详情 + * DateTime: 2020/5/14 0:31 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function msg_view() + { + $id = $this->request->param('id'); + $uid = $this->uid; + if (!$id || !$uid) + msg('系统忙碌!', 2, '/index/user/index'); + $where['uid'] = $this->uid; + $where['mid'] = $id; + $ret = Db::name('LcMsgIs')->where($where)->find(); + if (!$ret) + Db::name('LcMsgIs')->insertGetId(['uid' => $uid, 'mid' => $id]); + $this->msg = Db::name('LcMsg')->find($id); + $this->fetch(); + } + + /** + * Describe: 账户安全 + * DateTime: 2020/5/14 0:48 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function set_account() + { + $uid = $this->uid; + + + $user = Db::name('LcUser')->find($uid); + $this->fetch(); + } + + /** + * @description:交易密码设置 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function pwd_pay() + { + $uid = $this->uid;; + $user = Db::name('LcUser')->find($uid); + if ($this->request->isPost()) { + if (!input('oldpwd', '')) $this->error('原支付密码不能为空'); + if (!input('pwd', '')) $this->error('新密码不能为空'); + if (!input('pwd2', '')) $this->error('确认密码不能为空'); + $data = $this->request->param(); + if ($user['password'] != md5($data['oldpwd'])) + $this->error('原支付密码错误!'); + if ($user['password'] == md5($data['pwd'])) + $this->error('新密码不能与原密码相同!'); + if (strlen($data['pwd']) < 6 || 16 < strlen($data['pwd'])) + $this->error(json_lang("请输入6-16位密码!")); + if ($data['pwd'] != $data['pwd2']) + $this->error('两次密码不一致!'); + if (Db::name('LcUser')->where(['id' => $user['id']])->update(['password2' => md5($data['pwd']), 'mwpassword2' => $data['pwd2']])) { + $this->success('修改成功!'); + } else { + $this->error('修改失败!'); + } + } + } + + /** + * Describe: 登录密码设置 + * DateTime: 2020/5/14 1:00 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function pwd_login() + { + $uid = $this->uid; + + $user = Db::name('LcUser')->find($uid); + if ($this->request->isPost()) { + if (!input('oldpwd', '')) $this->error('原登录密码不能为空'); + if (!input('pwd', '')) $this->error('新密码不能为空'); + if (!input('pwd2', '')) $this->error('确认密码不能为空'); + $data = $this->request->param(); + if ($user['password'] != md5($data['oldpwd'])) + $this->error('原登录密码错误!'); + if ($user['password'] == md5($data['pwd'])) + $this->error('新密码不能与原密码相同!'); + if (strlen($data['pwd']) < 6 || 16 < strlen($data['pwd'])) + $this->error(json_lang("请输入6-16位密码!")); + if ($data['pwd'] != $data['pwd2']) + $this->error('两次密码不一致!'); + if (Db::name('LcUser')->where(['id' => $user['id']])->update(['password' => md5($data['pwd']), 'mwpassword' => $data['pwd2']])) { + $this->success('修改成功!'); + } else { + $this->error('修改失败!'); + } + } + } + + /** + * @description:身份认证 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function certification() + { + $uid = $this->uid; + + + $user = Db::name('LcUser')->find($uid); + if ($this->request->isPost()) { + $data = $this->request->param(); + if ($user['auth'] == 1) + $this->error('你已认证,请勿重复认证!'); + $check = Db::name('LcUser')->where("idcard = '{$data['idcard']}' AND id <> $uid")->find(); + if ($check) + $this->error('身份证号码已存在,请勿重复注册!'); + if (getInfo('cert') == 1) { + $auth_check = idCardAuth($data['idcard'], $data['name']); + if ($auth_check['code'] == 0) + $this->error($auth_check['msg']); + } else { + if (!judge($data['name'], 'name')) + $this->error('名字不正确!'); + if (!judge($data['idcard'], 'idcard')) + $this->error('身份证号码不正确!'); + } + $money = getReward('shimingsong'); + addFinance($uid, $money, 1, "实名成功,系统赠送{$money}元"); + setNumber('LcUser', 'money', $money, 1, "id = $uid"); + setNumber('LcUser', 'income', $money, 1, "id = $uid"); + if (Db::name('LcUser')->where(['id' => $uid])->update(['name' => $data['name'], 'idcard' => $data['idcard'], 'auth' => 1])) { + $this->success('认证成功!'); + } else { + $this->error('认证失败!'); + } + } + $this->fetch(); + } + + /** + * @description:银行卡管理 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function bank_card() + { + $uid = $this->uid;; + $this->bank = Db::name('LcBank')->where('uid', $uid)->order("id desc")->select(); + $this->success(json_lang("操作成功"), ['banks' => $this->bank]); + } + + /** + * @description:添加银行卡 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function add_card() + { + $uid = $this->uid;; + if (Request::isPost()) { + $data = Request::param(); + if (Db::name('LcBank')->where('uid', $uid)->find()) $this->error(json_lang('银行卡已绑定,请勿重复添加!')); + $add = $data; + $add['uid'] = $uid; + if (Db::name('LcBank')->insert($add)) + $this->success('添加成功!'); + $this->error('操作失败!'); + } + $this->fetch(); + } + + public function add_usdt() + { + $uid = $this->uid;; + if (Request::isPost()) { + $data = Request::param(); + if (Db::name('LcUsdt')->where('uid', $uid)->find()) $this->error(json_lang('地址已绑定,请勿重复添加!')); + $add = ['uid' => $uid, 'address' => $data['address'], 'create_time' => time()]; + if (Db::name('LcBank')->insert($add)) { + $this->success('添加成功!'); + } + $this->error('操作失败!'); + } + $this->fetch(); + } + + /** + * @description:删除银行卡 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function del_card() + { + $this->applyCsrfToken(); + $uid = $this->uid; + + + $id = $this->request->param('id'); + if (Db::name('LcBank')->where(['uid' => $uid, 'id' => $id])->delete()) { + msg('删除成功!', 2, '/index/user/index'); + } + msg('操作失败!', 2, '/index/user/index'); + } + + /** + * @description:支付宝设置 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function alipay() + { + $uid = $this->uid; + + + $user = Db::name('LcUser')->find($uid); + if ($this->request->isPost()) { + $data = $this->request->param(); + if (Db::name('LcUser')->where(['id' => $uid])->update(['alipay' => $data['alipay']])) { + msg('操作成功!', 2, '/index/user/index'); + } else { + msg('操作失败!', 2, '/index/user/index'); + } + } + $this->fetch(); + } + + /** + * @description:资金流水 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function fund() + { + $uid = $this->uid;; + + $page = Request::param('page', 1); + $num = Request::param('num', 10); + $this->finance = Db::name('LcFinance')->where('uid', $uid)->order("id desc")->page($page, $num)->select(); + $this->success(json_lang("操作成功"), $this->finance); + } + + /** + * @description:投资记录 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function invest() + { + $uid = $this->uid; + + + $this->invest = Db::name('LcInvest')->where('uid', $uid)->order("id desc")->select(); + $this->fetch(); + } + + /** + * @description:收益记录 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function interest() + { + $uid = $this->uid; + + + $this->interest = Db::name('LcInvestList')->where("uid = $uid AND status = 1 AND pay1 <> 0")->order("time2 desc")->select(); + $this->fetch(); + } + + /** + * @description:充值记录 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function recharge_record() + { + $uid = $this->uid; + $page = Request::param('page', 1); + $num = Request::param('num', 10); + $recharge = Db::name('LcRecharge')->where('uid', $uid)->order("id desc")->page($page, $num)->select(); + $this->success(json_lang("操作成功"), $recharge); + } + + /** + * @description:提现记录 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @author: DeeBoo + * @date: 2020/5/14 0014 + */ + public function cash_record() + { + $uid = $this->uid;; + + $page = Request::param('page', 1); + $num = Request::param('num', 10); + $cash = Db::name('LcCash')->where('uid', $uid)->order("id desc")->page($page, $num)->select(); + $this->success(json_lang("操作成功"), $cash); + } + + /** + * @description:推广记录 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function extend() + { + $uid = $this->uid; + + + $this->results = Db::name('LcUser')->field("id,name,phone,time")->where('top', $uid)->order("id desc")->select(); + foreach ($this->results as &$vo) { + $vo['recharge'] = Db::name('LcRecharge')->where(['uid' => $vo['id'], 'status' => 1])->sum('money'); + $vo['cash'] = Db::name('LcCash')->where(['uid' => $vo['id'], 'status' => 1])->sum('money'); + } + $this->fetch(); + } + + /** + * @description:邀请好友 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function recommend() + { + $uid = $this->uid; + + + $user = Db::name('LcUser')->find($uid); + // if($user['auth'] != 1) msg('请实名认证后再进行邀请!', 2, '/index/User/certification'); + $domain = getInfo('domain'); + $this->url = $domain ? $domain : $uid = Request::host(); + $this->fetch(); + } + + /** + * @description:提现 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function cash() + { + $uid = $this->uid; + $user = Db::name('LcUser')->find($uid); + $cashConfig = [ + 'user' => $user, + "bank" => Db::name('LcBank')->where('uid', $uid)->order("id desc")->select(), + 'txsxf' => getInfo('cash_charge'), + 'cash_start' => getInfo('cash_start'), + 'cash_end' => getInfo('cash_end'), + 'cash_min' => getInfo('cash_min'), + 'cash_max' => getInfo('cash_max'), + 'cash_day_max' => getInfo('cash_day_max'), + 'cash_max_num' => getInfo('cash_max_num') + ]; + if (Request::isPost()) { + if ($user['rz_status'] != 2) { + $this->error(json_lang("请先完成实名认证!")); + } + if ($user['isjy'] == 1) { + $this->error(json_lang("账号被锁定,请联系管理员!")); + } + $time = time(); + $cash_start = strtotime(date('Y-m-d ' . $cashConfig['cash_start'] . ':00')); + $cash_end = strtotime(date('Y-m-d ' . $cashConfig['cash_end'] . ':00')); + if ($time < $cash_start || $time > $cash_end) { + $this->error(json_lang("提现时间为") . $cashConfig['cash_start'] . '-' . $cashConfig['cash_end']); + } + $data = Request::param(); + $money = $data['money']; + if (!$money) $this->error(json_lang("提现金额不能为空!")); + $pwd = $data['pwd']; + if (!$pwd) $this->error(json_lang("提现密码不能为空!")); + $today = date('Y-m-d 00:00:00'); + if ($user['password2'] != md5($data['pwd'])) + $this->error(json_lang("交易密码不正确!")); + if ($data['money'] < $cashConfig['cash_min']) + $this->error(json_lang("提现金额不能小于") . $cashConfig['cash_min']); + if ($data['money'] > $cashConfig['cash_max']) + $this->error(json_lang("提现金额不能大于") . $cashConfig['cash_max']); + if ($user['money'] < $data['money']) + $this->error(json_lang("账户余额不足,请确认")); + + $day_num = Db::name('LcCash')->where("uid = $uid AND time > '$today'")->count(); + if ($day_num >= $cashConfig['cash_max_num']) + $this->error(json_lang('每日提现次数') . $cashConfig['cash_max_num']); + + $day_sum = Db::name('LcCash')->where("uid = $uid AND time > '$today'")->sum('money'); + if ($day_sum >= $cashConfig['cash_day_max']) + $this->error(json_lang('当日累计最高提现金额不能大于') . $cashConfig['cash_day_max']); + if ($data['bank'] != 0) { + $bank = Db::name('LcBank')->where('id', $data['bank'])->find(); + if ($bank['uid'] != $uid || empty($bank)) + $this->error('请先绑定提现银行卡!'); + } + $cash_charge = getInfo('cash_charge'); + + $sxf = $data['money'] * $cash_charge * 0.01; + + $dzje = $data['money'] - $sxf; + + $sxfbfb = $cash_charge; + if ($data['bank'] == 0) { + $add = array( + 'uid' => $uid, + 'sxf' => $sxf, + 'dzje' => $dzje, + 'sxfbfb' => $sxfbfb, + 'name' => $user['name'], + 'bid' => $data['bank'], + 'bank' => '支付宝', + 'area' => 0, + 'account' => $user['alipay'], + 'money' => $data['money'], + 'status' => 0, + 'time' => date('Y-m-d H:i:s'), 'time2' => '0000-00-00 00:00:00'); + } + else { + $add = array('uid' => $uid, + 'sxf' => $sxf, + 'dzje' => $dzje, + 'sxfbfb' => $sxfbfb, + 'name' => $user['name'], + 'bid' => $data['bank'], + 'bank' => $bank['bank'], + 'area' => $bank['area'] ?: 0, + 'account' => $bank['account'], + 'money' => $data['money'], 'status' => 0, 'time' => date('Y-m-d H:i:s'), 'time2' => '0000-00-00 00:00:00'); + } + + if (Db::name('LcCash')->insert($add)) { + addFinance($uid, $data['money'], 2, "余额提现{$data['money']}元"); + setNumber('LcUser', 'money', $data['money'], 2, "id = $uid"); + + $this->success(json_lang("提现申请成功!")); + } else { + $this->error(json_lang("提现失败!")); + } + } + $this->success(json_lang("操作成功"), $cashConfig); + } + + /** + * @description:充值 + * @date: 2020/5/14 0014 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function recharge() + { + $uid = $this->uid; + $user = Db::name('LcUser')->find($uid); + $min_recharge = 1; + if (Request::isPost()) { + $data = Request::param(); + if ($data['money'] < $min_recharge) { + $this->error('最低充值' . $this->min_recharge . '元'); + } + $add = [ + 'uid' => $uid, + 'money' => $data['money'], + 'type' => "TRC20", + 'status' => 0, + 'time' => date('Y-m-d H:i:s'), + 'time2' => '0000-00-00 00:00:00' + ]; + Db::name('LcRecharge')->insertGetId($add); + $this->success(json_lang('操作成功')); + } + $this->success(json_lang('操作成功'), ['user' => $user, 'min_recharge' => $min_recharge, 'address' => "TZEGFjVuHmGJCxc31e1GxgdonJEZVopJy4"]); + } + + /** + * @description:扫描充值 + * @date: 2020/5/14 0014 + */ + public function scan() + { + $type = $this->request->param('type'); + $this->money = $this->request->param('money'); + $this->qr = getInfo('qr_alipay_img'); + if ($type == 'wechat') + $this->qr = getInfo('qr_wechat_img'); + $this->fetch(); + } + + /** + * Describe:提现银行 + * DateTime: 2020/5/14 21:44 + * @throws \think\Exception + * @throws \think\exception\PDOException + */ + public function bank() + { + $uid = $this->uid; + + + if (Request::isPost()) { + $data = $this->request->param(); + $update = array('reason' => '付款人:' . $data['name'] . '
转账附言:' . $data['reason']); + if (Db::name('LcRecharge')->where(['uid' => $uid, 'status' => 0, 'orderid' => $data['orderid']])->update($update)) { + msg('操作成功!', 2, '/index/user/index'); + } else { + msg('操作失败!', 2, '/index/user/index'); + } + } + $this->type = $this->request->param('type'); + $this->orderid = $this->request->param('orderid'); + $this->money = $this->request->param('money'); + if (empty($this->orderid)) + msg('充值失败!', 2, '/index/user/index'); + $this->fetch(); + } + + /** + * Describe:合同详情 + * DateTime: 2020/5/14 21:44 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public function contract() + { + $this->uid = $this->uid; + if (!$this->uid) + + $id = $this->request->param('id'); + if (empty($id)) + msg('参数缺失!', 2, '/index/user/index'); + $this->invest = Db::name('LcInvest')->where(['uid' => $this->uid, 'id' => $id])->find(); + $this->list = Db::name('LcInvestList')->where(['uid' => $this->uid, 'iid' => $id])->order('id desc')->select(); + //if(!$this->invest||!$this->list) msg('暂无数据!', 2, '/index/user/index'); + $this->fetch(); + } + + public function mall_contract() + { + $this->uid = $this->uid; + if (!$this->uid) + + $id = $this->request->param('id'); + if (empty($id)) + msg('参数缺失!', 2, '/index/user/index'); + $this->invest = Db::name('LcMallInvest')->where(['uid' => $this->uid, 'id' => $id])->find(); + $this->list = Db::name('LcMallInvestList')->where(['uid' => $this->uid, 'iid' => $id])->order('id desc')->select(); + $this->fetch(); + } + + public function details() + { + $this->uid = $this->uid; + if (!$this->uid) + + $id = $this->request->param('id'); + if (empty($id)) + msg('参数缺失!', 2, '/index/user/index'); + $this->invest = Db::name('LcInvest')->where(['uid' => $this->uid, 'id' => $id])->find(); + $this->list = Db::name('LcInvestList')->where(['uid' => $this->uid, 'iid' => $id])->order('id asc')->select(); + if (!$this->invest || !$this->list) + msg('暂无数据!', 2, '/index/user/index'); + $this->fetch(); + } + + public function wallet() + { + $this->uid = $this->uid; + if (!$this->uid) + + $user = Db::name('LcUser')->find($this->uid); + $now = date('Y-m-d H:i:s'); + $this->kjbz = Db::name('LcMallInvest')->where('uid', $this->uid)->where("time2 >= '$now'")->sum('money'); + $this->hybz = Db::name('LcInvest')->where('uid', $this->uid)->where("time2 >= '$now'")->sum('money'); + + $this->kjcl = Db::name('LcMallInvestList')->where(['uid' => $this->uid, 'status' => 1])->sum('money1'); + $this->hysy = Db::name('LcInvestList')->where(['uid' => $this->uid, 'status' => 1])->sum('money1'); + $this->kjsy = Db::name('LcFinance')->where("uid = {$this->uid} AND reason LIKE '%BTC兑换%'")->sum('money'); + $this->fetch(); + } + + public function trade() + { + $this->uid = $this->uid; + if (!$this->uid) + + $user = Db::name('LcUser')->find($this->uid); + $this->fetch(); + } + + public function tradeBTC() + { + $uid = $this->uid; + + + $user = Db::name('LcUser')->find($uid); + $data = $this->request->param(); + if ($data['buynum'] <= 0) + $this->error("无效数量"); + if ($data['buynum'] > $user['btc']) + $this->error("BTC不足"); + $btc_price = 393848.54; + $money = round($btc_price * $data['buynum'], 2); + addFinance($uid, $money, 1, "BTC兑换交易{$money}元"); + setNumber('LcUser', 'money', $money, 1, "id = {$uid}"); + setNumber('LcUser', 'btc', $data['buynum'], 2, "id = {$uid}"); + $this->success("交易成功"); + } + + /** + * @description:退出登录 + * @date: 2020/5/13 23:57 + */ + public function logout() + { + $uid = $this->uid; + Db::table('lc_user')->where('id', $uid)->limit(1)->update(['access_time' => 0]); + session('uid', null); + //$this->app->session->clear(); + //$this->app->session->destroy(); + $this->redirect('/index'); + } + + public function hold() + { + $uid = $this->uid; + + + $page = Request::param('page', 1); + $num = Request::param('num', 10); + $this->type = $this->request->param('type'); + $this->hold = Db::name('LcOrder')->where(array('uid' => $uid, 'ostaus' => 0))->order('id desc')->page($page, $num)->select(); + //->field('id,ptitle,buytime,fee,ostyle') + //var_dump($this->hold);die; + $this->success(json_lang("操作成功"), $this->hold); + } + + /** + * 下单 + * @return void [type] [description] + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @author lukui 2017-07-20 + */ + public function addorder() + { + $data = Request::param(); + $uid = $this->uid; + //用户信息 + $user = Db::name('LcUser')->find($uid); + if (!$user) $this->error(json_lang("用户不存在")); + //验证用户是否被冻结 + if ($user['clock'] == 1) { + // return WPreturn('您的账户已被冻结',-1); + } + if ($user['isjy'] == 1) { + $this->error(json_lang("账号被锁定,请联系管理员!")); + } + $adddata['uid'] = $uid; + $pro = Db::name('LcProduct')->find($data['order_pid']); + if (!$pro) + $this->error(json_lang("产品未找到")); + //验证是否开市 + if ($pro['isopen']) { + $isopen = ChickIsOpen($pro['id']); + if ($isopen == 0) { + $this->error(json_lang("休市中")); + } + } else { + $this->error(json_lang("休市中")); + } + if (getinfo('order_max_amount') > 0) { + $allfee = Db::name('LcOrder')->where(array('ostaus' => 0, 'uid' => $data['uid']))->sum('fee'); + $allfee = $allfee ? $allfee : 0; + if ($allfee + $data['order_price'] > getinfo('order_max_amount')) { + $this->error(json_lang("持仓最大金额为") . getinfo('order_max_amount') . '!'); + } + } + if ($data['order_price'] < getinfo('order_min')) { + $this->error(json_lang("持仓最小金额为") . getinfo('order_min') . '!'); + } + //持仓限制 + if (getinfo('order_max_amount') > 0) { + $allfee = Db::name('LcOrder')->where(array('ostaus' => 0, 'uid' => $data['uid']))->sum('fee'); + $allfee = $allfee ? $allfee : 0; + if ($allfee + $data['order_price'] > getinfo('order_max_amount')) { + $this->error(json_lang("持仓最大金额为") . getinfo('order_max_amount') . '!'); + } + } + if (getinfo('order_max_count') > 0) { + Db::name('LcOrder')->where(array('ostaus' => 0, 'uid' => $data['uid']))->count(); + } + //手续费 + $web_poundage = 0; + if (getinfo('order_charge') > 0) { + $web_poundage = round($data['order_price'] * getinfo('order_charge') / 100, 2); + } + $moneyfrom = 1; + //验证余额是否够 + if ($user['money'] < $data['order_price'] + $web_poundage) { + $this->error(json_lang("账户余额不足,请确认")); + } + if (floatval($data['newprice']) <= 0) { + $this->error(json_lang("操作失败")); + } + //建仓 + $adddata['buytime'] = time(); + $adddata['endprofit'] = $data['order_sen']; + $adddata['pid'] = $data['order_pid']; + $adddata['ostyle'] = $data['order_type']; + $adddata['buyprice'] = $data['newprice']; + $adddata['endloss'] = $data['order_shouyi']; + $adddata['lossrate'] = $data['order_kuishun']; + $adddata['eid'] = 2; + $adddata['selltime'] = $adddata['buytime'] + $adddata['endprofit']; + $adddata['fee'] = $data['order_price']; + $adddata['ptitle'] = $pro['title']; + $adddata['ostaus'] = '0'; + $adddata['sx_fee'] = $web_poundage; + $allfee = $adddata['fee'] + $adddata['sx_fee']; + //会员建仓后金额 + $adddata['commission'] = $user['money'] - $allfee; + //订单号 + $adddata['orderno'] = date('YmdHis') . $uid . rand(1111, 9999); + //var_dump($adddata); + //下单 + $id = Db::name('LcOrder')->insertGetId($adddata); + if ($id) { + //下单成功减用户余额 + if ($moneyfrom == 1) { + addFinance($uid, $allfee, 2, '下单[' . $adddata['orderno'] . ']从账户扣除金额 ' . $allfee . '元'); + setNumber('LcUser', 'money', $allfee, 2, "id = $uid"); + } + if ($moneyfrom == 2) { + addFinance($uid, $allfee, 2, '下单[' . $adddata['orderno'] . ']从余额宝扣除金额 ' . $allfee . '元'); + setNumber('LcUser', 'money', $allfee, 2, "id = $uid"); + //Db::table('lc_yuebao_uc')->where('uid = '.$uid)->update(['balance']) + } + $nowmoney = $adddata['commission']; + if ($nowmoney < 0) { + $nowmoney = 0; + } + $adddata['oid'] = $id; + $order_rand = rand(1, 1000); + $adddata['order_rand'] = $order_rand; + $this->success(json_lang("操作成功"), $adddata); + } else { + $this->error(json_lang("操作失败")); + } + } + + public function goorder() + { + // { + // "price": "275.661", + // "oid": "463", + // "order_rand": "547" + // } + $data = $this->request->param(); + $oid = $data['oid']; + $price = $data['price']; + $order_rand = $data['order_rand']; + + $static = 1; //1成功返回并继续运行 0失败返回不运行 2 失败返回继续轮询 + if (!$oid || !$price || !$order_rand) { + die('0' . $oid . '-' . $price . '-' . $order_rand); + } + + $order = Db::name('LcOrder')->find($oid); + + //没有此订单 + if (!$order) { + die('1' . $oid . '-' . $price . '-' . $order_rand); + } + + //没有平仓 + if (isset($order['ostyle']) && $order['ostaus'] == 0) { + die('2'); + } + + //已平仓 但是价格相同 + if (isset($order['sellprice']) && $order['sellprice'] == $price) { + cache('goorder_' . $order['id'], null); + die('1'); + } + + //已平仓 但是无效交易 + if (isset($order['is_win']) && $order['is_win'] == 3) { + cache('goorder_' . $order['id'], null); + die('1'); + } + //该订单指定赢亏 + if (isset($order['kong_type']) && $order['kong_type'] != 0) { + cache('goorder_' . $order['id'], null); + die('1'); + } + die('1'); + } + + public function get_price() + { + //此刻产品价格 + $pro = Db::name('LcProduct')->field('id,Price')->where(array('isdelete' => 0))->select(); + $prodata = array(); + foreach ($pro as $k => $v) { + $prodata[$v['id']] = $v['Price']; + } + return base64_encode(json_encode($prodata));; + } + + /** + * ajax 通过产品id 获取用户订单, + * @return [type] [description] + * @author lukui 2017-07-22 + */ + public function ajaxorder() + { + $uid = $this->uid; + $pid = $this->request->param('pid'); + if (empty($uid) || empty($pid)) { + return false; + } + //持仓信息 + $map = []; + $map[] = ['uid', '=', $uid]; + $map[] = ['pid', '=', $pid]; + $map[] = ['ostaus', '=', 0]; + $map[] = ['selltime', '>', time()]; + + $list = Db::name('LcOrder')->where($map)->order('id desc')->select(); + foreach ($list as $key => $value) { + $list[$key]['time'] = time(); + } + if ($list) { + return base64_encode(json_encode($list)); + // return json_encode($list); + } else { + return false; + } + + } + + /** + * ajax 通过产品id 平仓后弹框提示, + * @return [type] [description] + * @author lukui 2017-07-22 + */ + public function ajaxalert() + { + $uid = $this->uid; + $pid = $this->request->param('pid'); + if (empty($uid) || empty($pid)) { + return false; + } + //持仓信息 + $hold = Db::name('LcOrder')->field('id,ploss,fee,eid')->where(array('uid' => $uid, 'ostaus' => 1, 'pid' => $pid, 'isshow' => 0))->order('id desc')->find(); + //修改持仓信息 + $isedit = Db::name('LcOrder')->where('id', $hold['id'])->setField('isshow', '1'); + if ($hold && $isedit) { + return $hold; + } else { + return false; + } + } + + /** + * 交易记录 + * @return [type] [description] + * @author lukui 2017-07-22 + */ + public function ajaxorder_list() + { + $uid = $this->uid; + if (empty($uid)) { + $this->error('用户ID不能为空'); + } + + $type = input('type', 0); + $page = Request::param('page', 1); + $num = Request::param('num', 10); + //持仓信息 + $map = []; + $map[] = ['ostaus', '=', $type]; + $map[] = ['uid', '=', $uid]; + + $list = Db::name('LcOrder')->where($map)->order('id desc')->page($page, $num)->select(); + foreach ($list as $key => $value) { + $list[$key]['time'] = time(); + $list[$key]['ploss'] = round($value['ploss'], 2); + } + if ($list) { + $this->success(json_lang("操作成功"), $list); + } else { + $this->success('暂无数据', []); + } + } + + public function getchart() + { + $data['hangqing'] = '商品行情'; + $data['jiaoyijilu'] = '交易记录'; + $data['jiaoyilishi'] = '历史委托'; + $data['chicangmingxi'] = '持仓明细'; + $data['lishimingxi'] = '历史明细'; + $data['gendanjiaoyi'] = '跟单交易'; + $res = base64_encode(json_encode($data)); + return $res; + } + + public function orderlist() + { + $uid = $this->uid; + if (empty($uid)) { + return false; + } + $map = []; + $map[] = ['uid', '=', $uid]; + $map[] = ['ostaus', '=', 1]; + + $hold = Db::name('LcOrder')->where($map)->order('id desc')->paginate(20); + return base64_encode(json_encode($hold)); + } + + /** + * 已平仓订单详情 + * @return [type] [description] + * @author lukui 2017-07-21 + */ + public function orderinfo() + { + $uid = $this->uid; + $oid = $this->request->param('oid'); + if (!$oid) { + $this->redirect('orderlist'); + } + $order = Db::name('LcOrder')->where('id', $oid)->find(); + $this->assign($order); + return $this->fetch(); + + } + + /** + * 实时获取以平仓订单 + * @return [type] [description] + */ + public function get_this_order() + { + $oid = $this->request->param('oid'); + $map['id'] = $oid; + $map['ostaus'] = 1; + $order = Db::name('LcOrder')->where($map)->find(); + + return base64_encode(json_encode($order)); + } + + /** + * 实时获取以平仓订单 + * @return [type] [description] + */ + public function get_hold_order() + { + $oid = $this->request->param('oid'); + $map['id'] = $oid; + $map['ostaus'] = 1; + + $order = Db::name('LcOrder')->where($map)->find(); + + return base64_encode(json_encode($order)); + } + + public function inquiries() + { + $uid = $this->uid; + + + $map['uid'] = $uid; + $map['ostaus'] = 1; + + $this->list = Db::name('LcOrder')->where($map)->order('id desc')->select(); + + $this->fetch(); + } + + public function yeb() + { + $yuebao = Db::name('lc_yuebao')->where('status = 1')->order('id desc')->select(); + $this->success(json_lang("操作成功"), $yuebao); + } + + public function yebtrans() + { + Db::startTrans(); + try { + $uid = $this->uid; + $money = (float)input('post.money'); + if ($money <= 0) { + return json(['code' => 500, 'msg' => '转出金额错误!']); + } + $uc = Db::table('lc_yuebao_uc')->lock(true)->where('uid', $uid)->find(); + if ($money > $uc['trans_balance']) { + return json(['code' => 500, 'msg' => '大于可转出金额!']); + } + Db::table('lc_yuebao_uc')->where('id', $uc['id'])->limit(1)->update(['trans_balance' => round($uc['trans_balance'] - $money, 1)]); + $userMoney = DB::table('lc_user')->where('id', $uid)->value('money'); + Db::table('lc_user')->where('id', $uid)->limit(1)->update(['money' => round($userMoney + $money, 1)]); + DB::table('lc_finance')->insert(['uid' => $uid, 'money' => $money, 'type' => 1, 'reason' => '利息宝转出', 'before' => $userMoney, 'time' => date('Y-m-d H:i:s')]); + return json(['code' => 200, 'msg' => '转出成功!']); + Db::commit(); + } catch (Exception $e) { + Db::rollback(); + return json(['code' => 500, 'msg' => '转出失败!']); + } + } + + public function yebjoinnow() + { + // + $param = Request::param(); + $uid = $this->uid; + //优先核对账户余额,并扣减。 + $where['id'] = $uid; + $userinfo = Db::table('lc_user')->where($where)->find(); + if ($userinfo['money'] < $param['money']) { + $this->error(json_lang("账户余额不足,请确认")); + } + //查找余额宝理财方案信息,并校检。 + $where['id'] = $param['yebid']; + $yebinfo = Db::table('lc_yuebao')->where($where)->find(); + if ($yebinfo['lowmoney'] > $param['money']) { + $this->error(json_lang("您办理的方案有最低存入:") . $yebinfo['lowmoney']); + } + $newmoney = $userinfo['money'] - $param['money']; + $res = Db::table('lc_user')->where('id', $userinfo['id'])->update(['money' => $newmoney]); + if (!$res) { + $this->error(json_lang("网络异常,请稍后再试:")); + } + $res = DB::table('lc_finance')->insert(['uid' => $userinfo['id'], 'money' => $param['money'], 'type' => 2, 'reason' => '利息宝转入', 'before' => $userinfo['money'], 'time' => date('Y-m-d H:i:s')]); + if (!$res) { + $this->error(json_lang("网络异常,请稍后再试:")); + } + //保存办理记录。 + $savelist = array('uid' => $uid, + 'username' => $userinfo['phone'], + 'yuebaoid' => $yebinfo['id'], + 'yebtitle' => $yebinfo['title'], + 'lily' => $yebinfo['lily'], + 'money' => $param['money'], + 'days' => $yebinfo['days'], + 'start_time' => time(), + 'profit_time' => time(), + 'end_time' => time() + $yebinfo['days']*86400, + 'nowprofit' => 0, 'finishprofit' => round(($param['money'] * $yebinfo['lily']/ 100) * $yebinfo['days'], 4), 'status' => 1); + $newid = Db::table('lc_yuebao_lists')->insertGetId($savelist); + if (!$newid) { + $this->error(json_lang("网络异常,请稍后再试:")); + } + //再做UC + unset($where['id']); + $where['uid'] = $uid; + $yebucinfo = Db::table('lc_yuebao_uc')->where($where)->find(); + $newbalance = $yebucinfo['balance'] + $param['money']; + Db::table('lc_yuebao_uc')->where($where)->update(['balance' => $newbalance]); + //再做UCLOG + $yebuclog = array('uid' => $uid, 'balance' => $yebucinfo['balance'], 'money' => $param['money'], 'addtime' => time(), 'remarks' => "用户购买理财方案:" . $yebinfo['title']); + Db::table('lc_yuebao_uclog')->insert($yebuclog); + $this->success(json_lang("操作成功")); + } + + public function yebstop() + { + $uid = $this->uid; + + $param = Request::param(); + + $getlistinfo = Db::table('lc_yuebao_lists')->where('id=' . $param['id'])->find(); + + if ($getlistinfo['status'] != 1 or empty($getlistinfo)) { + return "操作失败:订单无法操作!"; + die; + } + + $getuserinfo = Db::table('lc_user')->where('id=' . $getlistinfo['uid'])->find(); + //var_dump($getlistinfo,$getuserinfo);die; + if (!empty($getuserinfo)) { + Db::table('lc_yuebao_lists')->where('id=' . $param['id'])->update(['status' => 2, 'end_time' => time()]); + //记录日志! + unset($getlistinfo['id']); + $getlistinfo['status'] = 2; + $getlistinfo['end_time'] = time(); + $getlistinfo['balance'] = $getuserinfo['money']; + $getlistinfo['closetime'] = time(); + $getlistinfo['remarks'] = "客户手动结算"; + Db::table('lc_yuebao_log')->insert($getlistinfo); + //更新用户余额 + $newbalance = $getuserinfo['money'] + $getlistinfo['nowprofit'] + $getlistinfo['money']; + Db::table('lc_user')->where('id=' . $getlistinfo['uid'])->update(['money' => $newbalance]); + //更新UC + $where['uid'] = $uid; + $yebucinfo = Db::table('lc_yuebao_uc')->where($where)->find(); + $newbalance = $yebucinfo['balance'] - $getlistinfo['money']; + Db::table('lc_yuebao_uc')->where($where)->update(['balance' => $newbalance]); + //再做UCLOG + $yebuclog = array('uid' => $uid, 'balance' => $yebucinfo['balance'], 'money' => $getlistinfo['money'], 'addtime' => time(), 'remarks' => "用户购买理财方案:" . $getlistinfo['title']); + Db::table('lc_yuebao_uclog')->insert($yebuclog); + + return "ok"; + die; + + } else { + return "操作失败:订单无法操作!"; + die; + } + + } + + public function yebkeep() + { + $uid = $this->uid; + + + $param = Request::param(); + $getlistinfo = Db::table('lc_yuebao_lists')->where('id=' . $param['id'])->find(); + if ($getlistinfo['status'] == 2) { + return "操作失败:订单无法操作!"; + die; + } elseif ($getlistinfo['status'] == 1) { + $getlistinfo['end_time'] = $getlistinfo['end_time'] + $getlistinfo['days'] * 86400; + } + unset($getlistinfo['id']); + Db::table('lc_yuebao_lists')->where('id=' . $param['id'])->update(['end_time' => $getlistinfo['end_time']]); + return "操作成功"; + die; + } + + /** + * @description:身份认证 + * @date: 2020/5/14 0014 + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ + public function verified() + { + $uid = $this->uid; + + $user = Db::name('LcUser')->field('rz_status,name,idcard,z_id_card,f_id_card')->find($uid); + if (Request::isPost()) { + $param = Request::param(); + if ($user['rz_status'] == 2) { + $this->error(json_lang('已认证请勿重复提交!')); + } + $name = $param['name']; + if (!$name) $this->error(json_lang('名字不能为空!')); + $idcard = $param['idcard']; + if (!$idcard) $this->error(json_lang('身份证号码不能为空!')); + $z_id_card = $param['z_id_card']; + if (!$z_id_card) $this->error(json_lang('身份证正面照不能为空!')); + $f_id_card = $param['f_id_card']; + if (!$f_id_card) $this->error(json_lang('身份证反面照不能为空!')); +// $country = $param['country']; +// if (!$country) $this->error(json_lang('地址不能为空!')); + $data = $param; + $check = Db::name('LcUser')->where("idcard = '{$data['idcard']}' AND id <> " . $uid)->find(); + if ($check) + $this->error(json_lang('身份证号码已被其他账号绑定!')); + if (Db::name('LcUser')->where(['id' => $uid])->update([ + 'name' => $data['name'], + 'idcard' => $data['idcard'], + 'z_id_card' => $data['z_id_card'], + 'f_id_card' => $data['f_id_card'], +// 'country' => $data['country'], + 'rz_status' => 1 + ])) { + $this->success(json_lang('认证信息提交成功!')); + } else { + $this->error(json_lang('认证信息提交失败!')); + } + } + $this->success(json_lang('操作成功'), $user); + } +} diff --git a/application/index/controller/code.txt b/application/index/controller/code.txt new file mode 100755 index 0000000..b97fc71 --- /dev/null +++ b/application/index/controller/code.txt @@ -0,0 +1,20 @@ +btc_usdt +eth_usdt +ht_usdt +dot_usdt +link_usdt +bch_usdt +ltc_usdt +bsv_usdt +eos_usdt +xmr_usdt +dash_usdt +zec_usdt +etc_usdt +ksm_usdt +yfi_usdt +yfii_usdt +iota_usdt +neo_usdt +wbtc_usdt +pax_usdt diff --git a/application/index/service/IndexService.php b/application/index/service/IndexService.php new file mode 100755 index 0000000..6639ff4 --- /dev/null +++ b/application/index/service/IndexService.php @@ -0,0 +1,23 @@ +find($uid); + if(!$user||!$user['clock']) return false; + $data = ['logintime' => time(),'id'=>$uid]; + Db::name('LcUser')->update($data); + return true; + } +} + +/** + * @description:手机号验证 + * @date: 2020/5/14 0014 + * @param $phone + * @return bool + */ +function isMobile($phone){ + if(preg_match("/^1[3456789]{1}\d{9}$/",$phone)) return true; + return false; +} +function isAlphaNum($phone){ + if(preg_match("/^[A-Za-z0-9]+$/",$phone)) return true; + return false; +} + +/** + * @description:IP查询 + * @date: 2020/5/14 0014 + * @param string $ip + * @return array|bool|string + */ +function GetIpLookup($ip = ''){ + if(empty($ip)){ + return ''; + } + $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip; + $ip=json_decode(file_get_contents($url)); + if((string)$ip->code=='1'){ + return false; + } + $data = (array)$ip->data; + return $data; +} + +/** + * @description:添加流水 + * @date: 2020/5/13 0013 + * @param $uid + * @param $money + * @param $type + * @param $reason + * @return bool + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ +function addFinance($uid,$money,$type,$reason){ + $user = Db::name('LcUser')->find($uid); + if(!$user) return false; + if($user['money']<0) return false; + $data = array( + 'uid' => $uid, + 'money' => $money, + 'type' => $type, + 'reason' => $reason, + 'before' => $user['money'], + 'time' => date('Y-m-d H:i:s') + ); + Db::name('LcFinance')->insert($data); +} + +/** + * @description: + * @date: 2020/5/14 0014 + * @param $str + * @param $type + * @return bool + */ +function judge($str, $type) +{ + $char = ''; + if ($type == 'int') { + $char = '/^\\d*$/'; + } + else if ($type == 'email') { + $char = '/([\\w\\-]+\\@[\\w\\-]+\\.[\\w\\-]+)/'; + } + else if ($type == 'idcard') { + $char = '/[0-9]{17}([0-9]|X)/'; + } + else if ($type == 'name') { + $char = '/^[\\x{4e00}-\\x{9fa5}]+[·•]?[\\x{4e00}-\\x{9fa5}]+$/u'; + } + else if ($type == 'phone') { + $char = '/^1[3456789]{1}\\d{9}$/'; + } + else if ($type == 'tel') { + $char = '/(^(\\d{3,4}-)?\\d{7,8})$/'; + } + else if ($type == 'date') { + $char = '/^\\d{4}[\\-](0?[1-9]|1[012])[\\-](0?[1-9]|[12][0-9]|3[01])?$/'; + } + else if ($type == 'time') { + $char = '/^\\d{4}[\\-](0?[1-9]|1[012])[\\-](0?[1-9]|[12][0-9]|3[01])(\\s+(0?[0-9]|1[0-9]|2[0-3])\\:(0?[0-9]|[1-5][0-9])\\:(0?[0-9]|[1-5][0-9]))?$/'; + } + else if ($type == 'exist') { + } + else { + return false; + } + if (preg_match($char, $str)) { + return true; + } + return false; +} + +/** + * @description:设置 + * @date: 2020/5/13 0013 + * @param $database + * @param $field + * @param $value + * @param int $type + * @param string $where + * @return int|true + * @throws \think\Exception + */ +function setNumber($database, $field, $value, $type = 1, $where = '') +{ + if ($type != 1) { + $re = Db::name($database)->where($where)->setDec($field, $value); + } + else { + $re = Db::name($database)->where($where)->setInc($field, $value); + } + return $re; +} + +/** + * @description:脱敏 + * @date: 2020/5/14 0014 + * @param $string + * @param int $start + * @param int $length + * @param string $re + * @return bool|string + */ +function dataDesensitization($string, $start = 0, $length = 0, $re = '*') +{ + if (empty($string)) { + return false; + } + $strarr = array(); + $mb_strlen = mb_strlen($string); + while ($mb_strlen) { + $strarr[] = mb_substr($string, 0, 1, 'utf8'); + $string = mb_substr($string, 1, $mb_strlen, 'utf8'); + $mb_strlen = mb_strlen($string); + } + $strlen = count($strarr); + $begin = $start >= 0 ? $start : ($strlen - abs($start)); + $end = $last = $strlen - 1; + if ($length > 0) { + $end = $begin + $length - 1; + } elseif ($length < 0) { + $end -= abs($length); + } + for ($i = $begin; $i <= $end; $i++) { + $strarr[$i] = $re; + } + if ($begin >= $end || $begin >= $last || $end > $last) return false; + return implode('', $strarr); +} + +/** + * @description:投资状态 + * @date: 2020/5/14 0014 + * @param $id + * @return string + */ +function getInvestStatus($id) +{ + $invest = Db::name('LcInvestList')->where("status = 0 AND iid = $id")->count(); + if (0 < $invest) { + return '未完成'; + } + return '已完成'; +} + +/** + * @description:身份认证 + * @date: 2020/5/14 0014 + * @param $id_card + * @param $name + * @param $app_code + * @return array + */ +function idCardAuth($id_card,$name){ + $host = 'http://idcard.market.alicloudapi.com'; + $path = '/lianzhuo/idcard'; + $method = 'GET'; + $appcode = getInfo('linetoken'); + $headers = array(); + array_push($headers, 'Authorization:APPCODE ' . $appcode); + $querys = 'cardno=' . $id_card . '&name=' . $name; + $url = $host . $path . '?' . $querys; + $curl = curl_init(); + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + curl_setopt($curl, CURLOPT_FAILONERROR, false); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_HEADER, false); + if (1 == strpos('$' . $host, 'https://')) { + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + } + $re = curl_exec($curl); + $resp = json_decode($re, true); + if ($resp['resp']['code'] == '5') return ['code'=>0,'msg'=>'姓名和身份证号码不匹配']; + if ($resp['resp']['code'] == '14') return ['code'=>0,'msg'=>'无此身份证号码']; + if ($resp['resp']['code'] == '96') return ['code'=>0,'msg'=>'交易失败,请稍后重试']; + if ($resp['resp']['code'] != '0') return ['code'=>0,'msg'=>'网络繁忙,请稍后重试!']; + return ['code'=>1,'msg'=>'认证成功']; +} + +/** + * @description:银行卡认证 + * @date: 2020/5/14 0014 + * @param $name + * @param $account + * @param $id_card + * @return array + */ +function bankAuth($name,$account,$id_card){ + $host = 'http://lundroid.market.alicloudapi.com'; + $path = '/lianzhuo/verifi'; + $method = 'GET'; + $appcode = getInfo('banktoken'); + $headers = array(); + array_push($headers, 'Authorization:APPCODE ' . $appcode); + $querys = 'acct_name=' . $name . '&acct_pan=' . $account . '&cert_id=' . $id_card; + $url = $host . $path . '?' . $querys; + $curl = curl_init(); + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + curl_setopt($curl, CURLOPT_FAILONERROR, false); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_HEADER, false); + if (1 == strpos('$' . $host, 'https://')) { + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + } + header('Content-type:text/html; charset=utf-8'); + $re = curl_exec($curl); + $res = json_decode($re, true); + if($res['resp']['code'] == 0 && $res['resp']['desc'] == 'OK') return ['code'=>1,'bank'=>$res['data']['bank_name']]; + return ['code'=>0,'msg'=>'银行卡认证失败']; +} + +/** + * Describe:会员等级 + * DateTime: 2020/5/13 23:49 + * @param $member + * @return mixed|string + */ +function getUserMember($member) +{ + $member = Db::name('LcUserMember')->where("id = {$member}")->value('name'); + return $member?$member:'普通会员'; +} + +/** + * @description:获取支付方式 + * @date: 2020/5/14 0014 + * @param $pay + * @return string + */ +function getPayName($pay) +{ + switch ($pay) { + case 'wechat': + return '微信扫码'; + case 'alipay': + return '支付宝扫码'; + case 'bank': + return '银行入款'; + case 'gz_bank': + return '公账入款'; + case 'alipay_bank': + return '支付宝转银行卡'; + case 'wx_bank': + return '微信转银行卡'; + case 'online_wechat': + return '微信在线支付'; + case 'online_alipay': + return '支付宝在线支付'; + case 'wechat_scan': + return '微信在线扫码支付'; + default: + } + return '未知支付'; +} + +function gotoWechatPay($money){ + $status = getInfo('qr_wechat_statustz'); + $wxlianjie = getInfo('qr_wechattzlj'); + if($status == 1){ + $url = $wxlianjie; + } + else{ + $url = "/index/User/scan?type=wechat&money=".$money;//扫码链接 + } + header("Location:".$url); +} + +function gotoAlipay($money){ + $status = getInfo('qr_alipay_statustz'); + $zfblianjie = getInfo('qr_alipaytzlj'); + + if($status == 1){ + $url = $zfblianjie; + } + else{ + $url = "/index/User/scan?type=alipay&money=".$money;//扫码链接 + } + header("Location:".$url); +} + +/** + * Describe: 理财开关 + * DateTime: 2020/5/13 22:44 + * @param $uid + * @return int + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ +function getlcopen($uid = ''){ + $lcopen =0; + if(!$uid){ + $uid = Session::get('uid'); + } + if (!empty($uid)){ + $user = Db::name('LcUser')->where("id = $uid")->find(); + if (getInfo('qdlcopen') == 0){ + $lcopen = 1; + }else{ + if ($user['qdnum'] >= getInfo('qdnum') || $user['top'] > 0) { + $lcopen = 1; + }else{ + $lcopen = 0; + } + } + } + return $lcopen; +} + +/** + * @description:获取网站配置 + * @date: 2020/5/14 0014 + * @param $value + * @return mixed + */ +function getInfo($value){ + return Db::name('LcInfo')->where('id',1)->value($value); +} + +/** + * @description:获取奖励配置 + * @date: 2020/5/14 0014 + * @param $value + * @return mixed + */ +function getReward($value){ + return Db::name('LcReward')->where('id',1)->value($value); +} + +/** + * @description:项目进度 + * @date: 2020/5/14 0014 + * @param $id + * @return float|int|mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ +function getProjectPercent($id){ + $item = Db::name('LcItem')->find($id); + if($item['auto']>0){ + $xc=diffBetweenTwoDays($item['time'],date('Y-m-d H:i:s')); + if($xc>$item['auto']){ + $total=100; + }else{ + $total= round($xc/$item['auto']*100); + } + }else{ + $pid = $item['id']; + $percent = $item['percent']; + $investMoney = Db::name('LcInvest')->where('pid', $pid)->sum('money'); + $actual = $investMoney / ($item['total'] * 10000) * 100; + $total = $actual + $percent; + } + if (100 < $total) return 100; + return $total; +} + +function diffBetweenTwoDays ($day1, $day2) +{ + $second1 = strtotime($day1); + $second2 = strtotime($day2); + if ($second1 < $second2) { + $tmp = $second2; + $second2 = $second1; + $second1 = $tmp; + } + return ($second1 - $second2) / 86400; +} + +/** + * @description: + * @date: 2020/5/14 0014 + * @param $money + * @param $rate + * @param $day + * @return float + */ +function getFuliIncome($money, $rate, $day) +{ + $sum = $money; + $i = 0; + while ($i < $day) { + $sum = $sum + $sum * $rate / 100; + ++$i; + } + return round($sum - $money, 2); +} + +/** + * @description: + * @date: 2020/5/14 0014 + * @param $pid + * @return float|int + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ +function getProjectSurplus($pid) +{ + $percent = getProjectPercent($pid); + $total = Db::name('LcItem')->where('id', $pid)->value('total'); + $surplus = (100 - $percent) * $total * 100; + if ($surplus < 0) return 0; + return $surplus; +} + +function getProfit($day_income,$cost){ + return number_format($day_income-$cost, 8, '.', ''); +} + +function getMinerPercent($total,$stock){ + return round(($total-$stock)/$total*100,2); +} + +/** + * @description:奖励设置 + * @date: 2020/5/14 0014 + * @param $uid + * @param $money + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ +function setInvestReward_old($uid, $money ) +{ + $reward = Db::name('LcReward')->find(1); + $top1 = round($reward['invest1'] * $money / 100, 2); + $top2 = round($reward['invest2'] * $money / 100, 2); + $top3 = round($reward['invest3'] * $money / 100, 2); + $t1 = Db::name('LcUser')->where(['id'=>$uid])->value('top') ?: 0; + $t2 = Db::name('LcUser')->where(['id'=>$t1])->value('top') ?: 0; + $t3 = Db::name('LcUser')->where(['id'=>$t2])->value('top') ?: 0; + if (0 < $top1 && !empty($t1)) { + addFinance($t1, $top1, 1, '推荐会员投资' . $money . '元奖励' . $top1 . '元!'); + setNumber('LcUser', 'money', $top1, 1, "id = $t1"); + setNumber('LcUser', 'income', $top1, 1, "id = $t1"); + } + if (0 < $top2 && !empty($t2)) { + addFinance($t2, $top2, 1, '二级推荐会员投资' . $money . '元奖励' . $top2 . '元!'); + setNumber('LcUser', 'money', $top2, 1, "id = $t2"); + setNumber('LcUser', 'income', $top2, 1, "id = $t2"); + } + if (0 < $top3 && !empty($t3)) { + addFinance($t3, $top3, 1, '三级推荐会员投资' . $money . '元奖励' . $top3 . '元!'); + setNumber('LcUser', 'money', $top3, 1, "id = $t3"); + setNumber('LcUser', 'income', $top3, 1, "id = $t3"); + } +} + + +function setUserMember($uid, $value) +{ + $member = Db::name('LcUserMember')->where("value <= '{$value}'")->order('value desc')->find(); + if(empty($member)){ + $mid = 0; + }else{ + $mid = $member['id']; + } + Db::name('LcUser')->where("id = {$uid}")->update(array('member' => $mid)); + return $mid; +} + +function getUserField($uid, $field) +{ + return Db::name('LcUser')->where(['id'=>$uid])->value($field); +} + +function getUserPhone($uid) +{ + return Db::name('LcUser')->where(['id'=>$uid])->value('phone'); +} + +/** + * @description: + * @date: 2020/5/14 0014 + * @param $uid + * @param $money + * @param $id + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ +function setInvestReward($uid, $money,$id) +{ + $reward = Db::name("LcItem")->find($id); + $top1 = round($reward['invest1'] * $money / 100, 2); + $top2 = round($reward['invest2'] * $money / 100, 2); + $top3 = round($reward['invest3'] * $money / 100, 2); + /*$red1 = round($reward['red1'], 2); + $red2 = round($reward['red2'], 2); + $red3 = round($reward['red3'], 2);*/ + $t1 = getUserField($uid, 'top') ?: 0; + $t2 = getUserField($t1, 'top') ?: 0; + $t3 = getUserField($t2, 'top') ?: 0; + if (0 < $top1 && !empty($t1)) { + addFinance($t1,$top1,1,'推荐会员(' . getUserPhone($uid) . ')投资' . $money . '元奖励' . $top1 . '元!'); + setNumber('LcUser', 'money', $top1, 1, 'id=\'' . $t1 . '\''); + setNumber('LcUser', 'income', $top1, 1, 'id=\'' . $t1 . '\''); + } + + if (0 < $top2 && !empty($t2)) { + addFinance($t2, $top2,1, '二级推荐会员(' . getUserPhone($uid) . ')投资' . $money . '元奖励' . $top2 . '元!'); + setNumber('LcUser', 'money', $top2, 1, 'id=\'' . $t2 . '\''); + setNumber('LcUser', 'income', $top2, 1, 'id=\'' . $t2 . '\''); + } + + if (0 < $top3 && !empty($t3)) { + addFinance($t3, $top3,1, '三级推荐会员(' . getUserPhone($uid) . ')投资' . $money . '元奖励' . $top3 . '元!'); + setNumber('LcUser', 'money', $top3, 1, 'id=\'' . $t3 . '\''); + setNumber('LcUser', 'income', $top3, 1, 'id=\'' . $t3 . '\''); + } + //以下为红包奖励 +/* if (0 < $red1 && !empty($t1)) { + addFinance($t1, $red1, 1, '推荐会员(' . getUserPhone($uid) . ')投资' . $money . '元奖励红包' . $red1 . '元!'); + setNumber('user', 'money', $red1, 1, 'id=\'' . $t1 . '\''); + setNumber('user', 'income', $red1, 1, 'id=\'' . $t1 . '\''); + } + + if (0 < $red2 && !empty($t2)) { + addFinance($t2, $red2, 1, '二级推荐会员(' . getUserPhone($uid) . ')投资' . $money . '元奖励红包' . $red2 . '元!'); + setNumber('user', 'money', $red2, 1, 'id=\'' . $t2 . '\''); + setNumber('user', 'income', $red2, 1, 'id=\'' . $t2 . '\''); + } + if (0 < $red3 && !empty($t3)) { + addFinance($t3, $red3, 1, '三级推荐会员(' . getUserPhone($uid) . ')投资' . $money . '元奖励红包' . $red3 . '元!'); + setNumber('user', 'money', $red3, 1, 'id=\'' . $t3 . '\''); + setNumber('user', 'income', $red3, 1, 'id=\'' . $t3 . '\''); + }*/ +} + +/** + * @description: + * @date: 2020/5/14 0014 + * @param $id + * @param $money + * @param $uid + * @return bool + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ +function getInvestList($id, $money, $uid) +{ + $item = Db::name('LcItem')->where(['id'=>$id])->find(); + $title = $item['title']; + $type = $item['type']; + $day = $item['day']; + $jfbl = $item['jfbl']; + $rate = $item['rate']; + $mid = Db::name('LcUser')->where(['id'=>$uid])->value('member'); + $member = Db::name('LcUserMember')->where("id = $mid")->find(); + if (!empty($member) && 0 < $member['rate']) { + $rate += $member['rate'] ?: 0; + } + /*if (date('Y-m-d H:i:s') <= $item['jiaxitime']) { + $rate += $item['jiaxi'] ?: 0; + }*/ + //赠送抽奖次数 + if ($item['prize'] == 1) { + $num = intval($money / $item['min']); + setNumber('LcUser', 'prize', $num, 1, "id = $uid"); + } + //赠送积分 + if ($item['integral'] == 1) { + setNumber('LcUser', 'integral', intval($money)*intval($jfbl), 1, "id = $uid"); + } + $res=Db::name('LcInvest')->order("id desc")->find(); + if($res['number']){ + $number= date('ymd').sprintf("%05d", substr($res['number'],-5)+1); + }else{ + $number= date('ymd').'01000'; + } + $invest = array('uid' => $uid,'number'=>$number ,'pid' => $id, 'title' => $title, 'money' => $money, 'day' => $day, 'rate' => $rate, 'type1' => $type, 'type2' => getprojecttype($type), 'status' => 0, 'time' => date('Y-m-d H:i:s'),'time2'=>date('Y-m-d H:i:s', strtotime('+' . $item['day'] . ' day'))); + setNumber('LcUser', 'value', $money, 1, "id = $uid"); + setUserMember($uid, Db::name('LcUser')->where(['id'=>$uid])->value('value')); + setInvestReward($uid, $money,$id); + $iid = Db::name('LcInvest')->insertGetId($invest); + if (!empty($iid)) { + if ($type == 1) { + $base = 1; + } + else if ($type == 2) { + $base = 7; + } + else if ($type == 3) { + $base = 30; + } + else if ($type == 4) { + $base = 1; + } + else if ($type == 5) { + $base = $day; + } + elseif ($type == 6) { + $base = 1; + + }else{ + $base = 0; + } + $day2 = $day / $base; + $bool = false; + $money2 = $money; + $i = 1; + while($i <= $day2){ + $time1 = $i * $base; + $data = array('uid' => $uid, 'iid' => $iid, 'num' => $i, 'title' => $title, 'money1' => round($money * $rate / 100 * $base, 2), 'money2' => 0, 'time1' => $type == 6?$item['fixedtime']:date('Y-m-d H:i:s', strtotime('+' . $time1 . ' day')), 'time2' => '0000-00-00 00:00:00', 'pay1' => $money * $rate / 100 * $base, 'pay2' => 0, 'status' => 0); + if($type == 4){ + $data['money1'] = $money2 - $money + round($money2 * $rate / 100 * $base, 2); + $data['money2'] = $money; + $data['pay1'] = 0; + $money2 += round($money2 * $rate / 100 * $base, 2); + } + if($i == $day2){ + $data['pay1'] += $money; + $data['money2'] += $money; + } + if($i == $day2 && $type == 4) { + $data['pay1'] = $money + $data['money1']; + $data['money2'] = $money; + } + if(Db::name('LcInvestList')->insertGetId($data)){ + $bool = true; + } + ++$i; + } + return $bool; + } + return false; +} + +function getMallInvestList($id, $money, $uid,$tran_type) +{ + $item = Db::name('LcMall')->where(['id'=>$id])->find(); + $title = $item['title']; + $day = $item['day']; + $profit = $item['day_income']-$item['cost']; + + $res=Db::name('LcMallInvest')->order("id desc")->find(); + if($res['number']){ + $number= date('ymd').sprintf("%05d", substr($res['number'],-5)+1); + }else{ + $number= date('ymd').'01000'; + } + + $invest = array( + 'uid' => $uid, + 'pid' => $id, + 'number' => $number, + 'title' => $title, + 'money' => $money, + 'num' => $money/$item['min'], + 'day' => $day, + 'day_income' => $item['day_income'], + 'cost' => $item['cost'], + 'profit' => $profit, + 'type' => $tran_type, + 'status' => 0, + 'time' => date('Y-m-d H:i:s'), + 'time2'=> date('Y-m-d H:i:s', strtotime('+' . $item['day'] . ' day')), + ); + $iid = Db::name('LcMallInvest')->insertGetId($invest); + if (!empty($iid)) { + $base = 1; + $day2 = $day / $base; + $bool = false; + $i = 1; + while($i <= $day2){ + $time1 = $i * $base; + $data = array( + 'uid' => $uid, + 'iid' => $iid, + 'num' => $i, + 'title' => $title, + 'money1' => $profit, + 'money2' => 0, + 'time1' => date('Y-m-d H:i:s', strtotime('+' . $time1 . ' day')), + 'time2' => '0000-00-00 00:00:00', + 'pay1' => $profit, + 'pay2' => 0, + 'tran_type' => $tran_type, + 'status' => 0 + ); + if($i == $day2){ + $data['money2'] += $money; + } + if(Db::name('LcMallInvestList')->insertGetId($data)){ + $bool = true; + } + ++$i; + } + return $bool; + } + return false; +} + +/** + * @description:获取项目类型 + * @date: 2020/5/14 0014 + * @param $pid + * @return string + */ +function getProjectType($pid) +{ + $str = '到期还本还息'; + switch ($pid) { + case 1: + $str = '按日付收益,保证金到期全额返还'; + break; + case 2: + $str = '每周返息,到期还本'; + break; + + case 3: + $str = '每月返息,到期还本'; + break; + + case 4: + $str = '每日复利,保本保息'; + break; + + case 5: + $str = '到期还本还息'; + break; + case 6: + $str = '当天投资,当天还本付息'; + break; + } + return $str; +} + +function getItemField($id, $field) +{ + return Db::name('LcItem')->where(['id'=>$id])->value($field); +} + +function getMallItemField($id, $field) +{ + return Db::name('LcMall')->where(['id'=>$id])->value($field); +} + +function getInvestMoney($id) +{ + return Db::name('LcInvestList')->where("iid = '$id' AND pay1 <> 0")->sum('money1'); +} + +/** + * @description:通用跳转 + * @date: 2020/5/14 0014 + * @param $msg + * @param int $time + * @param string $url + */ +function msg($msg, $time = 2, $url = '') +{ + echo ' + + + + 跳转提示 + + + + +
+
+
+ + + +
+
+
+

' . $msg . '

+

+ 确定 +

+
+
+
+ + +'; + exit(); +} + + +//短信开关 +function smsStatus($code) +{ + return Db::name('LcSms')->where(['code' => $code])->value('status'); +} + +/** + * @description:短信接口 + * @date: 2020/9/3 0003 + * @param $phone + * @param $code + * @param $msg + * @return array + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + * @throws \think\exception\PDOException + */ +function sendSms($phone, $code, $msg) +{ + if (smsStatus($code) == 0) { + return reSmsCode('001'); + } + $sms = Db::name('LcSms')->where(['code' => $code])->find(); + if (empty($sms)) { + return reSmsCode('002'); + } + $sms_code = $msg; + $sign = "【" . sysconf('yunpian_sign') . "】"; + $msg = str_replace('【', '[', $msg); + $msg = str_replace('】', ']', $msg); + $smsMsg = str_replace('###', $msg, $sign . $sms['msg']); + $sms_type = sysconf("sms_api_type"); + if ($sms_type == 1) $recode = yunpian($phone, $code, $smsMsg); + elseif ($sms_type == 2) $recode = wangJian($phone, $smsMsg); + else $recode = smsbao($phone, $smsMsg); + $data = array('phone' => $phone, 'msg' => $smsMsg, 'code' => $recode . '#' . reSmsCode($recode)['msg'], 'time' => date('Y-m-d H:i:s'), 'ip' => $sms_code); + Db::name('LcSmsList')->insert($data); + return reSmsCode($recode); +} + +/** + * @description:云片短信接口 + * @date: 2020/9/3 0003 + * @param $phone + * @param $code + * @param $smsMsg + * @return string + * @throws \think\Exception + * @throws \think\exception\PDOException + */ +function yunpian($phone, $code, $smsMsg) +{ + if ($code == '18001' || $code == '18004') { + $apikey = sysconf('yunpian_key');//注册、找回密码 + } else { + $apikey = sysconf('yunpian_tkey');//通知 + } + $url = 'https://sms.yunpian.com/v2/sms/single_send.json'; + $encoded_text = urlencode($smsMsg); + $mobile = urlencode($phone); + $post_string = 'apikey=' . $apikey . '&text=' . $encoded_text . '&mobile=' . $mobile; + $msg = vpost($url, $post_string); + $msg = json_decode($msg, true); + if ($msg['code'] == '0') { + $recode = '000'; + } else if (0 < $msg['code']) { + $recode = '004'; + } else { + if ($msg['code'] < 0 && -50 < $msg['code']) { + $recode = '005'; + } else if ($msg['code'] == -50) { + $recode = '006'; + } else { + $recode = '009'; + } + } + return $recode; +} + + +/** + * @description:网建通短信接口 + * @date: 2020/9/3 0003 + * @param $phone + * @param $smsMsg + * @return string + * @throws \think\Exception + * @throws \think\exception\PDOException + */ +function wangJian($phone, $smsMsg) +{ + $smsapi = "http://utf8.api.smschinese.cn/"; + $user = sysconf('wj_user'); + $key = sysconf('wj_key'); + $sendurl = $smsapi . "?Uid=" . $user . "&Key=" . $key . "&smsMob=" . $phone . "&smsText=" . $smsMsg; + $result = file_get_contents($sendurl); + if ($result > 0) return '000'; + return '009'; +} + +/** + * @description:短信宝 + * @date: 2020/9/3 0003 + * @param $phone + * @param $content + * @return string + * @throws \think\Exception + * @throws \think\exception\PDOException + */ +function smsBao($phone, $content) +{ + $smsapi = "http://api.smsbao.com/"; + $user = sysconf('smsbao_user'); + $pass = sysconf('smsbao_pass'); + $pass = md5("$pass"); + $sendurl = $smsapi . "sms?u=" . $user . "&p=" . $pass . "&m=" . $phone . "&c=" . urlencode($content); + $result = file_get_contents($sendurl); + if ($result == '0') return '000'; + return '009'; +} + +/** + * @description: + * @date: 2020/9/3 0003 + * @param $url + * @param $data + * @return mixed + */ +function vpost($url, $data) +{ + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); + curl_setopt($curl, CURLOPT_AUTOREFERER, 1); + curl_setopt($curl, CURLOPT_POST, 1); + curl_setopt($curl, CURLOPT_POSTFIELDS, $data); + curl_setopt($curl, CURLOPT_TIMEOUT, 30); + curl_setopt($curl, CURLOPT_HEADER, 0); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + $tmpInfo = curl_exec($curl); + if (curl_errno($curl)) { + echo 'Errno' . curl_error($curl); + } + curl_close($curl); + return $tmpInfo; +} + +function reSmsCode($code) +{ + $data = array('code' => $code, 'msg' => '未知'); + switch ($code) { + case '000': + $data['msg'] = '发送成功'; + break; + case '001': + $data['msg'] = '平台未启用短信通知'; + break; + case '002': + $data['msg'] = '平台未设置该模板'; + break; + case '003': + $data['msg'] = '平台未设置签名'; + break; + case '004': + $data['msg'] = '操作过于频繁'; + break; + case '005': + $data['msg'] = '短信权限不足'; + break; + case '006': + $data['msg'] = '短信接口调用失败'; + break; + case '007': + $data['msg'] = '管理员已关闭短信通知'; + break; + case '008': + $data['msg'] = '操作过于频繁,请一小时后再试'; + break; + default: + $data['code'] = '009'; + $data['msg'] = '未知错误'; + } + return $data; +} +function ChickIsOpen($id){ + $pro = Db::name('LcProduct')->where('id',$id)->find(); + $otime_arr = []; + $otime_arr[] = $pro['opentime_1']; + $otime_arr[] = $pro['opentime_2']; + $otime_arr[] = $pro['opentime_3']; + $otime_arr[] = $pro['opentime_4']; + $otime_arr[] = $pro['opentime_5']; + $otime_arr[] = $pro['opentime_6']; + $otime_arr[] = $pro['opentime_7']; + + //此时时间 + $_time = time(); + $_zhou = (int)date("w"); + if($_zhou == 0){ + $_zhou = 7; + } + $_shi = (int)date("H"); + $_fen = (int)date("i"); + + $isopen = 1; + foreach ($otime_arr as $k => $v) { + if($k == $_zhou-1){ + $_check = explode('|',$v); + if(!$_check){ + continue; + } + foreach ($_check as $key => $value) { + $_check_shi = explode('~',$value); + if(count($_check_shi) != 2){ + continue; + } + $_check_shi_1 = explode(':',$_check_shi[0]); + $_check_shi_2 = explode(':',$_check_shi[1]); + //开市时间在1与2之间 + if($isopen == 1){ + continue; + } + if( ($_check_shi_1[0] == $_shi && $_check_shi_1[1] < $_fen) || + ($_check_shi_1[0] < $_shi && $_check_shi_2[0] > $_shi) || + ($_check_shi_2[0] == $_shi && $_check_shi_2[1] > $_fen) + ){ + $isopen = 1; + }else{ + $isopen = 0; + } + } + } + } + if ($pro['isopen']) { + return $isopen; + + }else{ + return 0; + } +} + +//计算小数点后位数 +function getFloatLength($num) { + $count = 0; + + $temp = explode ( '.', $num ); + + if (sizeof ( $temp ) > 1) { + $decimal = end ( $temp ); + $count = strlen ( $decimal ); + } + + return $count; +} + +/** + * 自定义返回提示信息 + * @author lukui 2017-07-14 + * @param [type] $data [description] + * @param [type] $type [description] + */ +function WPreturn($data,$type,$url=null) +{ + + $res = array('data'=>$data,'type'=>$type); + + if($url){ + $res['url'] = $url; + } + return $res; +} \ No newline at end of file diff --git a/application/index/view/index/about.html b/application/index/view/index/about.html new file mode 100755 index 0000000..752b378 --- /dev/null +++ b/application/index/view/index/about.html @@ -0,0 +1,93 @@ +{include file="public/header1" nav="关于我们"} + + + + + + +
+
+ +
+
关于我们
+
+
+
+ + {volist name="abour_type" id="t"} + +
+ + {$t.name} + +
+
+ {/volist} + + +
+
+{include file="public/footer" menu="about"} + + \ No newline at end of file diff --git a/application/index/view/index/about_details.html b/application/index/view/index/about_details.html new file mode 100755 index 0000000..3da7c7d --- /dev/null +++ b/application/index/view/index/about_details.html @@ -0,0 +1,23 @@ +{include file="public/header" nav="$article.title"} + +
+
+
+
+
+ + {$article.title} +
+
+
+ {:htmlspecialchars_decode($article['content'])} +
+
+
+
+ {include file="public/footer"} +
+
+ + + diff --git a/application/index/view/index/about_list.html b/application/index/view/index/about_list.html new file mode 100755 index 0000000..dfe0d11 --- /dev/null +++ b/application/index/view/index/about_list.html @@ -0,0 +1,79 @@ +{include file="public/header1" nav="$type_name"} + + + + + + +
+
+
+ +
+
{$type_name}
+
+
+ {volist name="about" id="t"} + +
+ + {$t.title} + +
+
+ {/volist} +
+
+{include file="public/footer" menu=""} + + \ No newline at end of file diff --git a/application/index/view/index/calculator.html b/application/index/view/index/calculator.html new file mode 100755 index 0000000..52d1c2d --- /dev/null +++ b/application/index/view/index/calculator.html @@ -0,0 +1,323 @@ + + + + + 计算器 + + + + + + + +
+
+ +
收益计算器
+
+
+
+
+ + + +
+
+ + + +
+
+ + + % +
+
+ + +
+
+ + +
+
+
+
+ 重新计算 +
    +
      + +
      +
      +
      + + diff --git a/application/index/view/index/ex_lists.html b/application/index/view/index/ex_lists.html new file mode 100755 index 0000000..243c1a4 --- /dev/null +++ b/application/index/view/index/ex_lists.html @@ -0,0 +1,287 @@ +{include file="public/header" nav="我的矿产"} + + + + +
      +
      + +
      + 矿机
      +
      + +
      合约 +
      +
      +
      +
      + +
      +
      +
      + + 正常矿机 + + + 到期矿机 + + +
      +
      +
      +
      累计收益
      +
      + {:round($ljsy,8)} BTC
      + +
      收益明细
      +
      +
      +
      + 有效矿机:{$yxkj} +   到期矿机:{$dqkj} +
      +
      +
      +
      + {volist name="invest" id="i"} +
    • +
      + 已到期 +
      +
      + + {$i.title} +
      +
      +
        +
      • + 订单保证金 + {$i.money/$i.num}元 × {$i.num}份 +
      • +
      • + 净收益/天 + {$i.profit} × {$i.num}份 +
      • +
      • + 已收益 + {$i.profit*$i.num} +
      • +
      • + 售出方式 + {$i.type=='1'?'手动出售':'自动售出'} +
      • +
      • + 订单号 + {$i.number} +
      • +
      • + 到期时间 + {:date("Y-m-d",strtotime($i.time2))} +
      • +
      + +
      + 查看矿机租赁合同 +
      +
      +
      +
      + 展开更多 +
      +
    • + {/volist} +
      +
      +
      +{include file="public/footer" menu="list"} + + + diff --git a/application/index/view/index/expirefutures.html b/application/index/view/index/expirefutures.html new file mode 100755 index 0000000..d97a09e --- /dev/null +++ b/application/index/view/index/expirefutures.html @@ -0,0 +1,285 @@ +{include file="public/header" nav="我的合约"} + + + +
      +
      + +
      + 矿机
      +
      + +
      合约 +
      +
      +
      +
      +
      +
      + +
      +
      +
      累计收益
      +
      + {:round($ljsy,2)} 元
      + +
      收益明细
      +
      +
      +
      + 在期合约:{$yxkj} +   到期合约:{$dqkj} +
      +
      +
      +
      + {volist name="invest" id="i"} +
    • + +
      + + {$i.title} +
      +
      +
        +
      • + 合约金额 + {$i.money}元 +
      • +
      • + 净收益率 + {$i.rate}% +
      • +
      • + 已收益 + 0 +
      • +
      • + 合约天数 + {$i.day} +
      • +
      • + 订单号 + {$i.number} +
      • +
      • + 到期时间 + {:date("Y-m-d",strtotime($i.time2))} +
      • +
      + +
      + 查看矿机租赁合同 +
      +
      +
      +
      + 展开更多 +
      +
    • + {/volist} +
      +
      +
      +{include file="public/footer" menu="list"} + + + diff --git a/application/index/view/index/form.html b/application/index/view/index/form.html new file mode 100755 index 0000000..5b49dfe --- /dev/null +++ b/application/index/view/index/form.html @@ -0,0 +1,658 @@ +{include file="public/header1" nav="交易详情"} + + + +
      +
      +
      + +
      +
      交易详情
      +
      +
      +
      +
      + + + + +
      {$data['title']}
      +
      购买金额
      +
      + + +
      +
      最低起投{:round($data['min'],2)}元,加一次为100整数倍
      + +
      支付密码
      +
      + +
      +
      支付密码默认为登录密码
      + {if condition="$data['offvoucher'] eq 1 and $voushow eq 1"} +
      投资抵用券
      +
      + 请选择投资抵用券 + +
      +
      最多使用{$usevounum}张投资抵用券
      + {/if} +
      +
      +
      + 账户余额 + ¥{$user['money']} +
      +
      + 可购金额(元) + {:getProjectSurplus($data['id'])} +
      +
      + 日化收益率 + {:round($data['rate'],2)}% +
      +
      + 结息时间 + 满24小时自动发放收益 +
      +
      + 起投金额 + {:round($data['min'],2)}元 +
      + +
      +
      确认
      +
      +
      +
      + +
      + + + +
      +
      +

      温馨提示

      +

      +
      +
      确定
      +
      +
      +
      + + + + + diff --git a/application/index/view/index/futureslist.html b/application/index/view/index/futureslist.html new file mode 100755 index 0000000..eb1b360 --- /dev/null +++ b/application/index/view/index/futureslist.html @@ -0,0 +1,152 @@ +{include file="public/header" nav="算力合约"} + + + + +
      + 算力合约 + + +
      +
      +
      +
        + {volist name="item" id="i"} +
      • + +
        日化收益{:round($i['rate'],2)}%
        +
        + 投资周期 + {$i.day}天 +
        +
        + 收益方式 + {:getProjectType($i['type'])} +
        +
        + 起购金额 + {:round($i['min'],2)}元 +
        +
        + 本期份额 + {:round($i['total']*10000,2)}元 +
        +
        + 剩余份额 + {:getProjectSurplus($i['id'])}元 +
        +
        + 合约进度 + + + + {:round(getProjectPercent($i['id']),2)}% +
        +
      • + {/volist} +
      +
      +
      + + diff --git a/application/index/view/index/goods.html b/application/index/view/index/goods.html new file mode 100755 index 0000000..4f63341 --- /dev/null +++ b/application/index/view/index/goods.html @@ -0,0 +1,806 @@ +{include file="public/header" nav="-"} + + + + + + + + + + + +
      +
      + + + + + + +
      +
      +
      +
      {$info.Price}
      +
      + {$info.Open} + {$info.Close} +
      +
      +
      +
      最高{$info.High}
      +
      最低{$info.Low}
      +
      +
      + + +
      +
      +
      +
      Time:
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + +
      + +

      买涨

      +
      +
      + +

      买跌

      +
      +
      + +
      +
      +
      +
      +
      + 订单确认 +
      + +
      +
      +
      +
      +
      +

      结算时间/赔率

      + +
      +
      + {if $info.protime_1 > 0 } +
      +
      + {$info.protime_1*300} + 秒|85% +
      + {if $info.showps==1 or $info.showps2==1} + {/if} +
      + {/if} + {if $info.protime_2 > 0 } +
      +
      + {$info.protime_2*30} + 秒|90% +
      + {if $info.showps==1 or $info.showps2==1} + {/if} +
      + {/if} + {if $info.protime_3 > 0 } +
      +
      + {$info.protime_3*30} + 秒|95% +
      + {if $info.showps==1 or $info.showps2==1} + {/if} +
      + {/if} + {if $info.protime_4 > 0 } +
      + + + +
      + {$info.protime_4*60} + +
      + {if $info.showps==1 or $info.showps2==1} + + {/if} +
      + {/if} +
      +
      +
      +
      +
      +
      +
      + + + +

      投资金额

      +
      + + + +
      +
      + + + + +
      +
      +
      +
      +
      +
      + +
      +
      +
      余额: ¥ {$user.money}
      +
      手续费:{:getinfo('order_charge')}%
      +
      +
      +
      +
      +
      + +
      +
      + +
      +
      名称
      +
      方向
      +
      现价
      +
      金额
      +
      +
      +
      {$info['title']}222
      +
      买涨
      +
      {$info['Price']}
      +
      + +
      +

      + 预期收益 : ¥ +    + 保底金额 : ¥ 0.00 +

      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      现价
      +
      {$info.Price}
      +
      +
      +
      +

      交易成功,等待结算

      +

      + 剩余时间: + 天Invalid Date +

      +
      +
      +
      +

      方向

      +

      +
      +
      +

      金额

      +

      +
      +
      +

      执行价

      +

      +
      +
      +

      预测结果

      +

      +
      +
      +
      +
      +
      +
      + + 请稍后…… +
      +
      +
      +
      +
      +
      + + 正在提交订单 +
      +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +
      到期结算完成
      +
      +
      +
      +
      +

      方向

      +

      +
      +
      +

      金额

      +

      +
      +
      +

      执行价

      +

      +
      +
      +

      成交价

      +

      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      +
      + +
      +
        +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      + + {include file="public/footer" menu='goods'} +
      +
      + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/index/view/index/home.html b/application/index/view/index/home.html new file mode 100755 index 0000000..1b53c66 --- /dev/null +++ b/application/index/view/index/home.html @@ -0,0 +1,215 @@ +{include file="public/header" nav="首页"} + + +
      +
      +
      +
      + {volist name="banner" id="s"} +
      + {/volist} +
      +
      +
      + + + 涨幅榜 + +
      +
      +
      +
      + + + + + + + + {volist name="product" id="vo"} + + + + + + + {/volist} +
      LOGO名称最新价交易状态
      + + + {$vo['title']} + + + + +
      + + + + + + + + + + + + + + + + + +
      +
      +
      + {include file="public/footer" menu='index'} +
      + +
      {if $ater} +
      +
      + +
      + {$ater.title} +
      +
      + {$ater.content|raw} +
      + +
      +
      {/if} + + diff --git a/application/index/view/index/index.html b/application/index/view/index/index.html new file mode 100755 index 0000000..d4fa749 --- /dev/null +++ b/application/index/view/index/index.html @@ -0,0 +1,170 @@ + + + + + 线路选择 + + + + + + + + + + + +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + + \ No newline at end of file diff --git a/application/index/view/index/item.html b/application/index/view/index/item.html new file mode 100755 index 0000000..09d422c --- /dev/null +++ b/application/index/view/index/item.html @@ -0,0 +1,243 @@ + + + + + + + + + 产品详情 + + + + + + + + + + +
      + 产品介绍 + + +
      +
      +
      +
      +
      +
      日化收益率
      +
      + {:round($data['rate'],2)}%
      +
      +
      +
      合约期限
      +
      + {$data.day} +
      +
      +
      + +
        +
      • +
        +
        + 本期总额(元) + {:round($data['total']*10000,2)} +
        +
        + 剩余份额(元) + {:getProjectSurplus($data['id'])} +
        +
        + 起购金额(元) + {:round($data['min'],2)} +
        +
        +
        + + 已售{:round(getProjectPercent($data['id']),2)}% + + + +
        +
      • +
      + +
      +
        +
      • +
        产品介绍
        +
        产品名称{$data.title}
        +
        + 合约算力 + {$data.hysl}Ghash +
        +
        + 收益方式 + {:getProjectType($data['type'])} +
        +
        + 产品亮点 + {$data.desc} +
        +
      • +
      +
      + +
      +
        +
      • +
        + + 产品详情 + +
        + {:htmlspecialchars_decode($data['fixedcontent'])} +
      • +
      +
      + +
      +
      + + +
      + 马上抢购
      +
      + + diff --git a/application/index/view/index/lists.html b/application/index/view/index/lists.html new file mode 100755 index 0000000..cc297eb --- /dev/null +++ b/application/index/view/index/lists.html @@ -0,0 +1,286 @@ +{include file="public/header" nav="我的矿产"} + + + +
      +
      + +
      + 矿机
      +
      + +
      合约 +
      +
      +
      +
      +
      +
      +
      + + 正常矿机 + + + + 到期矿机 + +
      +
      +
      +
      累计收益
      +
      + {:round($ljsy,8)} BTC
      + +
      收益明细
      +
      +
      +
      + 有效矿机:{$yxkj} +   到期矿机:{$dqkj} +
      +
      +
      +
      + {volist name="invest" id="i"} +
    • +
      + 运行中 +
      +
      + + {$i.title} +
      +
      +
        +
      • + 订单保证金 + {$i.money/$i.num}元 × {$i.num}份 +
      • +
      • + 净收益/天 + {$i.profit} × {$i.num}份 +
      • +
      • + 已收益 + 0.00000000 +
      • +
      • + 售出方式 + {$i.type=='1'?'手动出售':'自动售出'} +
      • +
      • + 订单号 + {$i.number} +
      • +
      • + 到期时间 + {:date("Y-m-d",strtotime($i.time2))} +
      • +
      + +
      + 查看矿机租赁合同 +
      +
      +
      +
      + 展开更多 +
      +
    • + {/volist} +
      +
      +
      +{include file="public/footer" menu="list"} + + + diff --git a/application/index/view/index/mall.html b/application/index/view/index/mall.html new file mode 100755 index 0000000..d1dab64 --- /dev/null +++ b/application/index/view/index/mall.html @@ -0,0 +1,226 @@ + + + + + + + + + 矿机商城 + + + + + + + + +
      + 矿机商城 + + +
      +
      +
      +
      +
      +
      + {volist name="mall" id="i"} +
    • +
      + + + + +
      +
      + +
      {$i.title}
      +
      +
      + 净收益/天:{:getProfit($i.day_income,$i.cost)} BTC +
      +
      + 使用期限:{$i.day} 天 +
      +
      + + 保证金: + {$i.min} + +
      + 支付 +
      +
      + +
      +
      +
      +
      + + {:getMinerPercent($i.total,$i.stock)}% +
      + 仅剩{$i.stock}份 +
      +
      +
    • + {/volist} +
      +
      +
      +
      +
      + + diff --git a/application/index/view/index/mall_detail.html b/application/index/view/index/mall_detail.html new file mode 100755 index 0000000..72b6dcc --- /dev/null +++ b/application/index/view/index/mall_detail.html @@ -0,0 +1,271 @@ + + + + + + + + + 矿机详情 + + + + + + + + + + +
      + {$data.title} + + +
      +
      +
      + +
      +
      + + 规格参数 + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      规格 + 参数
      使用期限{$data.day} 天
      保证金{$data.min} 元/份
      算力{$data.power} TH/s
      日总产出{$data.day_income} BTC/天
      日运维费{$data.cost} BTC/天
      日净收益{:getProfit($data.day_income,$data.cost)} BTC/天
      日化收益率{$data.rate}
      上架时间{$data.time}
      +
      + +
      +
        +
      • +
        + + 产品详情 + +
        + {:htmlspecialchars_decode($data['fixedcontent'])} +
      • +
      +
      +
      +
      + + +
      + 马上抢购
      +
      + + diff --git a/application/index/view/index/mall_form.html b/application/index/view/index/mall_form.html new file mode 100755 index 0000000..5244f10 --- /dev/null +++ b/application/index/view/index/mall_form.html @@ -0,0 +1,516 @@ + + + + + + + + + 交易详情 + + + + + + + + + +
      + 交易详情 + + +
      +
      +
      +
      +
      + 保证金(元) + {$data.min} +
      +
      + 租赁期限(天) + {$data.day} +
      +
      +
      + + {$data.title} + 本批剩余{$data.stock}份 +
      + +
        +
      • + 收益方式 + 每日分配收益,保证金到期全额返还 +
      • +
      • + 日净收益 + {:getProfit($data.day_income,$data.cost)} BTC +
      • +
      • + 总净收益 + {:round(getProfit($data.day_income,$data.cost)*$data.day,8)} BTC +
      • +
      • + 总保证金 + ¥{$data.min} +
      • +
      • + BTC售出方式 + + + + +
      • +
      • + 租赁份数 + +
      • +
      • + 每次加减1份,可自行输入份数 +
      • +
      + +
      + 实付:¥{$data.min} + 确认支付 +
      +
      +
      +
      +
      +
      请输入支付密码 +
      ×
      +
      +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      +
      安全支付环境,请放心使用
      +
        +
        + +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + + diff --git a/application/index/view/index/msg_view.html b/application/index/view/index/msg_view.html new file mode 100644 index 0000000..b0358c8 --- /dev/null +++ b/application/index/view/index/msg_view.html @@ -0,0 +1,25 @@ +{include file="public/header" nav="消息详情"} + +
        +
        +
        +
        +
        + + {$msg.title} +
        +
        + +
        + {:htmlspecialchars_decode($msg['content'])} +
        +
        +
        +
        + {include file="public/footer" menu='index'} +
        +
        + + + + diff --git a/application/index/view/index/my_news.html b/application/index/view/index/my_news.html new file mode 100755 index 0000000..661a5cb --- /dev/null +++ b/application/index/view/index/my_news.html @@ -0,0 +1,124 @@ + + + + + + + 新闻 + + + + + + + + + + +
        +
        + +
        + {include file="public/footer" menu='news'} +
        + + + + + + + \ No newline at end of file diff --git a/application/index/view/index/new_index.html b/application/index/view/index/new_index.html new file mode 100755 index 0000000..262d6a1 --- /dev/null +++ b/application/index/view/index/new_index.html @@ -0,0 +1,87 @@ + + + + + + 新闻 + + + + + + + + + +
        +
        + +
        + + +
        + + {if getInfo("activity1_status")} +
        +
        +
        + 关闭 + +
        +
        +
        +
        + {/if} + + + + + diff --git a/application/index/view/index/normalfutures.html b/application/index/view/index/normalfutures.html new file mode 100755 index 0000000..2bf53eb --- /dev/null +++ b/application/index/view/index/normalfutures.html @@ -0,0 +1,286 @@ +{include file="public/header" nav="我的合约"} + + + +
        +
        + +
        + 矿机
        +
        + +
        合约 +
        +
        +
        +
        +
        +
        +
        + + 在期合约 + + + + 到期合约 + +
        +
        +
        +
        累计收益
        +
        + {:round($ljsy,2)} 元
        + +
        收益明细
        +
        +
        +
        + 在期合约:{$yxkj} +   到期合约:{$dqkj} +
        +
        +
        +
        + {volist name="invest" id="i"} +
      • + +
        + + {$i.title} +
        +
        +
          +
        • + 合约金额 + {$i.money}元 +
        • +
        • + 净收益率 + {$i.rate}% +
        • +
        • + 已收益 + 0 +
        • +
        • + 合约天数 + {$i.day} +
        • +
        • + 订单号 + {$i.number} +
        • +
        • + 到期时间 + {:date("Y-m-d",strtotime($i.time2))} +
        • +
        + +
        + 查看矿机租赁合同 +
        +
        +
        +
        + 展开更多 +
        +
      • + {/volist} +
        +
        +
        +{include file="public/footer" menu="list"} + + + diff --git a/application/index/view/index/notice.html b/application/index/view/index/notice.html new file mode 100755 index 0000000..300f6c2 --- /dev/null +++ b/application/index/view/index/notice.html @@ -0,0 +1,36 @@ +{include file="public/header" nav="最新公告"} + +
        +
        +
        +
        +
        + + 最新公告 +
        +
        + {if count($notice)} + + {else/} +
        +

        没有更多数据了

        +
        + {/if} +
        +
        +
        + {include file="public/footer"} +
        +
        + + + diff --git a/application/index/view/index/prize.html b/application/index/view/index/prize.html new file mode 100755 index 0000000..63413b0 --- /dev/null +++ b/application/index/view/index/prize.html @@ -0,0 +1,131 @@ + + + + + + + 大转盘 + + + + + + + + + + +
        + + + + + +
        + +
        + +
        + +
        +
        + + + + +
        + {volist name="prize_list" id="vo"} +
        + {$vo.msg} +
        + {/volist} + + +
        + + +
        + {:htmlspecialchars_decode($data['rule'])} +
        +
        + + +
        +
        +
        + + 中奖啦
        +
        +
        关闭
        +
        +
        + + +
        +
        +
        + 很遗憾
        没有抽中礼品 +
        +
        关闭
        +
        +
        + + + + + + + + + + \ No newline at end of file diff --git a/application/index/view/index/prize_list.html b/application/index/view/index/prize_list.html new file mode 100755 index 0000000..bbde5d4 --- /dev/null +++ b/application/index/view/index/prize_list.html @@ -0,0 +1,108 @@ + + + + + + + + 抽奖记录 + + + + + + + +
        + + +
        + + + + + + + + + + {volist name="prize" id="p"} + + + + + + {/volist} + +
        奖品类型日期
        {$p.name} + {if condition="$p['type'] eq 1"} + 现金 + {else/} + 实物 + {/if} + {:date('m-d H:i',strtotime($p['time']))}
        +
        +
        +
        + + \ No newline at end of file diff --git a/application/index/view/index/shop.html b/application/index/view/index/shop.html new file mode 100755 index 0000000..024b87b --- /dev/null +++ b/application/index/view/index/shop.html @@ -0,0 +1,68 @@ +{include file="public/header" nav="积分商城"} + + + + \ No newline at end of file diff --git a/application/index/view/index/shop_details.html b/application/index/view/index/shop_details.html new file mode 100755 index 0000000..746e188 --- /dev/null +++ b/application/index/view/index/shop_details.html @@ -0,0 +1,143 @@ +{include file="public/header" nav="商品详情"} + +
        +
        + + + +
        商品详情
        +
        +
        +
        +
        + +
        +
        + [{if condition="$goods['type'] eq 1"}现金{else/}实物{/if}] {$goods.title} +
        +
        +
        + 需{$goods.integral}积分 +
        +
        + 剩{$goods.num}份 +
        +
        +
        +
        +
        +
        + 您有{$count}积分 +
        +
        + +
        +
        +
        +
        +
        商品详情
        +
        + {:htmlspecialchars_decode($goods['content'])} +
        +
        +
        + © {:getInfo('webname')} +
        +
        +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + \ No newline at end of file diff --git a/application/index/view/index/shop_order.html b/application/index/view/index/shop_order.html new file mode 100755 index 0000000..9fa385c --- /dev/null +++ b/application/index/view/index/shop_order.html @@ -0,0 +1,37 @@ +{include file="public/header" nav="兑换记录"} + + + \ No newline at end of file diff --git a/application/index/view/login/index.html b/application/index/view/login/index.html new file mode 100755 index 0000000..a333954 --- /dev/null +++ b/application/index/view/login/index.html @@ -0,0 +1,110 @@ + + + + + + + + + + + 会员登录 + + + + + + +
        +
        + +
        +
        +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + + + diff --git a/application/index/view/login/reg.html b/application/index/view/login/reg.html new file mode 100755 index 0000000..79f225d --- /dev/null +++ b/application/index/view/login/reg.html @@ -0,0 +1,192 @@ + + + + + + + + + + +会员注册 + + + + + + + +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + + + diff --git a/application/index/view/public/footer.html b/application/index/view/public/footer.html new file mode 100755 index 0000000..6f6e05a --- /dev/null +++ b/application/index/view/public/footer.html @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/application/index/view/public/header.html b/application/index/view/public/header.html new file mode 100755 index 0000000..323ad88 --- /dev/null +++ b/application/index/view/public/header.html @@ -0,0 +1,20 @@ + + + + + + + + + + + [nav] + + + + + \ No newline at end of file diff --git a/application/index/view/public/header1.html b/application/index/view/public/header1.html new file mode 100755 index 0000000..083f999 --- /dev/null +++ b/application/index/view/public/header1.html @@ -0,0 +1,9 @@ + + + + + + [nav] + + + diff --git a/application/index/view/user/account.html b/application/index/view/user/account.html new file mode 100755 index 0000000..c295f43 --- /dev/null +++ b/application/index/view/user/account.html @@ -0,0 +1,231 @@ +{include file="public/header" nav="我的"} + + + + + + + + +
        +
        +
        + +
        + + + + + + + +
        +
        +

        持仓明细(0)

        +
        +
        +

        历史明细(0)

        +
        +
        +
        +
        + + + + + + + + + + +
          +
        +
        + +
          +
        +
        +
        +
        + +
        + + + + + + +
        +
        + +
        +
        + {include file="public/footer" menu='account'} +
        +
        +
        + + + + + + diff --git a/application/index/view/user/add_card.html b/application/index/view/user/add_card.html new file mode 100755 index 0000000..27a2895 --- /dev/null +++ b/application/index/view/user/add_card.html @@ -0,0 +1,100 @@ +{include file="public/header" nav="添加银行卡"} + + +
        +
        +
        +
        +
        + + 添加银行卡 +
        +
        +
          +
        • + + +
        • + {if condition="getInfo('bank') eq 0"} +
        • + + +
        • +
        • + + +
        • + {else/} + + + {/if} +
        • + + +
        • +
        +
        + +
        +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + + diff --git a/application/index/view/user/alipay.html b/application/index/view/user/alipay.html new file mode 100755 index 0000000..d7ba6d5 --- /dev/null +++ b/application/index/view/user/alipay.html @@ -0,0 +1,125 @@ +{include file="public/header1" nav="支付宝设置"} + + + +
        + + + +
        支付宝设置
        +
        +
        +
        +
        +
        真实姓名
        +
        +
        +
        +
        支付宝账号
        +
        +
        +

        绑定的支付宝必须与实名一致,否则将无法成功提现

        + {if condition="empty($user['alipay'])"} +
        确认
        + {/if} +
        +
        + + + + + diff --git a/application/index/view/user/bank.html b/application/index/view/user/bank.html new file mode 100755 index 0000000..39d25db --- /dev/null +++ b/application/index/view/user/bank.html @@ -0,0 +1,564 @@ + + + + + + 银行入款充值 + + + +
        +
        +
        + +
        +
        银行入款充值
        +
        +
        +
        +
        +
        + +
        +
        银行入款
        +
        {$money}元
        + +
        +
        + 此为我公司财务,请放心充值 +
        +
        +
        收款银行:
        +
        + {if condition="$type eq 'gz_bank'"} + {:getInfo('gz_bank_type')} + {/if} + {if condition="$type eq 'alipay_bank'"} + {:getInfo('alipay_bank_type')} + {/if} + {if condition="$type eq 'wx_bank'"} + {:getInfo('wx_bank_type')} + {/if} + {if condition="$type eq 'bank'"} + {:getInfo('pay_bank_type')} + {/if} +
        +
        +
        +
        收款人:
        +
        + {if condition="$type eq 'gz_bank'"} + {:getInfo('gz_bank_name')} + {/if} + {if condition="$type eq 'wx_bank'"} + {:getInfo('wx_bank_name')} + {/if} + {if condition="$type eq 'alipay_bank'"} + {:getInfo('alipay_bank_name')} + {/if} + {if condition="$type eq 'bank'"} + {:getInfo('pay_bank_name')} + {/if} +
        +
        +
        +
        收款账号:
        +
        + {if condition="$type eq 'gz_bank'"} + {:getInfo('gz_bank_account')} + {/if} + {if condition="$type eq 'wx_bank'"} + {:getInfo('wx_bank_account')} + {/if} + {if condition="$type eq 'alipay_bank'"} + {:getInfo('alipay_bank_account')} + {/if} + {if condition="$type eq 'bank'"} + {:getInfo('pay_bank_account')} + {/if} +
        +
        +
        +
        + +
        +
        +
        付款人:
        +
        +
        +
        +
        转账附言:
        +
        +
        +
        +
        提交
        +
        +
        +
        +
        注意事项
        +
        + {if condition="$type eq 'gz_bank'"} + {:getInfo('gz_bank')} + {/if} + {if condition="$type eq 'wx_bank'"} + {:getInfo('wx_bank')} + {/if} + {if condition="$type eq 'alipay_bank'"} + {:getInfo('alipay_bank')} + {/if} + {if condition="$type eq 'bank'"} + {:getInfo('pay_bank')} + {/if} +
        +
        +
        +
        + +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + + + + diff --git a/application/index/view/user/bank_card.html b/application/index/view/user/bank_card.html new file mode 100755 index 0000000..b3b01af --- /dev/null +++ b/application/index/view/user/bank_card.html @@ -0,0 +1,44 @@ +{include file="public/header" nav="银行卡管理"} + +
        +
        +
        +
        +
        + + 银行卡管理 +
        +
        + {if condition="$bank"} + {volist name="bank" id="b"} +
          +
        • + + {$b.bank} ****{:substr($b['account'], strlen($b['account']) - 4, 4)} + {$b.name} + +
        • +
        + {/volist} + + + {else} + {/if} +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        + + + \ No newline at end of file diff --git a/application/index/view/user/cash.html b/application/index/view/user/cash.html new file mode 100755 index 0000000..c293039 --- /dev/null +++ b/application/index/view/user/cash.html @@ -0,0 +1,156 @@ +{include file="public/header" nav="提现"} + + + +
        +
        +
        +
        +
        + + 提现 +
        +
        +
        +
        可提现金额(元)
        +
        + + {$user['money']} +
        +
        +
        +
        提现金额
        +
        + + + {$txsxf?$txsxf:'0'}% +
        +
        单次提现金额最低 {$cash_min?$cash_min:'0'}元
        +
        + + +
        + + +
        +
        + +
        + {if $bank} + + {else} +

        绑定银行卡 +

        + {/if} +
        +
        + {if $bank} +
        + +
        + {else} +
        + +
        + {/if} + +

        提示:

        +

        1.提现限制:{$cash_min} - {$cash_max}

        +

        2.提现时间:{$cash_start} - {$cash_end}

        +

        3.若忘记提款密码,请点击找回

        +
        + +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + + + + diff --git a/application/index/view/user/cash_record.html b/application/index/view/user/cash_record.html new file mode 100755 index 0000000..1731750 --- /dev/null +++ b/application/index/view/user/cash_record.html @@ -0,0 +1,71 @@ +{include file="public/header" nav="提现记录"} + + +
        +
        +
        +
        +
        + + 提现记录 +
        +
        + {if count($cash) > 0} + {volist name="cash" id="r"} +
          +
        • + 时间: +

          {$r.time}

          +
        • +
        • + 金额: +

          ¥{$r.money}

          +
        • +
        • + 手续费: +

          {$r.sxfbfb}%

          +
        • +
        • + 实际到账: +

          ¥{$r.dzje}

          +
        • +
        • + 类型: +

          {if condition="$r['bid'] eq 0"}支付宝提现{else}银行卡提现{/if}

          +
        • +
        • + 状态: +

          + {if condition="$r['status'] eq 0"} + 审核中 + {/if} + {if condition="$r['status'] eq 1"} + 申请成功 + {/if} + {if condition="$r['status'] eq 2"} + 申请失败 + {/if} +

          +
        • + {if condition="$r['reaolae'] "} +
        • + 拒绝原因: +

          {$r.reaolae}

          +
        • + {/if} +
        + {/volist} + {else/} +
        +

        没有更多数据了

        +
        + {/if} +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        + + + diff --git a/application/index/view/user/certification.html b/application/index/view/user/certification.html new file mode 100755 index 0000000..473669f --- /dev/null +++ b/application/index/view/user/certification.html @@ -0,0 +1,103 @@ +{include file="public/header" nav="实名认证"} + + +
        +
        +
        +
        +
        + + 实名认证 +
        +
        + {if condition="$user['auth'] eq 1"} +
        +

        +
        +
          +
        • + + {$user.name} +
        • +
        • + + {$user.idcard} +
        • +
        + {else /} +
          +
        • + + +
        • +
        • + + +
        • +
        + +
        + +
        + {/if} +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + + diff --git a/application/index/view/user/contract.html b/application/index/view/user/contract.html new file mode 100755 index 0000000..fd7b346 --- /dev/null +++ b/application/index/view/user/contract.html @@ -0,0 +1,80 @@ +{include file="public/header" nav="合同"} +
        +
        + + + +
        合同书
        +
        +
        + +
        +

        {:getInfo('webname')}投资合同书

        +

        合同编号:{$invest['number']}

        +

        :{:getUserField($uid,'name')}

        +

        :{:getInfo('company')}

        +

        :{:getItemField($invest['pid'],'guarantee')}

        +

        甲乙丙双方经友好协商,本着平等自愿、诚实信用的原则,就甲方使用乙方提供的本网站所有服务的

        +

        +

        一、

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        产品名称{$invest.title}
        投资人姓名{:getUserField($uid,'name')}
        投资人身份证{:getUserField($uid,'idcard')}
        投入本金数额
        (下称"甲方投资本金")
        {$invest.money}元
        协议期(天){$invest.day}天
        预期收益率{$invest.rate}%
        起息日{:date('Y-m-d',strtotime($invest['time']))}
        到期日{:date('Y-m-d',strtotime('+'.$invest['day'].' day',strtotime($invest['time'])))}
        应收本息(元){:getInvestMoney($invest['id'])+$invest['money']}元
        还款方式{$invest.type2}
        + {:htmlspecialchars_decode(getInfo('contract'))} +
        +
        +

        甲方:{:getUserField($uid,'name')}

        + {:date('Y年m月d日',strtotime($invest['time']))} +
        +
        +

        乙方:{:getInfo('company')}

        + {:date('Y年m月d日',strtotime($invest['time']))} +
        +
        +
        +

        丙方:{:getItemField($invest['pid'],'guarantee')}

        + {:date('Y年m月d日',strtotime($invest['time']))} +
        +
        +
        + + \ No newline at end of file diff --git a/application/index/view/user/details.html b/application/index/view/user/details.html new file mode 100755 index 0000000..b27c1fb --- /dev/null +++ b/application/index/view/user/details.html @@ -0,0 +1,55 @@ +{include file="public/header" nav="投资详情"} +
        +
        + + + +
        投资详情
        +
        +
        +
        +
        + 投资金额:{$invest.money}元 + 预期效益:{:getInvestMoney($invest['id'])}元
        + 投资时间:{:date('Y-m-d',strtotime($invest['time']))} + 到期时间:{:date('Y-m-d',strtotime('+'.$invest['day'].' day',strtotime($invest['time'])))}
        + 收益方式:{$invest.type2} +
        +
        + + + + + + + + + + + + {volist name="list" id="l"} + + + + + + + + + + + {/volist} +
        期号应收本金应收利息应收时间收益时间应收总额已支付状态
        第{$l.num}期{$l.money2}{$l.money1}{$l.time1} + + {$l.pay1}{$l.pay2} + {if condition="$l['status'] eq 1"} + 已完成 + {else/} + 未完成 + {/if} +
        +
        +
        +
        + + \ No newline at end of file diff --git a/application/index/view/user/extend.html b/application/index/view/user/extend.html new file mode 100755 index 0000000..98b9f2a --- /dev/null +++ b/application/index/view/user/extend.html @@ -0,0 +1,182 @@ +{include file="public/header1" nav="推广记录"} + + + + +
        +
        + +
        +
        推广记录
        +
        + {volist name="results" id="r"} +
        +
        +
        +

        {$r.name|default='未实名'}({$r.phone})

        +
        +

        注册日期:{:date('Y-m-d',strtotime($r['time']))}

        +
        +
        +

        + 充值金额:{$r.recharge} 元 +

        +

        + 提现金额:{$r.cash} 元 +

        +
        +
        + {/volist} +
        暂无更多记录
        + + + + diff --git a/application/index/view/user/fund.html b/application/index/view/user/fund.html new file mode 100755 index 0000000..301088e --- /dev/null +++ b/application/index/view/user/fund.html @@ -0,0 +1,43 @@ +{include file="public/header" nav="资金明细"} + +
        +
        +
        +
        +
        + + 资金明细 +
        +
        + {if count($finance) > 0} + {volist name="finance" id="f"} +
          +
        • + 时间: +

          {$f['time']}

          +
        • +
        • + 备注: +

          {$f.reason}

          +
        • +
        • + 金额: +

          {if condition="$f['type'] eq 1"}+{else /}-{/if}{$f.money}

          +
        • +
        + {/volist} + {else/} +
        +

        没有更多数据了

        +
        + {/if} +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        + + + + diff --git a/application/index/view/user/hold.html b/application/index/view/user/hold.html new file mode 100755 index 0000000..ac011ae --- /dev/null +++ b/application/index/view/user/hold.html @@ -0,0 +1,166 @@ +{include file="public/header" nav="历史委托"} + + + + + + + + + + +
        +
        + + + + + + + + + +
        +
        +

        持仓明细

        +
        +
        +

        历史明细

        +
        +
        +
        +
        + +
          +
        +
        + +
          +
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        +
        + +
        + {include file="public/footer" menu='hold'} +
        +
        + + + + + + \ No newline at end of file diff --git a/application/index/view/user/index.html b/application/index/view/user/index.html new file mode 100755 index 0000000..53782cc --- /dev/null +++ b/application/index/view/user/index.html @@ -0,0 +1,193 @@ +{include file="public/header" nav="我的"} + +
        +
        +
        +
        + + + + +
        +
        +
        +
        + +
        + +
        + 我的信用积分 +
        +
        + /100 +
        +
        + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + + +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        +
        + + + diff --git a/application/index/view/user/inquiries.html b/application/index/view/user/inquiries.html new file mode 100755 index 0000000..4198b4f --- /dev/null +++ b/application/index/view/user/inquiries.html @@ -0,0 +1,45 @@ +{include file="public/header" nav="平仓查询"} + +
        +
        +
        +
        +
        + 平仓查询 +
        +
          +
        • 商品名称
        • +
        • 金额
        • +
        • 方向
        • +
        • 盈亏
        • +
        +
        + {if count($list)} +
        + {volist name="list" id="vo"} +
        +
        +
        + + {$vo.ptitle} + ¥{$vo.fee} + {$vo['ostyle']==0?'买涨':'买跌'} + {$vo.ploss} +
        +
        +
        + {/volist} +
        + {else/} +
        +

        没有更多数据了

        +
        + {/if} +
        +
        +
        + {include file="public/footer"} +
        +
        + + diff --git a/application/index/view/user/interest.html b/application/index/view/user/interest.html new file mode 100755 index 0000000..33a3cdc --- /dev/null +++ b/application/index/view/user/interest.html @@ -0,0 +1,185 @@ +{include file="public/header1" nav="收益记录"} + + + + +
        +
        + +
        +
        收益记录
        +
        + {volist name="interest" id="f"} +
        +
        +
        +

        第{$f.num}期 {$f.title}

        +
        +
        +

        + 已完成 +

        +
        +
        +
        +
        +

        金额:

        +

        {$f.pay2}元

        +
        +

        {:$f['time2']}

        +
        +
        + {/volist} +
        暂无更多记录
        + + + + diff --git a/application/index/view/user/invest.html b/application/index/view/user/invest.html new file mode 100755 index 0000000..bf87059 --- /dev/null +++ b/application/index/view/user/invest.html @@ -0,0 +1,185 @@ +{include file="public/header1" nav="投资记录"} + + + + +
        +
        + +
        +
        投资记录
        +
        +{volist name="invest" id="f"} +
        +
        +
        +

        {$f.title}

        +
        + +
        +
        +
        +

        金额:

        +

        {$f.money}元{:getInvestStatus($f['id'])}

        +
        +

        {:$f['time']}

        +
        +
        +{/volist} +
        暂无更多记录
        + + + + diff --git a/application/index/view/user/mall_contract.html b/application/index/view/user/mall_contract.html new file mode 100755 index 0000000..30dd3e1 --- /dev/null +++ b/application/index/view/user/mall_contract.html @@ -0,0 +1,88 @@ +{include file="public/header" nav="合同"} +
        +
        + + + +
        合同书
        +
        +
        + +
        +

        {:getInfo('webname')}投资合同书

        +

        合同编号:{$invest['number']}

        +

        :{:getUserField($uid,'name')}

        +

        :{:getInfo('company')}

        +

        :{:getMallItemField($invest['pid'],'guarantee')}

        +

        根据中华人民共和国有关法律、法规规定,本着平等、自愿、公平、互惠互利和诚实守信的原则,就乙方使用甲方平台提供的矿机租赁服务的有关事项达成如下协议:

        +

        一、

        +

        1.矿机租赁明细

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        矿机名称{$invest.title}
        租赁人姓名{:getUserField($uid,'name')}
        租赁人身份证{:getUserField($uid,'idcard')}
        租赁份数{$invest.num}
        租赁单份保证金{$invest.money/$invest.num}元
        租赁总保证金{$invest.money}元
        租赁期限{$invest.day}天
        租赁人日净收益{$invest.profit}
        租赁人总净收益{$invest.profit*$invest.day}
        矿机上线日期{:date('Y-m-d',strtotime($invest['time']))}
        矿机到期日期{:date('Y-m-d',strtotime('+'.$invest['day'].' day',strtotime($invest['time'])))}
        还款方式每日分配收益,保证金到期全额返还
        + {:htmlspecialchars_decode(getInfo('contract_kj'))} +
        +
        +

        甲方:{:getUserField($uid,'name')}

        + {:date('Y年m月d日',strtotime($invest['time']))} +
        +
        +

        乙方:{:getInfo('company')}

        + {:date('Y年m月d日',strtotime($invest['time']))} +
        +
        +
        +

        丙方:{:getMallItemField($invest['pid'],'guarantee')}

        + {:date('Y年m月d日',strtotime($invest['time']))} +
        +
        +
        + + diff --git a/application/index/view/user/msg.html b/application/index/view/user/msg.html new file mode 100755 index 0000000..5859053 --- /dev/null +++ b/application/index/view/user/msg.html @@ -0,0 +1,48 @@ +{include file="public/header" nav="站内信"} + +
        +
        +
        +
        +
        + + 站内信 +
        +
        + {if count($msgtop) > 0 || count($msgfoot) > 0 } + {volist name="msgtop" id="m"} + + {/volist} + {volist name="msgfoot" id="m"} + + {/volist} + {else/} +
        +

        没有更多数据了

        +
        + {/if} +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        + + + \ No newline at end of file diff --git a/application/index/view/user/msg_view.html b/application/index/view/user/msg_view.html new file mode 100755 index 0000000..8d7b27b --- /dev/null +++ b/application/index/view/user/msg_view.html @@ -0,0 +1,25 @@ +{include file="public/header" nav="消息详情"} + +
        +
        +
        +
        +
        + + {$msg.title} +
        +
        + +
        + {:htmlspecialchars_decode($msg['content'])} +
        +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        + + + + diff --git a/application/index/view/user/pwd_login.html b/application/index/view/user/pwd_login.html new file mode 100755 index 0000000..8d8f548 --- /dev/null +++ b/application/index/view/user/pwd_login.html @@ -0,0 +1,98 @@ +{include file="public/header" nav="设置密码"} + + +
        +
        +
        +
        +
        + + 修改登录密码 +
        +
        +
          +
        • + + +
        • +
        • + + +
        • +
        • + + +
        • +
        +
        + +
        +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + + diff --git a/application/index/view/user/pwd_pay.html b/application/index/view/user/pwd_pay.html new file mode 100755 index 0000000..347719f --- /dev/null +++ b/application/index/view/user/pwd_pay.html @@ -0,0 +1,98 @@ +{include file="public/header" nav="设置密码"} + + +
        +
        +
        +
        +
        + + 修改支付密码 +
        +
        +
          +
        • + + +
        • +
        • + + +
        • +
        • + + +
        • +
        +
        + +
        +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + + diff --git a/application/index/view/user/recharge.html b/application/index/view/user/recharge.html new file mode 100755 index 0000000..3c07189 --- /dev/null +++ b/application/index/view/user/recharge.html @@ -0,0 +1,146 @@ +{include file="public/header" nav="充值"} + + +
        +
        +
        +
        +
        + + 充值 +
        +
        +
        + +
        +
        +
          +
        • + 开户银行:{:getInfo('pay_bank_type')} +
        • +
        • + 开户网点:{:getInfo('pay_bank_type')} +
        • +
        • + 收款账号:

          {:getInfo('pay_bank_account')}

          +
        • +
        • + 收款姓名:

          {:getInfo('pay_bank_name')}

          +
        • +
        +
        +
        + +
        +
        +
          +
        • 充值金额: 
        • +
        • 存款姓名: 
        • +
        • 转账附言: 
        • +
        +
        +
        + +
        +
        +
        +
        + +
        +
        +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + + + diff --git a/application/index/view/user/recharge_record.html b/application/index/view/user/recharge_record.html new file mode 100755 index 0000000..d5b49ab --- /dev/null +++ b/application/index/view/user/recharge_record.html @@ -0,0 +1,65 @@ +{include file="public/header" nav="充值记录"} + + +
        +
        +
        +
        +
        + + 充值记录 +
        +
        + {if count($recharge) > 0} + {volist name="recharge" id="r"} +
          +
        • + 时间: +

          {$r.time}

          +
        • +
        • + 金额: +

          ¥{$r.money}

          +
        • +
        • + 类型: +

          {$r.type}

          +
        • +
        • + 状态: +

          + {if condition="$r['status'] eq 0"} + 审核中 + {/if} + {if condition="$r['status'] eq 1"} + 申请成功 + {/if} + {if condition="$r['status'] eq 2"} + 申请失败 + {/if} +

          +
        • + {if condition="$r['reaolae'] "} +
        • + 拒绝原因: +

          {$r.reaolae}

          +
        • + {/if} +
        + {/volist} + {else/} +
        +

        没有更多数据了

        +
        + {/if} +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        + + + + + diff --git a/application/index/view/user/recommend.html b/application/index/view/user/recommend.html new file mode 100755 index 0000000..9b3da5a --- /dev/null +++ b/application/index/view/user/recommend.html @@ -0,0 +1,227 @@ +{include file="public/header1" nav="邀请朋友"} + + + +
        +
        +
        + +
        +
        +
        + +
        +
        +

        好友扫描二维码可直接注册

        + +
        您的邀请ID: {$user.phone}
        +
        +
        +
        +
        我的邀请奖励
        + +
        +
        +
        邀请规则
        +
        +

        1.本活动永久有效,欢迎参与

        + +

        2.推荐名额可累计计算

        + +

        3.满足条件后,请联系在线客服申请奖励

        + +
        +
        +
        +
        + + + + + + diff --git a/application/index/view/user/scan.html b/application/index/view/user/scan.html new file mode 100755 index 0000000..fafc754 --- /dev/null +++ b/application/index/view/user/scan.html @@ -0,0 +1,42 @@ +{include file="public/header" nav="充值"} +{if condition="$_GET['type'] eq 'wechat'"} +
        +
        + + + +
        微信扫码充值
        +
        +
        +
        + 微信充值 {$money} 元 +
        +
        + +
        +
        + {:getInfo('qr_wechat')} +
        +
        + {else/} +
        +
        + + + +
        支付宝扫码充值
        +
        +
        +
        + 支付宝充值 {$money} 元 +
        +
        + +
        +
        + {:getInfo('qr_alipay')} +
        +
        +{/if} + + diff --git a/application/index/view/user/set_account.html b/application/index/view/user/set_account.html new file mode 100755 index 0000000..db372e8 --- /dev/null +++ b/application/index/view/user/set_account.html @@ -0,0 +1,38 @@ +{include file="public/header" nav="账户安全"} + +
        +
        +
        +
        +
        + + 账户安全 +
        +
        +
        +
        + 用户名 + {$user.phone} +
        + + +
        +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        + + + \ No newline at end of file diff --git a/application/index/view/user/trade.html b/application/index/view/user/trade.html new file mode 100755 index 0000000..6b9929e --- /dev/null +++ b/application/index/view/user/trade.html @@ -0,0 +1,679 @@ +{include file="public/header" nav="交易中心"} + + + + + + + + + +
        + 交易中心 + 交易明细 +
        +
        +
        +
        +
        BTC
        +
        + 0.00 + 0.00% +
        +
        + +
        +
        +
        + BTC钱包 + {$user.btc} +
        +
        + +   全部出售   +
        +
        确认出售
        +
        +
        +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        +{include file="public/footer" menu='trade'} + + + + diff --git a/application/index/view/user/verified.html b/application/index/view/user/verified.html new file mode 100755 index 0000000..3477c13 --- /dev/null +++ b/application/index/view/user/verified.html @@ -0,0 +1,244 @@ +{include file="public/header" nav="实名认证"} + + + + +
        +
        +
        +
        +
        + + 实名认证 +
        +
        +
        + {if condition="$user['rz_status'] eq 0"} +

        + {/if} + {if condition="$user['rz_status'] eq 1"} +

        + {/if} + {if condition="$user['rz_status'] eq 2"} +

        + {/if} + {if condition="$user['rz_status'] eq 3"} +

        + {/if} +
        + {if condition="$user['rz_status'] eq 1 or $user['rz_status'] eq 2"} +
          +
        • + + {$user.name} +
        • +
        • + + {$user.idcard} +
        • +
        +
        + + +
        + + + + {else /} +
          +
        • + + +
        • +
        • + + +
        • +
        +
        + + +
        +
        + +
        + {/if} +
        +
        +
        + {include file="public/footer" menu='user'} +
        +
        +
        +
        +

        温馨提示

        +

        +
        +
        确定
        +
        +
        +
        + + + + + + diff --git a/application/index/view/user/wallet.html b/application/index/view/user/wallet.html new file mode 100755 index 0000000..585e78b --- /dev/null +++ b/application/index/view/user/wallet.html @@ -0,0 +1,148 @@ +{include file="public/header" nav="我的钱包"} + + + + + + + + +
        + 我的钱包 +
        +
        +
        +
        +
        +
        +
        账户余额(元)
        +
        + {$user.money}
        + +
        +
          +
        • + + 矿机保证金 + {$kjbz} +
        • +
        • + + 合约保证金 + {$hybz} +
        • +
        • + + BTC钱包 + {$user.btc} +
        • +
        • + + BTC累计产量 + {$kjcl} +
        • +
        • + + 矿机收益 + {$kjsy} +
        • +
        • + + 合约收益 + {$hysy} +
        • +
        • + + 推荐奖励 + 0.00 +
        • +
        • + + 获得积分 + {$user.integral} +
        • +
        +
        +
        +{include file="public/footer" menu='wallet'} + + diff --git a/application/index/view/user/yeb.html b/application/index/view/user/yeb.html new file mode 100755 index 0000000..6543983 --- /dev/null +++ b/application/index/view/user/yeb.html @@ -0,0 +1,244 @@ +{include file="public/header" nav="利息宝"} + +
        +
        +
        +
        +
        + + 利息宝 +
        +
        +
        总金额(元)
        +
        {$yuebaouc.balance}
        +
        可转出余额(元):{$yuebaouc.trans_balance}
        +
        +
        +
        昨天收益(元)
        +
        {$yuebaouc.preprofit}
        +
        +
        +
        累计收益(元)
        +
        {$yuebaouc.totalprofit}
        +
        +
        +
        昨天余额
        +
        {$yuebaouc.prebalance}
        +
        +
        +
        +
        + + +
        +
        +
        +
        +
        + 方案明细 + 进行中 + 已结束 +
        +
        + {foreach $doinglist as $key=>$vo} +
        +
        + 产品名称:{$vo.yebtitle}:{$vo.money}元 + 当前收益:{$vo.nowprofit}元
        +
        + 办理时间:{$vo.start_time} + 状态:{$vo.status=='1'?'进行中':''} +
        +
        + 预计收益:{$vo.finishprofit}元 + / +
        +
        + {/foreach} + {empty name='$doinglist'}没有记录哦{/empty} +
        + + +
        +
        + + + + {include file="public/footer" menu='yeb'} + + +
        +
        +
        + + diff --git a/application/lang/en.json b/application/lang/en.json new file mode 100644 index 0000000..6875105 --- /dev/null +++ b/application/lang/en.json @@ -0,0 +1 @@ +{"账户余额不足,请确认":"Insufficient account balance, please confirm","您办理的方案有最低存入":"The plan you applied for has a minimum deposit","网络异常,请稍后再试":"Network abnormality, please try again later","操作成功":"Successful operation","登录成功":"login successful","用户不存在":"User does not exist","请输入正确的用户名":"Please enter a valid username","登录密码有误,请重试!":"The login password is incorrect, please try again!","账号被锁定,请联系管理员!":"No trading allowed!","该账号已注册!":"This account has been registered!","请输入6-16位密码!":"Please enter a 6-16 digit password!","手机号请输入数字":"Please enter your mobile phone number","两次支付密码不一致":"The two payment passwords are inconsistent","两次密码不一致":"The two passwords do not match","验证码不正确":"Incorrect verification code","请输入验证码":"please enter verification code","无效邀请人!":"Invalid inviter!","系统繁忙,注册失败!":"The system is busy, registration failed!","注册成功":"registration success","产品不存在":"Product does not exist","产品未开启":"The product is not turned on","已认证请勿重复提交!":"Please do not submit again if it has been verified!","名字不能为空!":"Name cannot be empty!","身份证号码不能为空!":"ID number cannot be empty!","身份证正面照不能为空!":"The front photo of the ID card cannot be empty!","身份证反面照不能为空!":"The back side of the ID card cannot be empty!","身份证号码已被其他账号绑定!":"The ID number has been bound to another account!","名字不正确!":"The name is incorrect!","身份证号码不正确!":"Incorrect ID number!","认证信息提交成功!":"Authentication information submitted successfully!","认证信息提交失败!":"Failed to submit authentication information!","请先完成实名认证!":"Please complete the real-name authentication first!","提现时间为":"The withdrawal time is","提现金额不能为空!":"The withdrawal amount cannot be empty!","交易密码不正确!":"The transaction password is incorrect!","提现金额不能小于":"The withdrawal amount cannot be less than","提现金额不能大于":"The withdrawal amount cannot be greater than","每日提现次数":"Daily withdrawal times","当日累计最高提现金额不能大于":"The maximum daily withdrawal amount cannot be greater than","提现申请成功!":"Withdrawal application successful!","提现失败!":"Withdrawal failed!","产品未找到":"Product not found","休市中":"Closed","持仓最大金额为":"The maximum amount of position is","地址已绑定,请勿重复添加!":"The address has been bound, please do not add it again!","持仓最小金额为":"The minimum position amount is","":""} \ No newline at end of file diff --git a/application/lang/fr.json b/application/lang/fr.json new file mode 100644 index 0000000..a017d28 --- /dev/null +++ b/application/lang/fr.json @@ -0,0 +1 @@ +{"账户余额不足,请确认":"Solde du compte insuffisant, veuillez confirmer","您办理的方案有最低存入":"Le plan que vous avez demandé comporte un dépôt minimum","网络异常,请稍后再试":"Anomalie du réseau, veuillez réessayer plus tard","操作成功":"Opération réussie","登录成功":"connexion réussie","用户不存在":"L'utilisateur n'existe pas","请输入正确的用户名":"Veuillez entrer un nom d'utilisateur valide","登录密码有误,请重试!":"Le mot de passe de connexion est incorrect, veuillez réessayer !","账号被锁定,请联系管理员!":"Aucun échange autorisé !","该账号已注册!":"Ce compte a été enregistré !","请输入6-16位密码!":"Veuillez entrer un mot de passe de 6 à 16 chiffres !","手机号请输入数字":"Veuillez entrer votre numéro de téléphone portable","两次支付密码不一致":"Les deux mots de passe de paiement sont incohérents","两次密码不一致":"Les deux mots de passe ne correspondent pas","验证码不正确":"Code de vérification incorrect","请输入验证码":"veuillez entrer le code de vérification","无效邀请人!":"Invitant invalide !","系统繁忙,注册失败!":"Le système est occupé, l'enregistrement a échoué !","注册成功":"succès de l'inscription","产品不存在":"Le produit n'existe pas","产品未开启":"Le produit n'est pas allumé","已认证请勿重复提交!":"Veuillez ne pas soumettre à nouveau si cela a été vérifié !","名字不能为空!":"Le nom ne peut pas être vide !","身份证号码不能为空!":"Le numéro d'identification ne peut pas être vide !","身份证正面照不能为空!":"La photo de face de la carte d'identité ne peut pas être vide !","身份证反面照不能为空!":"Le verso de la carte d'identité ne peut pas être vide !","身份证号码已被其他账号绑定!":"Le numéro d’identification a été lié à un autre compte !","名字不正确!":"Le nom est incorrect !","身份证号码不正确!":"Numéro d'identification incorrect !","认证信息提交成功!":"Les informations d'authentification ont été soumises avec succès !","认证信息提交失败!":"Échec de la soumission des informations d'authentification !","请先完成实名认证!":"Veuillez d’abord compléter l’authentification du nom réel !","提现时间为":"Le délai de retrait est","提现金额不能为空!":"Le montant du retrait ne peut pas être vide !","交易密码不正确!":"Le mot de passe de transaction est incorrect !","提现金额不能小于":"Le montant du retrait ne peut pas être inférieur à","提现金额不能大于":"Le montant du retrait ne peut pas être supérieur à","每日提现次数":"Délais de retrait quotidiens","当日累计最高提现金额不能大于":"Le montant maximum de retrait quotidien ne peut pas être supérieur à","提现申请成功!":"Demande de retrait réussie !","提现失败!":"Le retrait a échoué !","产品未找到":"Produit non trouvé","休市中":"Fermé","持仓最大金额为":"Le montant maximum de la position est","地址已绑定,请勿重复添加!":"L'adresse a été liée, veuillez ne pas l'ajouter à nouveau !","持仓最小金额为":"Le montant minimum de la position est","":""} \ No newline at end of file diff --git a/application/lang/ko.json b/application/lang/ko.json new file mode 100644 index 0000000..76c9785 --- /dev/null +++ b/application/lang/ko.json @@ -0,0 +1 @@ +{"账户余额不足,请确认":"계좌잔액이 부족합니다. 확인해 주세요.","您办理的方案有最低存入":"신청하신 플랜에는 최소 보증금이 있습니다.","网络异常,请稍后再试":"네트워크 이상입니다. 잠시후 다시 시도해주세요.","操作成功":"성공적인 작업","登录成功":"성공적 로그인","用户不存在":"사용자가 존재하지 않습니다","请输入正确的用户名":"유효한 사용자 이름을 입력하세요","登录密码有误,请重试!":"로그인 비밀번호가 올바르지 않습니다. 다시 시도해 주세요!","账号被锁定,请联系管理员!":"거래는 허용되지 않습니다!","该账号已注册!":"이 계정은 등록되었습니다!","请输入6-16位密码!":"6~16자리의 비밀번호를 입력하세요!","手机号请输入数字":"휴대폰 번호를 입력해주세요.","两次支付密码不一致":"두 개의 결제 비밀번호가 일치하지 않습니다.","两次密码不一致":"두 비밀번호가 일치하지 않습니다","验证码不正确":"잘못된 검증코드입니다","请输入验证码":"인증 코드를 입력하세요","无效邀请人!":"잘못된 초대자입니다!","系统繁忙,注册失败!":"시스템이 사용 중이어서 등록에 실패했습니다!","注册成功":"등록 성공","产品不存在":"제품이 존재하지 않습니다","产品未开启":"제품이 켜지지 않습니다","已认证请勿重复提交!":"검증이 완료된 경우 다시 제출하지 마세요!","名字不能为空!":"이름은 비워둘 수 없습니다!","身份证号码不能为空!":"ID 번호는 비어있을 수 없습니다!","身份证正面照不能为空!":"신분증 앞면 사진은 비워둘 수 없습니다!","身份证反面照不能为空!":"신분증 뒷면은 비워둘 수 없습니다!","身份证号码已被其他账号绑定!":"ID번호가 다른 계정에 연결되어 있습니다!","名字不正确!":"이름이 잘못되었습니다!","身份证号码不正确!":"잘못된 ID 번호입니다!","认证信息提交成功!":"인증 정보가 성공적으로 전송되었습니다!","认证信息提交失败!":"인증 정보를 제출하지 못했습니다!","请先完成实名认证!":"먼저 실명인증을 완료해 주세요!","提现时间为":"출금시간은","提现金额不能为空!":"출금 금액은 비어 있을 수 없습니다!","交易密码不正确!":"거래 비밀번호가 틀렸습니다!","提现金额不能小于":"출금금액은 다음보다 적을 수 없습니다.","提现金额不能大于":"인출금액은 다음보다 클 수 없습니다.","每日提现次数":"일일 출금 시간","当日累计最高提现金额不能大于":"최대 일일 출금 금액은 다음보다 클 수 없습니다.","提现申请成功!":"출금 신청이 성공했습니다!","提现失败!":"출금 실패!","产品未找到":"제품을 찾을 수 없습니다","休市中":"닫은","持仓最大金额为":"최대 위치량은","地址已绑定,请勿重复添加!":"주소가 바인딩되었으니 다시 추가하지 마세요!","持仓最小金额为":"최소 포지션 금액은","":""} \ No newline at end of file diff --git a/application/lang/pt.json b/application/lang/pt.json new file mode 100644 index 0000000..02e672a --- /dev/null +++ b/application/lang/pt.json @@ -0,0 +1 @@ +{"账户余额不足,请确认":"Saldo de conta insuficiente, confirme","您办理的方案有最低存入":"O plano que você solicitou tem um depósito mínimo","网络异常,请稍后再试":"Anormalidade na rede, tente novamente mais tarde","操作成功":"Operação bem-sucedida","登录成功":"login bem-sucedido","用户不存在":"Usuário não existe","请输入正确的用户名":"Por favor, insira um nome de usuário válido","登录密码有误,请重试!":"A senha de login está incorreta, tente novamente!","账号被锁定,请联系管理员!":"Não é permitida negociação!","该账号已注册!":"Esta conta foi registrada!","请输入6-16位密码!":"Por favor, digite uma senha de 6 a 16 dígitos!","手机号请输入数字":"Por favor, insira seu número de telefone celular","两次支付密码不一致":"As duas senhas de pagamento são inconsistentes","两次密码不一致":"As duas senhas não correspondem","验证码不正确":"Código de verificação incorreto","请输入验证码":"por favor insira o código de verificação","无效邀请人!":"Convidador inválido!","系统繁忙,注册失败!":"O sistema está ocupado, o registro falhou!","注册成功":"Registro bem sucedido","产品不存在":"O produto não existe","产品未开启":"O produto não liga","已认证请勿重复提交!":"Por favor, não envie novamente se já tiver sido verificado!","名字不能为空!":"O nome não pode estar vazio!","身份证号码不能为空!":"O número de identificação não pode estar vazio!","身份证正面照不能为空!":"A foto da frente do documento de identificação não pode estar vazia!","身份证反面照不能为空!":"O verso do documento de identificação não pode ficar em branco!","身份证号码已被其他账号绑定!":"O número de identificação foi vinculado a outra conta!","名字不正确!":"O nome está incorreto!","身份证号码不正确!":"Número de identificação incorreto!","认证信息提交成功!":"Informações de autenticação enviadas com sucesso!","认证信息提交失败!":"Falha ao enviar informações de autenticação!","请先完成实名认证!":"Por favor, conclua a autenticação do nome real primeiro!","提现时间为":"O tempo de retirada é","提现金额不能为空!":"O valor de retirada não pode estar vazio!","交易密码不正确!":"A senha da transação está incorreta!","提现金额不能小于":"O valor do saque não pode ser inferior a","提现金额不能大于":"O valor do saque não pode ser maior que","每日提现次数":"Tempos de retirada diários","当日累计最高提现金额不能大于":"O valor máximo de retirada diária não pode ser maior que","提现申请成功!":"Pedido de retirada bem-sucedido!","提现失败!":"A retirada falhou!","产品未找到":"Produto não encontrado","休市中":"Fechado","持仓最大金额为":"A quantidade máxima de posição é","地址已绑定,请勿重复添加!":"O endereço foi vinculado, por favor, não o adicione novamente!","持仓最小金额为":"O valor mínimo da posição é","":""} \ No newline at end of file diff --git a/application/lang/th.json b/application/lang/th.json new file mode 100644 index 0000000..d4dc11c --- /dev/null +++ b/application/lang/th.json @@ -0,0 +1 @@ +{"账户余额不足,请确认":"ยอดเงินในบัญชีไม่เพียงพอ กรุณายืนยัน","您办理的方案有最低存入":"แผนที่คุณสมัครมีเงินฝากขั้นต่ำ","网络异常,请稍后再试":"เครือข่ายผิดปกติ กรุณาลองใหม่อีกครั้งในภายหลัง","操作成功":"การดำเนินการที่ประสบความสำเร็จ","登录成功":"เข้าสู่ระบบสำเร็จ","用户不存在":"ไม่มีผู้ใช้","请输入正确的用户名":"กรุณากรอกชื่อผู้ใช้ให้ถูกต้อง","登录密码有误,请重试!":"รหัสผ่านเข้าสู่ระบบไม่ถูกต้อง กรุณาลองอีกครั้ง!","账号被锁定,请联系管理员!":"ไม่อนุญาตให้ซื้อขาย!","该账号已注册!":"บัญชีนี้ได้รับการลงทะเบียนแล้ว!","请输入6-16位密码!":"กรุณาใส่รหัสผ่าน 6-16 หลัก!","手机号请输入数字":"กรุณากรอกหมายเลขโทรศัพท์มือถือของคุณ","两次支付密码不一致":"รหัสผ่านการชำระเงินทั้งสองไม่สอดคล้องกัน","两次密码不一致":"รหัสผ่านทั้งสองไม่ตรงกัน","验证码不正确":"รหัสตรวจสอบไม่ถูกต้อง","请输入验证码":"กรุณากรอกรหัสยืนยัน","无效邀请人!":"ผู้เชิญไม่ถูกต้อง!","系统繁忙,注册失败!":"ระบบกำลังยุ่งอยู่ ลงทะเบียนล้มเหลว!","注册成功":"การลงทะเบียนสำเร็จ","产品不存在":"สินค้าไม่มีอยู่","产品未开启":"สินค้าไม่ได้เปิดอยู่","已认证请勿重复提交!":"กรุณาอย่าส่งซ้ำอีกหากได้รับการตรวจสอบแล้ว!","名字不能为空!":"ชื่อไม่สามารถว่างเปล่าได้!","身份证号码不能为空!":"หมายเลขบัตรประชาชนไม่สามารถว่างเปล่าได้!","身份证正面照不能为空!":"รูปหน้าบัตรประชาชนห้ามเว้นว่างไว้!","身份证反面照不能为空!":"หลังบัตรประชาชนห้ามว่างเปล่า!","身份证号码已被其他账号绑定!":"เลขบัตรประชาชนถูกผูกกับบัญชีอื่นแล้ว!","名字不正确!":"ชื่อไม่ถูกต้อง!","身份证号码不正确!":"หมายเลขบัตรประชาชนไม่ถูกต้อง!","认证信息提交成功!":"ส่งข้อมูลยืนยันตัวตนเรียบร้อยแล้ว!","认证信息提交失败!":"ไม่สามารถส่งข้อมูลยืนยันตัวตนได้!","请先完成实名认证!":"กรุณาทำการพิสูจน์ชื่อจริงก่อน!","提现时间为":"เวลาถอนเงินคือ","提现金额不能为空!":"จำนวนเงินที่ถอนไม่สามารถว่างเปล่าได้!","交易密码不正确!":"รหัสผ่านการทำธุรกรรมไม่ถูกต้อง!","提现金额不能小于":"จำนวนเงินที่ถอนไม่สามารถน้อยกว่า","提现金额不能大于":"จำนวนเงินที่ถอนออกไม่สามารถมากกว่า","每日提现次数":"เวลาถอนเงินรายวัน","当日累计最高提现金额不能大于":"จำนวนเงินถอนสูงสุดต่อวันไม่สามารถมากกว่า","提现申请成功!":"การสมัครถอนเงินสำเร็จแล้ว!","提现失败!":"การถอนเงินล้มเหลว!","产品未找到":"ไม่พบสินค้า","休市中":"ปิด","持仓最大金额为":"จำนวนตำแหน่งสูงสุดคือ","地址已绑定,请勿重复添加!":"ที่อยู่ถูกผูกไว้แล้ว กรุณาอย่าเพิ่มอีก!","持仓最小金额为":"จำนวนตำแหน่งขั้นต่ำคือ","":""} \ No newline at end of file diff --git a/application/lang/tr.json b/application/lang/tr.json new file mode 100644 index 0000000..b7a5a10 --- /dev/null +++ b/application/lang/tr.json @@ -0,0 +1 @@ +{"账户余额不足,请确认":"Yetersiz hesap bakiyesi, lütfen onaylayın","您办理的方案有最低存入":"Başvurduğunuz planın minimum depozitosu var","网络异常,请稍后再试":"Ağ anormalliği, lütfen daha sonra tekrar deneyin","操作成功":"İşlem başarılı","登录成功":"giriş başarılı","用户不存在":"Kullanıcı yok","请输入正确的用户名":"Lütfen geçerli bir kullanıcı adı girin","登录密码有误,请重试!":"Giriş şifresi hatalı, lütfen tekrar deneyin!","账号被锁定,请联系管理员!":"İşlem yapılmasına izin verilmiyor!","该账号已注册!":"Bu hesap kaydedildi!","请输入6-16位密码!":"Lütfen 6-16 haneli bir şifre giriniz!","手机号请输入数字":"Lütfen cep telefonu numaranızı giriniz","两次支付密码不一致":"İki ödeme şifresi tutarsız","两次密码不一致":"İki şifre eşleşmiyor","验证码不正确":"Yanlış doğrulama kodu","请输入验证码":"lütfen doğrulama kodunu girin","无效邀请人!":"Geçersiz davet eden!","系统繁忙,注册失败!":"Sistem meşgul, kayıt başarısız!","注册成功":"başarılı Kayıt","产品不存在":"Ürün mevcut değil","产品未开启":"Ürün açık değil","已认证请勿重复提交!":"Doğrulandıysa lütfen tekrar göndermeyin!","名字不能为空!":"İsim boş bırakılamaz!","身份证号码不能为空!":"Kimlik numarası boş bırakılamaz!","身份证正面照不能为空!":"Kimliğin ön yüzü boş olamaz!","身份证反面照不能为空!":"Kimliğin arka yüzü boş olamaz!","身份证号码已被其他账号绑定!":"Kimlik numarası başka bir hesaba bağlanmış!","名字不正确!":"İsim yanlış!","身份证号码不正确!":"Hatalı TC Kimlik Numarası!","认证信息提交成功!":"Kimlik doğrulama bilgileri başarıyla gönderildi!","认证信息提交失败!":"Kimlik doğrulama bilgileri gönderilemedi!","请先完成实名认证!":"Lütfen önce gerçek isim doğrulamasını tamamlayın!","提现时间为":"Para çekme süresi","提现金额不能为空!":"Çekim tutarı boş bırakılamaz!","交易密码不正确!":"İşlem şifresi hatalı!","提现金额不能小于":"Çekilecek tutar şu miktardan az olamaz:","提现金额不能大于":"Çekilecek tutar şu miktardan fazla olamaz:","每日提现次数":"Günlük çekim süreleri","当日累计最高提现金额不能大于":"Günlük maksimum çekim tutarı şundan büyük olamaz:","提现申请成功!":"Para çekme talebiniz başarılı!","提现失败!":"Para çekme işlemi başarısız oldu!","产品未找到":"Ürün bulunamadı","休市中":"Kapalı","持仓最大金额为":"Pozisyonun maksimum miktarı","地址已绑定,请勿重复添加!":"Adres bağlanmış, lütfen tekrar eklemeyin!","持仓最小金额为":"Minimum pozisyon miktarı","":""} \ No newline at end of file diff --git a/application/lang/vi.json b/application/lang/vi.json new file mode 100644 index 0000000..4dfbe5c --- /dev/null +++ b/application/lang/vi.json @@ -0,0 +1 @@ +{"账户余额不足,请确认":"Số dư tài khoản không đủ, vui lòng xác nhận","您办理的方案有最低存入":"Kế hoạch bạn đã đăng ký có mức tiền gửi tối thiểu","网络异常,请稍后再试":"Mạng bất thường, vui lòng thử lại sau","操作成功":"Hoạt động thành công","登录成功":"đăng nhập thành công","用户不存在":"người dùng không tồn tại","请输入正确的用户名":"Vui lòng nhập tên người dùng hợp lệ","登录密码有误,请重试!":"Mật khẩu đăng nhập không đúng, vui lòng thử lại!","账号被锁定,请联系管理员!":"Không được phép giao dịch!","该账号已注册!":"Tài khoản này đã được đăng ký!","请输入6-16位密码!":"Vui lòng nhập mật khẩu từ 6-16 chữ số!","手机号请输入数字":"Vui lòng nhập số điện thoại di động của bạn","两次支付密码不一致":"Hai mật khẩu thanh toán không nhất quán","两次密码不一致":"Hai mật khẩu không nhất quán","验证码不正确":"Mã xác minh không chính xác","请输入验证码":"vui lòng nhập mã xác nhận","无效邀请人!":"Người mời không hợp lệ!","系统繁忙,注册失败!":"Hệ thống đang bận, đăng ký không thành công!","注册成功":"đăng ký thành công","产品不存在":"Sản phẩm không tồn tại","产品未开启":"Sản phẩm chưa được bật","已认证请勿重复提交!":"Vui lòng không gửi lại nếu thông tin đã được xác minh!","名字不能为空!":"Tên không được để trống!","身份证号码不能为空!":"Số ID không được để trống!","身份证正面照不能为空!":"Ảnh mặt trước của thẻ căn cước không được để trống!","身份证反面照不能为空!":"Mặt sau của thẻ căn cước không được để trống!","身份证号码已被其他账号绑定!":"Số ID đã được liên kết với một tài khoản khác!","名字不正确!":"Tên không đúng!","身份证号码不正确!":"Số CMND không đúng!","认证信息提交成功!":"Thông tin xác thực đã được gửi thành công!","认证信息提交失败!":"Không thể gửi thông tin xác thực!","请先完成实名认证!":"Vui lòng hoàn tất xác thực tên thật trước!","提现时间为":"Thời gian rút tiền là","提现金额不能为空!":"Số tiền rút không được để trống!","交易密码不正确!":"Mật khẩu giao dịch không đúng!","提现金额不能小于":"Số tiền rút không được ít hơn","提现金额不能大于":"Số tiền rút không được lớn hơn","每日提现次数":"Thời gian rút tiền hàng ngày","当日累计最高提现金额不能大于":"Số tiền rút tối đa hàng ngày không được lớn hơn","提现申请成功!":"Đã nộp đơn xin rút tiền thành công!","提现失败!":"Rút tiền không thành công!","产品未找到":"Không tìm thấy sản phẩm","休市中":"Đã đóng","持仓最大金额为":"Số lượng vị trí tối đa là","地址已绑定,请勿重复添加!":"Địa chỉ đã được liên kết, vui lòng không thêm lại nữa!","持仓最小金额为":"Số lượng vị trí tối thiểu là","":""} \ No newline at end of file diff --git a/application/lang/zh-cn.json b/application/lang/zh-cn.json new file mode 100644 index 0000000..ed0258a --- /dev/null +++ b/application/lang/zh-cn.json @@ -0,0 +1,50 @@ +{ + "账户余额不足,请确认": "账户余额不足,请确认", + "您办理的方案有最低存入": "您办理的方案有最低存入", + "网络异常,请稍后再试": "网络异常,请稍后再试", + "操作成功": "操作成功", + "登录成功": "登录成功", + "用户不存在": "用户不存在", + "邀请人不存在": "邀请人不存在", + "请输入正确的用户名": "请输入正确的用户名", + "登录密码有误,请重试!": "登录密码有误,请重试!", + "账号被锁定,请联系管理员!": "禁止交易!", + "该账号已注册!": "该账号已注册!", + "请输入6-16位密码!": "请输入6-16位密码!", + "手机号请输入数字": "手机号请输入数字", + "两次支付密码不一致": "两次支付密码不一致", + "两次密码不一致": "两次密码不一致", + "验证码不正确": "验证码不正确", + "请输入验证码": "请输入验证码", + "无效邀请人!": "无效邀请人!", + "系统繁忙,注册失败!": "系统繁忙,注册失败!", + "注册成功": "注册成功", + "产品不存在": "产品不存在", + "产品未开启": "产品未开启", + "已认证请勿重复提交!": "已认证请勿重复提交!", + "名字不能为空!": "名字不能为空!", + "身份证号码不能为空!": "身份证号码不能为空!", + "身份证正面照不能为空!": "身份证正面照不能为空!", + "身份证反面照不能为空!": "身份证反面照不能为空!", + "身份证号码已被其他账号绑定!": "身份证号码已被其他账号绑定!", + "名字不正确!": "名字不正确!", + "身份证号码不正确!": "身份证号码不正确!", + "认证信息提交成功!": "认证信息提交成功!", + "认证信息提交失败!": "认证信息提交失败!", + "请先完成实名认证!": "请先完成实名认证!", + "提现时间为": "提现时间为", + "提现金额不能为空!": "提现金额不能为空!", + "交易密码不正确!": "交易密码不正确!", + "提现金额不能小于": "提现金额不能小于", + "提现金额不能大于": "提现金额不能大于", + "每日提现次数": "每日提现次数", + "当日累计最高提现金额不能大于": "当日累计最高提现金额不能大于", + "提现申请成功!": "提现申请成功!", + "提现失败!": "提现失败!", + "产品未找到": "产品未找到", + "休市中": "休市中", + "持仓最大金额为": "持仓最大金额为", + "地址已绑定,请勿重复添加!": "地址已绑定,请勿重复添加!", + "持仓最小金额为": "持仓最小金额为", + "": "" +} \ No newline at end of file diff --git a/build.php b/build.php new file mode 100644 index 0000000..34ba3c8 --- /dev/null +++ b/build.php @@ -0,0 +1,26 @@ + +// +---------------------------------------------------------------------- + +return [ + // 生成应用公共文件 + '__file__' => ['common.php'], + + // 定义demo模块的自动生成 (按照实际定义的文件名生成) + 'demo' => [ + '__file__' => ['common.php'], + '__dir__' => ['behavior', 'controller', 'model', 'view'], + 'controller' => ['Index', 'Test', 'UserType'], + 'model' => ['User', 'UserType'], + 'view' => ['index/index'], + ], + + // 其他更多的模块定义 +]; diff --git a/config/app.php b/config/app.php new file mode 100755 index 0000000..9e674a9 --- /dev/null +++ b/config/app.php @@ -0,0 +1,31 @@ + true, + // 应用Trace调试 + 'app_trace' => false, + // 0按名称成对解析 1按顺序解析 + 'url_param_type' => 1, + // 当前 ThinkAdmin 版本号 + 'thinkadmin_ver' => 'v5', + // 设置时区 +// 设置时区为圣保罗 + 'DEFAULT_TIMEZONE' => 'America/Sao_Paulo', + 'default_lang' => 'zh-cn', // 设置默认语言 + 'lang_switch_on' => true, // 开启多语言切换 + 'deny_module_list' => ['akszadmin'] +]; diff --git a/config/cookie.php b/config/cookie.php new file mode 100755 index 0000000..5030834 --- /dev/null +++ b/config/cookie.php @@ -0,0 +1,25 @@ + 1800, + // cookie 启用安全传输 + 'secure' => false, + // httponly 设置 + 'httponly' => true, + // 是否使用 setcookie + 'setcookie' => true, +]; diff --git a/config/database.php b/config/database.php new file mode 100755 index 0000000..42d093e --- /dev/null +++ b/config/database.php @@ -0,0 +1,35 @@ + env('database.debug', true), + // 数据库类型 + 'type' => 'mysql', + // 服务器地址 + 'hostname' => env('database.hostname', '127.0.0.1'), + // 数据库名 + 'database' => env('database.database', '0302-2'), + // 用户名 + 'username' => env('database.username', '0302-2'), + // 密码 + 'password' => env('database.password', '0302-2'), + // 编码 + 'charset' => env('database.charset', 'utf8mb4'), + // 端口 + 'hostport' => env('database.hostport', '3306'), + // 主从 + 'deploy' => 0, + // 分离 + 'rw_separate' => false, +]; diff --git a/config/log.php b/config/log.php new file mode 100755 index 0000000..932bb1e --- /dev/null +++ b/config/log.php @@ -0,0 +1,27 @@ + 'single', + // 最多保留50个文件 + 'max_files' => 50, + // 日志每10兆分割文件 + 'file_size' => 10485760, + // 设置记录目录的类型 + // 'level' => ['error'], + // 日志类型分别写入文件 + 'apart_level' => ['error', 'sql'], +]; diff --git a/config/session.php b/config/session.php new file mode 100755 index 0000000..cdaab64 --- /dev/null +++ b/config/session.php @@ -0,0 +1,26 @@ + 'fw', + 'path' => $_path_, + 'name' => $_name_, +]; diff --git a/config/template.php b/config/template.php new file mode 100755 index 0000000..2fff727 --- /dev/null +++ b/config/template.php @@ -0,0 +1,30 @@ + true, + // 开启模板编译缓存 + 'tpl_cache' => !Config::get('app_debug'), + // 定义模板替换字符串 + 'tpl_replace_string' => [ + '__APP__' => rtrim(url('@'), '\\/'), + '__ROOT__' => rtrim(dirname(Request::basefile()), '\\/'), + '__FULL__' => rtrim(dirname(Request::basefile(true)), '\\/'), + ], +]; diff --git a/config/wechat.php b/config/wechat.php new file mode 100755 index 0000000..5c6f2a8 --- /dev/null +++ b/config/wechat.php @@ -0,0 +1,28 @@ + 'https://demo.thinkadmin.top', + // 小程序支付参数 + 'miniapp' => [ + 'appid' => 'wx8c108930fe12b7ef', + 'appsecret' => '13d829992a2b6a0a44195a4a580da56d', + 'mch_id' => '1332187001', + 'mch_key' => 'A82DC5BD1F3359081049C568D8502BC5', + 'ssl_p12' => __DIR__ . '/cert/1332187001_20181030_cert.p12', + 'cache_path' => env('runtime_path') . 'wechat' . DIRECTORY_SEPARATOR, + ], +]; diff --git a/db/0302-2_20250306_112456.sql.gz b/db/0302-2_20250306_112456.sql.gz new file mode 100644 index 0000000000000000000000000000000000000000..b3a6256447f9d2ec5ffe9bdb10b3924adcb54f71 GIT binary patch literal 295826 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⪻MR;omWEV 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 literal 0 HcmV?d00001 diff --git a/extend/ExtendException.php b/extend/ExtendException.php new file mode 100644 index 0000000..0128e4a --- /dev/null +++ b/extend/ExtendException.php @@ -0,0 +1,21 @@ +] + * +---------------------------------------------------------------------- + * | Tool: [ PhpStorm ] + * +---------------------------------------------------------------------- + * | Date: [ 2024/12/26 ] + * +---------------------------------------------------------------------- + * | 版权所有 [ 2020~2024 kaadon.com ] + * +---------------------------------------------------------------------- + **/ +class ExtendException extends Exception +{ + +} \ No newline at end of file diff --git a/extend/GdImageClass.php b/extend/GdImageClass.php new file mode 100644 index 0000000..b35eb55 --- /dev/null +++ b/extend/GdImageClass.php @@ -0,0 +1,220 @@ +image = $this->createImageFromPath($imagePath, $ext); + + if ($this->image === false) { + throw new ExtendException('Unsupported image type: ' . $ext); + } + } + + /** + * @throws \Exception + */ + function convertToValidPng($filePath, $outputPath) + { + // 获取文件内容 + $fileContent = file_get_contents($filePath); + if ($fileContent === false) { + throw new Exception('读取文件失败。'); + } + + // 从文件内容创建图像 + $image = imagecreatefromstring($fileContent); + if ($image === false) { + throw new Exception('该文件不是有效的图像。'); + } + + // 将图像保存为有效的 PNG 文件 + if (!imagepng($image, $outputPath)) { + throw new Exception('保存图像为 PNG 文件失败。'); + } + + // 释放内存 + imagedestroy($image); + } + + /** + * @param $filePath + * @param $outputPath + * @return void + * @throws \Exception + */ + function convertToValidJpg($filePath, $outputPath) + { + // 获取文件内容 + $fileContent = file_get_contents($filePath); + if ($fileContent === false) { + throw new Exception('读取文件失败。'); + } + + // 从文件内容创建图像 + $image = imagecreatefromstring($fileContent); + if ($image === false) { + throw new Exception('该文件不是有效的图像。'); + } + + // 将图像保存为有效的 PNG 文件 + if (!imagejpeg($image, $outputPath)) { + throw new Exception('保存图像为 PNG 文件失败。'); + } + + // 释放内存 + imagedestroy($image); + } + + /** + * @param $filePath + * @return bool + */ + function isValidPng($filePath): bool + { + $imageInfo = getimagesize($filePath); + return $imageInfo && $imageInfo[2] === IMAGETYPE_PNG; + } + + //判断是否为有效的jpg文件 + + /** + * @param $filePath + * @return bool + */ + function isValidJpg($filePath): bool + { + $imageInfo = getimagesize($filePath); + return $imageInfo && $imageInfo[2] === IMAGETYPE_JPEG; + } + + + /** + * @param string $imagePath + * @param string $ext + * @return \GdImage|false|resource + * @throws \Exception + */ + private function createImageFromPath(string $imagePath, string $ext) + { + switch ($ext) { + case 'png': + if (!$this->isValidPng($imagePath)){ + $this->convertToValidPng($imagePath, $imagePath); + } + return imagecreatefrompng($imagePath); + case 'gif': + return imagecreatefromgif($imagePath); + case 'jpeg': + case 'jpg': + if (!$this->isValidJpg($imagePath)){ + $this->convertToValidJpg($imagePath, $imagePath); + } + return imagecreatefromjpeg($imagePath); + case 'bmp': + return imagecreatefrombmp($imagePath); + case 'webp': + return imagecreatefromwebp($imagePath); + case 'xbm': + return imagecreatefromxbm($imagePath); + case 'xpm': + return imagecreatefromxpm($imagePath); + default: + return false; + } + } + + /** + * @return int + * @noinspection PhpUnusedPrivateMethodInspection + */ + private function getFileSize(): int + { + ob_start(); + imagejpeg($this->image); + $content = ob_get_clean(); + /** @noinspection PhpComposerExtensionStubsInspection */ + return (int)bcdiv((string)strlen($content), "1024", 4); + } + + /** + * @param int $width + * @param int $height + * @return $this + */ + public function resize(int $width, int $height): self + { + $newImage = imagecreatetruecolor($width, $height); + imagecopyresampled($newImage, $this->image, 0, 0, 0, 0, $width, $height, imagesx($this->image), imagesy($this->image)); + imagedestroy($this->image); + $this->image = $newImage; + return $this; + } + + /** + * @param string $targetPath + * @param string $format + * @return string + * @throws \ExtendException + */ + public function convertTo(string $targetPath, string $format): string + { + if (!imageistruecolor($this->image)) { + imagepalettetotruecolor($this->image); + } + switch (strtolower($format)) { + case 'png': + imagepng($this->image, $targetPath); + break; + case 'gif': + imagegif($this->image, $targetPath); + break; + case 'jpeg': + case 'jpg': + imagejpeg($this->image, $targetPath); + break; + case 'bmp': + imagebmp($this->image, $targetPath); + break; + case 'webp': + imagewebp($this->image, $targetPath); + break; + default: + throw new ExtendException('Unsupported target format: ' . $format); + } + + imagedestroy($this->image); + return $targetPath; + } +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..1bd54ae --- /dev/null +++ b/index.html @@ -0,0 +1,55 @@ + + + + + Site is created successfully! + + + +
        +

        Congratulations, the site is created successfully!

        +

        This is the default index.html, this page is automatically generated by the system

        +
          +
        • The index.html of this page is in the site root directory
        • +
        • You can modify, delete or overwrite this page
        • +
        +
        + + + \ No newline at end of file diff --git a/nodejs/String-ext.js b/nodejs/String-ext.js new file mode 100755 index 0000000..ec71060 --- /dev/null +++ b/nodejs/String-ext.js @@ -0,0 +1,38 @@ +String.prototype.format=function(){ + if(arguments.length==0) return this; + + var args=[], i=0; + for(;i + + + + + + + \ No newline at end of file diff --git a/nodejs/node_modules/cron-parser/.idea/encodings.xml b/nodejs/node_modules/cron-parser/.idea/encodings.xml new file mode 100755 index 0000000..97626ba --- /dev/null +++ b/nodejs/node_modules/cron-parser/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/nodejs/node_modules/cron-parser/.idea/jsLibraryMappings.xml b/nodejs/node_modules/cron-parser/.idea/jsLibraryMappings.xml new file mode 100755 index 0000000..63b6c47 --- /dev/null +++ b/nodejs/node_modules/cron-parser/.idea/jsLibraryMappings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/nodejs/node_modules/cron-parser/.idea/modules.xml b/nodejs/node_modules/cron-parser/.idea/modules.xml new file mode 100755 index 0000000..7088fb0 --- /dev/null +++ b/nodejs/node_modules/cron-parser/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/nodejs/node_modules/cron-parser/.idea/vcs.xml b/nodejs/node_modules/cron-parser/.idea/vcs.xml new file mode 100755 index 0000000..94a25f7 --- /dev/null +++ b/nodejs/node_modules/cron-parser/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/nodejs/node_modules/cron-parser/.idea/workspace.xml b/nodejs/node_modules/cron-parser/.idea/workspace.xml new file mode 100755 index 0000000..12a06b8 --- /dev/null +++ b/nodejs/node_modules/cron-parser/.idea/workspace.xml @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + iterator + Dec + currentDate + const + range + explicit day of month definition + Invalid explicit day of month definition + yearly + _parseField + callback + + + $PROJECT_DIR$/test + $PROJECT_DIR$/lib + + + + + + + + + + + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // + DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // + DATE: 'YYYY-MM-DD', // + TIME: 'HH:mm', // + TIME_SECONDS: 'HH:mm:ss', // + TIME_MS: 'HH:mm:ss.SSS', // + WEEK: 'YYYY-[W]WW', // + MONTH: 'YYYY-MM' // + }; + + //! moment.js locale configuration + + hooks.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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('ar-dz', { + 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 : 4 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + 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$1 = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر' + ]; + + hooks.defineLocale('ar-ly', { + months : months$1, + monthsShort : months$1, + 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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.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 : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var symbolMap$1 = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }; + + hooks.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$1[match]; + }).replace(/,/g, '،'); + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.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. + } + }); + + //! moment.js locale configuration + + var symbolMap$2 = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, numberMap$1 = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }, pluralForm$1 = 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$1 = { + 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$1 = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm$1(number), + str = plurals$1[u][pluralForm$1(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months$2 = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر' + ]; + + hooks.defineLocale('ar', { + months : months$2, + monthsShort : months$2, + 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$1('s'), + ss : pluralize$1('s'), + m : pluralize$1('m'), + mm : pluralize$1('m'), + h : pluralize$1('h'), + hh : pluralize$1('h'), + d : pluralize$1('d'), + dd : pluralize$1('d'), + M : pluralize$1('M'), + MM : pluralize$1('M'), + y : pluralize$1('y'), + yy : pluralize$1('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap$1[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$2[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + 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ı' + }; + + hooks.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 : 'birneçə 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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + 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); + } + } + + hooks.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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.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 дни', + 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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.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. + } + }); + + //! moment.js locale configuration + + var symbolMap$3 = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap$2 = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + hooks.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$2[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$3[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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var symbolMap$4 = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap$3 = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + hooks.defineLocale('bo', { + 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 : '[བདུན་ཕྲག་རྗེས་མ], 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$3[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$4[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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + 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); + } + + hooks.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('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY h[e]mm A', + LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A' + }, + 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. + } + }); + + //! moment.js locale configuration + + 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; + } + } + + hooks.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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.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. + } + }); + + //! moment.js locale configuration + + var months$3 = '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('_'); + function plural$1(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + function translate$1(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$1(number) ? 'sekundy' : 'sekund'); + } else { + return result + 'sekundami'; + } + break; + 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$1(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + 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$1(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + 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$1(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + 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$1(number) ? 'měsíce' : 'měsíců'); + } else { + return result + 'měsíci'; + } + break; + 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$1(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + hooks.defineLocale('cs', { + months : months$3, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (červenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months$3, monthsShort)), + shortMonthsParse : (function (monthsShort) { + var i, _shortMonthsParse = []; + for (i = 0; i < 12; i++) { + _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i'); + } + return _shortMonthsParse; + }(monthsShort)), + longMonthsParse : (function (months) { + var i, _longMonthsParse = []; + for (i = 0; i < 12; i++) { + _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i'); + } + return _longMonthsParse; + }(months$3)), + 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$1, + ss : translate$1, + m : translate$1, + mm : translate$1, + h : translate$1, + hh : translate$1, + d : translate$1, + dd : translate$1, + M : translate$1, + MM : translate$1, + y : translate$1, + yy : translate$1 + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.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. + } + }); + + //! moment.js locale configuration + + hooks.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. + } + }); + + //! moment.js locale configuration + + 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'], + '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]; + } + + hooks.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, + 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. + } + }); + + //! moment.js locale configuration + + function processRelativeTime$1(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'], + '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]; + } + + hooks.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$1, + mm : '%d Minuten', + h : processRelativeTime$1, + hh : '%d Stunden', + d : processRelativeTime$1, + dd : processRelativeTime$1, + M : processRelativeTime$1, + MM : processRelativeTime$1, + y : processRelativeTime$1, + yy : processRelativeTime$1 + }, + 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. + } + }); + + //! moment.js locale configuration + + function processRelativeTime$2(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'], + '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]; + } + + hooks.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$2, + mm : '%d Minuten', + h : processRelativeTime$2, + hh : '%d Stunden', + d : processRelativeTime$2, + dd : processRelativeTime$2, + M : processRelativeTime$2, + MM : processRelativeTime$2, + y : processRelativeTime$2, + yy : processRelativeTime$2 + }, + 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. + } + }); + + //! moment.js locale configuration + + var months$4 = [ + 'ޖެނުއަރީ', + 'ފެބްރުއަރީ', + 'މާރިޗު', + 'އޭޕްރީލު', + 'މޭ', + 'ޖޫން', + 'ޖުލައި', + 'އޯގަސްޓު', + 'ސެޕްޓެމްބަރު', + 'އޮކްޓޯބަރު', + 'ނޮވެމްބަރު', + 'ޑިސެމްބަރު' + ], weekdays = [ + 'އާދިއްތަ', + 'ހޯމަ', + 'އަންގާރަ', + 'ބުދަ', + 'ބުރާސްފަތި', + 'ހުކުރު', + 'ހޮނިހިރު' + ]; + + hooks.defineLocale('dv', { + months : months$4, + monthsShort : months$4, + 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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.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. + } + }); + + //! moment.js locale configuration + + hooks.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 : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.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; + } + }); + + //! moment.js locale configuration + + hooks.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. + } + }); + + //! moment.js locale configuration + + hooks.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. + } + }); + + //! moment.js locale configuration + + hooks.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', + 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; + } + }); + + //! moment.js locale configuration + + hooks.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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_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 : 'D[-a de] MMMM, YYYY', + LLL : 'D[-a de] MMMM, YYYY HH:mm', + LLLL : 'dddd, [la] D[-a de] MMMM, 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 [je] LT', + lastDay : '[Hieraŭ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'post %s', + past : 'antaŭ %s', + s : 'sekundoj', + ss : '%d sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : '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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort$1 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + var 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]; + var monthsRegex$1 = /^(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; + + hooks.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$1[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + monthsRegex: monthsRegex$1, + monthsShortRegex: monthsRegex$1, + 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', + 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. + } + }); + + //! moment.js locale configuration + + var monthsShortDot$1 = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort$2 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + hooks.defineLocale('es-us', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot$1; + } else if (/-MMM-/.test(format)) { + return monthsShort$2[m.month()]; + } else { + return monthsShortDot$1[m.month()]; + } + }, + monthsParseExact : true, + 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 : 'MM/DD/YYYY', + LL : 'MMMM [de] D [de] YYYY', + LLL : 'MMMM [de] D [de] YYYY h:mm A', + LLLL : 'dddd, MMMM [de] D [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', + 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 : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var monthsShortDot$2 = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort$3 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + var monthsParse$1 = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; + var monthsRegex$2 = /^(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; + + hooks.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot$2; + } else if (/-MMM-/.test(format)) { + return monthsShort$3[m.month()]; + } else { + return monthsShortDot$2[m.month()]; + } + }, + monthsRegex : monthsRegex$2, + monthsShortRegex : monthsRegex$2, + 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$1, + longMonthsParse : monthsParse$1, + shortMonthsParse : monthsParse$1, + 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', + 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. + } + }); + + //! moment.js locale configuration + + function processRelativeTime$3(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'ss': [number + 'sekundi', number + 'sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + hooks.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.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' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime$3, + ss : processRelativeTime$3, + m : processRelativeTime$3, + mm : processRelativeTime$3, + h : processRelativeTime$3, + hh : processRelativeTime$3, + d : processRelativeTime$3, + dd : '%d päeva', + M : processRelativeTime$3, + MM : processRelativeTime$3, + y : processRelativeTime$3, + yy : processRelativeTime$3 + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + monthsParseExact : true, + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] HH:mm', + llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + ss : '%d segundo', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var symbolMap$5 = { + '1': '۱', + '2': '۲', + '3': '۳', + '4': '۴', + '5': '۵', + '6': '۶', + '7': '۷', + '8': '۸', + '9': '۹', + '0': '۰' + }, numberMap$4 = { + '۱': '1', + '۲': '2', + '۳': '3', + '۴': '4', + '۵': '5', + '۶': '6', + '۷': '7', + '۸': '8', + '۹': '9', + '۰': '0' + }; + + hooks.defineLocale('fa', { + months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.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 /بعد از ظهر/.test(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$4[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$5[match]; + }).replace(/,/g, '،'); + }, + dayOfMonthOrdinalParse: /\d{1,2}م/, + ordinal : '%dم', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + function translate$2(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'ss': + return isFuture ? 'sekunnin' : 'sekuntia'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + hooks.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] HH.mm', + llll : 'ddd, Do MMM YYYY, [klo] HH.mm' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate$2, + ss : translate$2, + m : translate$2, + mm : translate$2, + h : translate$2, + hh : translate$2, + d : translate$2, + dd : translate$2, + M : translate$2, + MM : translate$2, + y : translate$2, + yy : translate$2 + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.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 : '[Í dag kl.] LT', + nextDay : '[Í morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[Í gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + ss : '%d sekundir', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt á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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('fr-ch', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_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 : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_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 : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|)/, + ordinal : function (number, period) { + switch (period) { + // TODO: Return 'e' when day of month > 1. Move this case inside + // block for masculine words below. + // See https://github.com/moment/moment/issues/3375 + case 'D': + return number + (number === 1 ? 'er' : ''); + + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + }, + 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. + } + }); + + //! moment.js locale configuration + + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + hooks.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + monthsParseExact : true, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.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: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + ss : '%d sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + 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. + } + }); + + //! moment.js locale configuration + + var months$5 = [ + 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd' + ]; + + var monthsShort$4 = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh']; + + var weekdays$1 = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne']; + + var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis']; + + var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa']; + + hooks.defineLocale('gd', { + months : months$5, + monthsShort : monthsShort$4, + monthsParseExact : true, + weekdays : weekdays$1, + weekdaysShort : weekdaysShort, + weekdaysMin : weekdaysMin, + 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 : '[An-diugh aig] LT', + nextDay : '[A-màireach aig] LT', + nextWeek : 'dddd [aig] LT', + lastDay : '[An-dè aig] LT', + lastWeek : 'dddd [seo chaidh] [aig] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ann an %s', + past : 'bho chionn %s', + s : 'beagan diogan', + ss : '%d diogan', + m : 'mionaid', + mm : '%d mionaidean', + h : 'uair', + hh : '%d uairean', + d : 'latha', + dd : '%d latha', + M : 'mìos', + MM : '%d mìosan', + y : 'bliadhna', + yy : '%d bliadhna' + }, + dayOfMonthOrdinalParse : /\d{1,2}(d|na|mh)/, + ordinal : function (number) { + var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('gl', { + months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'), + monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mé_xo_ve_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 '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str.indexOf('un') === 0) { + return 'n' + str; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + 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. + } + }); + + //! moment.js locale configuration + + function processRelativeTime$4(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['thodde secondanim', 'thodde second'], + 'ss': [number + ' secondanim', number + ' second'], + 'm': ['eka mintan', 'ek minute'], + 'mm': [number + ' mintanim', number + ' mintam'], + 'h': ['eka horan', 'ek hor'], + 'hh': [number + ' horanim', number + ' horam'], + 'd': ['eka disan', 'ek dis'], + 'dd': [number + ' disanim', number + ' dis'], + 'M': ['eka mhoinean', 'ek mhoino'], + 'MM': [number + ' mhoineanim', number + ' mhoine'], + 'y': ['eka vorsan', 'ek voros'], + 'yy': [number + ' vorsanim', number + ' vorsam'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + hooks.defineLocale('gom-latn', { + months : 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'), + monthsShort : 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son\'var'.split('_'), + weekdaysShort : 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'), + weekdaysMin : 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'A h:mm [vazta]', + LTS : 'A h:mm:ss [vazta]', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY A h:mm [vazta]', + LLLL : 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', + llll: 'ddd, D MMM YYYY, A h:mm [vazta]' + }, + calendar : { + sameDay: '[Aiz] LT', + nextDay: '[Faleam] LT', + nextWeek: '[Ieta to] dddd[,] LT', + lastDay: '[Kal] LT', + lastWeek: '[Fatlo] dddd[,] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s', + past : '%s adim', + s : processRelativeTime$4, + ss : processRelativeTime$4, + m : processRelativeTime$4, + mm : processRelativeTime$4, + h : processRelativeTime$4, + hh : processRelativeTime$4, + d : processRelativeTime$4, + dd : processRelativeTime$4, + M : processRelativeTime$4, + MM : processRelativeTime$4, + y : processRelativeTime$4, + yy : processRelativeTime$4 + }, + dayOfMonthOrdinalParse : /\d{1,2}(er)/, + ordinal : function (number, period) { + switch (period) { + // the ordinal 'er' only applies to day of the month + case 'D': + return number + 'er'; + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + case 'w': + case 'W': + return number; + } + }, + 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: /rati|sokalli|donparam|sanje/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'rati') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'sokalli') { + return hour; + } else if (meridiem === 'donparam') { + return hour > 12 ? hour : hour + 12; + } else if (meridiem === 'sanje') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'rati'; + } else if (hour < 12) { + return 'sokalli'; + } else if (hour < 16) { + return 'donparam'; + } else if (hour < 20) { + return 'sanje'; + } else { + return 'rati'; + } + } + }); + + //! moment.js locale configuration + + var symbolMap$6 = { + '1': '૧', + '2': '૨', + '3': '૩', + '4': '૪', + '5': '૫', + '6': '૬', + '7': '૭', + '8': '૮', + '9': '૯', + '0': '૦' + }, + numberMap$5 = { + '૧': '1', + '૨': '2', + '૩': '3', + '૪': '4', + '૫': '5', + '૬': '6', + '૭': '7', + '૮': '8', + '૯': '9', + '૦': '0' + }; + + hooks.defineLocale('gu', { + months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'), + monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'), + 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: '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$5[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$6[match]; + }); + }, + // Gujarati notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati. + 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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'સાંજ') { + return hour + 12; + } + }, + 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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('he', { + months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + 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', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM 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 : function (number) { + if (number === 2) { + return 'שעתיים'; + } + return number + ' שעות'; + }, + d : 'יום', + dd : function (number) { + if (number === 2) { + return 'יומיים'; + } + return number + ' ימים'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיים'; + } + return number + ' חודשים'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיים'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שנים'; + } + }, + meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i, + isPM : function (input) { + return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 5) { + return 'לפנות בוקר'; + } else if (hour < 10) { + return 'בבוקר'; + } else if (hour < 12) { + return isLower ? 'לפנה"צ' : 'לפני הצהריים'; + } else if (hour < 18) { + return isLower ? 'אחה"צ' : 'אחרי הצהריים'; + } else { + return 'בערב'; + } + } + }); + + //! moment.js locale configuration + + var symbolMap$7 = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap$6 = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + hooks.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'), + monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'), + 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 : '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$6[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$7[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + 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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + 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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + function translate$3(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; + } + } + + hooks.defineLocale('hr', { + months : { + format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'), + standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_') + }, + monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.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$3, + m : translate$3, + mm : translate$3, + h : translate$3, + hh : translate$3, + d : 'dan', + dd : translate$3, + M : 'mjesec', + MM : translate$3, + y : 'godinu', + yy : translate$3 + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' '); + function translate$4(number, withoutSuffix, key, isFuture) { + var num = number; + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'ss': + return num + (isFuture || withoutSuffix) ? ' másodperc' : ' másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + return ''; + } + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + hooks.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D. H:mm', + LLLL : 'YYYY. MMMM D., dddd H:mm' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate$4, + ss : translate$4, + m : translate$4, + mm : translate$4, + h : translate$4, + hh : translate$4, + d : translate$4, + dd : translate$4, + M : translate$4, + MM : translate$4, + y : translate$4, + yy : translate$4 + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('hy-am', { + months : { + format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'), + standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_') + }, + monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'), + weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'), + 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 () { + return '[անցած] 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 տարի' + }, + meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/, + isPM: function (input) { + return /^(ցերեկվա|երեկոյան)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'գիշերվա'; + } else if (hour < 12) { + return 'առավոտվա'; + } else if (hour < 17) { + return 'ցերեկվա'; + } else { + return 'երեկոյան'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-ին'; + } + return number + '-րդ'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + ss : '%d detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + function plural$2(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + function translate$5(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'ss': + if (plural$2(number)) { + return result + (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum'); + } + return result + 'sekúnda'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural$2(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural$2(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural$2(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural$2(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural$2(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + hooks.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate$5, + ss : translate$5, + m : translate$5, + mm : translate$5, + h : 'klukkustund', + hh : translate$5, + d : translate$5, + dd : translate$5, + M : translate$5, + MM : translate$5, + y : translate$5, + yy : translate$5 + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), + weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), + weekdaysMin : 'do_lu_ma_me_gi_ve_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: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + ss : '%d secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : '日_月_火_水_木_金_土'.split('_'), + weekdaysMin : '日_月_火_水_木_金_土'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日 dddd HH:mm', + l : 'YYYY/MM/DD', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日(ddd) HH:mm' + }, + meridiemParse: /午前|午後/i, + isPM : function (input) { + return input === '午後'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return '午前'; + } else { + return '午後'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : function (now) { + if (now.week() < this.week()) { + return '[来週]dddd LT'; + } else { + return 'dddd LT'; + } + }, + lastDay : '[昨日] LT', + lastWeek : function (now) { + if (this.week() < now.week()) { + return '[先週]dddd LT'; + } else { + return 'dddd LT'; + } + }, + sameElse : 'L' + }, + dayOfMonthOrdinalParse : /\d{1,2}日/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + default: + return number; + } + }, + relativeTime : { + future : '%s後', + past : '%s前', + s : '数秒', + ss : '%d秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1日', + dd : '%d日', + M : '1ヶ月', + MM : '%dヶ月', + y : '1年', + yy : '%d年' + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('jv', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'), + weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /enjing|siyang|sonten|ndalu/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'enjing') { + return hour; + } else if (meridiem === 'siyang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sonten' || meridiem === 'ndalu') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'enjing'; + } else if (hours < 15) { + return 'siyang'; + } else if (hours < 19) { + return 'sonten'; + } else { + return 'ndalu'; + } + }, + calendar : { + sameDay : '[Dinten puniko pukul] LT', + nextDay : '[Mbenjang pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kala wingi pukul] LT', + lastWeek : 'dddd [kepengker pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'wonten ing %s', + past : '%s ingkang kepengker', + s : 'sawetawis detik', + ss : '%d detik', + m : 'setunggal menit', + mm : '%d menit', + h : 'setunggal jam', + hh : '%d jam', + d : 'sedinten', + dd : '%d dinten', + M : 'sewulan', + MM : '%d wulan', + y : 'setaun', + yy : '%d taun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('ka', { + months : { + standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'), + format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_') + }, + monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'), + weekdays : { + standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'), + format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'), + isFormat: /(წინა|შემდეგ)/ + }, + weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'), + weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.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 : '[დღეს] LT[-ზე]', + nextDay : '[ხვალ] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინა] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წამი|წუთი|საათი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რამდენიმე წამი', + ss : '%d წამი', + m : 'წუთი', + mm : '%d წუთი', + h : 'საათი', + hh : '%d საათი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + if (number === 1) { + return number + '-ლი'; + } + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); + + //! moment.js locale configuration + + var suffixes$1 = { + 0: '-ші', + 1: '-ші', + 2: '-ші', + 3: '-ші', + 4: '-ші', + 5: '-ші', + 6: '-шы', + 7: '-ші', + 8: '-ші', + 9: '-шы', + 10: '-шы', + 20: '-шы', + 30: '-шы', + 40: '-шы', + 50: '-ші', + 60: '-шы', + 70: '-ші', + 80: '-ші', + 90: '-шы', + 100: '-ші' + }; + + hooks.defineLocale('kk', { + months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'), + monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'), + weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'), + 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', + 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 жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes$1[number] || suffixes$1[a] || suffixes$1[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var symbolMap$8 = { + '1': '១', + '2': '២', + '3': '៣', + '4': '៤', + '5': '៥', + '6': '៦', + '7': '៧', + '8': '៨', + '9': '៩', + '0': '០' + }, numberMap$7 = { + '១': '1', + '២': '2', + '៣': '3', + '៤': '4', + '៥': '5', + '៦': '6', + '៧': '7', + '៨': '8', + '៩': '9', + '០': '0' + }; + + hooks.defineLocale('km', { + 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 ឆ្នាំ' + }, + dayOfMonthOrdinalParse : /ទី\d{1,2}/, + ordinal : 'ទី%d', + preparse: function (string) { + return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) { + return numberMap$7[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$8[match]; + }); + }, + 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. + } + }); + + //! moment.js locale configuration + + var symbolMap$9 = { + '1': '೧', + '2': '೨', + '3': '೩', + '4': '೪', + '5': '೫', + '6': '೬', + '7': '೭', + '8': '೮', + '9': '೯', + '0': '೦' + }, + numberMap$8 = { + '೧': '1', + '೨': '2', + '೩': '3', + '೪': '4', + '೫': '5', + '೬': '6', + '೭': '7', + '೮': '8', + '೯': '9', + '೦': '0' + }; + + hooks.defineLocale('kn', { + months : 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'), + monthsShort : 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'), + 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 : '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$8[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$9[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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'ಸಂಜೆ') { + return hour + 12; + } + }, + 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 'ರಾತ್ರಿ'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/, + ordinal : function (number) { + return number + 'ನೇ'; + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('ko', { + months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), + weekdaysShort : '일_월_화_수_목_금_토'.split('_'), + weekdaysMin : '일_월_화_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY년 MMMM D일', + LLL : 'YYYY년 MMMM D일 A h:mm', + LLLL : 'YYYY년 MMMM D일 dddd A h:mm', + l : 'YYYY.MM.DD.', + ll : 'YYYY년 MMMM D일', + lll : 'YYYY년 MMMM D일 A h:mm', + llll : 'YYYY년 MMMM D일 dddd 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 : '1분', + mm : '%d분', + h : '한 시간', + hh : '%d시간', + d : '하루', + dd : '%d일', + M : '한 달', + MM : '%d달', + y : '일 년', + yy : '%d년' + }, + dayOfMonthOrdinalParse : /\d{1,2}(일|월|주)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '일'; + case 'M': + return number + '월'; + case 'w': + case 'W': + return number + '주'; + default: + return number; + } + }, + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); + + //! moment.js locale configuration + + var suffixes$2 = { + 0: '-чү', + 1: '-чи', + 2: '-чи', + 3: '-чү', + 4: '-чү', + 5: '-чи', + 6: '-чы', + 7: '-чи', + 8: '-чи', + 9: '-чу', + 10: '-чу', + 20: '-чы', + 30: '-чу', + 40: '-чы', + 50: '-чү', + 60: '-чы', + 70: '-чи', + 80: '-чи', + 90: '-чу', + 100: '-чү' + }; + + hooks.defineLocale('ky', { + months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'), + monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'), + 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', + 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 жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes$2[number] || suffixes$2[a] || suffixes$2[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + function processRelativeTime$5(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + hooks.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm [Auer]', + LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + ss : '%d Sekonnen', + m : processRelativeTime$5, + mm : '%d Minutten', + h : processRelativeTime$5, + hh : '%d Stonnen', + d : processRelativeTime$5, + dd : '%d Deeg', + M : processRelativeTime$5, + MM : '%d Méint', + y : processRelativeTime$5, + yy : '%d Joer' + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('lo', { + 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 : '1 ນາທີ', + mm : '%d ນາທີ', + h : '1 ຊົ່ວໂມງ', + hh : '%d ຊົ່ວໂມງ', + d : '1 ມື້', + dd : '%d ມື້', + M : '1 ເດືອນ', + MM : '%d ເດືອນ', + y : '1 ປີ', + yy : '%d ປີ' + }, + dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/, + ordinal : function (number) { + return 'ທີ່' + number; + } + }); + + //! moment.js locale configuration + + var units = { + 'ss' : 'sekundė_sekundžių_sekundes', + 'm' : 'minutė_minutės_minutę', + 'mm': 'minutės_minučių_minutes', + 'h' : 'valanda_valandos_valandą', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dieną', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mėnuo_mėnesio_mėnesį', + 'MM': 'mėnesiai_mėnesių_mėnesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }; + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundės'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + function forms(key) { + return units[key].split('_'); + } + function translate$6(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + hooks.defineLocale('lt', { + months : { + format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'), + standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'), + isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/ + }, + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : { + format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'), + standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'), + isFormat: /dddd HH:mm/ + }, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]' + }, + calendar : { + sameDay : '[Šiandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[Praėjusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieš %s', + s : translateSeconds, + ss : translate$6, + m : translateSingular, + mm : translate$6, + h : translateSingular, + hh : translate$6, + d : translateSingular, + dd : translate$6, + M : translateSingular, + MM : translate$6, + y : translateSingular, + yy : translate$6 + }, + dayOfMonthOrdinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + 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. + } + }); + + //! moment.js locale configuration + + var units$1 = { + 'ss': 'sekundes_sekundēm_sekunde_sekundes'.split('_'), + 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'h': 'stundas_stundām_stunda_stundas'.split('_'), + 'hh': 'stundas_stundām_stunda_stundas'.split('_'), + 'd': 'dienas_dienām_diena_dienas'.split('_'), + 'dd': 'dienas_dienām_diena_dienas'.split('_'), + 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'y': 'gada_gadiem_gads_gadi'.split('_'), + 'yy': 'gada_gadiem_gads_gadi'.split('_') + }; + /** + * @param withoutSuffix boolean true = a length of time; false = before/after a period of time. + */ + function format$1(forms, number, withoutSuffix) { + if (withoutSuffix) { + // E.g. "21 minūte", "3 minūtes". + return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3]; + } else { + // E.g. "21 minūtes" as in "pēc 21 minūtes". + // E.g. "3 minūtēm" as in "pēc 3 minūtēm". + return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1]; + } + } + function relativeTimeWithPlural$1(number, withoutSuffix, key) { + return number + ' ' + format$1(units$1[key], number, withoutSuffix); + } + function relativeTimeWithSingular(number, withoutSuffix, key) { + return format$1(units$1[key], number, withoutSuffix); + } + function relativeSeconds(number, withoutSuffix) { + return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm'; + } + + hooks.defineLocale('lv', { + months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY.', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, HH:mm', + LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm' + }, + calendar : { + sameDay : '[Šodien pulksten] LT', + nextDay : '[Rīt pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[Pagājušā] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'pēc %s', + past : 'pirms %s', + s : relativeSeconds, + ss : relativeTimeWithPlural$1, + m : relativeTimeWithSingular, + mm : relativeTimeWithPlural$1, + h : relativeTimeWithSingular, + hh : relativeTimeWithPlural$1, + d : relativeTimeWithSingular, + dd : relativeTimeWithPlural$1, + M : relativeTimeWithSingular, + MM : relativeTimeWithPlural$1, + y : relativeTimeWithSingular, + yy : relativeTimeWithPlural$1 + }, + 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. + } + }); + + //! moment.js locale configuration + + var translator = { + words: { //Different grammatical cases + ss: ['sekund', 'sekunda', 'sekundi'], + m: ['jedan minut', 'jednog minuta'], + mm: ['minut', 'minuta', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mjesec', 'mjeseca', 'mjeseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + hooks.defineLocale('me', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._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: '[sjutra 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če u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedjelje] [u] LT', + '[prošlog] [ponedjeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srijede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'nekoliko sekundi', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mjesec', + MM : translator.translate, + y : 'godinu', + yy : translator.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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('mi', { + months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'), + monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'), + monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i, + weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'), + weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY [i] HH:mm', + LLLL: 'dddd, D MMMM YYYY [i] HH:mm' + }, + calendar: { + sameDay: '[i teie mahana, i] LT', + nextDay: '[apopo i] LT', + nextWeek: 'dddd [i] LT', + lastDay: '[inanahi i] LT', + lastWeek: 'dddd [whakamutunga i] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'i roto i %s', + past: '%s i mua', + s: 'te hēkona ruarua', + ss: '%d hēkona', + m: 'he meneti', + mm: '%d meneti', + h: 'te haora', + hh: '%d haora', + d: 'he ra', + dd: '%d ra', + M: 'he marama', + MM: '%d marama', + y: 'he tau', + yy: '%d tau' + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'), + weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'), + weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.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 дена', + 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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('ml', { + months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'), + 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 : '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 വർഷം' + }, + meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'രാത്രി' && hour >= 4) || + meridiem === 'ഉച്ച കഴിഞ്ഞ്' || + meridiem === 'വൈകുന്നേരം') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാത്രി'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉച്ച കഴിഞ്ഞ്'; + } else if (hour < 20) { + return 'വൈകുന്നേരം'; + } else { + return 'രാത്രി'; + } + } + }); + + //! moment.js locale configuration + + function translate$7(number, withoutSuffix, key, isFuture) { + switch (key) { + case 's': + return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын'; + case 'ss': + return number + (withoutSuffix ? ' секунд' : ' секундын'); + case 'm': + case 'mm': + return number + (withoutSuffix ? ' минут' : ' минутын'); + case 'h': + case 'hh': + return number + (withoutSuffix ? ' цаг' : ' цагийн'); + case 'd': + case 'dd': + return number + (withoutSuffix ? ' өдөр' : ' өдрийн'); + case 'M': + case 'MM': + return number + (withoutSuffix ? ' сар' : ' сарын'); + case 'y': + case 'yy': + return number + (withoutSuffix ? ' жил' : ' жилийн'); + default: + return number; + } + } + + hooks.defineLocale('mn', { + months : 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split('_'), + monthsShort : '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split('_'), + monthsParseExact : true, + weekdays : 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'), + weekdaysShort : 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'), + weekdaysMin : 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY оны MMMMын D', + LLL : 'YYYY оны MMMMын D HH:mm', + LLLL : 'dddd, YYYY оны MMMMын D HH:mm' + }, + meridiemParse: /ҮӨ|ҮХ/i, + 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 : translate$7, + ss : translate$7, + m : translate$7, + mm : translate$7, + h : translate$7, + hh : translate$7, + d : translate$7, + dd : translate$7, + M : translate$7, + MM : translate$7, + y : translate$7, + yy : translate$7 + }, + dayOfMonthOrdinalParse: /\d{1,2} өдөр/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + ' өдөр'; + default: + return number; + } + } + }); + + //! moment.js locale configuration + + var symbolMap$a = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap$9 = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + function relativeTimeMr(number, withoutSuffix, string, isFuture) + { + var output = ''; + if (withoutSuffix) { + switch (string) { + case 's': output = 'काही सेकंद'; break; + case 'ss': output = '%d सेकंद'; break; + case 'm': output = 'एक मिनिट'; break; + case 'mm': output = '%d मिनिटे'; break; + case 'h': output = 'एक तास'; break; + case 'hh': output = '%d तास'; break; + case 'd': output = 'एक दिवस'; break; + case 'dd': output = '%d दिवस'; break; + case 'M': output = 'एक महिना'; break; + case 'MM': output = '%d महिने'; break; + case 'y': output = 'एक वर्ष'; break; + case 'yy': output = '%d वर्षे'; break; + } + } + else { + switch (string) { + case 's': output = 'काही सेकंदां'; break; + case 'ss': output = '%d सेकंदां'; break; + case 'm': output = 'एका मिनिटा'; break; + case 'mm': output = '%d मिनिटां'; break; + case 'h': output = 'एका तासा'; break; + case 'hh': output = '%d तासां'; break; + case 'd': output = 'एका दिवसा'; break; + case 'dd': output = '%d दिवसां'; break; + case 'M': output = 'एका महिन्या'; break; + case 'MM': output = '%d महिन्यां'; break; + case 'y': output = 'एका वर्षा'; break; + case 'yy': output = '%d वर्षां'; break; + } + } + return output.replace(/%d/i, number); + } + + hooks.defineLocale('mr', { + months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'), + 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 : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future: '%sमध्ये', + past: '%sपूर्वी', + s: relativeTimeMr, + ss: relativeTimeMr, + m: relativeTimeMr, + mm: relativeTimeMr, + h: relativeTimeMr, + hh: relativeTimeMr, + d: relativeTimeMr, + dd: relativeTimeMr, + M: relativeTimeMr, + MM: relativeTimeMr, + y: relativeTimeMr, + yy: relativeTimeMr + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap$9[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$a[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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + 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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + ss : '%d saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('ms', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + ss : '%d saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('mt', { + months : 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'), + monthsShort : 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'), + weekdays : 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'), + weekdaysShort : 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'), + weekdaysMin : 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.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 : '[Illum fil-]LT', + nextDay : '[Għada fil-]LT', + nextWeek : 'dddd [fil-]LT', + lastDay : '[Il-bieraħ fil-]LT', + lastWeek : 'dddd [li għadda] [fil-]LT', + sameElse : 'L' + }, + relativeTime : { + future : 'f’ %s', + past : '%s ilu', + s : 'ftit sekondi', + ss : '%d sekondi', + m : 'minuta', + mm : '%d minuti', + h : 'siegħa', + hh : '%d siegħat', + d : 'ġurnata', + dd : '%d ġranet', + M : 'xahar', + MM : '%d xhur', + y : 'sena', + yy : '%d sni' + }, + 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. + } + }); + + //! moment.js locale configuration + + var symbolMap$b = { + '1': '၁', + '2': '၂', + '3': '၃', + '4': '၄', + '5': '၅', + '6': '၆', + '7': '၇', + '8': '၈', + '9': '၉', + '0': '၀' + }, numberMap$a = { + '၁': '1', + '၂': '2', + '၃': '3', + '၄': '4', + '၅': '5', + '၆': '6', + '၇': '7', + '၈': '8', + '၉': '9', + '၀': '0' + }; + + hooks.defineLocale('my', { + months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'), + 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 [မှာ]', + 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$a[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$b[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'), + monthsParseExact : true, + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i går kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'noen sekunder', + ss : '%d sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en måned', + MM : '%d måneder', + y : 'ett å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. + } + }); + + //! moment.js locale configuration + + var symbolMap$c = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap$b = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + hooks.defineLocale('ne', { + months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'), + monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'), + monthsParseExact : true, + weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'), + weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'), + weekdaysParseExact : true, + 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 बजे' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap$b[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$c[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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'साँझ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राति'; + } else if (hour < 12) { + return 'बिहान'; + } else if (hour < 16) { + return 'दिउँसो'; + } else if (hour < 20) { + 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 बर्ष' + }, + 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. + } + }); + + //! moment.js locale configuration + + var monthsShortWithDots$1 = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots$1 = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + var monthsParse$2 = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; + var monthsRegex$3 = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + + hooks.defineLocale('nl-be', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots$1; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots$1[m.month()]; + } else { + return monthsShortWithDots$1[m.month()]; + } + }, + + monthsRegex: monthsRegex$3, + monthsShortRegex: monthsRegex$3, + monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + + monthsParse : monthsParse$2, + longMonthsParse : monthsParse$2, + shortMonthsParse : monthsParse$2, + + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.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: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + ss : '%d seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + 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'); + }, + 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. + } + }); + + //! moment.js locale configuration + + var monthsShortWithDots$2 = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots$2 = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + var monthsParse$3 = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; + var monthsRegex$4 = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + + hooks.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots$2; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots$2[m.month()]; + } else { + return monthsShortWithDots$2[m.month()]; + } + }, + + monthsRegex: monthsRegex$4, + monthsShortRegex: monthsRegex$4, + monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + + monthsParse : monthsParse$3, + longMonthsParse : monthsParse$3, + shortMonthsParse : monthsParse$3, + + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.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: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + ss : '%d seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + 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'); + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_må_ty_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 [kl.] H:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I går klokka] LT', + lastWeek: '[Føregåande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s sidan', + s : 'nokre sekund', + ss : '%d sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein månad', + MM : '%d månader', + y : 'eit å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. + } + }); + + //! moment.js locale configuration + + var symbolMap$d = { + '1': '੧', + '2': '੨', + '3': '੩', + '4': '੪', + '5': '੫', + '6': '੬', + '7': '੭', + '8': '੮', + '9': '੯', + '0': '੦' + }, + numberMap$c = { + '੧': '1', + '੨': '2', + '੩': '3', + '੪': '4', + '੫': '5', + '੬': '6', + '੭': '7', + '੮': '8', + '੯': '9', + '੦': '0' + }; + + hooks.defineLocale('pa-in', { + // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi. + 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$c[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$d[match]; + }); + }, + // Punjabi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi. + 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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'ਸ਼ਾਮ') { + return hour + 12; + } + }, + 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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'); + function plural$3(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + function translate$8(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'ss': + return result + (plural$3(number) ? 'sekundy' : 'sekund'); + case 'm': + return withoutSuffix ? 'minuta' : 'minutę'; + case 'mm': + return result + (plural$3(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinę'; + case 'hh': + return result + (plural$3(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural$3(number) ? 'miesiące' : 'miesięcy'); + case 'yy': + return result + (plural$3(number) ? 'lata' : 'lat'); + } + } + + hooks.defineLocale('pl', { + months : function (momentToFormat, format) { + if (!momentToFormat) { + return monthsNominative; + } else if (format === '') { + // Hack: if format empty we know this is used to generate + // RegExp by moment. Give then back both valid forms of months + // in RegExp ready format. + return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')'; + } else if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), + weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), + weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.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: '[Dziś o] LT', + nextDay: '[Jutro o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[W niedzielę o] LT'; + + case 2: + return '[We wtorek o] LT'; + + case 3: + return '[W środę o] LT'; + + case 6: + return '[W sobotę o] LT'; + + default: + return '[W] dddd [o] LT'; + } + }, + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszłą niedzielę o] LT'; + case 3: + return '[W zeszłą środę o] LT'; + case 6: + return '[W zeszłą sobotę o] LT'; + default: + return '[W zeszły] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + ss : translate$8, + m : translate$8, + mm : translate$8, + h : translate$8, + hh : translate$8, + d : '1 dzień', + dd : '%d dni', + M : 'miesiąc', + MM : translate$8, + y : 'rok', + yy : translate$8 + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'poucos segundos', + ss : '%d segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); + + //! moment.js locale configuration + + hooks.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + ss : '%d segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + 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. + } + }); + + //! moment.js locale configuration + + function relativeTimeWithPlural$2(number, withoutSuffix, key) { + var format = { + 'ss': 'secunde', + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + return number + separator + format[key]; + } + + hooks.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.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' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + ss : relativeTimeWithPlural$2, + m : 'un minut', + mm : relativeTimeWithPlural$2, + h : 'o oră', + hh : relativeTimeWithPlural$2, + d : 'o zi', + dd : relativeTimeWithPlural$2, + M : 'o lună', + MM : relativeTimeWithPlural$2, + y : 'un an', + yy : relativeTimeWithPlural$2 + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + function plural$4(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$3(number, withoutSuffix, key) { + var format = { + 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'час_часа_часов', + 'dd': 'день_дня_дней', + 'MM': 'месяц_месяца_месяцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural$4(format[key], +number); + } + } + var monthsParse$4 = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; + + // http://new.gramota.ru/spravka/rules/139-prop : § 103 + // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637 + // CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753 + hooks.defineLocale('ru', { + months : { + format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'), + standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_') + }, + monthsShort : { + // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ? + format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'), + standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_') + }, + weekdays : { + standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'), + format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'), + isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/ + }, + weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + monthsParse : monthsParse$4, + longMonthsParse : monthsParse$4, + shortMonthsParse : monthsParse$4, + + // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки + monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, + + // копия предыдущего + monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, + + // полные названия с падежами + monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i, + + // Выражение, которое соотвествует только сокращённым формам + monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i, + 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: '[Сегодня, в] LT', + nextDay: '[Завтра, в] LT', + lastDay: '[Вчера, в] LT', + nextWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В следующее] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В следующий] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В следующую] dddd, [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd, [в] LT'; + } else { + return '[В] dddd, [в] LT'; + } + } + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В прошлое] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В прошлый] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В прошлую] dddd, [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd, [в] LT'; + } else { + return '[В] dddd, [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'несколько секунд', + ss : relativeTimeWithPlural$3, + m : relativeTimeWithPlural$3, + mm : relativeTimeWithPlural$3, + h : 'час', + hh : relativeTimeWithPlural$3, + d : 'день', + dd : relativeTimeWithPlural$3, + M : 'месяц', + MM : relativeTimeWithPlural$3, + y : 'год', + yy : relativeTimeWithPlural$3 + }, + meridiemParse: /ночи|утра|дня|вечера/i, + 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': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-я'; + default: + return number; + } + }, + 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. + } + }); + + //! moment.js locale configuration + + var months$6 = [ + 'جنوري', + 'فيبروري', + 'مارچ', + 'اپريل', + 'مئي', + 'جون', + 'جولاءِ', + 'آگسٽ', + 'سيپٽمبر', + 'آڪٽوبر', + 'نومبر', + 'ڊسمبر' + ]; + var days$1 = [ + 'آچر', + 'سومر', + 'اڱارو', + 'اربع', + 'خميس', + 'جمع', + 'ڇنڇر' + ]; + + hooks.defineLocale('sd', { + months : months$6, + monthsShort : months$6, + weekdays : days$1, + weekdaysShort : days$1, + weekdaysMin : days$1, + 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 'صبح'; + } + 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 : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('se', { + months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'), + monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'), + weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'), + weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'), + weekdaysMin : 's_v_m_g_d_b_L'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'MMMM D. [b.] YYYY', + LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm', + LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm' + }, + calendar : { + sameDay: '[otne ti] LT', + nextDay: '[ihttin ti] LT', + nextWeek: 'dddd [ti] LT', + lastDay: '[ikte ti] LT', + lastWeek: '[ovddit] dddd [ti] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s geažes', + past : 'maŋit %s', + s : 'moadde sekunddat', + ss: '%d sekunddat', + m : 'okta minuhta', + mm : '%d minuhtat', + h : 'okta diimmu', + hh : '%d diimmut', + d : 'okta beaivi', + dd : '%d beaivvit', + M : 'okta mánnu', + MM : '%d mánut', + y : 'okta jahki', + yy : '%d jagit' + }, + 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. + } + }); + + //! moment.js locale configuration + + /*jshint -W100*/ + hooks.defineLocale('si', { + months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'), + monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'), + weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'), + weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'), + weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'a h:mm', + LTS : 'a h:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY MMMM D', + LLL : 'YYYY MMMM D, a h:mm', + LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss' + }, + 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' + }, + dayOfMonthOrdinalParse: /\d{1,2} වැනි/, + ordinal : function (number) { + return number + ' වැනි'; + }, + meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./, + isPM : function (input) { + return input === 'ප.ව.' || input === 'පස් වරු'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'ප.ව.' : 'පස් වරු'; + } else { + return isLower ? 'පෙ.ව.' : 'පෙර වරු'; + } + } + }); + + //! moment.js locale configuration + + var months$7 = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort$5 = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + function plural$5(n) { + return (n > 1) && (n < 5); + } + function translate$9(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 sekúnd' : 'pár sekundami'; + case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago + if (withoutSuffix || isFuture) { + return result + (plural$5(number) ? 'sekundy' : 'sekúnd'); + } else { + return result + 'sekundami'; + } + break; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural$5(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + 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$5(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural$5(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural$5(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural$5(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + hooks.defineLocale('sk', { + months : months$7, + monthsShort : monthsShort$5, + weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_št_pi_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' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo štvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[včera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate$9, + ss : translate$9, + m : translate$9, + mm : translate$9, + h : translate$9, + hh : translate$9, + d : translate$9, + dd : translate$9, + M : translate$9, + MM : translate$9, + y : translate$9, + yy : translate$9 + }, + 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. + } + }); + + //! moment.js locale configuration + + function processRelativeTime$6(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami'; + case 'ss': + if (number === 1) { + result += withoutSuffix ? 'sekundo' : 'sekundi'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah'; + } else { + result += withoutSuffix || isFuture ? 'sekund' : 'sekund'; + } + return result; + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += withoutSuffix ? 'minuta' : 'minuto'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'minuti' : 'minutama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'minute' : 'minutami'; + } else { + result += withoutSuffix || isFuture ? 'minut' : 'minutami'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += withoutSuffix ? 'ura' : 'uro'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'uri' : 'urama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'ure' : 'urami'; + } else { + result += withoutSuffix || isFuture ? 'ur' : 'urami'; + } + return result; + case 'd': + return withoutSuffix || isFuture ? 'en dan' : 'enim dnem'; + case 'dd': + if (number === 1) { + result += withoutSuffix || isFuture ? 'dan' : 'dnem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'dni' : 'dnevoma'; + } else { + result += withoutSuffix || isFuture ? 'dni' : 'dnevi'; + } + return result; + case 'M': + return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem'; + case 'MM': + if (number === 1) { + result += withoutSuffix || isFuture ? 'mesec' : 'mesecem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'meseca' : 'mesecema'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'mesece' : 'meseci'; + } else { + result += withoutSuffix || isFuture ? 'mesecev' : 'meseci'; + } + return result; + case 'y': + return withoutSuffix || isFuture ? 'eno leto' : 'enim letom'; + case 'yy': + if (number === 1) { + result += withoutSuffix || isFuture ? 'leto' : 'letom'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'leti' : 'letoma'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'leta' : 'leti'; + } else { + result += withoutSuffix || isFuture ? 'let' : 'leti'; + } + return result; + } + } + + hooks.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_če_pe_so'.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 : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[včeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + return '[prejšnjo] [nedeljo] [ob] LT'; + case 3: + return '[prejšnjo] [sredo] [ob] LT'; + case 6: + return '[prejšnjo] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejšnji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'čez %s', + past : 'pred %s', + s : processRelativeTime$6, + ss : processRelativeTime$6, + m : processRelativeTime$6, + mm : processRelativeTime$6, + h : processRelativeTime$6, + hh : processRelativeTime$6, + d : processRelativeTime$6, + dd : processRelativeTime$6, + M : processRelativeTime$6, + MM : processRelativeTime$6, + y : processRelativeTime$6, + yy : processRelativeTime$6 + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + weekdaysParseExact : true, + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + 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 : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + ss : '%d sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + 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. + } + }); + + //! moment.js locale configuration + + var translator$1 = { + words: { //Different grammatical cases + ss: ['секунда', 'секунде', 'секунди'], + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један сат', 'једног сата'], + hh: ['сат', 'сата', 'сати'], + dd: ['дан', 'дана', 'дана'], + MM: ['месец', 'месеца', 'месеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator$1.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator$1.correctGrammaticalCase(number, wordKey); + } + } + }; + + hooks.defineLocale('sr-cyrl', { + months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'), + monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'), + monthsParseExact: true, + weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'), + weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'), + weekdaysMin: 'не_по_ут_ср_че_пе_су'.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: '[данас у] LT', + nextDay: '[сутра у] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [среду] [у] LT'; + case 6: + return '[у] [суботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [среде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [суботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико секунди', + ss : translator$1.translate, + m : translator$1.translate, + mm : translator$1.translate, + h : translator$1.translate, + hh : translator$1.translate, + d : 'дан', + dd : translator$1.translate, + M : 'месец', + MM : translator$1.translate, + y : 'годину', + yy : translator$1.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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var translator$2 = { + words: { //Different grammatical cases + ss: ['sekunda', 'sekunde', 'sekundi'], + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator$2.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator$2.correctGrammaticalCase(number, wordKey); + } + } + }; + + hooks.defineLocale('sr', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'), + weekdaysShort: 'ned._pon._uto._sre._č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] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juče u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedelje] [u] LT', + '[prošlog] [ponedeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + ss : translator$2.translate, + m : translator$2.translate, + mm : translator$2.translate, + h : translator$2.translate, + hh : translator$2.translate, + d : 'dan', + dd : translator$2.translate, + M : 'mesec', + MM : translator$2.translate, + y : 'godinu', + yy : translator$2.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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('ss', { + months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'), + monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'), + weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'), + weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'), + weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'), + weekdaysParseExact : true, + 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 : '[Namuhla nga] LT', + nextDay : '[Kusasa nga] LT', + nextWeek : 'dddd [nga] LT', + lastDay : '[Itolo nga] LT', + lastWeek : 'dddd [leliphelile] [nga] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'nga %s', + past : 'wenteka nga %s', + s : 'emizuzwana lomcane', + ss : '%d mzuzwana', + m : 'umzuzu', + mm : '%d emizuzu', + h : 'lihora', + hh : '%d emahora', + d : 'lilanga', + dd : '%d emalanga', + M : 'inyanga', + MM : '%d tinyanga', + y : 'umnyaka', + yy : '%d iminyaka' + }, + meridiemParse: /ekuseni|emini|entsambama|ebusuku/, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'ekuseni'; + } else if (hours < 15) { + return 'emini'; + } else if (hours < 19) { + return 'entsambama'; + } else { + return 'ebusuku'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ekuseni') { + return hour; + } else if (meridiem === 'emini') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') { + if (hour === 0) { + return 0; + } + return hour + 12; + } + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D MMMM YYYY [kl.] HH:mm', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd D MMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[Igår] LT', + nextWeek: '[På] dddd LT', + lastWeek: '[I] dddd[s] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'några sekunder', + ss : '%d sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en månad', + MM : '%d månader', + y : 'ett år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('sw', { + months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'), + weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'), + weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.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 : '[leo saa] LT', + nextDay : '[kesho saa] LT', + nextWeek : '[wiki ijayo] dddd [saat] LT', + lastDay : '[jana] LT', + lastWeek : '[wiki iliyopita] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s baadaye', + past : 'tokea %s', + s : 'hivi punde', + ss : 'sekunde %d', + m : 'dakika moja', + mm : 'dakika %d', + h : 'saa limoja', + hh : 'masaa %d', + d : 'siku moja', + dd : 'masiku %d', + M : 'mwezi mmoja', + MM : 'miezi %d', + y : 'mwaka mmoja', + yy : 'miaka %d' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var symbolMap$e = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, numberMap$d = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; + + hooks.defineLocale('ta', { + months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'), + 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', + 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 ஆண்டுகள்' + }, + dayOfMonthOrdinalParse: /\d{1,2}வது/, + ordinal : function (number) { + return number + 'வது'; + }, + preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap$d[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap$e[match]; + }); + }, + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமம்'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நண்பகல்'; // நண்பகல் + } else if (hour < 18) { + return ' எற்பாடு'; // எற்பாடு + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமம்'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமம்') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நண்பகல்') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('te', { + months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'), + monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'), + 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 : '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 సంవత్సరాలు' + }, + dayOfMonthOrdinalParse : /\d{1,2}వ/, + ordinal : '%dవ', + 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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'సాయంత్రం') { + return hour + 12; + } + }, + 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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('tet', { + months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'), + weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'), + weekdaysMin : 'Do_Seg_Te_Ku_Ki_Ses_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: '[Ohin iha] LT', + nextDay: '[Aban iha] LT', + nextWeek: 'dddd [iha] LT', + lastDay: '[Horiseik iha] LT', + lastWeek: 'dddd [semana kotuk] [iha] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'iha %s', + past : '%s liuba', + s : 'minutu balun', + ss : 'minutu %d', + m : 'minutu ida', + mm : 'minutu %d', + h : 'oras ida', + hh : 'oras %d', + d : 'loron ida', + dd : 'loron %d', + M : 'fulan ida', + MM : 'fulan %d', + y : 'tinan ida', + yy : 'tinan %d' + }, + 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. + } + }); + + //! moment.js locale configuration + + var suffixes$3 = { + 0: '-ум', + 1: '-ум', + 2: '-юм', + 3: '-юм', + 4: '-ум', + 5: '-ум', + 6: '-ум', + 7: '-ум', + 8: '-ум', + 9: '-ум', + 10: '-ум', + 12: '-ум', + 13: '-ум', + 20: '-ум', + 30: '-юм', + 40: '-ум', + 50: '-ум', + 60: '-ум', + 70: '-ум', + 80: '-ум', + 90: '-ум', + 100: '-ум' + }; + + hooks.defineLocale('tg', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'), + 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 : 'dddd[и] [ҳафтаи оянда соати] LT', + lastWeek : 'dddd[и] [ҳафтаи гузашта соати] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'баъди %s', + past : '%s пеш', + s : 'якчанд сония', + m : 'як дақиқа', + mm : '%d дақиқа', + h : 'як соат', + hh : '%d соат', + d : 'як рӯз', + dd : '%d рӯз', + M : 'як моҳ', + MM : '%d моҳ', + y : 'як сол', + yy : '%d сол' + }, + 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 >= 11 ? hour : hour + 12; + } else if (meridiem === 'бегоҳ') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'шаб'; + } else if (hour < 11) { + return 'субҳ'; + } else if (hour < 16) { + return 'рӯз'; + } else if (hour < 19) { + return 'бегоҳ'; + } else { + return 'шаб'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/, + ordinal: function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes$3[number] || suffixes$3[a] || suffixes$3[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1th is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('th', { + months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'), + monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'), + monthsParseExact: true, + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.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' + }, + 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 : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY HH:mm', + LLLL : 'dddd, MMMM DD, YYYY HH:mm' + }, + calendar : { + sameDay: 'LT [ngayong araw]', + nextDay: '[Bukas ng] LT', + nextWeek: 'LT [sa susunod na] dddd', + lastDay: 'LT [kahapon]', + lastWeek: 'LT [noong nakaraang] dddd', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + ss : '%d segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + 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. + } + }); + + //! moment.js locale configuration + + var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_'); + + function translateFuture(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'leS' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'waQ' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'nem' : + time + ' pIq'; + return time; + } + + function translatePast(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'Hu’' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'wen' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'ben' : + time + ' ret'; + return time; + } + + function translate$a(number, withoutSuffix, string, isFuture) { + var numberNoun = numberAsNoun(number); + switch (string) { + case 'ss': + return numberNoun + ' lup'; + case 'mm': + return numberNoun + ' tup'; + case 'hh': + return numberNoun + ' rep'; + case 'dd': + return numberNoun + ' jaj'; + case 'MM': + return numberNoun + ' jar'; + case 'yy': + return numberNoun + ' DIS'; + } + } + + function numberAsNoun(number) { + var hundred = Math.floor((number % 1000) / 100), + ten = Math.floor((number % 100) / 10), + one = number % 10, + word = ''; + if (hundred > 0) { + word += numbersNouns[hundred] + 'vatlh'; + } + if (ten > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH'; + } + if (one > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[one]; + } + return (word === '') ? 'pagh' : word; + } + + hooks.defineLocale('tlh', { + months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'), + monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'), + monthsParseExact : true, + weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.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: '[DaHjaj] LT', + nextDay: '[wa’leS] LT', + nextWeek: 'LLL', + lastDay: '[wa’Hu’] LT', + lastWeek: 'LLL', + sameElse: 'L' + }, + relativeTime : { + future : translateFuture, + past : translatePast, + s : 'puS lup', + ss : translate$a, + m : 'wa’ tup', + mm : translate$a, + h : 'wa’ rep', + hh : translate$a, + d : 'wa’ jaj', + dd : translate$a, + M : 'wa’ jar', + MM : translate$a, + y : 'wa’ DIS', + yy : translate$a + }, + 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. + } + }); + + var suffixes$4 = { + 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ı' + }; + + hooks.defineLocale('tr', { + months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.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 : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[gelecek] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + ss : '%d saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinal: function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'Do': + case 'DD': + return number; + default: + 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$4[a] || suffixes$4[b] || suffixes$4[c]); + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals. + // This is currently too difficult (maybe even impossible) to add. + hooks.defineLocale('tzl', { + months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'), + monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'), + weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'), + weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'), + weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM [dallas] YYYY', + LLL : 'D. MMMM [dallas] YYYY HH.mm', + LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm' + }, + meridiemParse: /d\'o|d\'a/i, + isPM : function (input) { + return 'd\'o' === input.toLowerCase(); + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'd\'o' : 'D\'O'; + } else { + return isLower ? 'd\'a' : 'D\'A'; + } + }, + calendar : { + sameDay : '[oxhi à] LT', + nextDay : '[demà à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[ieiri à] LT', + lastWeek : '[sür el] dddd [lasteu à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'osprei %s', + past : 'ja%s', + s : processRelativeTime$7, + ss : processRelativeTime$7, + m : processRelativeTime$7, + mm : processRelativeTime$7, + h : processRelativeTime$7, + hh : processRelativeTime$7, + d : processRelativeTime$7, + dd : processRelativeTime$7, + M : processRelativeTime$7, + MM : processRelativeTime$7, + y : processRelativeTime$7, + yy : processRelativeTime$7 + }, + 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. + } + }); + + function processRelativeTime$7(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['viensas secunds', '\'iensas secunds'], + 'ss': [number + ' secunds', '' + number + ' secunds'], + 'm': ['\'n míut', '\'iens míut'], + 'mm': [number + ' míuts', '' + number + ' míuts'], + 'h': ['\'n þora', '\'iensa þora'], + 'hh': [number + ' þoras', '' + number + ' þoras'], + 'd': ['\'n ziua', '\'iensa ziua'], + 'dd': [number + ' ziuas', '' + number + ' ziuas'], + 'M': ['\'n mes', '\'iens mes'], + 'MM': [number + ' mesen', '' + number + ' mesen'], + 'y': ['\'n ar', '\'iens ar'], + 'yy': [number + ' ars', '' + number + ' ars'] + }; + return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]); + } + + //! moment.js locale configuration + + hooks.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.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: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + ss : '%d imik', + m : 'minuḍ', + mm : '%d minuḍ', + h : 'saɛa', + hh : '%d tassaɛin', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('tzm', { + months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + 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', + 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 oⵙⵙⴰⵏ', + M : 'ⴰⵢoⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔⵏ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙⵏ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js language configuration + + hooks.defineLocale('ug-cn', { + months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( + '_' + ), + monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( + '_' + ), + weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split( + '_' + ), + weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), + weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'YYYY-MM-DD', + LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى', + LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', + LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm' + }, + meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ( + meridiem === 'يېرىم كېچە' || + meridiem === 'سەھەر' || + meridiem === 'چۈشتىن بۇرۇن' + ) { + return hour; + } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') { + return hour + 12; + } else { + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return 'يېرىم كېچە'; + } else if (hm < 900) { + return 'سەھەر'; + } else if (hm < 1130) { + return 'چۈشتىن بۇرۇن'; + } else if (hm < 1230) { + return 'چۈش'; + } else if (hm < 1800) { + 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 يىل' + }, + + dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/, + ordinal: function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '-كۈنى'; + case 'w': + case 'W': + return number + '-ھەپتە'; + default: + return number; + } + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week: { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow: 1, // Monday is the first day of the week. + doy: 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + function plural$6(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$4(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$6(format[key], +number); + } + } + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_') + }; + + if (!m) { + return weekdays['nominative']; + } + + var nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + return weekdays[nounCase][m.day()]; + } + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + hooks.defineLocale('uk', { + months : { + 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'), + 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') + }, + monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), + weekdays : weekdaysCaseReplace, + 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: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька секунд', + ss : relativeTimeWithPlural$4, + m : relativeTimeWithPlural$4, + mm : relativeTimeWithPlural$4, + h : 'годину', + hh : relativeTimeWithPlural$4, + d : 'день', + dd : relativeTimeWithPlural$4, + M : 'місяць', + MM : relativeTimeWithPlural$4, + y : 'рік', + yy : relativeTimeWithPlural$4 + }, + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + 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 + '-й'; + 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 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + var months$8 = [ + 'جنوری', + 'فروری', + 'مارچ', + 'اپریل', + 'مئی', + 'جون', + 'جولائی', + 'اگست', + 'ستمبر', + 'اکتوبر', + 'نومبر', + 'دسمبر' + ]; + var days$2 = [ + 'اتوار', + 'پیر', + 'منگل', + 'بدھ', + 'جمعرات', + 'جمعہ', + 'ہفتہ' + ]; + + hooks.defineLocale('ur', { + months : months$8, + monthsShort : months$8, + weekdays : days$2, + weekdaysShort : days$2, + weekdaysMin : days$2, + 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 'صبح'; + } + 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 : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('uz-latn', { + months : 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'), + monthsShort : 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'), + weekdays : 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'), + weekdaysShort : 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'), + weekdaysMin : 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'D MMMM YYYY, dddd HH:mm' + }, + calendar : { + sameDay : '[Bugun soat] LT [da]', + nextDay : '[Ertaga] LT [da]', + nextWeek : 'dddd [kuni soat] LT [da]', + lastDay : '[Kecha soat] LT [da]', + lastWeek : '[O\'tgan] dddd [kuni soat] LT [da]', + sameElse : 'L' + }, + relativeTime : { + future : 'Yaqin %s ichida', + past : 'Bir necha %s oldin', + s : 'soniya', + ss : '%d soniya', + m : 'bir daqiqa', + mm : '%d daqiqa', + h : 'bir soat', + hh : '%d soat', + d : 'bir kun', + dd : '%d kun', + M : 'bir oy', + MM : '%d oy', + y : 'bir yil', + yy : '%d yil' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('uz', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + 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 : 'D MMMM YYYY, dddd 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 : 7 // The week that contains Jan 4th is the first week of the year. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + monthsParseExact : true, + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysParseExact : true, + meridiemParse: /sa|ch/i, + isPM : function (input) { + return /^ch$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'sa' : 'SA'; + } else { + return isLower ? 'ch' : 'CH'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY HH:mm', + LLLL : 'dddd, D MMMM [năm] YYYY HH:mm', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tới lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tới', + past : '%s trước', + s : 'vài giây', + ss : '%d giây' , + m : 'một phút', + mm : '%d phút', + h : 'một giờ', + hh : '%d giờ', + d : 'một ngày', + dd : '%d ngày', + M : 'một tháng', + MM : '%d tháng', + y : 'một năm', + yy : '%d năm' + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('x-pseudo', { + months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'), + monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'), + monthsParseExact : true, + weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'), + weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'), + weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[T~ódá~ý át] LT', + nextDay : '[T~ómó~rró~w át] LT', + nextWeek : 'dddd [át] LT', + lastDay : '[Ý~ést~érdá~ý át] LT', + lastWeek : '[L~ást] dddd [át] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'í~ñ %s', + past : '%s á~gó', + s : 'á ~féw ~sécó~ñds', + ss : '%d s~écóñ~ds', + m : 'á ~míñ~úté', + mm : '%d m~íñú~tés', + h : 'á~ñ hó~úr', + hh : '%d h~óúrs', + d : 'á ~dáý', + dd : '%d d~áýs', + M : 'á ~móñ~th', + MM : '%d m~óñt~hs', + y : 'á ~ýéár', + yy : '%d ý~éárs' + }, + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('yo', { + months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'), + monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'), + weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'), + weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'), + weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.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 : '[Ònì ni] LT', + nextDay : '[Ọ̀la ni] LT', + nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', + lastDay : '[Àna ni] LT', + lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ní %s', + past : '%s kọjá', + s : 'ìsẹjú aayá die', + ss :'aayá %d', + m : 'ìsẹjú kan', + mm : 'ìsẹjú %d', + h : 'wákati kan', + hh : 'wákati %d', + d : 'ọjọ́ kan', + dd : 'ọjọ́ %d', + M : 'osù kan', + MM : 'osù %d', + y : 'ọdún kan', + yy : 'ọdún %d' + }, + dayOfMonthOrdinalParse : /ọjọ́\s\d{1,2}/, + ordinal : 'ọjọ́ %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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日Ah点mm分', + LLLL : 'YYYY年M月D日ddddAh点mm分', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上午') { + return hour; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } else { + // '中午' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%s前', + s : '几秒', + ss : '%d 秒', + m : '1 分钟', + mm : '%d 分钟', + h : '1 小时', + hh : '%d 小时', + d : '1 天', + dd : '%d 天', + M : '1 个月', + MM : '%d 个月', + y : '1 年', + yy : '%d 年' + }, + week : { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + 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. + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('zh-hk', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日dddd HH:mm', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + ss : '%d 秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' + } + }); + + //! moment.js locale configuration + + hooks.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日dddd HH:mm', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天] LT', + nextDay : '[明天] LT', + nextWeek : '[下]dddd LT', + lastDay : '[昨天] LT', + lastWeek : '[上]dddd LT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + ss : '%d 秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' + } + }); + + hooks.locale('en'); + + return hooks; + +}))); diff --git a/nodejs/node_modules/moment/min/moment-with-locales.min.js b/nodejs/node_modules/moment/min/moment-with-locales.min.js new file mode 100755 index 0000000..e7320a7 --- /dev/null +++ b/nodejs/node_modules/moment/min/moment-with-locales.min.js @@ -0,0 +1 @@ +!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a():"function"==typeof define&&define.amd?define(a):e.moment=a()}(this,function(){"use strict";var e,n;function l(){return e.apply(null,arguments)}function _(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function i(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function o(e){return void 0===e}function m(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function u(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function M(e,a){var t,s=[];for(t=0;t>>0,s=0;sTe(e)?(d=e+1,r=_-Te(e)):(d=e,r=_),{year:d,dayOfYear:r}}function Ie(e,a,t){var s,n,d=Ne(e.year(),a,t),r=Math.floor((e.dayOfYear()-d-1)/7)+1;return r<1?s=r+Ce(n=e.year()-1,a,t):r>Ce(e.year(),a,t)?(s=r-Ce(e.year(),a,t),n=e.year()+1):(n=e.year(),s=r),{week:s,year:n}}function Ce(e,a,t){var s=Ne(e,a,t),n=Ne(e+1,a,t);return(Te(e)-s+n)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),P("week","w"),P("isoWeek","W"),A("week",5),A("isoWeek",5),ie("w",B),ie("ww",B,V),ie("W",B),ie("WW",B,V),Me(["w","ww","W","WW"],function(e,a,t,s){a[s.substr(0,1)]=g(e)});I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),P("day","d"),P("weekday","e"),P("isoWeekday","E"),A("day",11),A("weekday",11),A("isoWeekday",11),ie("d",B),ie("e",B),ie("E",B),ie("dd",function(e,a){return a.weekdaysMinRegex(e)}),ie("ddd",function(e,a){return a.weekdaysShortRegex(e)}),ie("dddd",function(e,a){return a.weekdaysRegex(e)}),Me(["dd","ddd","dddd"],function(e,a,t,s){var n=t._locale.weekdaysParse(e,s,t._strict);null!=n?a.d=n:Y(t).invalidWeekday=e}),Me(["d","e","E"],function(e,a,t,s){a[s]=g(e)});var Ge="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var Ue="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var Ve="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var Ke=re;var $e=re;var Ze=re;function Be(){function e(e,a){return a.length-e.length}var a,t,s,n,d,r=[],_=[],i=[],o=[];for(a=0;a<7;a++)t=c([2e3,1]).day(a),s=this.weekdaysMin(t,""),n=this.weekdaysShort(t,""),d=this.weekdays(t,""),r.push(s),_.push(n),i.push(d),o.push(s),o.push(n),o.push(d);for(r.sort(e),_.sort(e),i.sort(e),o.sort(e),a=0;a<7;a++)_[a]=me(_[a]),i[a]=me(i[a]),o[a]=me(o[a]);this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+_.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function qe(){return this.hours()%12||12}function Qe(e,a){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),a)})}function Xe(e,a){return a._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,qe),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+qe.apply(this)+F(this.minutes(),2)}),I("hmmss",0,0,function(){return""+qe.apply(this)+F(this.minutes(),2)+F(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+F(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+F(this.minutes(),2)+F(this.seconds(),2)}),Qe("a",!0),Qe("A",!1),P("hour","h"),A("hour",13),ie("a",Xe),ie("A",Xe),ie("H",B),ie("h",B),ie("k",B),ie("HH",B,V),ie("hh",B,V),ie("kk",B,V),ie("hmm",q),ie("hmmss",Q),ie("Hmm",q),ie("Hmmss",Q),le(["H","HH"],Ye),le(["k","kk"],function(e,a,t){var s=g(e);a[Ye]=24===s?0:s}),le(["a","A"],function(e,a,t){t._isPm=t._locale.isPM(e),t._meridiem=e}),le(["h","hh"],function(e,a,t){a[Ye]=g(e),Y(t).bigHour=!0}),le("hmm",function(e,a,t){var s=e.length-2;a[Ye]=g(e.substr(0,s)),a[ye]=g(e.substr(s)),Y(t).bigHour=!0}),le("hmmss",function(e,a,t){var s=e.length-4,n=e.length-2;a[Ye]=g(e.substr(0,s)),a[ye]=g(e.substr(s,2)),a[fe]=g(e.substr(n)),Y(t).bigHour=!0}),le("Hmm",function(e,a,t){var s=e.length-2;a[Ye]=g(e.substr(0,s)),a[ye]=g(e.substr(s))}),le("Hmmss",function(e,a,t){var s=e.length-4,n=e.length-2;a[Ye]=g(e.substr(0,s)),a[ye]=g(e.substr(s,2)),a[fe]=g(e.substr(n))});var ea,aa=Se("Hours",!0),ta={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,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"},months:Pe,monthsShort:Oe,week:{dow:0,doy:6},weekdays:Ge,weekdaysMin:Ve,weekdaysShort:Ue,meridiemParse:/[ap]\.?m?\.?/i},sa={},na={};function da(e){return e?e.toLowerCase().replace("_","-"):e}function ra(e){var a=null;if(!sa[e]&&"undefined"!=typeof module&&module&&module.exports)try{a=ea._abbr,require("./locale/"+e),_a(a)}catch(e){}return sa[e]}function _a(e,a){var t;return e&&((t=o(a)?oa(e):ia(e,a))?ea=t:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),ea._abbr}function ia(e,a){if(null!==a){var t,s=ta;if(a.abbr=e,null!=sa[e])S("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=sa[e]._config;else if(null!=a.parentLocale)if(null!=sa[a.parentLocale])s=sa[a.parentLocale]._config;else{if(null==(t=ra(a.parentLocale)))return na[a.parentLocale]||(na[a.parentLocale]=[]),na[a.parentLocale].push({name:e,config:a}),null;s=t._config}return sa[e]=new j(b(s,a)),na[e]&&na[e].forEach(function(e){ia(e.name,e.config)}),_a(e),sa[e]}return delete sa[e],null}function oa(e){var a;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return ea;if(!_(e)){if(a=ra(e))return a;e=[e]}return function(e){for(var a,t,s,n,d=0;d=a&&r(n,t,!0)>=a-1)break;a--}d++}return ea}(e)}function ma(e){var a,t=e._a;return t&&-2===Y(e).overflow&&(a=t[Le]<0||11je(t[he],t[Le])?ce:t[Ye]<0||24Ce(t,d,r)?Y(e)._overflowWeeks=!0:null!=i?Y(e)._overflowWeekday=!0:(_=Re(t,s,n,d,r),e._a[he]=_.year,e._dayOfYear=_.dayOfYear)}(e),null!=e._dayOfYear&&(d=ua(e._a[he],s[he]),(e._dayOfYear>Te(d)||0===e._dayOfYear)&&(Y(e)._overflowDayOfYear=!0),t=Je(d,0,e._dayOfYear),e._a[Le]=t.getUTCMonth(),e._a[ce]=t.getUTCDate()),a=0;a<3&&null==e._a[a];++a)e._a[a]=r[a]=s[a];for(;a<7;a++)e._a[a]=r[a]=null==e._a[a]?2===a?1:0:e._a[a];24===e._a[Ye]&&0===e._a[ye]&&0===e._a[fe]&&0===e._a[ke]&&(e._nextDay=!0,e._a[Ye]=0),e._d=(e._useUTC?Je:function(e,a,t,s,n,d,r){var _=new Date(e,a,t,s,n,d,r);return e<100&&0<=e&&isFinite(_.getFullYear())&&_.setFullYear(e),_}).apply(null,r),n=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[Ye]=24),e._w&&void 0!==e._w.d&&e._w.d!==n&&(Y(e).weekdayMismatch=!0)}}var Ma=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ha=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,La=/Z|[+-]\d\d(?::?\d\d)?/,ca=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Ya=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],ya=/^\/?Date\((\-?\d+)/i;function fa(e){var a,t,s,n,d,r,_=e._i,i=Ma.exec(_)||ha.exec(_);if(i){for(Y(e).iso=!0,a=0,t=ca.length;at.valueOf():t.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},it.isLocal=function(){return!!this.isValid()&&!this._isUTC},it.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},it.isUtc=Na,it.isUTC=Na,it.zoneAbbr=function(){return this._isUTC?"UTC":""},it.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},it.dates=t("dates accessor is deprecated. Use date instead.",tt),it.months=t("months accessor is deprecated. Use month instead",Ee),it.years=t("years accessor is deprecated. Use year instead",ve),it.zone=t("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,a){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,a),this):-this.utcOffset()}),it.isDSTShifted=t("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!o(this._isDSTShifted))return this._isDSTShifted;var e={};if(k(e,this),(e=wa(e))._a){var a=e._isUTC?c(e._a):Sa(e._a);this._isDSTShifted=this.isValid()&&0>>0,s=0;sDe(e)?(r=e+1,a=o-De(e)):(r=e,a=o),{year:r,dayOfYear:a}}function Ie(e,t,n){var s,i,r=Ve(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+Ae(i=e.year()-1,t,n):a>Ae(e.year(),t,n)?(s=a-Ae(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function Ae(e,t,n){var s=Ve(e,t,n),i=Ve(e+1,t,n);return(De(e)-s+i)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),H("week","w"),H("isoWeek","W"),L("week",5),L("isoWeek",5),ue("w",B),ue("ww",B,z),ue("W",B),ue("WW",B,z),fe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=k(e)});I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),H("day","d"),H("weekday","e"),H("isoWeekday","E"),L("day",11),L("weekday",11),L("isoWeekday",11),ue("d",B),ue("e",B),ue("E",B),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:g(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,s){t[s]=k(e)});var je="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var Ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var $e=ae;var qe=ae;var Je=ae;function Be(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=y([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=de(o[t]),u[t]=de(u[t]),l[t]=de(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Qe(){return this.hours()%12||12}function Xe(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Ke(e,t){return t._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,Qe),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)}),I("hmmss",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)+U(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+U(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+U(this.minutes(),2)+U(this.seconds(),2)}),Xe("a",!0),Xe("A",!1),H("hour","h"),L("hour",13),ue("a",Ke),ue("A",Ke),ue("H",B),ue("h",B),ue("k",B),ue("HH",B,z),ue("hh",B,z),ue("kk",B,z),ue("hmm",Q),ue("hmmss",X),ue("Hmm",Q),ue("Hmmss",X),ce(["H","HH"],ge),ce(["k","kk"],function(e,t,n){var s=k(e);t[ge]=24===s?0:s}),ce(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ce(["h","hh"],function(e,t,n){t[ge]=k(e),g(n).bigHour=!0}),ce("hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s)),g(n).bigHour=!0}),ce("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i)),g(n).bigHour=!0}),ce("Hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s))}),ce("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i))});var et,tt=Te("Hours",!0),nt={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,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"},months:He,monthsShort:Re,week:{dow:0,doy:6},weekdays:je,weekdaysMin:ze,weekdaysShort:Ze,meridiemParse:/[ap]\.?m?\.?/i},st={},it={};function rt(e){return e?e.toLowerCase().replace("_","-"):e}function at(e){var t=null;if(!st[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=et._abbr,require("./locale/"+e),ot(t)}catch(e){}return st[e]}function ot(e,t){var n;return e&&((n=l(t)?lt(e):ut(e,t))?et=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),et._abbr}function ut(e,t){if(null!==t){var n,s=nt;if(t.abbr=e,null!=st[e])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=st[e]._config;else if(null!=t.parentLocale)if(null!=st[t.parentLocale])s=st[t.parentLocale]._config;else{if(null==(n=at(t.parentLocale)))return it[t.parentLocale]||(it[t.parentLocale]=[]),it[t.parentLocale].push({name:e,config:t}),null;s=n._config}return st[e]=new P(b(s,t)),it[e]&&it[e].forEach(function(e){ut(e.name,e.config)}),ot(e),st[e]}return delete st[e],null}function lt(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return et;if(!o(e)){if(t=at(e))return t;e=[e]}return function(e){for(var t,n,s,i,r=0;r=t&&a(i,n,!0)>=t-1)break;t--}r++}return et}(e)}function dt(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[_e]<0||11Pe(n[me],n[_e])?ye:n[ge]<0||24Ae(n,r,a)?g(e)._overflowWeeks=!0:null!=u?g(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[me]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=ht(e._a[me],s[me]),(e._dayOfYear>De(r)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Ge(r,0,e._dayOfYear),e._a[_e]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=s[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ge]&&0===e._a[pe]&&0===e._a[ve]&&0===e._a[we]&&(e._nextDay=!0,e._a[ge]=0),e._d=(e._useUTC?Ge:function(e,t,n,s,i,r,a){var o=new Date(e,t,n,s,i,r,a);return e<100&&0<=e&&isFinite(o.getFullYear())&&o.setFullYear(e),o}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ge]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(g(e).weekdayMismatch=!0)}}var ft=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,mt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_t=/Z|[+-]\d\d(?::?\d\d)?/,yt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],gt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],pt=/^\/?Date\((\-?\d+)/i;function vt(e){var t,n,s,i,r,a,o=e._i,u=ft.exec(o)||mt.exec(o);if(u){for(g(e).iso=!0,t=0,n=yt.length;tn.valueOf():n.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},ln.isLocal=function(){return!!this.isValid()&&!this._isUTC},ln.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},ln.isUtc=Vt,ln.isUTC=Vt,ln.zoneAbbr=function(){return this._isUTC?"UTC":""},ln.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},ln.dates=n("dates accessor is deprecated. Use date instead.",nn),ln.months=n("months accessor is deprecated. Use month instead",Fe),ln.years=n("years accessor is deprecated. Use year instead",Oe),ln.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),ln.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={};if(w(e,this),(e=Yt(e))._a){var t=e._isUTC?y(e._a):Tt(e._a);this._isDSTShifted=this.isValid()&&0 string); + interface CalendarSpec { + sameDay?: CalendarSpecVal; + nextDay?: CalendarSpecVal; + lastDay?: CalendarSpecVal; + nextWeek?: CalendarSpecVal; + lastWeek?: CalendarSpecVal; + sameElse?: CalendarSpecVal; + + // any additional properties might be used with moment.calendarFormat + [x: string]: CalendarSpecVal | void; // undefined + } + + type RelativeTimeSpecVal = ( + string | + ((n: number, withoutSuffix: boolean, + key: RelativeTimeKey, isFuture: boolean) => string) + ); + type RelativeTimeFuturePastVal = string | ((relTime: string) => string); + + interface RelativeTimeSpec { + future: RelativeTimeFuturePastVal; + past: RelativeTimeFuturePastVal; + s: RelativeTimeSpecVal; + ss: RelativeTimeSpecVal; + m: RelativeTimeSpecVal; + mm: RelativeTimeSpecVal; + h: RelativeTimeSpecVal; + hh: RelativeTimeSpecVal; + d: RelativeTimeSpecVal; + dd: RelativeTimeSpecVal; + M: RelativeTimeSpecVal; + MM: RelativeTimeSpecVal; + y: RelativeTimeSpecVal; + yy: RelativeTimeSpecVal; + } + + interface LongDateFormatSpec { + LTS: string; + LT: string; + L: string; + LL: string; + LLL: string; + LLLL: string; + + // lets forget for a sec that any upper/lower permutation will also work + lts?: string; + lt?: string; + l?: string; + ll?: string; + lll?: string; + llll?: string; + } + + type MonthWeekdayFn = (momentToFormat: Moment, format?: string) => string; + type WeekdaySimpleFn = (momentToFormat: Moment) => string; + + interface LocaleSpecification { + months?: string[] | StandaloneFormatSpec | MonthWeekdayFn; + monthsShort?: string[] | StandaloneFormatSpec | MonthWeekdayFn; + + weekdays?: string[] | StandaloneFormatSpec | MonthWeekdayFn; + weekdaysShort?: string[] | StandaloneFormatSpec | WeekdaySimpleFn; + weekdaysMin?: string[] | StandaloneFormatSpec | WeekdaySimpleFn; + + meridiemParse?: RegExp; + meridiem?: (hour: number, minute:number, isLower: boolean) => string; + + isPM?: (input: string) => boolean; + + longDateFormat?: LongDateFormatSpec; + calendar?: CalendarSpec; + relativeTime?: RelativeTimeSpec; + invalidDate?: string; + ordinal?: (n: number) => string; + ordinalParse?: RegExp; + + week?: WeekSpec; + + // Allow anything: in general any property that is passed as locale spec is + // put in the locale object so it can be used by locale functions + [x: string]: any; + } + + interface MomentObjectOutput { + years: number; + /* One digit */ + months: number; + /* Day of the month */ + date: number; + hours: number; + minutes: number; + seconds: number; + milliseconds: number; + } + + interface Duration { + clone(): Duration; + + humanize(withSuffix?: boolean): string; + + abs(): Duration; + + as(units: unitOfTime.Base): number; + get(units: unitOfTime.Base): number; + + milliseconds(): number; + asMilliseconds(): number; + + seconds(): number; + asSeconds(): number; + + minutes(): number; + asMinutes(): number; + + hours(): number; + asHours(): number; + + days(): number; + asDays(): number; + + weeks(): number; + asWeeks(): number; + + months(): number; + asMonths(): number; + + years(): number; + asYears(): number; + + add(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration; + subtract(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration; + + locale(): string; + locale(locale: LocaleSpecifier): Duration; + localeData(): Locale; + + toISOString(): string; + toJSON(): string; + + /** + * @deprecated since version 2.8.0 + */ + lang(locale: LocaleSpecifier): Moment; + /** + * @deprecated since version 2.8.0 + */ + lang(): Locale; + /** + * @deprecated + */ + toIsoString(): string; + } + + interface MomentRelativeTime { + future: any; + past: any; + s: any; + ss: any; + m: any; + mm: any; + h: any; + hh: any; + d: any; + dd: any; + M: any; + MM: any; + y: any; + yy: any; + } + + interface MomentLongDateFormat { + L: string; + LL: string; + LLL: string; + LLLL: string; + LT: string; + LTS: string; + + l?: string; + ll?: string; + lll?: string; + llll?: string; + lt?: string; + lts?: string; + } + + interface MomentParsingFlags { + empty: boolean; + unusedTokens: string[]; + unusedInput: string[]; + overflow: number; + charsLeftOver: number; + nullInput: boolean; + invalidMonth: string | void; // null + invalidFormat: boolean; + userInvalidated: boolean; + iso: boolean; + parsedDateParts: any[]; + meridiem: string | void; // null + } + + interface MomentParsingFlagsOpt { + empty?: boolean; + unusedTokens?: string[]; + unusedInput?: string[]; + overflow?: number; + charsLeftOver?: number; + nullInput?: boolean; + invalidMonth?: string; + invalidFormat?: boolean; + userInvalidated?: boolean; + iso?: boolean; + parsedDateParts?: any[]; + meridiem?: string; + } + + interface MomentBuiltinFormat { + __momentBuiltinFormatBrand: any; + } + + type MomentFormatSpecification = string | MomentBuiltinFormat | (string | MomentBuiltinFormat)[]; + + namespace unitOfTime { + type Base = ( + "year" | "years" | "y" | + "month" | "months" | "M" | + "week" | "weeks" | "w" | + "day" | "days" | "d" | + "hour" | "hours" | "h" | + "minute" | "minutes" | "m" | + "second" | "seconds" | "s" | + "millisecond" | "milliseconds" | "ms" + ); + + type _quarter = "quarter" | "quarters" | "Q"; + type _isoWeek = "isoWeek" | "isoWeeks" | "W"; + type _date = "date" | "dates" | "D"; + type DurationConstructor = Base | _quarter; + + type DurationAs = Base; + + type StartOf = Base | _quarter | _isoWeek | _date; + + type Diff = Base | _quarter; + + type MomentConstructor = Base | _date; + + type All = Base | _quarter | _isoWeek | _date | + "weekYear" | "weekYears" | "gg" | + "isoWeekYear" | "isoWeekYears" | "GG" | + "dayOfYear" | "dayOfYears" | "DDD" | + "weekday" | "weekdays" | "e" | + "isoWeekday" | "isoWeekdays" | "E"; + } + + interface MomentInputObject { + years?: number; + year?: number; + y?: number; + + months?: number; + month?: number; + M?: number; + + days?: number; + day?: number; + d?: number; + + dates?: number; + date?: number; + D?: number; + + hours?: number; + hour?: number; + h?: number; + + minutes?: number; + minute?: number; + m?: number; + + seconds?: number; + second?: number; + s?: number; + + milliseconds?: number; + millisecond?: number; + ms?: number; + } + + interface DurationInputObject extends MomentInputObject { + quarters?: number; + quarter?: number; + Q?: number; + + weeks?: number; + week?: number; + w?: number; + } + + interface MomentSetObject extends MomentInputObject { + weekYears?: number; + weekYear?: number; + gg?: number; + + isoWeekYears?: number; + isoWeekYear?: number; + GG?: number; + + quarters?: number; + quarter?: number; + Q?: number; + + weeks?: number; + week?: number; + w?: number; + + isoWeeks?: number; + isoWeek?: number; + W?: number; + + dayOfYears?: number; + dayOfYear?: number; + DDD?: number; + + weekdays?: number; + weekday?: number; + e?: number; + + isoWeekdays?: number; + isoWeekday?: number; + E?: number; + } + + interface FromTo { + from: MomentInput; + to: MomentInput; + } + + type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined + type DurationInputArg1 = Duration | number | string | FromTo | DurationInputObject | void; // null | undefined + type DurationInputArg2 = unitOfTime.DurationConstructor; + type LocaleSpecifier = string | Moment | Duration | string[] | boolean; + + interface MomentCreationData { + input: MomentInput; + format?: MomentFormatSpecification; + locale: Locale; + isUTC: boolean; + strict?: boolean; + } + + interface Moment extends Object { + format(format?: string): string; + + startOf(unitOfTime: unitOfTime.StartOf): Moment; + endOf(unitOfTime: unitOfTime.StartOf): Moment; + + add(amount?: DurationInputArg1, unit?: DurationInputArg2): Moment; + /** + * @deprecated reverse syntax + */ + add(unit: unitOfTime.DurationConstructor, amount: number|string): Moment; + + subtract(amount?: DurationInputArg1, unit?: DurationInputArg2): Moment; + /** + * @deprecated reverse syntax + */ + subtract(unit: unitOfTime.DurationConstructor, amount: number|string): Moment; + + calendar(time?: MomentInput, formats?: CalendarSpec): string; + + clone(): Moment; + + /** + * @return Unix timestamp in milliseconds + */ + valueOf(): number; + + // current date/time in local mode + local(keepLocalTime?: boolean): Moment; + isLocal(): boolean; + + // current date/time in UTC mode + utc(keepLocalTime?: boolean): Moment; + isUTC(): boolean; + /** + * @deprecated use isUTC + */ + isUtc(): boolean; + + parseZone(): Moment; + isValid(): boolean; + invalidAt(): number; + + hasAlignedHourOffset(other?: MomentInput): boolean; + + creationData(): MomentCreationData; + parsingFlags(): MomentParsingFlags; + + year(y: number): Moment; + year(): number; + /** + * @deprecated use year(y) + */ + years(y: number): Moment; + /** + * @deprecated use year() + */ + years(): number; + quarter(): number; + quarter(q: number): Moment; + quarters(): number; + quarters(q: number): Moment; + month(M: number|string): Moment; + month(): number; + /** + * @deprecated use month(M) + */ + months(M: number|string): Moment; + /** + * @deprecated use month() + */ + months(): number; + day(d: number|string): Moment; + day(): number; + days(d: number|string): Moment; + days(): number; + date(d: number): Moment; + date(): number; + /** + * @deprecated use date(d) + */ + dates(d: number): Moment; + /** + * @deprecated use date() + */ + dates(): number; + hour(h: number): Moment; + hour(): number; + hours(h: number): Moment; + hours(): number; + minute(m: number): Moment; + minute(): number; + minutes(m: number): Moment; + minutes(): number; + second(s: number): Moment; + second(): number; + seconds(s: number): Moment; + seconds(): number; + millisecond(ms: number): Moment; + millisecond(): number; + milliseconds(ms: number): Moment; + milliseconds(): number; + weekday(): number; + weekday(d: number): Moment; + isoWeekday(): number; + isoWeekday(d: number|string): Moment; + weekYear(): number; + weekYear(d: number): Moment; + isoWeekYear(): number; + isoWeekYear(d: number): Moment; + week(): number; + week(d: number): Moment; + weeks(): number; + weeks(d: number): Moment; + isoWeek(): number; + isoWeek(d: number): Moment; + isoWeeks(): number; + isoWeeks(d: number): Moment; + weeksInYear(): number; + isoWeeksInYear(): number; + dayOfYear(): number; + dayOfYear(d: number): Moment; + + from(inp: MomentInput, suffix?: boolean): string; + to(inp: MomentInput, suffix?: boolean): string; + fromNow(withoutSuffix?: boolean): string; + toNow(withoutPrefix?: boolean): string; + + diff(b: MomentInput, unitOfTime?: unitOfTime.Diff, precise?: boolean): number; + + toArray(): number[]; + toDate(): Date; + toISOString(keepOffset?: boolean): string; + inspect(): string; + toJSON(): string; + unix(): number; + + isLeapYear(): boolean; + /** + * @deprecated in favor of utcOffset + */ + zone(): number; + zone(b: number|string): Moment; + utcOffset(): number; + utcOffset(b: number|string, keepLocalTime?: boolean): Moment; + isUtcOffset(): boolean; + daysInMonth(): number; + isDST(): boolean; + + zoneAbbr(): string; + zoneName(): string; + + isBefore(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean; + isAfter(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean; + isSame(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean; + isSameOrAfter(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean; + isSameOrBefore(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean; + isBetween(a: MomentInput, b: MomentInput, granularity?: unitOfTime.StartOf, inclusivity?: "()" | "[)" | "(]" | "[]"): boolean; + + /** + * @deprecated as of 2.8.0, use locale + */ + lang(language: LocaleSpecifier): Moment; + /** + * @deprecated as of 2.8.0, use locale + */ + lang(): Locale; + + locale(): string; + locale(locale: LocaleSpecifier): Moment; + + localeData(): Locale; + + /** + * @deprecated no reliable implementation + */ + isDSTShifted(): boolean; + + // NOTE(constructor): Same as moment constructor + /** + * @deprecated as of 2.7.0, use moment.min/max + */ + max(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment; + /** + * @deprecated as of 2.7.0, use moment.min/max + */ + max(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment; + + // NOTE(constructor): Same as moment constructor + /** + * @deprecated as of 2.7.0, use moment.min/max + */ + min(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment; + /** + * @deprecated as of 2.7.0, use moment.min/max + */ + min(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment; + + get(unit: unitOfTime.All): number; + set(unit: unitOfTime.All, value: number): Moment; + set(objectLiteral: MomentSetObject): Moment; + + toObject(): MomentObjectOutput; + } + + export var version: string; + export var fn: Moment; + + // NOTE(constructor): Same as moment constructor + export function utc(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment; + export function utc(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment; + + export function unix(timestamp: number): Moment; + + export function invalid(flags?: MomentParsingFlagsOpt): Moment; + export function isMoment(m: any): m is Moment; + export function isDate(m: any): m is Date; + export function isDuration(d: any): d is Duration; + + /** + * @deprecated in 2.8.0 + */ + export function lang(language?: string): string; + /** + * @deprecated in 2.8.0 + */ + export function lang(language?: string, definition?: Locale): string; + + export function locale(language?: string): string; + export function locale(language?: string[]): string; + export function locale(language?: string, definition?: LocaleSpecification | void): string; // null | undefined + + export function localeData(key?: string | string[]): Locale; + + export function duration(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration; + + // NOTE(constructor): Same as moment constructor + export function parseZone(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment; + export function parseZone(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment; + + export function months(): string[]; + export function months(index: number): string; + export function months(format: string): string[]; + export function months(format: string, index: number): string; + export function monthsShort(): string[]; + export function monthsShort(index: number): string; + export function monthsShort(format: string): string[]; + export function monthsShort(format: string, index: number): string; + + export function weekdays(): string[]; + export function weekdays(index: number): string; + export function weekdays(format: string): string[]; + export function weekdays(format: string, index: number): string; + export function weekdays(localeSorted: boolean): string[]; + export function weekdays(localeSorted: boolean, index: number): string; + export function weekdays(localeSorted: boolean, format: string): string[]; + export function weekdays(localeSorted: boolean, format: string, index: number): string; + export function weekdaysShort(): string[]; + export function weekdaysShort(index: number): string; + export function weekdaysShort(format: string): string[]; + export function weekdaysShort(format: string, index: number): string; + export function weekdaysShort(localeSorted: boolean): string[]; + export function weekdaysShort(localeSorted: boolean, index: number): string; + export function weekdaysShort(localeSorted: boolean, format: string): string[]; + export function weekdaysShort(localeSorted: boolean, format: string, index: number): string; + export function weekdaysMin(): string[]; + export function weekdaysMin(index: number): string; + export function weekdaysMin(format: string): string[]; + export function weekdaysMin(format: string, index: number): string; + export function weekdaysMin(localeSorted: boolean): string[]; + export function weekdaysMin(localeSorted: boolean, index: number): string; + export function weekdaysMin(localeSorted: boolean, format: string): string[]; + export function weekdaysMin(localeSorted: boolean, format: string, index: number): string; + + export function min(moments: Moment[]): Moment; + export function min(...moments: Moment[]): Moment; + export function max(moments: Moment[]): Moment; + export function max(...moments: Moment[]): Moment; + + /** + * Returns unix time in milliseconds. Overwrite for profit. + */ + export function now(): number; + + export function defineLocale(language: string, localeSpec: LocaleSpecification | void): Locale; // null + export function updateLocale(language: string, localeSpec: LocaleSpecification | void): Locale; // null + + export function locales(): string[]; + + export function normalizeUnits(unit: unitOfTime.All): string; + export function relativeTimeThreshold(threshold: string): number | boolean; + export function relativeTimeThreshold(threshold: string, limit: number): boolean; + export function relativeTimeRounding(fn: (num: number) => number): boolean; + export function relativeTimeRounding(): (num: number) => number; + export function calendarFormat(m: Moment, now: Moment): string; + + export function parseTwoDigitYear(input: string): number; + + /** + * Constant used to enable explicit ISO_8601 format parsing. + */ + export var ISO_8601: MomentBuiltinFormat; + export var RFC_2822: MomentBuiltinFormat; + + export var defaultFormat: string; + export var defaultFormatUtc: string; + + export var HTML5_FMT: { + DATETIME_LOCAL: string, + DATETIME_LOCAL_SECONDS: string, + DATETIME_LOCAL_MS: string, + DATE: string, + TIME: string, + TIME_SECONDS: string, + TIME_MS: string, + WEEK: string, + MONTH: string + }; + +} + +export = moment; diff --git a/nodejs/node_modules/moment/moment.js b/nodejs/node_modules/moment/moment.js new file mode 100755 index 0000000..1c18684 --- /dev/null +++ b/nodejs/node_modules/moment/moment.js @@ -0,0 +1,4506 @@ +//! moment.js + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.moment = factory() +}(this, (function () { 'use strict'; + + var hookCallback; + + function hooks () { + return hookCallback.apply(null, arguments); + } + + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback (callback) { + hookCallback = callback; + } + + function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; + } + + function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return input != null && Object.prototype.toString.call(input) === '[object Object]'; + } + + function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return (Object.getOwnPropertyNames(obj).length === 0); + } else { + var k; + for (k in obj) { + if (obj.hasOwnProperty(k)) { + return false; + } + } + return true; + } + } + + function isUndefined(input) { + return input === void 0; + } + + function isNumber(input) { + return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; + } + + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } + + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false, + parsedDateParts : [], + meridiem : null, + rfc2822 : false, + weekdayMismatch : false + }; + } + + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } + + var some; + if (Array.prototype.some) { + some = Array.prototype.some; + } else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; + + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } + + return false; + }; + } + + function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + var isNowValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); + + if (m._strict) { + isNowValid = isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } + else { + return isNowValid; + } + } + return m._isValid; + } + + function createInvalid (flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } + + return m; + } + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + var momentProperties = hooks.momentProperties = []; + + function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i = 0; i < momentProperties.length; i++) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } + + return to; + } + + var updateInProgress = false; + + // Moment prototype object + function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = new Date(NaN); + } + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } + } + + function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + } + + function absFloor (number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + + return value; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function warn(msg) { + if (hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = []; + var arg; + for (var i = 0; i < arguments.length; i++) { + arg = ''; + if (typeof arguments[i] === 'object') { + arg += '\n[' + i + '] '; + for (var key in arguments[0]) { + arg += key + ': ' + arguments[0][key] + ', '; + } + arg = arg.slice(0, -2); // Remove trailing comma and space + } else { + arg = arguments[i]; + } + args.push(arg); + } + warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + var deprecations = {}; + + function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } + + hooks.suppressDeprecationWarnings = false; + hooks.deprecationHandler = null; + + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } + + function set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. + // TODO: Remove "ordinalParse" fallback in next major release. + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + + '|' + (/\d{1,2}/).source); + } + + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop])) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; + } + + function Locale(config) { + if (config != null) { + this.set(config); + } + } + + var keys; + + if (Object.keys) { + keys = Object.keys; + } else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; + } + + var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }; + + function calendar (key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; + } + + var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }; + + function longDateFormat (key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; + } + + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + + return this._longDateFormat[key]; + } + + var defaultInvalidDate = 'Invalid date'; + + function invalidDate () { + return this._invalidDate; + } + + var defaultOrdinal = '%d'; + var defaultDayOfMonthOrdinalParse = /\d{1,2}/; + + function ordinal (number) { + return this._ordinal.replace('%d', number); + } + + var defaultRelativeTime = { + 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' + }; + + function relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + } + + function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); + } + + var aliases = {}; + + function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + } + + function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + var priorities = {}; + + function addUnitPriority(unit, priority) { + priorities[unit] = priority; + } + + function getPrioritizedUnits(unitsObj) { + var units = []; + for (var u in unitsObj) { + units.push({unit: u, priority: priorities[u]}); + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; + } + + function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + } + + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + + var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + + var formatFunctions = {}; + + var formatTokenFunctions = {}; + + // token: 'M' + // padded: ['MM', 2] + // ordinal: 'Mo' + // callback: function () { this.month() + 1 } + function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } + } + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = '', i; + for (i = 0; i < length; i++) { + output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + var match1 = /\d/; // 0 - 9 + var match2 = /\d\d/; // 00 - 99 + var match3 = /\d{3}/; // 000 - 999 + var match4 = /\d{4}/; // 0000 - 9999 + var match6 = /[+-]?\d{6}/; // -999999 - 999999 + var match1to2 = /\d\d?/; // 0 - 99 + var match3to4 = /\d\d\d\d?/; // 999 - 9999 + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 + var match1to3 = /\d{1,3}/; // 0 - 999 + var match1to4 = /\d{1,4}/; // 0 - 9999 + var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 + + var matchUnsigned = /\d+/; // 0 - inf + var matchSigned = /[+-]?\d+/; // -inf - inf + + var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z + + var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 + + // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months + var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; + + var regexes = {}; + + function addRegexToken (token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; + } + + function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); + } + + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + var tokens = {}; + + function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (isNumber(callback)) { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } + } + + function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); + } + + function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } + } + + var YEAR = 0; + var MONTH = 1; + var DATE = 2; + var HOUR = 3; + var MINUTE = 4; + var SECOND = 5; + var MILLISECOND = 6; + var WEEK = 7; + var WEEKDAY = 8; + + // FORMATTING + + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; + }); + + addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; + }); + + addFormatToken(0, ['YYYY', 4], 0, 'year'); + addFormatToken(0, ['YYYYY', 5], 0, 'year'); + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + + // ALIASES + + addUnitAlias('year', 'y'); + + // PRIORITIES + + addUnitPriority('year', 1); + + // PARSING + + addRegexToken('Y', matchSigned); + addRegexToken('YY', match1to2, match2); + addRegexToken('YYYY', match1to4, match4); + addRegexToken('YYYYY', match1to6, match6); + addRegexToken('YYYYYY', match1to6, match6); + + addParseToken(['YYYYY', 'YYYYYY'], YEAR); + addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); + }); + addParseToken('YY', function (input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); + }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); + + // HELPERS + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + // HOOKS + + hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + // MOMENTS + + var getSetYear = makeGetSet('FullYear', true); + + function getIsLeapYear () { + return isLeapYear(this.year()); + } + + function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + set$1(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; + } + + function get (mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; + } + + function set$1 (mom, unit, value) { + if (mom.isValid() && !isNaN(value)) { + if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); + } + else { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + } + + // MOMENTS + + function stringGet (units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; + } + + + function stringSet (units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units); + for (var i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; + } + + function mod(n, x) { + return ((n % x) + x) % x; + } + + var indexOf; + + if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; + } else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; + } + + function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); + } + + // FORMATTING + + addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; + }); + + addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); + }); + + addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); + }); + + // ALIASES + + addUnitAlias('month', 'M'); + + // PRIORITY + + addUnitPriority('month', 8); + + // PARSING + + addRegexToken('M', match1to2); + addRegexToken('MM', match1to2, match2); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); + + addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; + }); + + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); + + // LOCALES + + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); + function localeMonths (m, format) { + if (!m) { + return isArray(this._months) ? this._months : + this._months['standalone']; + } + return isArray(this._months) ? this._months[m.month()] : + this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; + } + + var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); + function localeMonthsShort (m, format) { + if (!m) { + return isArray(this._monthsShort) ? this._monthsShort : + this._monthsShort['standalone']; + } + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; + } + + function handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; + + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format, strict); + } + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } + + // MOMENTS + + function setMonth (mom, value) { + var dayOfMonth; + + if (!mom.isValid()) { + // No op + return mom; + } + + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (!isNumber(value)) { + return mom; + } + } + } + + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, 'Month'); + } + } + + function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); + } + + var defaultMonthsShortRegex = matchWord; + function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } + } + + var defaultMonthsRegex = matchWord; + function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } + } + + function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + } + + function createDate (y, m, d, h, M, s, ms) { + // can't just apply() to create a date: + // https://stackoverflow.com/q/181348 + var date = new Date(y, m, d, h, M, s, ms); + + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { + date.setFullYear(y); + } + return date; + } + + function createUTCDate (y) { + var date = new Date(Date.UTC.apply(null, arguments)); + + // the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + return date; + } + + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + + return -fwdlw + fwd - 1; + } + + // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + + return { + year: resYear, + dayOfYear: resDayOfYear + }; + } + + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; + + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; + } + + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; + } + + // FORMATTING + + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + + // ALIASES + + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); + + // PRIORITIES + + addUnitPriority('week', 5); + addUnitPriority('isoWeek', 5); + + // PARSING + + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); + + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); + + // HELPERS + + // LOCALES + + function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + + var defaultLocaleWeek = { + 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. + }; + + function localeFirstDayOfWeek () { + return this._week.dow; + } + + function localeFirstDayOfYear () { + return this._week.doy; + } + + // MOMENTS + + function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + // FORMATTING + + addFormatToken('d', 0, 'do', 'day'); + + addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); + }); + + addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); + }); + + addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); + }); + + addFormatToken('e', 0, 0, 'weekday'); + addFormatToken('E', 0, 0, 'isoWeekday'); + + // ALIASES + + addUnitAlias('day', 'd'); + addUnitAlias('weekday', 'e'); + addUnitAlias('isoWeekday', 'E'); + + // PRIORITY + addUnitPriority('day', 11); + addUnitPriority('weekday', 11); + addUnitPriority('isoWeekday', 11); + + // PARSING + + addRegexToken('d', match1to2); + addRegexToken('e', match1to2); + addRegexToken('E', match1to2); + addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); + }); + addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); + }); + addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); + }); + + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); + + addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); + }); + + // HELPERS + + function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; + } + + function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; + } + + // LOCALES + + var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); + function localeWeekdays (m, format) { + if (!m) { + return isArray(this._weekdays) ? this._weekdays : + this._weekdays['standalone']; + } + return isArray(this._weekdays) ? this._weekdays[m.day()] : + this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; + } + + var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); + function localeWeekdaysShort (m) { + return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; + } + + var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); + function localeWeekdaysMin (m) { + return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; + } + + function handleStrictParse$1(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + + for (i = 0; i < 7; ++i) { + mom = createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeWeekdaysParse (weekdayName, format, strict) { + var i, mom, regex; + + if (this._weekdaysParseExact) { + return handleStrictParse$1.call(this, weekdayName, format, strict); + } + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + + mom = createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } + + // MOMENTS + + function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + } + + function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + } + + function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } + } + + var defaultWeekdaysRegex = matchWord; + function weekdaysRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } + } + + var defaultWeekdaysShortRegex = matchWord; + function weekdaysShortRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } + } + + var defaultWeekdaysMinRegex = matchWord; + function weekdaysMinRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } + } + + + function computeWeekdaysParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); + } + + // FORMATTING + + function hFormat() { + return this.hours() % 12 || 12; + } + + function kFormat() { + return this.hours() || 24; + } + + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + addFormatToken('k', ['kk', 2], 0, kFormat); + + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); + + addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + + addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); + } + + meridiem('a', true); + meridiem('A', false); + + // ALIASES + + addUnitAlias('hour', 'h'); + + // PRIORITY + addUnitPriority('hour', 13); + + // PARSING + + function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; + } + + addRegexToken('a', matchMeridiem); + addRegexToken('A', matchMeridiem); + addRegexToken('H', match1to2); + addRegexToken('h', match1to2); + addRegexToken('k', match1to2); + addRegexToken('HH', match1to2, match2); + addRegexToken('hh', match1to2, match2); + addRegexToken('kk', match1to2, match2); + + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); + + addParseToken(['H', 'HH'], HOUR); + addParseToken(['k', 'kk'], function (input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; + }); + addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); + + // LOCALES + + function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + } + + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; + function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + } + + + // MOMENTS + + // Setting the hour should keep the time, because the user explicitly + // specified which hour they want. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + var getSetHour = makeGetSet('Hours', true); + + var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, + + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, + + week: defaultLocaleWeek, + + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, + + meridiemParse: defaultLocaleMeridiemParse + }; + + // internal storage for locale config files + var locales = {}; + var localeFamilies = {}; + var globalLocale; + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return globalLocale; + } + + function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && (typeof module !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + var aliasedRequire = require; + aliasedRequire('./locale/' + name); + getSetGlobalLocale(oldLocale); + } catch (e) {} + } + return locales[name]; + } + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + function getSetGlobalLocale (key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } + else { + data = defineLocale(key, values); + } + + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + else { + if ((typeof console !== 'undefined') && console.warn) { + //warn user if arguments are passed but the locale could not be set + console.warn('Locale ' + key + ' not found. Did you forget to load it?'); + } + } + } + + return globalLocale._abbr; + } + + function defineLocale (name, config) { + if (config !== null) { + var locale, parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + locale = loadLocale(config.parentLocale); + if (locale != null) { + parentConfig = locale._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name: name, + config: config + }); + return null; + } + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); + + if (localeFamilies[name]) { + localeFamilies[name].forEach(function (x) { + defineLocale(x.name, x.config); + }); + } + + // backwards compat for now: also set the locale + // make sure we set the locale AFTER all child locales have been + // created, so we won't end up with the child locale set. + getSetGlobalLocale(name); + + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + } + + function updateLocale(name, config) { + if (config != null) { + var locale, tmpLocale, parentConfig = baseConfig; + // MERGE + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + + // backwards compat for now: also set the locale + getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; + } + + // returns locale data + function getLocale (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + } + + function listLocales() { + return keys(locales); + } + + function checkOverflow (m) { + var overflow; + var a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; + } + + // Pick the first defined of two or three arguments. + function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; + } + + function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function configFromArray (config) { + var i, date, input = [], currentDate, expectedWeekday, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear != null) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); + + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + + // check for mismatching day of week + if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { + getParsingFlags(config).weekdayMismatch = true; + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + var curWeek = weekOfYear(createLocal(), dow, doy); + + weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); + + // Default to current week. + week = defaults(w.w, curWeek.week); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to begining of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + } + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; + + var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] + ]; + + // iso time formats and regexes + var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] + ]; + + var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + + // date from iso format + function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; + + if (match) { + getParsingFlags(config).iso = true; + + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; + + function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; + + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } + + return result; + } + + function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; + } + + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + } + + function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), + weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; + return false; + } + } + return true; + } + + var obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; + + function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + // the only allowed military tz is Z + return 0; + } else { + var hm = parseInt(numOffset, 10); + var m = hm % 100, h = (hm - m) / 100; + return h * 60 + m; + } + } + + // date and time from ref 2822 format + function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)); + if (match) { + var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); + if (!checkWeekday(match[1], parsedArray, config)) { + return; + } + + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); + + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + + getParsingFlags(config).rfc2822 = true; + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); + + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } + + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + configFromRFC2822(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + // Final attempt, use Input Fallback + hooks.createFromInputFallback(config); + } + + hooks.createFromInputFallback = deprecate( + 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + + 'discouraged and will be removed in an upcoming major release. Please refer to ' + + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // constant that refers to the ISO standard + hooks.ISO_8601 = function () {}; + + // constant that refers to the RFC 2822 form + hooks.RFC_2822 = function () {}; + + // date from string and format string + function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; + } + + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); + } + + + function meridiemFixWrap (locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } + } + + // date from string and array of format strings + function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); + + configFromArray(config); + } + + function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + function prepareConfig (config) { + var input = config._i, + format = config._f; + + config._locale = config._locale || getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return createInvalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } + + if (!isValid(config)) { + config._d = null; + } + + return config; + } + + function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject(input)) { + configFromObject(config); + } else if (isNumber(input)) { + // from milliseconds + config._d = new Date(input); + } else { + hooks.createFromInputFallback(config); + } + } + + function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; + + if (locale === true || locale === false) { + strict = locale; + locale = undefined; + } + + if ((isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0)) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); + } + + function createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); + } + + var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } + ); + + var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + // TODO: Use [].sort instead? + function min () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + } + + function max () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + } + + var now = function () { + return Date.now ? Date.now() : +(new Date()); + }; + + var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; + + function isDurationValid(m) { + for (var key in m) { + if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + return false; + } + } + + var unitHasDecimal = false; + for (var i = 0; i < ordering.length; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; // only allow non-integers for smallest unit + } + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; + } + } + } + + return true; + } + + function isValid$1() { + return this._isValid; + } + + function createInvalid$1() { + return createDuration(NaN); + } + + function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + this._isValid = isDurationValid(normalizedInput); + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible to translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = getLocale(); + + this._bubble(); + } + + function isDuration (obj) { + return obj instanceof Duration; + } + + function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } + } + + // FORMATTING + + function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); + } + + offset('Z', ':'); + offset('ZZ', ''); + + // PARSING + + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); + addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); + }); + + // HELPERS + + // timezone chunker + // '+10:00' > ['10', '00'] + // '-1530' > ['-15', '30'] + var chunkOffset = /([\+\-]|\d\d)/gi; + + function offsetFromString(matcher, string) { + var matches = (string || '').match(matcher); + + if (matches === null) { + return null; + } + + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); + + return minutes === 0 ? + 0 : + parts[0] === '+' ? minutes : -minutes; + } + + // Return a moment from input, that is local/utc/zone equivalent to model. + function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } + } + + function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; + } + + // HOOKS + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + hooks.updateOffset = function () {}; + + // MOMENTS + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + function getSetOffset (input, keepLocalTime, keepMinutes) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; + } + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract(this, createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } + } + + function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + + function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + } + + function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; + } + + function setOffsetToParsedOffset () { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === 'string') { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } + else { + this.utcOffset(0, true); + } + } + return this; + } + + function hasAlignedHourOffset (input) { + if (!this.isValid()) { + return false; + } + input = input ? createLocal(input).utcOffset() : 0; + + return (this.utcOffset() - input) % 60 === 0; + } + + function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); + } + + function isDaylightSavingTimeShifted () { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; + } + + function isLocal () { + return this.isValid() ? !this._isUTC : false; + } + + function isUtcOffset () { + return this.isValid() ? this._isUTC : false; + } + + function isUtc () { + return this.isValid() ? this._isUTC && this._offset === 0 : false; + } + + // ASP.NET json date format regex + var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + // and further modified to allow for strings containing both week and day + var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + + function createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; + + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (isNumber(input)) { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + } + + createDuration.fn = Duration.prototype; + createDuration.invalid = createInvalid$1; + + function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; + }; + } + + function addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); + + if (!mom.isValid()) { + // No op + return; + } + + updateOffset = updateOffset == null ? true : updateOffset; + + if (months) { + setMonth(mom, get(mom, 'Month') + months * isAdding); + } + if (days) { + set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); + } + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days || months); + } + } + + var add = createAdder(1, 'add'); + var subtract = createAdder(-1, 'subtract'); + + function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + } + + function calendar$1 (time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = hooks.calendarFormat(this, sod) || 'sameElse'; + + var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, createLocal(now))); + } + + function clone () { + return new Moment(this); + } + + function isAfter (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } + } + + function isBefore (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } + } + + function isBetween (from, to, units, inclusivity) { + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && + (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); + } + + function isSame (input, units) { + var localInput = isMoment(input) ? input : createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + } + } + + function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input,units); + } + + function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input,units); + } + + function diff (input, units, asFloat) { + var that, + zoneDelta, + output; + + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + + units = normalizeUnits(units); + + switch (units) { + case 'year': output = monthDiff(this, that) / 12; break; + case 'month': output = monthDiff(this, that); break; + case 'quarter': output = monthDiff(this, that) / 3; break; + case 'second': output = (this - that) / 1e3; break; // 1000 + case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 + case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 + case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst + case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst + default: output = this - that; + } + + return asFloat ? output : absFloor(output); + } + + function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; + } + + hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; + + function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } + + function toISOString(keepOffset) { + if (!this.isValid()) { + return null; + } + var utc = keepOffset !== true; + var m = utc ? this.clone().utc() : this; + if (m.year() < 0 || m.year() > 9999) { + return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + if (utc) { + return this.toDate().toISOString(); + } else { + return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + } + } + return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + + /** + * Return a human readable representation of a moment that can + * also be evaluated to get a new moment which is the same + * + * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects + */ + function inspect () { + if (!this.isValid()) { + return 'moment.invalid(/* ' + this._i + ' */)'; + } + var func = 'moment'; + var zone = ''; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; + zone = 'Z'; + } + var prefix = '[' + func + '("]'; + var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; + var datetime = '-MM-DD[T]HH:mm:ss.SSS'; + var suffix = zone + '[")]'; + + return this.format(prefix + year + datetime + suffix); + } + + function format (inputString) { + if (!inputString) { + inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); + } + + function from (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function fromNow (withoutSuffix) { + return this.from(createLocal(), withoutSuffix); + } + + function to (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function toNow (withoutSuffix) { + return this.to(createLocal(), withoutSuffix); + } + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + } + + var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ); + + function localeData () { + return this._locale; + } + + function startOf (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + case 'date': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } + if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + } + + function endOf (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + + // 'date' is an alias for 'day', so it should be considered as such. + if (units === 'date') { + units = 'day'; + } + + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + } + + function valueOf () { + return this._d.valueOf() - ((this._offset || 0) * 60000); + } + + function unix () { + return Math.floor(this.valueOf() / 1000); + } + + function toDate () { + return new Date(this.valueOf()); + } + + function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; + } + + function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; + } + + function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; + } + + function isValid$2 () { + return isValid(this); + } + + function parsingFlags () { + return extend({}, getParsingFlags(this)); + } + + function invalidAt () { + return getParsingFlags(this).overflow; + } + + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; + } + + // FORMATTING + + addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; + }); + + addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; + }); + + function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); + } + + addWeekYearFormatToken('gggg', 'weekYear'); + addWeekYearFormatToken('ggggg', 'weekYear'); + addWeekYearFormatToken('GGGG', 'isoWeekYear'); + addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + + // ALIASES + + addUnitAlias('weekYear', 'gg'); + addUnitAlias('isoWeekYear', 'GG'); + + // PRIORITY + + addUnitPriority('weekYear', 1); + addUnitPriority('isoWeekYear', 1); + + + // PARSING + + addRegexToken('G', matchSigned); + addRegexToken('g', matchSigned); + addRegexToken('GG', match1to2, match2); + addRegexToken('gg', match1to2, match2); + addRegexToken('GGGG', match1to4, match4); + addRegexToken('gggg', match1to4, match4); + addRegexToken('GGGGG', match1to6, match6); + addRegexToken('ggggg', match1to6, match6); + + addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); + }); + + addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = hooks.parseTwoDigitYear(input); + }); + + // MOMENTS + + function getSetWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); + } + + function getSetISOWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); + } + + function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); + } + + function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + } + + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } + } + + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; + } + + // FORMATTING + + addFormatToken('Q', 0, 'Qo', 'quarter'); + + // ALIASES + + addUnitAlias('quarter', 'Q'); + + // PRIORITY + + addUnitPriority('quarter', 7); + + // PARSING + + addRegexToken('Q', match1); + addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; + }); + + // MOMENTS + + function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + } + + // FORMATTING + + addFormatToken('D', ['DD', 2], 'Do', 'date'); + + // ALIASES + + addUnitAlias('date', 'D'); + + // PRIORITY + addUnitPriority('date', 9); + + // PARSING + + addRegexToken('D', match1to2); + addRegexToken('DD', match1to2, match2); + addRegexToken('Do', function (isStrict, locale) { + // TODO: Remove "ordinalParse" fallback in next major release. + return isStrict ? + (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : + locale._dayOfMonthOrdinalParseLenient; + }); + + addParseToken(['D', 'DD'], DATE); + addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0]); + }); + + // MOMENTS + + var getSetDayOfMonth = makeGetSet('Date', true); + + // FORMATTING + + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + + // ALIASES + + addUnitAlias('dayOfYear', 'DDD'); + + // PRIORITY + addUnitPriority('dayOfYear', 4); + + // PARSING + + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); + + // HELPERS + + // MOMENTS + + function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + } + + // FORMATTING + + addFormatToken('m', ['mm', 2], 0, 'minute'); + + // ALIASES + + addUnitAlias('minute', 'm'); + + // PRIORITY + + addUnitPriority('minute', 14); + + // PARSING + + addRegexToken('m', match1to2); + addRegexToken('mm', match1to2, match2); + addParseToken(['m', 'mm'], MINUTE); + + // MOMENTS + + var getSetMinute = makeGetSet('Minutes', false); + + // FORMATTING + + addFormatToken('s', ['ss', 2], 0, 'second'); + + // ALIASES + + addUnitAlias('second', 's'); + + // PRIORITY + + addUnitPriority('second', 15); + + // PARSING + + addRegexToken('s', match1to2); + addRegexToken('ss', match1to2, match2); + addParseToken(['s', 'ss'], SECOND); + + // MOMENTS + + var getSetSecond = makeGetSet('Seconds', false); + + // FORMATTING + + addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); + }); + + addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); + }); + + addFormatToken(0, ['SSS', 3], 0, 'millisecond'); + addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; + }); + addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; + }); + addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; + }); + addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; + }); + addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; + }); + addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; + }); + + + // ALIASES + + addUnitAlias('millisecond', 'ms'); + + // PRIORITY + + addUnitPriority('millisecond', 16); + + // PARSING + + addRegexToken('S', match1to3, match1); + addRegexToken('SS', match1to3, match2); + addRegexToken('SSS', match1to3, match3); + + var token; + for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); + } + + function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); + } + + for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); + } + // MOMENTS + + var getSetMillisecond = makeGetSet('Milliseconds', false); + + // FORMATTING + + addFormatToken('z', 0, 0, 'zoneAbbr'); + addFormatToken('zz', 0, 0, 'zoneName'); + + // MOMENTS + + function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; + } + + function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + } + + var proto = Moment.prototype; + + proto.add = add; + proto.calendar = calendar$1; + proto.clone = clone; + proto.diff = diff; + proto.endOf = endOf; + proto.format = format; + proto.from = from; + proto.fromNow = fromNow; + proto.to = to; + proto.toNow = toNow; + proto.get = stringGet; + proto.invalidAt = invalidAt; + proto.isAfter = isAfter; + proto.isBefore = isBefore; + proto.isBetween = isBetween; + proto.isSame = isSame; + proto.isSameOrAfter = isSameOrAfter; + proto.isSameOrBefore = isSameOrBefore; + proto.isValid = isValid$2; + proto.lang = lang; + proto.locale = locale; + proto.localeData = localeData; + proto.max = prototypeMax; + proto.min = prototypeMin; + proto.parsingFlags = parsingFlags; + proto.set = stringSet; + proto.startOf = startOf; + proto.subtract = subtract; + proto.toArray = toArray; + proto.toObject = toObject; + proto.toDate = toDate; + proto.toISOString = toISOString; + proto.inspect = inspect; + proto.toJSON = toJSON; + proto.toString = toString; + proto.unix = unix; + proto.valueOf = valueOf; + proto.creationData = creationData; + proto.year = getSetYear; + proto.isLeapYear = getIsLeapYear; + proto.weekYear = getSetWeekYear; + proto.isoWeekYear = getSetISOWeekYear; + proto.quarter = proto.quarters = getSetQuarter; + proto.month = getSetMonth; + proto.daysInMonth = getDaysInMonth; + proto.week = proto.weeks = getSetWeek; + proto.isoWeek = proto.isoWeeks = getSetISOWeek; + proto.weeksInYear = getWeeksInYear; + proto.isoWeeksInYear = getISOWeeksInYear; + proto.date = getSetDayOfMonth; + proto.day = proto.days = getSetDayOfWeek; + proto.weekday = getSetLocaleDayOfWeek; + proto.isoWeekday = getSetISODayOfWeek; + proto.dayOfYear = getSetDayOfYear; + proto.hour = proto.hours = getSetHour; + proto.minute = proto.minutes = getSetMinute; + proto.second = proto.seconds = getSetSecond; + proto.millisecond = proto.milliseconds = getSetMillisecond; + proto.utcOffset = getSetOffset; + proto.utc = setOffsetToUTC; + proto.local = setOffsetToLocal; + proto.parseZone = setOffsetToParsedOffset; + proto.hasAlignedHourOffset = hasAlignedHourOffset; + proto.isDST = isDaylightSavingTime; + proto.isLocal = isLocal; + proto.isUtcOffset = isUtcOffset; + proto.isUtc = isUtc; + proto.isUTC = isUtc; + proto.zoneAbbr = getZoneAbbr; + proto.zoneName = getZoneName; + proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); + proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); + proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); + proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); + proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); + + function createUnix (input) { + return createLocal(input * 1000); + } + + function createInZone () { + return createLocal.apply(null, arguments).parseZone(); + } + + function preParsePostFormat (string) { + return string; + } + + var proto$1 = Locale.prototype; + + proto$1.calendar = calendar; + proto$1.longDateFormat = longDateFormat; + proto$1.invalidDate = invalidDate; + proto$1.ordinal = ordinal; + proto$1.preparse = preParsePostFormat; + proto$1.postformat = preParsePostFormat; + proto$1.relativeTime = relativeTime; + proto$1.pastFuture = pastFuture; + proto$1.set = set; + + proto$1.months = localeMonths; + proto$1.monthsShort = localeMonthsShort; + proto$1.monthsParse = localeMonthsParse; + proto$1.monthsRegex = monthsRegex; + proto$1.monthsShortRegex = monthsShortRegex; + proto$1.week = localeWeek; + proto$1.firstDayOfYear = localeFirstDayOfYear; + proto$1.firstDayOfWeek = localeFirstDayOfWeek; + + proto$1.weekdays = localeWeekdays; + proto$1.weekdaysMin = localeWeekdaysMin; + proto$1.weekdaysShort = localeWeekdaysShort; + proto$1.weekdaysParse = localeWeekdaysParse; + + proto$1.weekdaysRegex = weekdaysRegex; + proto$1.weekdaysShortRegex = weekdaysShortRegex; + proto$1.weekdaysMinRegex = weekdaysMinRegex; + + proto$1.isPM = localeIsPM; + proto$1.meridiem = localeMeridiem; + + function get$1 (format, index, field, setter) { + var locale = getLocale(); + var utc = createUTC().set(setter, index); + return locale[field](utc, format); + } + + function listMonthsImpl (format, index, field) { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return get$1(format, index, field, 'month'); + } + + var i; + var out = []; + for (i = 0; i < 12; i++) { + out[i] = get$1(format, i, field, 'month'); + } + return out; + } + + // () + // (5) + // (fmt, 5) + // (fmt) + // (true) + // (true, 5) + // (true, fmt, 5) + // (true, fmt) + function listWeekdaysImpl (localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; + + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } + + var locale = getLocale(), + shift = localeSorted ? locale._week.dow : 0; + + if (index != null) { + return get$1(format, (index + shift) % 7, field, 'day'); + } + + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = get$1(format, (i + shift) % 7, field, 'day'); + } + return out; + } + + function listMonths (format, index) { + return listMonthsImpl(format, index, 'months'); + } + + function listMonthsShort (format, index) { + return listMonthsImpl(format, index, 'monthsShort'); + } + + function listWeekdays (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); + } + + function listWeekdaysShort (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); + } + + function listWeekdaysMin (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); + } + + getSetGlobalLocale('en', { + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // Side effect imports + + hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); + hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); + + var mathAbs = Math.abs; + + function abs () { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; + } + + function addSubtract$1 (duration, input, value, direction) { + var other = createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); + } + + // supports only 2.0-style add(1, 's') or add(duration) + function add$1 (input, value) { + return addSubtract$1(this, input, value, 1); + } + + // supports only 2.0-style subtract(1, 's') or subtract(duration) + function subtract$1 (input, value) { + return addSubtract$1(this, input, value, -1); + } + + function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } + } + + function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; + } + + function daysToMonths (days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; + } + + function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; + } + + function as (units) { + if (!this.isValid()) { + return NaN; + } + var days; + var months; + var milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + } + + // TODO: Use this.as('ms')? + function valueOf$1 () { + if (!this.isValid()) { + return NaN; + } + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); + } + + function makeAs (alias) { + return function () { + return this.as(alias); + }; + } + + var asMilliseconds = makeAs('ms'); + var asSeconds = makeAs('s'); + var asMinutes = makeAs('m'); + var asHours = makeAs('h'); + var asDays = makeAs('d'); + var asWeeks = makeAs('w'); + var asMonths = makeAs('M'); + var asYears = makeAs('y'); + + function clone$1 () { + return createDuration(this); + } + + function get$2 (units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + 's']() : NaN; + } + + function makeGetter(name) { + return function () { + return this.isValid() ? this._data[name] : NaN; + }; + } + + var milliseconds = makeGetter('milliseconds'); + var seconds = makeGetter('seconds'); + var minutes = makeGetter('minutes'); + var hours = makeGetter('hours'); + var days = makeGetter('days'); + var months = makeGetter('months'); + var years = makeGetter('years'); + + function weeks () { + return absFloor(this.days() / 7); + } + + var round = Math.round; + var thresholds = { + ss: 44, // a few seconds to seconds + s : 45, // seconds to minute + m : 45, // minutes to hour + h : 22, // hours to day + d : 26, // days to month + M : 11 // months to year + }; + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime$1 (posNegDuration, withoutSuffix, locale) { + var duration = createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); + + var a = seconds <= thresholds.ss && ['s', seconds] || + seconds < thresholds.s && ['ss', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); + } + + // This function allows you to set the rounding function for relative time strings + function getSetRelativeTimeRounding (roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof(roundingFunction) === 'function') { + round = roundingFunction; + return true; + } + return false; + } + + // This function allows you to set a threshold for relative time strings + function getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === 's') { + thresholds.ss = limit - 1; + } + return true; + } + + function humanize (withSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var locale = this.localeData(); + var output = relativeTime$1(this, !withSuffix, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); + } + + var abs$1 = Math.abs; + + function sign(x) { + return ((x > 0) - (x < 0)) || +x; + } + + function toISOString$1() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var seconds = abs$1(this._milliseconds) / 1000; + var days = abs$1(this._days); + var months = abs$1(this._months); + var minutes, hours, years; + + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; + var total = this.asSeconds(); + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + var totalSign = total < 0 ? '-' : ''; + var ymSign = sign(this._months) !== sign(total) ? '-' : ''; + var daysSign = sign(this._days) !== sign(total) ? '-' : ''; + var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; + + return totalSign + 'P' + + (Y ? ymSign + Y + 'Y' : '') + + (M ? ymSign + M + 'M' : '') + + (D ? daysSign + D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? hmsSign + h + 'H' : '') + + (m ? hmsSign + m + 'M' : '') + + (s ? hmsSign + s + 'S' : ''); + } + + var proto$2 = Duration.prototype; + + proto$2.isValid = isValid$1; + proto$2.abs = abs; + proto$2.add = add$1; + proto$2.subtract = subtract$1; + proto$2.as = as; + proto$2.asMilliseconds = asMilliseconds; + proto$2.asSeconds = asSeconds; + proto$2.asMinutes = asMinutes; + proto$2.asHours = asHours; + proto$2.asDays = asDays; + proto$2.asWeeks = asWeeks; + proto$2.asMonths = asMonths; + proto$2.asYears = asYears; + proto$2.valueOf = valueOf$1; + proto$2._bubble = bubble; + proto$2.clone = clone$1; + proto$2.get = get$2; + proto$2.milliseconds = milliseconds; + proto$2.seconds = seconds; + proto$2.minutes = minutes; + proto$2.hours = hours; + proto$2.days = days; + proto$2.weeks = weeks; + proto$2.months = months; + proto$2.years = years; + proto$2.humanize = humanize; + proto$2.toISOString = toISOString$1; + proto$2.toString = toISOString$1; + proto$2.toJSON = toISOString$1; + proto$2.locale = locale; + proto$2.localeData = localeData; + + proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); + proto$2.lang = lang; + + // Side effect imports + + // FORMATTING + + addFormatToken('X', 0, 0, 'unix'); + addFormatToken('x', 0, 0, 'valueOf'); + + // PARSING + + addRegexToken('x', matchSigned); + addRegexToken('X', matchTimestamp); + addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); + }); + addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); + }); + + // Side effect imports + + + hooks.version = '2.22.2'; + + setHookCallback(createLocal); + + hooks.fn = proto; + hooks.min = min; + hooks.max = max; + hooks.now = now; + hooks.utc = createUTC; + hooks.unix = createUnix; + hooks.months = listMonths; + hooks.isDate = isDate; + hooks.locale = getSetGlobalLocale; + hooks.invalid = createInvalid; + hooks.duration = createDuration; + hooks.isMoment = isMoment; + hooks.weekdays = listWeekdays; + hooks.parseZone = createInZone; + hooks.localeData = getLocale; + hooks.isDuration = isDuration; + hooks.monthsShort = listMonthsShort; + hooks.weekdaysMin = listWeekdaysMin; + hooks.defineLocale = defineLocale; + hooks.updateLocale = updateLocale; + hooks.locales = listLocales; + hooks.weekdaysShort = listWeekdaysShort; + hooks.normalizeUnits = normalizeUnits; + hooks.relativeTimeRounding = getSetRelativeTimeRounding; + hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; + hooks.calendarFormat = getCalendarFormat; + hooks.prototype = proto; + + // currently HTML5 input type only supports 24-hour formats + hooks.HTML5_FMT = { + DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // + DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // + DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // + DATE: 'YYYY-MM-DD', // + TIME: 'HH:mm', // + TIME_SECONDS: 'HH:mm:ss', // + TIME_MS: 'HH:mm:ss.SSS', // + WEEK: 'YYYY-[W]WW', // + MONTH: 'YYYY-MM' // + }; + + return hooks; + +}))); diff --git a/nodejs/node_modules/moment/package.js b/nodejs/node_modules/moment/package.js new file mode 100755 index 0000000..aba8d50 --- /dev/null +++ b/nodejs/node_modules/moment/package.js @@ -0,0 +1,11 @@ +var profile = { + resourceTags: { + ignore: function(filename, mid){ + // only include moment/moment + return mid != "moment/moment"; + }, + amd: function(filename, mid){ + return /\.js$/.test(filename); + } + } +}; diff --git a/nodejs/node_modules/moment/package.json b/nodejs/node_modules/moment/package.json new file mode 100755 index 0000000..a60949f --- /dev/null +++ b/nodejs/node_modules/moment/package.json @@ -0,0 +1,150 @@ +{ + "_args": [ + [ + "moment@2.22.2", + "/www/wwwroot/Adminx.cc/nodejs" + ] + ], + "_from": "moment@2.22.2", + "_id": "moment@2.22.2", + "_inBundle": false, + "_integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=", + "_location": "/moment", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "moment@2.22.2", + "name": "moment", + "escapedName": "moment", + "rawSpec": "2.22.2", + "saveSpec": null, + "fetchSpec": "2.22.2" + }, + "_requiredBy": [ + "/moment-timezone" + ], + "_resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "_spec": "2.22.2", + "_where": "/www/wwwroot/Adminx.cc/nodejs", + "author": { + "name": "Iskren Ivov Chernev", + "email": "iskren.chernev@gmail.com", + "url": "https://github.com/ichernev" + }, + "bugs": { + "url": "https://github.com/moment/moment/issues" + }, + "contributors": [ + { + "name": "Tim Wood", + "email": "washwithcare@gmail.com", + "url": "http://timwoodcreates.com/" + }, + { + "name": "Rocky Meza", + "url": "http://rockymeza.com" + }, + { + "name": "Matt Johnson", + "email": "mj1856@hotmail.com", + "url": "http://codeofmatt.com" + }, + { + "name": "Isaac Cambron", + "email": "isaac@isaaccambron.com", + "url": "http://isaaccambron.com" + }, + { + "name": "Andre Polykanine", + "email": "andre@oire.org", + "url": "https://github.com/oire" + } + ], + "description": "Parse, validate, manipulate, and display dates", + "devDependencies": { + "benchmark": "latest", + "coveralls": "^2.11.2", + "es6-promise": "latest", + "grunt": "~0.4", + "grunt-benchmark": "latest", + "grunt-cli": "latest", + "grunt-contrib-clean": "latest", + "grunt-contrib-concat": "latest", + "grunt-contrib-copy": "latest", + "grunt-contrib-jshint": "latest", + "grunt-contrib-uglify": "latest", + "grunt-contrib-watch": "latest", + "grunt-env": "latest", + "grunt-exec": "latest", + "grunt-jscs": "latest", + "grunt-karma": "latest", + "grunt-nuget": "latest", + "grunt-string-replace": "latest", + "karma": "latest", + "karma-chrome-launcher": "latest", + "karma-firefox-launcher": "latest", + "karma-qunit": "latest", + "karma-sauce-launcher": "latest", + "load-grunt-tasks": "~3.5.2", + "node-qunit": "^1.0.0", + "nyc": "^2.1.4", + "qunit": "^2.6.0", + "rollup": "latest", + "spacejam": "latest", + "typescript": "^1.8.10", + "uglify-js": "latest" + }, + "dojoBuild": "package.js", + "ender": "./ender.js", + "engines": { + "node": "*" + }, + "homepage": "http://momentjs.com", + "jsnext:main": "./src/moment.js", + "jspm": { + "files": [ + "moment.js", + "moment.d.ts", + "locale" + ], + "map": { + "moment": "./moment" + }, + "buildConfig": { + "uglify": true + } + }, + "keywords": [ + "moment", + "date", + "time", + "parse", + "format", + "validate", + "i18n", + "l10n", + "ender" + ], + "license": "MIT", + "main": "./moment.js", + "name": "moment", + "repository": { + "type": "git", + "url": "git+https://github.com/moment/moment.git" + }, + "scripts": { + "coverage": "nyc npm test && nyc report", + "coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls", + "test": "grunt test", + "typescript-test": "tsc --project typing-tests" + }, + "spm": { + "main": "moment.js", + "output": [ + "locale/*.js" + ] + }, + "typings": "./moment.d.ts", + "version": "2.22.2" +} diff --git a/nodejs/node_modules/moment/src/lib/create/check-overflow.js b/nodejs/node_modules/moment/src/lib/create/check-overflow.js new file mode 100755 index 0000000..41b539f --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/check-overflow.js @@ -0,0 +1,34 @@ +import { daysInMonth } from '../units/month'; +import { YEAR, MONTH, DATE, HOUR, MINUTE, SECOND, MILLISECOND, WEEK, WEEKDAY } from '../units/constants'; +import getParsingFlags from '../create/parsing-flags'; + +export default function checkOverflow (m) { + var overflow; + var a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; +} + diff --git a/nodejs/node_modules/moment/src/lib/create/date-from-array.js b/nodejs/node_modules/moment/src/lib/create/date-from-array.js new file mode 100755 index 0000000..59b57b0 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/date-from-array.js @@ -0,0 +1,21 @@ +export function createDate (y, m, d, h, M, s, ms) { + // can't just apply() to create a date: + // https://stackoverflow.com/q/181348 + var date = new Date(y, m, d, h, M, s, ms); + + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { + date.setFullYear(y); + } + return date; +} + +export function createUTCDate (y) { + var date = new Date(Date.UTC.apply(null, arguments)); + + // the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + return date; +} diff --git a/nodejs/node_modules/moment/src/lib/create/from-anything.js b/nodejs/node_modules/moment/src/lib/create/from-anything.js new file mode 100755 index 0000000..e692679 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/from-anything.js @@ -0,0 +1,110 @@ +import isArray from '../utils/is-array'; +import isObject from '../utils/is-object'; +import isObjectEmpty from '../utils/is-object-empty'; +import isUndefined from '../utils/is-undefined'; +import isNumber from '../utils/is-number'; +import isDate from '../utils/is-date'; +import map from '../utils/map'; +import { createInvalid } from './valid'; +import { Moment, isMoment } from '../moment/constructor'; +import { getLocale } from '../locale/locales'; +import { hooks } from '../utils/hooks'; +import checkOverflow from './check-overflow'; +import { isValid } from './valid'; + +import { configFromStringAndArray } from './from-string-and-array'; +import { configFromStringAndFormat } from './from-string-and-format'; +import { configFromString } from './from-string'; +import { configFromArray } from './from-array'; +import { configFromObject } from './from-object'; + +function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; +} + +export function prepareConfig (config) { + var input = config._i, + format = config._f; + + config._locale = config._locale || getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return createInvalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } + + if (!isValid(config)) { + config._d = null; + } + + return config; +} + +function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject(input)) { + configFromObject(config); + } else if (isNumber(input)) { + // from milliseconds + config._d = new Date(input); + } else { + hooks.createFromInputFallback(config); + } +} + +export function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; + + if (locale === true || locale === false) { + strict = locale; + locale = undefined; + } + + if ((isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0)) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); +} diff --git a/nodejs/node_modules/moment/src/lib/create/from-array.js b/nodejs/node_modules/moment/src/lib/create/from-array.js new file mode 100755 index 0000000..b5a0911 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/from-array.js @@ -0,0 +1,147 @@ +import { hooks } from '../utils/hooks'; +import { createDate, createUTCDate } from './date-from-array'; +import { daysInYear } from '../units/year'; +import { weekOfYear, weeksInYear, dayOfYearFromWeeks } from '../units/week-calendar-utils'; +import { YEAR, MONTH, DATE, HOUR, MINUTE, SECOND, MILLISECOND } from '../units/constants'; +import { createLocal } from './local'; +import defaults from '../utils/defaults'; +import getParsingFlags from './parsing-flags'; + +function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; +} + +// convert an array to a date. +// the array should mirror the parameters below +// note: all values past the year are optional and will default to the lowest possible value. +// [year, month, day , hour, minute, second, millisecond] +export function configFromArray (config) { + var i, date, input = [], currentDate, expectedWeekday, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear != null) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); + + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + + // check for mismatching day of week + if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { + getParsingFlags(config).weekdayMismatch = true; + } +} + +function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + var curWeek = weekOfYear(createLocal(), dow, doy); + + weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); + + // Default to current week. + week = defaults(w.w, curWeek.week); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to begining of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } +} diff --git a/nodejs/node_modules/moment/src/lib/create/from-object.js b/nodejs/node_modules/moment/src/lib/create/from-object.js new file mode 100755 index 0000000..c0bfe9f --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/from-object.js @@ -0,0 +1,16 @@ +import { normalizeObjectUnits } from '../units/aliases'; +import { configFromArray } from './from-array'; +import map from '../utils/map'; + +export function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); + + configFromArray(config); +} diff --git a/nodejs/node_modules/moment/src/lib/create/from-string-and-array.js b/nodejs/node_modules/moment/src/lib/create/from-string-and-array.js new file mode 100755 index 0000000..1d8a7a8 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/from-string-and-array.js @@ -0,0 +1,50 @@ +import { copyConfig } from '../moment/constructor'; +import { configFromStringAndFormat } from './from-string-and-format'; +import getParsingFlags from './parsing-flags'; +import { isValid } from './valid'; +import extend from '../utils/extend'; + +// date from string and array of format strings +export function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); +} diff --git a/nodejs/node_modules/moment/src/lib/create/from-string-and-format.js b/nodejs/node_modules/moment/src/lib/create/from-string-and-format.js new file mode 100755 index 0000000..ed921d5 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/from-string-and-format.js @@ -0,0 +1,113 @@ +import { configFromISO, configFromRFC2822 } from './from-string'; +import { configFromArray } from './from-array'; +import { getParseRegexForToken } from '../parse/regex'; +import { addTimeToArrayFromToken } from '../parse/token'; +import { expandFormat, formatTokenFunctions, formattingTokens } from '../format/format'; +import checkOverflow from './check-overflow'; +import { HOUR } from '../units/constants'; +import { hooks } from '../utils/hooks'; +import getParsingFlags from './parsing-flags'; + +// constant that refers to the ISO standard +hooks.ISO_8601 = function () {}; + +// constant that refers to the RFC 2822 form +hooks.RFC_2822 = function () {}; + +// date from string and format string +export function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; + } + + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); +} + + +function meridiemFixWrap (locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } +} diff --git a/nodejs/node_modules/moment/src/lib/create/from-string.js b/nodejs/node_modules/moment/src/lib/create/from-string.js new file mode 100755 index 0000000..c5ad56b --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/from-string.js @@ -0,0 +1,230 @@ +import { configFromStringAndFormat } from './from-string-and-format'; +import { createUTCDate } from './date-from-array'; +import { configFromArray } from './from-array'; +import { hooks } from '../utils/hooks'; +import { deprecate } from '../utils/deprecate'; +import getParsingFlags from './parsing-flags'; +import {defaultLocaleMonthsShort} from '../units/month'; +import {defaultLocaleWeekdaysShort} from '../units/day-of-week'; + +// iso 8601 regex +// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) +var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; +var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + +var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; + +var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] +]; + +// iso time formats and regexes +var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] +]; + +var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + +// date from iso format +export function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; + + if (match) { + getParsingFlags(config).iso = true; + + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } +} + +// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 +var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; + +function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; + + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } + + return result; +} + +function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; +} + +function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, ''); +} + +function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), + weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; + return false; + } + } + return true; +} + +var obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 +}; + +function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + // the only allowed military tz is Z + return 0; + } else { + var hm = parseInt(numOffset, 10); + var m = hm % 100, h = (hm - m) / 100; + return h * 60 + m; + } +} + +// date and time from ref 2822 format +export function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)); + if (match) { + var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); + if (!checkWeekday(match[1], parsedArray, config)) { + return; + } + + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); + + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + + getParsingFlags(config).rfc2822 = true; + } else { + config._isValid = false; + } +} + +// date from iso format or fallback +export function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); + + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } + + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + configFromRFC2822(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + // Final attempt, use Input Fallback + hooks.createFromInputFallback(config); +} + +hooks.createFromInputFallback = deprecate( + 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + + 'discouraged and will be removed in an upcoming major release. Please refer to ' + + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } +); diff --git a/nodejs/node_modules/moment/src/lib/create/local.js b/nodejs/node_modules/moment/src/lib/create/local.js new file mode 100755 index 0000000..88c1e26 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/local.js @@ -0,0 +1,5 @@ +import { createLocalOrUTC } from './from-anything'; + +export function createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); +} diff --git a/nodejs/node_modules/moment/src/lib/create/parsing-flags.js b/nodejs/node_modules/moment/src/lib/create/parsing-flags.js new file mode 100755 index 0000000..c47173f --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/parsing-flags.js @@ -0,0 +1,26 @@ +function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false, + parsedDateParts : [], + meridiem : null, + rfc2822 : false, + weekdayMismatch : false + }; +} + +export default function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; +} diff --git a/nodejs/node_modules/moment/src/lib/create/utc.js b/nodejs/node_modules/moment/src/lib/create/utc.js new file mode 100755 index 0000000..9613953 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/utc.js @@ -0,0 +1,5 @@ +import { createLocalOrUTC } from './from-anything'; + +export function createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); +} diff --git a/nodejs/node_modules/moment/src/lib/create/valid.js b/nodejs/node_modules/moment/src/lib/create/valid.js new file mode 100755 index 0000000..d13f12f --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/create/valid.js @@ -0,0 +1,50 @@ +import extend from '../utils/extend'; +import { createUTC } from './utc'; +import getParsingFlags from '../create/parsing-flags'; +import some from '../utils/some'; + +export function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + var isNowValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); + + if (m._strict) { + isNowValid = isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } + else { + return isNowValid; + } + } + return m._isValid; +} + +export function createInvalid (flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } + + return m; +} diff --git a/nodejs/node_modules/moment/src/lib/duration/abs.js b/nodejs/node_modules/moment/src/lib/duration/abs.js new file mode 100755 index 0000000..103a4cf --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/abs.js @@ -0,0 +1,18 @@ +var mathAbs = Math.abs; + +export function abs () { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; +} diff --git a/nodejs/node_modules/moment/src/lib/duration/add-subtract.js b/nodejs/node_modules/moment/src/lib/duration/add-subtract.js new file mode 100755 index 0000000..3b44e18 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/add-subtract.js @@ -0,0 +1,21 @@ +import { createDuration } from './create'; + +function addSubtract (duration, input, value, direction) { + var other = createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); +} + +// supports only 2.0-style add(1, 's') or add(duration) +export function add (input, value) { + return addSubtract(this, input, value, 1); +} + +// supports only 2.0-style subtract(1, 's') or subtract(duration) +export function subtract (input, value) { + return addSubtract(this, input, value, -1); +} diff --git a/nodejs/node_modules/moment/src/lib/duration/as.js b/nodejs/node_modules/moment/src/lib/duration/as.js new file mode 100755 index 0000000..122204a --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/as.js @@ -0,0 +1,61 @@ +import { daysToMonths, monthsToDays } from './bubble'; +import { normalizeUnits } from '../units/aliases'; +import toInt from '../utils/to-int'; + +export function as (units) { + if (!this.isValid()) { + return NaN; + } + var days; + var months; + var milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } +} + +// TODO: Use this.as('ms')? +export function valueOf () { + if (!this.isValid()) { + return NaN; + } + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); +} + +function makeAs (alias) { + return function () { + return this.as(alias); + }; +} + +export var asMilliseconds = makeAs('ms'); +export var asSeconds = makeAs('s'); +export var asMinutes = makeAs('m'); +export var asHours = makeAs('h'); +export var asDays = makeAs('d'); +export var asWeeks = makeAs('w'); +export var asMonths = makeAs('M'); +export var asYears = makeAs('y'); diff --git a/nodejs/node_modules/moment/src/lib/duration/bubble.js b/nodejs/node_modules/moment/src/lib/duration/bubble.js new file mode 100755 index 0000000..0c4a336 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/bubble.js @@ -0,0 +1,61 @@ +import absFloor from '../utils/abs-floor'; +import absCeil from '../utils/abs-ceil'; +import { createUTCDate } from '../create/date-from-array'; + +export function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; +} + +export function daysToMonths (days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; +} + +export function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; +} diff --git a/nodejs/node_modules/moment/src/lib/duration/clone.js b/nodejs/node_modules/moment/src/lib/duration/clone.js new file mode 100755 index 0000000..56008d1 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/clone.js @@ -0,0 +1,6 @@ +import { createDuration } from './create'; + +export function clone () { + return createDuration(this); +} + diff --git a/nodejs/node_modules/moment/src/lib/duration/constructor.js b/nodejs/node_modules/moment/src/lib/duration/constructor.js new file mode 100755 index 0000000..2d86d5e --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/constructor.js @@ -0,0 +1,44 @@ +import { normalizeObjectUnits } from '../units/aliases'; +import { getLocale } from '../locale/locales'; +import isDurationValid from './valid.js'; + +export function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + this._isValid = isDurationValid(normalizedInput); + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible to translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = getLocale(); + + this._bubble(); +} + +export function isDuration (obj) { + return obj instanceof Duration; +} diff --git a/nodejs/node_modules/moment/src/lib/duration/create.js b/nodejs/node_modules/moment/src/lib/duration/create.js new file mode 100755 index 0000000..3468148 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/create.js @@ -0,0 +1,122 @@ +import { Duration, isDuration } from './constructor'; +import isNumber from '../utils/is-number'; +import toInt from '../utils/to-int'; +import absRound from '../utils/abs-round'; +import hasOwnProp from '../utils/has-own-prop'; +import { DATE, HOUR, MINUTE, SECOND, MILLISECOND } from '../units/constants'; +import { cloneWithOffset } from '../units/offset'; +import { createLocal } from '../create/local'; +import { createInvalid as invalid } from './valid'; + +// ASP.NET json date format regex +var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; + +// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html +// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere +// and further modified to allow for strings containing both week and day +var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + +export function createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; + + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (isNumber(input)) { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; +} + +createDuration.fn = Duration.prototype; +createDuration.invalid = invalid; + +function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; +} + +function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; +} + +function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; +} diff --git a/nodejs/node_modules/moment/src/lib/duration/duration.js b/nodejs/node_modules/moment/src/lib/duration/duration.js new file mode 100755 index 0000000..528b568 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/duration.js @@ -0,0 +1,16 @@ +// Side effect imports +import './prototype'; + +import { createDuration } from './create'; +import { isDuration } from './constructor'; +import { + getSetRelativeTimeRounding, + getSetRelativeTimeThreshold +} from './humanize'; + +export { + createDuration, + isDuration, + getSetRelativeTimeRounding, + getSetRelativeTimeThreshold +}; diff --git a/nodejs/node_modules/moment/src/lib/duration/get.js b/nodejs/node_modules/moment/src/lib/duration/get.js new file mode 100755 index 0000000..8993e07 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/get.js @@ -0,0 +1,25 @@ +import { normalizeUnits } from '../units/aliases'; +import absFloor from '../utils/abs-floor'; + +export function get (units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + 's']() : NaN; +} + +function makeGetter(name) { + return function () { + return this.isValid() ? this._data[name] : NaN; + }; +} + +export var milliseconds = makeGetter('milliseconds'); +export var seconds = makeGetter('seconds'); +export var minutes = makeGetter('minutes'); +export var hours = makeGetter('hours'); +export var days = makeGetter('days'); +export var months = makeGetter('months'); +export var years = makeGetter('years'); + +export function weeks () { + return absFloor(this.days() / 7); +} diff --git a/nodejs/node_modules/moment/src/lib/duration/humanize.js b/nodejs/node_modules/moment/src/lib/duration/humanize.js new file mode 100755 index 0000000..454b01a --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/humanize.js @@ -0,0 +1,85 @@ +import { createDuration } from './create'; + +var round = Math.round; +var thresholds = { + ss: 44, // a few seconds to seconds + s : 45, // seconds to minute + m : 45, // minutes to hour + h : 22, // hours to day + d : 26, // days to month + M : 11 // months to year +}; + +// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize +function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); +} + +function relativeTime (posNegDuration, withoutSuffix, locale) { + var duration = createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); + + var a = seconds <= thresholds.ss && ['s', seconds] || + seconds < thresholds.s && ['ss', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); +} + +// This function allows you to set the rounding function for relative time strings +export function getSetRelativeTimeRounding (roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof(roundingFunction) === 'function') { + round = roundingFunction; + return true; + } + return false; +} + +// This function allows you to set a threshold for relative time strings +export function getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === 's') { + thresholds.ss = limit - 1; + } + return true; +} + +export function humanize (withSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var locale = this.localeData(); + var output = relativeTime(this, !withSuffix, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); +} diff --git a/nodejs/node_modules/moment/src/lib/duration/iso-string.js b/nodejs/node_modules/moment/src/lib/duration/iso-string.js new file mode 100755 index 0000000..419f363 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/iso-string.js @@ -0,0 +1,64 @@ +import absFloor from '../utils/abs-floor'; +var abs = Math.abs; + +function sign(x) { + return ((x > 0) - (x < 0)) || +x; +} + +export function toISOString() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var seconds = abs(this._milliseconds) / 1000; + var days = abs(this._days); + var months = abs(this._months); + var minutes, hours, years; + + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; + var total = this.asSeconds(); + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + var totalSign = total < 0 ? '-' : ''; + var ymSign = sign(this._months) !== sign(total) ? '-' : ''; + var daysSign = sign(this._days) !== sign(total) ? '-' : ''; + var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; + + return totalSign + 'P' + + (Y ? ymSign + Y + 'Y' : '') + + (M ? ymSign + M + 'M' : '') + + (D ? daysSign + D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? hmsSign + h + 'H' : '') + + (m ? hmsSign + m + 'M' : '') + + (s ? hmsSign + s + 'S' : ''); +} diff --git a/nodejs/node_modules/moment/src/lib/duration/prototype.js b/nodejs/node_modules/moment/src/lib/duration/prototype.js new file mode 100755 index 0000000..dd5470d --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/prototype.js @@ -0,0 +1,52 @@ +import { Duration } from './constructor'; + +var proto = Duration.prototype; + +import { abs } from './abs'; +import { add, subtract } from './add-subtract'; +import { as, asMilliseconds, asSeconds, asMinutes, asHours, asDays, asWeeks, asMonths, asYears, valueOf } from './as'; +import { bubble } from './bubble'; +import { clone } from './clone'; +import { get, milliseconds, seconds, minutes, hours, days, months, years, weeks } from './get'; +import { humanize } from './humanize'; +import { toISOString } from './iso-string'; +import { lang, locale, localeData } from '../moment/locale'; +import { isValid } from './valid'; + +proto.isValid = isValid; +proto.abs = abs; +proto.add = add; +proto.subtract = subtract; +proto.as = as; +proto.asMilliseconds = asMilliseconds; +proto.asSeconds = asSeconds; +proto.asMinutes = asMinutes; +proto.asHours = asHours; +proto.asDays = asDays; +proto.asWeeks = asWeeks; +proto.asMonths = asMonths; +proto.asYears = asYears; +proto.valueOf = valueOf; +proto._bubble = bubble; +proto.clone = clone; +proto.get = get; +proto.milliseconds = milliseconds; +proto.seconds = seconds; +proto.minutes = minutes; +proto.hours = hours; +proto.days = days; +proto.weeks = weeks; +proto.months = months; +proto.years = years; +proto.humanize = humanize; +proto.toISOString = toISOString; +proto.toString = toISOString; +proto.toJSON = toISOString; +proto.locale = locale; +proto.localeData = localeData; + +// Deprecations +import { deprecate } from '../utils/deprecate'; + +proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString); +proto.lang = lang; diff --git a/nodejs/node_modules/moment/src/lib/duration/valid.js b/nodejs/node_modules/moment/src/lib/duration/valid.js new file mode 100755 index 0000000..033fd5b --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/duration/valid.js @@ -0,0 +1,36 @@ +import toInt from '../utils/to-int'; +import indexOf from '../utils/index-of'; +import {Duration} from './constructor'; +import {createDuration} from './create'; + +var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; + +export default function isDurationValid(m) { + for (var key in m) { + if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + return false; + } + } + + var unitHasDecimal = false; + for (var i = 0; i < ordering.length; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; // only allow non-integers for smallest unit + } + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; + } + } + } + + return true; +} + +export function isValid() { + return this._isValid; +} + +export function createInvalid() { + return createDuration(NaN); +} diff --git a/nodejs/node_modules/moment/src/lib/format/format.js b/nodejs/node_modules/moment/src/lib/format/format.js new file mode 100755 index 0000000..03f5c58 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/format/format.js @@ -0,0 +1,92 @@ +import zeroFill from '../utils/zero-fill'; +import isFunction from '../utils/is-function'; + +export var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + +var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + +var formatFunctions = {}; + +export var formatTokenFunctions = {}; + +// token: 'M' +// padded: ['MM', 2] +// ordinal: 'Mo' +// callback: function () { this.month() + 1 } +export function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } +} + +function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); +} + +function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = '', i; + for (i = 0; i < length; i++) { + output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; + } + return output; + }; +} + +// format date using native date object +export function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + + return formatFunctions[format](m); +} + +export function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; +} diff --git a/nodejs/node_modules/moment/src/lib/locale/base-config.js b/nodejs/node_modules/moment/src/lib/locale/base-config.js new file mode 100755 index 0000000..d7a7c66 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/base-config.js @@ -0,0 +1,44 @@ +import { defaultCalendar } from './calendar'; +import { defaultLongDateFormat } from './formats'; +import { defaultInvalidDate } from './invalid'; +import { defaultOrdinal, defaultDayOfMonthOrdinalParse } from './ordinal'; +import { defaultRelativeTime } from './relative'; + +// months +import { + defaultLocaleMonths, + defaultLocaleMonthsShort, +} from '../units/month'; + +// week +import { defaultLocaleWeek } from '../units/week'; + +// weekdays +import { + defaultLocaleWeekdays, + defaultLocaleWeekdaysMin, + defaultLocaleWeekdaysShort, +} from '../units/day-of-week'; + +// meridiem +import { defaultLocaleMeridiemParse } from '../units/hour'; + +export var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, + + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, + + week: defaultLocaleWeek, + + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, + + meridiemParse: defaultLocaleMeridiemParse +}; diff --git a/nodejs/node_modules/moment/src/lib/locale/calendar.js b/nodejs/node_modules/moment/src/lib/locale/calendar.js new file mode 100755 index 0000000..f12214b --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/calendar.js @@ -0,0 +1,15 @@ +export var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' +}; + +import isFunction from '../utils/is-function'; + +export function calendar (key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; +} diff --git a/nodejs/node_modules/moment/src/lib/locale/constructor.js b/nodejs/node_modules/moment/src/lib/locale/constructor.js new file mode 100755 index 0000000..c32b73e --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/constructor.js @@ -0,0 +1,5 @@ +export function Locale(config) { + if (config != null) { + this.set(config); + } +} diff --git a/nodejs/node_modules/moment/src/lib/locale/en.js b/nodejs/node_modules/moment/src/lib/locale/en.js new file mode 100755 index 0000000..4a7d250 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/en.js @@ -0,0 +1,15 @@ +import './prototype'; +import { getSetGlobalLocale } from './locales'; +import toInt from '../utils/to-int'; + +getSetGlobalLocale('en', { + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } +}); diff --git a/nodejs/node_modules/moment/src/lib/locale/formats.js b/nodejs/node_modules/moment/src/lib/locale/formats.js new file mode 100755 index 0000000..6d83b03 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/formats.js @@ -0,0 +1,23 @@ +export var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' +}; + +export function longDateFormat (key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; + } + + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + + return this._longDateFormat[key]; +} diff --git a/nodejs/node_modules/moment/src/lib/locale/invalid.js b/nodejs/node_modules/moment/src/lib/locale/invalid.js new file mode 100755 index 0000000..e909633 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/invalid.js @@ -0,0 +1,5 @@ +export var defaultInvalidDate = 'Invalid date'; + +export function invalidDate () { + return this._invalidDate; +} diff --git a/nodejs/node_modules/moment/src/lib/locale/lists.js b/nodejs/node_modules/moment/src/lib/locale/lists.js new file mode 100755 index 0000000..42f7572 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/lists.js @@ -0,0 +1,93 @@ +import isNumber from '../utils/is-number'; +import { getLocale } from './locales'; +import { createUTC } from '../create/utc'; + +function get (format, index, field, setter) { + var locale = getLocale(); + var utc = createUTC().set(setter, index); + return locale[field](utc, format); +} + +function listMonthsImpl (format, index, field) { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return get(format, index, field, 'month'); + } + + var i; + var out = []; + for (i = 0; i < 12; i++) { + out[i] = get(format, i, field, 'month'); + } + return out; +} + +// () +// (5) +// (fmt, 5) +// (fmt) +// (true) +// (true, 5) +// (true, fmt, 5) +// (true, fmt) +function listWeekdaysImpl (localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; + + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } + + var locale = getLocale(), + shift = localeSorted ? locale._week.dow : 0; + + if (index != null) { + return get(format, (index + shift) % 7, field, 'day'); + } + + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = get(format, (i + shift) % 7, field, 'day'); + } + return out; +} + +export function listMonths (format, index) { + return listMonthsImpl(format, index, 'months'); +} + +export function listMonthsShort (format, index) { + return listMonthsImpl(format, index, 'monthsShort'); +} + +export function listWeekdays (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); +} + +export function listWeekdaysShort (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); +} + +export function listWeekdaysMin (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); +} diff --git a/nodejs/node_modules/moment/src/lib/locale/locale.js b/nodejs/node_modules/moment/src/lib/locale/locale.js new file mode 100755 index 0000000..ac9cebf --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/locale.js @@ -0,0 +1,39 @@ +// Side effect imports +import './prototype'; + +import { + getSetGlobalLocale, + defineLocale, + updateLocale, + getLocale, + listLocales +} from './locales'; + +import { + listMonths, + listMonthsShort, + listWeekdays, + listWeekdaysShort, + listWeekdaysMin +} from './lists'; + +export { + getSetGlobalLocale, + defineLocale, + updateLocale, + getLocale, + listLocales, + listMonths, + listMonthsShort, + listWeekdays, + listWeekdaysShort, + listWeekdaysMin +}; + +import { deprecate } from '../utils/deprecate'; +import { hooks } from '../utils/hooks'; + +hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); +hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); + +import './en'; diff --git a/nodejs/node_modules/moment/src/lib/locale/locales.js b/nodejs/node_modules/moment/src/lib/locale/locales.js new file mode 100755 index 0000000..af28bfe --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/locales.js @@ -0,0 +1,197 @@ +import isArray from '../utils/is-array'; +import hasOwnProp from '../utils/has-own-prop'; +import isUndefined from '../utils/is-undefined'; +import compareArrays from '../utils/compare-arrays'; +import { deprecateSimple } from '../utils/deprecate'; +import { mergeConfigs } from './set'; +import { Locale } from './constructor'; +import keys from '../utils/keys'; + +import { baseConfig } from './base-config'; + +// internal storage for locale config files +var locales = {}; +var localeFamilies = {}; +var globalLocale; + +function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; +} + +// pick the locale from the array +// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each +// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root +function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return globalLocale; +} + +function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && (typeof module !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + var aliasedRequire = require; + aliasedRequire('./locale/' + name); + getSetGlobalLocale(oldLocale); + } catch (e) {} + } + return locales[name]; +} + +// This function will load locale and then set the global locale. If +// no arguments are passed in, it will simply return the current global +// locale key. +export function getSetGlobalLocale (key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } + else { + data = defineLocale(key, values); + } + + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + else { + if ((typeof console !== 'undefined') && console.warn) { + //warn user if arguments are passed but the locale could not be set + console.warn('Locale ' + key + ' not found. Did you forget to load it?'); + } + } + } + + return globalLocale._abbr; +} + +export function defineLocale (name, config) { + if (config !== null) { + var locale, parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + locale = loadLocale(config.parentLocale); + if (locale != null) { + parentConfig = locale._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name: name, + config: config + }); + return null; + } + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); + + if (localeFamilies[name]) { + localeFamilies[name].forEach(function (x) { + defineLocale(x.name, x.config); + }); + } + + // backwards compat for now: also set the locale + // make sure we set the locale AFTER all child locales have been + // created, so we won't end up with the child locale set. + getSetGlobalLocale(name); + + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } +} + +export function updateLocale(name, config) { + if (config != null) { + var locale, tmpLocale, parentConfig = baseConfig; + // MERGE + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + + // backwards compat for now: also set the locale + getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; +} + +// returns locale data +export function getLocale (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); +} + +export function listLocales() { + return keys(locales); +} diff --git a/nodejs/node_modules/moment/src/lib/locale/ordinal.js b/nodejs/node_modules/moment/src/lib/locale/ordinal.js new file mode 100755 index 0000000..e2efc05 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/ordinal.js @@ -0,0 +1,7 @@ +export var defaultOrdinal = '%d'; +export var defaultDayOfMonthOrdinalParse = /\d{1,2}/; + +export function ordinal (number) { + return this._ordinal.replace('%d', number); +} + diff --git a/nodejs/node_modules/moment/src/lib/locale/pre-post-format.js b/nodejs/node_modules/moment/src/lib/locale/pre-post-format.js new file mode 100755 index 0000000..10ed205 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/pre-post-format.js @@ -0,0 +1,3 @@ +export function preParsePostFormat (string) { + return string; +} diff --git a/nodejs/node_modules/moment/src/lib/locale/prototype.js b/nodejs/node_modules/moment/src/lib/locale/prototype.js new file mode 100755 index 0000000..24eef89 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/prototype.js @@ -0,0 +1,69 @@ +import { Locale } from './constructor'; + +var proto = Locale.prototype; + +import { calendar } from './calendar'; +import { longDateFormat } from './formats'; +import { invalidDate } from './invalid'; +import { ordinal } from './ordinal'; +import { preParsePostFormat } from './pre-post-format'; +import { relativeTime, pastFuture } from './relative'; +import { set } from './set'; + +proto.calendar = calendar; +proto.longDateFormat = longDateFormat; +proto.invalidDate = invalidDate; +proto.ordinal = ordinal; +proto.preparse = preParsePostFormat; +proto.postformat = preParsePostFormat; +proto.relativeTime = relativeTime; +proto.pastFuture = pastFuture; +proto.set = set; + +// Month +import { + localeMonthsParse, + localeMonths, + localeMonthsShort, + monthsRegex, + monthsShortRegex +} from '../units/month'; + +proto.months = localeMonths; +proto.monthsShort = localeMonthsShort; +proto.monthsParse = localeMonthsParse; +proto.monthsRegex = monthsRegex; +proto.monthsShortRegex = monthsShortRegex; + +// Week +import { localeWeek, localeFirstDayOfYear, localeFirstDayOfWeek } from '../units/week'; +proto.week = localeWeek; +proto.firstDayOfYear = localeFirstDayOfYear; +proto.firstDayOfWeek = localeFirstDayOfWeek; + +// Day of Week +import { + localeWeekdaysParse, + localeWeekdays, + localeWeekdaysMin, + localeWeekdaysShort, + + weekdaysRegex, + weekdaysShortRegex, + weekdaysMinRegex +} from '../units/day-of-week'; + +proto.weekdays = localeWeekdays; +proto.weekdaysMin = localeWeekdaysMin; +proto.weekdaysShort = localeWeekdaysShort; +proto.weekdaysParse = localeWeekdaysParse; + +proto.weekdaysRegex = weekdaysRegex; +proto.weekdaysShortRegex = weekdaysShortRegex; +proto.weekdaysMinRegex = weekdaysMinRegex; + +// Hours +import { localeIsPM, localeMeridiem } from '../units/hour'; + +proto.isPM = localeIsPM; +proto.meridiem = localeMeridiem; diff --git a/nodejs/node_modules/moment/src/lib/locale/relative.js b/nodejs/node_modules/moment/src/lib/locale/relative.js new file mode 100755 index 0000000..431466b --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/relative.js @@ -0,0 +1,30 @@ +export var defaultRelativeTime = { + 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' +}; + +import isFunction from '../utils/is-function'; + +export function relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); +} + +export function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); +} diff --git a/nodejs/node_modules/moment/src/lib/locale/set.js b/nodejs/node_modules/moment/src/lib/locale/set.js new file mode 100755 index 0000000..c63d5ad --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/locale/set.js @@ -0,0 +1,49 @@ +import isFunction from '../utils/is-function'; +import extend from '../utils/extend'; +import isObject from '../utils/is-object'; +import hasOwnProp from '../utils/has-own-prop'; + +export function set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. + // TODO: Remove "ordinalParse" fallback in next major release. + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + + '|' + (/\d{1,2}/).source); +} + +export function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop])) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; +} diff --git a/nodejs/node_modules/moment/src/lib/moment/add-subtract.js b/nodejs/node_modules/moment/src/lib/moment/add-subtract.js new file mode 100755 index 0000000..e758b5d --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/add-subtract.js @@ -0,0 +1,55 @@ +import { get, set } from './get-set'; +import { setMonth } from '../units/month'; +import { createDuration } from '../duration/create'; +import { deprecateSimple } from '../utils/deprecate'; +import { hooks } from '../utils/hooks'; +import absRound from '../utils/abs-round'; + + +// TODO: remove 'name' arg after deprecation is removed +function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; + }; +} + +export function addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); + + if (!mom.isValid()) { + // No op + return; + } + + updateOffset = updateOffset == null ? true : updateOffset; + + if (months) { + setMonth(mom, get(mom, 'Month') + months * isAdding); + } + if (days) { + set(mom, 'Date', get(mom, 'Date') + days * isAdding); + } + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days || months); + } +} + +export var add = createAdder(1, 'add'); +export var subtract = createAdder(-1, 'subtract'); + diff --git a/nodejs/node_modules/moment/src/lib/moment/calendar.js b/nodejs/node_modules/moment/src/lib/moment/calendar.js new file mode 100755 index 0000000..4b5725c --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/calendar.js @@ -0,0 +1,26 @@ +import { createLocal } from '../create/local'; +import { cloneWithOffset } from '../units/offset'; +import isFunction from '../utils/is-function'; +import { hooks } from '../utils/hooks'; + +export function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; +} + +export function calendar (time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = hooks.calendarFormat(this, sod) || 'sameElse'; + + var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, createLocal(now))); +} diff --git a/nodejs/node_modules/moment/src/lib/moment/clone.js b/nodejs/node_modules/moment/src/lib/moment/clone.js new file mode 100755 index 0000000..d96b328 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/clone.js @@ -0,0 +1,5 @@ +import { Moment } from './constructor'; + +export function clone () { + return new Moment(this); +} diff --git a/nodejs/node_modules/moment/src/lib/moment/compare.js b/nodejs/node_modules/moment/src/lib/moment/compare.js new file mode 100755 index 0000000..b26bac6 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/compare.js @@ -0,0 +1,59 @@ +import { isMoment } from './constructor'; +import { normalizeUnits } from '../units/aliases'; +import { createLocal } from '../create/local'; +import isUndefined from '../utils/is-undefined'; + +export function isAfter (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } +} + +export function isBefore (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } +} + +export function isBetween (from, to, units, inclusivity) { + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && + (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); +} + +export function isSame (input, units) { + var localInput = isMoment(input) ? input : createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + } +} + +export function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input,units); +} + +export function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input,units); +} diff --git a/nodejs/node_modules/moment/src/lib/moment/constructor.js b/nodejs/node_modules/moment/src/lib/moment/constructor.js new file mode 100755 index 0000000..bc53f81 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/constructor.js @@ -0,0 +1,77 @@ +import { hooks } from '../utils/hooks'; +import hasOwnProp from '../utils/has-own-prop'; +import isUndefined from '../utils/is-undefined'; +import getParsingFlags from '../create/parsing-flags'; + +// Plugins that add properties should also add the key here (null value), +// so we can properly clone ourselves. +var momentProperties = hooks.momentProperties = []; + +export function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i = 0; i < momentProperties.length; i++) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } + + return to; +} + +var updateInProgress = false; + +// Moment prototype object +export function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = new Date(NaN); + } + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } +} + +export function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); +} diff --git a/nodejs/node_modules/moment/src/lib/moment/creation-data.js b/nodejs/node_modules/moment/src/lib/moment/creation-data.js new file mode 100755 index 0000000..7e2d69a --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/creation-data.js @@ -0,0 +1,9 @@ +export function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; +} diff --git a/nodejs/node_modules/moment/src/lib/moment/diff.js b/nodejs/node_modules/moment/src/lib/moment/diff.js new file mode 100755 index 0000000..85254df --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/diff.js @@ -0,0 +1,58 @@ +import absFloor from '../utils/abs-floor'; +import { cloneWithOffset } from '../units/offset'; +import { normalizeUnits } from '../units/aliases'; + +export function diff (input, units, asFloat) { + var that, + zoneDelta, + delta, output; + + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + + units = normalizeUnits(units); + + switch (units) { + case 'year': output = monthDiff(this, that) / 12; break; + case 'month': output = monthDiff(this, that); break; + case 'quarter': output = monthDiff(this, that) / 3; break; + case 'second': output = (this - that) / 1e3; break; // 1000 + case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 + case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 + case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst + case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst + default: output = this - that; + } + + return asFloat ? output : absFloor(output); +} + +function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; +} diff --git a/nodejs/node_modules/moment/src/lib/moment/format.js b/nodejs/node_modules/moment/src/lib/moment/format.js new file mode 100755 index 0000000..9544f51 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/format.js @@ -0,0 +1,62 @@ +import { formatMoment } from '../format/format'; +import { hooks } from '../utils/hooks'; +import isFunction from '../utils/is-function'; + +hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; +hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; + +export function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); +} + +export function toISOString(keepOffset) { + if (!this.isValid()) { + return null; + } + var utc = keepOffset !== true; + var m = utc ? this.clone().utc() : this; + if (m.year() < 0 || m.year() > 9999) { + return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + if (utc) { + return this.toDate().toISOString(); + } else { + return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + } + } + return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); +} + +/** + * Return a human readable representation of a moment that can + * also be evaluated to get a new moment which is the same + * + * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects + */ +export function inspect () { + if (!this.isValid()) { + return 'moment.invalid(/* ' + this._i + ' */)'; + } + var func = 'moment'; + var zone = ''; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; + zone = 'Z'; + } + var prefix = '[' + func + '("]'; + var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; + var datetime = '-MM-DD[T]HH:mm:ss.SSS'; + var suffix = zone + '[")]'; + + return this.format(prefix + year + datetime + suffix); +} + +export function format (inputString) { + if (!inputString) { + inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); +} diff --git a/nodejs/node_modules/moment/src/lib/moment/from.js b/nodejs/node_modules/moment/src/lib/moment/from.js new file mode 100755 index 0000000..4fbd03e --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/from.js @@ -0,0 +1,17 @@ +import { createDuration } from '../duration/create'; +import { createLocal } from '../create/local'; +import { isMoment } from '../moment/constructor'; + +export function from (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } +} + +export function fromNow (withoutSuffix) { + return this.from(createLocal(), withoutSuffix); +} diff --git a/nodejs/node_modules/moment/src/lib/moment/get-set.js b/nodejs/node_modules/moment/src/lib/moment/get-set.js new file mode 100755 index 0000000..f5035f1 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/get-set.js @@ -0,0 +1,61 @@ +import { normalizeUnits, normalizeObjectUnits } from '../units/aliases'; +import { getPrioritizedUnits } from '../units/priorities'; +import { hooks } from '../utils/hooks'; +import isFunction from '../utils/is-function'; +import { daysInMonth } from '../units/month'; +import { isLeapYear } from '../units/year'; + +export function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + set(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; +} + +export function get (mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; +} + +export function set (mom, unit, value) { + if (mom.isValid() && !isNaN(value)) { + if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); + } + else { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } +} + +// MOMENTS + +export function stringGet (units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; +} + + +export function stringSet (units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units); + for (var i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; +} diff --git a/nodejs/node_modules/moment/src/lib/moment/locale.js b/nodejs/node_modules/moment/src/lib/moment/locale.js new file mode 100755 index 0000000..fb46e65 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/locale.js @@ -0,0 +1,34 @@ +import { getLocale } from '../locale/locales'; +import { deprecate } from '../utils/deprecate'; + +// If passed a locale key, it will set the locale for this +// instance. Otherwise, it will return the locale configuration +// variables for this instance. +export function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } +} + +export var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } +); + +export function localeData () { + return this._locale; +} diff --git a/nodejs/node_modules/moment/src/lib/moment/min-max.js b/nodejs/node_modules/moment/src/lib/moment/min-max.js new file mode 100755 index 0000000..d76920a --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/min-max.js @@ -0,0 +1,63 @@ +import { deprecate } from '../utils/deprecate'; +import isArray from '../utils/is-array'; +import { createLocal } from '../create/local'; +import { createInvalid } from '../create/valid'; + +export var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } +); + +export var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } +); + +// Pick a moment m from moments so that m[fn](other) is true for all +// other. This relies on the function fn to be transitive. +// +// moments should either be an array of moment objects or an array, whose +// first element is an array of moment objects. +function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; +} + +// TODO: Use [].sort instead? +export function min () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); +} + +export function max () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); +} diff --git a/nodejs/node_modules/moment/src/lib/moment/moment.js b/nodejs/node_modules/moment/src/lib/moment/moment.js new file mode 100755 index 0000000..12eb5f1 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/moment.js @@ -0,0 +1,28 @@ +import { createLocal } from '../create/local'; +import { createUTC } from '../create/utc'; +import { createInvalid } from '../create/valid'; +import { isMoment } from './constructor'; +import { min, max } from './min-max'; +import { now } from './now'; +import momentPrototype from './prototype'; + +function createUnix (input) { + return createLocal(input * 1000); +} + +function createInZone () { + return createLocal.apply(null, arguments).parseZone(); +} + +export { + now, + min, + max, + isMoment, + createUTC, + createUnix, + createLocal, + createInZone, + createInvalid, + momentPrototype +}; diff --git a/nodejs/node_modules/moment/src/lib/moment/now.js b/nodejs/node_modules/moment/src/lib/moment/now.js new file mode 100755 index 0000000..0f4d0ae --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/now.js @@ -0,0 +1,3 @@ +export var now = function () { + return Date.now ? Date.now() : +(new Date()); +}; diff --git a/nodejs/node_modules/moment/src/lib/moment/prototype.js b/nodejs/node_modules/moment/src/lib/moment/prototype.js new file mode 100755 index 0000000..bd8fff7 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/prototype.js @@ -0,0 +1,150 @@ +import { Moment } from './constructor'; + +var proto = Moment.prototype; + +import { add, subtract } from './add-subtract'; +import { calendar, getCalendarFormat } from './calendar'; +import { clone } from './clone'; +import { isBefore, isBetween, isSame, isAfter, isSameOrAfter, isSameOrBefore } from './compare'; +import { diff } from './diff'; +import { format, toString, toISOString, inspect } from './format'; +import { from, fromNow } from './from'; +import { to, toNow } from './to'; +import { stringGet, stringSet } from './get-set'; +import { locale, localeData, lang } from './locale'; +import { prototypeMin, prototypeMax } from './min-max'; +import { startOf, endOf } from './start-end-of'; +import { valueOf, toDate, toArray, toObject, toJSON, unix } from './to-type'; +import { isValid, parsingFlags, invalidAt } from './valid'; +import { creationData } from './creation-data'; + +proto.add = add; +proto.calendar = calendar; +proto.clone = clone; +proto.diff = diff; +proto.endOf = endOf; +proto.format = format; +proto.from = from; +proto.fromNow = fromNow; +proto.to = to; +proto.toNow = toNow; +proto.get = stringGet; +proto.invalidAt = invalidAt; +proto.isAfter = isAfter; +proto.isBefore = isBefore; +proto.isBetween = isBetween; +proto.isSame = isSame; +proto.isSameOrAfter = isSameOrAfter; +proto.isSameOrBefore = isSameOrBefore; +proto.isValid = isValid; +proto.lang = lang; +proto.locale = locale; +proto.localeData = localeData; +proto.max = prototypeMax; +proto.min = prototypeMin; +proto.parsingFlags = parsingFlags; +proto.set = stringSet; +proto.startOf = startOf; +proto.subtract = subtract; +proto.toArray = toArray; +proto.toObject = toObject; +proto.toDate = toDate; +proto.toISOString = toISOString; +proto.inspect = inspect; +proto.toJSON = toJSON; +proto.toString = toString; +proto.unix = unix; +proto.valueOf = valueOf; +proto.creationData = creationData; + +// Year +import { getSetYear, getIsLeapYear } from '../units/year'; +proto.year = getSetYear; +proto.isLeapYear = getIsLeapYear; + +// Week Year +import { getSetWeekYear, getSetISOWeekYear, getWeeksInYear, getISOWeeksInYear } from '../units/week-year'; +proto.weekYear = getSetWeekYear; +proto.isoWeekYear = getSetISOWeekYear; + +// Quarter +import { getSetQuarter } from '../units/quarter'; +proto.quarter = proto.quarters = getSetQuarter; + +// Month +import { getSetMonth, getDaysInMonth } from '../units/month'; +proto.month = getSetMonth; +proto.daysInMonth = getDaysInMonth; + +// Week +import { getSetWeek, getSetISOWeek } from '../units/week'; +proto.week = proto.weeks = getSetWeek; +proto.isoWeek = proto.isoWeeks = getSetISOWeek; +proto.weeksInYear = getWeeksInYear; +proto.isoWeeksInYear = getISOWeeksInYear; + +// Day +import { getSetDayOfMonth } from '../units/day-of-month'; +import { getSetDayOfWeek, getSetISODayOfWeek, getSetLocaleDayOfWeek } from '../units/day-of-week'; +import { getSetDayOfYear } from '../units/day-of-year'; +proto.date = getSetDayOfMonth; +proto.day = proto.days = getSetDayOfWeek; +proto.weekday = getSetLocaleDayOfWeek; +proto.isoWeekday = getSetISODayOfWeek; +proto.dayOfYear = getSetDayOfYear; + +// Hour +import { getSetHour } from '../units/hour'; +proto.hour = proto.hours = getSetHour; + +// Minute +import { getSetMinute } from '../units/minute'; +proto.minute = proto.minutes = getSetMinute; + +// Second +import { getSetSecond } from '../units/second'; +proto.second = proto.seconds = getSetSecond; + +// Millisecond +import { getSetMillisecond } from '../units/millisecond'; +proto.millisecond = proto.milliseconds = getSetMillisecond; + +// Offset +import { + getSetOffset, + setOffsetToUTC, + setOffsetToLocal, + setOffsetToParsedOffset, + hasAlignedHourOffset, + isDaylightSavingTime, + isDaylightSavingTimeShifted, + getSetZone, + isLocal, + isUtcOffset, + isUtc +} from '../units/offset'; +proto.utcOffset = getSetOffset; +proto.utc = setOffsetToUTC; +proto.local = setOffsetToLocal; +proto.parseZone = setOffsetToParsedOffset; +proto.hasAlignedHourOffset = hasAlignedHourOffset; +proto.isDST = isDaylightSavingTime; +proto.isLocal = isLocal; +proto.isUtcOffset = isUtcOffset; +proto.isUtc = isUtc; +proto.isUTC = isUtc; + +// Timezone +import { getZoneAbbr, getZoneName } from '../units/timezone'; +proto.zoneAbbr = getZoneAbbr; +proto.zoneName = getZoneName; + +// Deprecations +import { deprecate } from '../utils/deprecate'; +proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); +proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); +proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); +proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); +proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); + +export default proto; diff --git a/nodejs/node_modules/moment/src/lib/moment/start-end-of.js b/nodejs/node_modules/moment/src/lib/moment/start-end-of.js new file mode 100755 index 0000000..02f9824 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/start-end-of.js @@ -0,0 +1,59 @@ +import { normalizeUnits } from '../units/aliases'; + +export function startOf (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + case 'date': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } + if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; +} + +export function endOf (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + + // 'date' is an alias for 'day', so it should be considered as such. + if (units === 'date') { + units = 'day'; + } + + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); +} diff --git a/nodejs/node_modules/moment/src/lib/moment/to-type.js b/nodejs/node_modules/moment/src/lib/moment/to-type.js new file mode 100755 index 0000000..a990dd2 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/to-type.js @@ -0,0 +1,34 @@ +export function valueOf () { + return this._d.valueOf() - ((this._offset || 0) * 60000); +} + +export function unix () { + return Math.floor(this.valueOf() / 1000); +} + +export function toDate () { + return new Date(this.valueOf()); +} + +export function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; +} + +export function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; +} + +export function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; +} diff --git a/nodejs/node_modules/moment/src/lib/moment/to.js b/nodejs/node_modules/moment/src/lib/moment/to.js new file mode 100755 index 0000000..7ad667e --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/to.js @@ -0,0 +1,17 @@ +import { createDuration } from '../duration/create'; +import { createLocal } from '../create/local'; +import { isMoment } from '../moment/constructor'; + +export function to (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } +} + +export function toNow (withoutSuffix) { + return this.to(createLocal(), withoutSuffix); +} diff --git a/nodejs/node_modules/moment/src/lib/moment/valid.js b/nodejs/node_modules/moment/src/lib/moment/valid.js new file mode 100755 index 0000000..6c00742 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/moment/valid.js @@ -0,0 +1,15 @@ +import { isValid as _isValid } from '../create/valid'; +import extend from '../utils/extend'; +import getParsingFlags from '../create/parsing-flags'; + +export function isValid () { + return _isValid(this); +} + +export function parsingFlags () { + return extend({}, getParsingFlags(this)); +} + +export function invalidAt () { + return getParsingFlags(this).overflow; +} diff --git a/nodejs/node_modules/moment/src/lib/parse/regex.js b/nodejs/node_modules/moment/src/lib/parse/regex.js new file mode 100755 index 0000000..4b86f34 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/parse/regex.js @@ -0,0 +1,54 @@ +export var match1 = /\d/; // 0 - 9 +export var match2 = /\d\d/; // 00 - 99 +export var match3 = /\d{3}/; // 000 - 999 +export var match4 = /\d{4}/; // 0000 - 9999 +export var match6 = /[+-]?\d{6}/; // -999999 - 999999 +export var match1to2 = /\d\d?/; // 0 - 99 +export var match3to4 = /\d\d\d\d?/; // 999 - 9999 +export var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 +export var match1to3 = /\d{1,3}/; // 0 - 999 +export var match1to4 = /\d{1,4}/; // 0 - 9999 +export var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 + +export var matchUnsigned = /\d+/; // 0 - inf +export var matchSigned = /[+-]?\d+/; // -inf - inf + +export var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z +export var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z + +export var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 + +// any word (or two) characters or numbers including two/three word month in arabic. +// includes scottish gaelic two word and hyphenated months +export var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; + + +import hasOwnProp from '../utils/has-own-prop'; +import isFunction from '../utils/is-function'; + +var regexes = {}; + +export function addRegexToken (token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; +} + +export function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); +} + +// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript +function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); +} + +export function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); +} diff --git a/nodejs/node_modules/moment/src/lib/parse/token.js b/nodejs/node_modules/moment/src/lib/parse/token.js new file mode 100755 index 0000000..24b4474 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/parse/token.js @@ -0,0 +1,33 @@ +import hasOwnProp from '../utils/has-own-prop'; +import isNumber from '../utils/is-number'; +import toInt from '../utils/to-int'; + +var tokens = {}; + +export function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (isNumber(callback)) { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } +} + +export function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); +} + +export function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } +} diff --git a/nodejs/node_modules/moment/src/lib/units/aliases.js b/nodejs/node_modules/moment/src/lib/units/aliases.js new file mode 100755 index 0000000..0d8b88a --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/aliases.js @@ -0,0 +1,30 @@ +import hasOwnProp from '../utils/has-own-prop'; + +var aliases = {}; + +export function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; +} + +export function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; +} + +export function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; +} + diff --git a/nodejs/node_modules/moment/src/lib/units/constants.js b/nodejs/node_modules/moment/src/lib/units/constants.js new file mode 100755 index 0000000..70bf1b2 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/constants.js @@ -0,0 +1,9 @@ +export var YEAR = 0; +export var MONTH = 1; +export var DATE = 2; +export var HOUR = 3; +export var MINUTE = 4; +export var SECOND = 5; +export var MILLISECOND = 6; +export var WEEK = 7; +export var WEEKDAY = 8; diff --git a/nodejs/node_modules/moment/src/lib/units/day-of-month.js b/nodejs/node_modules/moment/src/lib/units/day-of-month.js new file mode 100755 index 0000000..cbd1e40 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/day-of-month.js @@ -0,0 +1,39 @@ +import { makeGetSet } from '../moment/get-set'; +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match1to2, match2 } from '../parse/regex'; +import { addParseToken } from '../parse/token'; +import { DATE } from './constants'; +import toInt from '../utils/to-int'; + +// FORMATTING + +addFormatToken('D', ['DD', 2], 'Do', 'date'); + +// ALIASES + +addUnitAlias('date', 'D'); + +// PRIORITY +addUnitPriority('date', 9); + +// PARSING + +addRegexToken('D', match1to2); +addRegexToken('DD', match1to2, match2); +addRegexToken('Do', function (isStrict, locale) { + // TODO: Remove "ordinalParse" fallback in next major release. + return isStrict ? + (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : + locale._dayOfMonthOrdinalParseLenient; +}); + +addParseToken(['D', 'DD'], DATE); +addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0]); +}); + +// MOMENTS + +export var getSetDayOfMonth = makeGetSet('Date', true); diff --git a/nodejs/node_modules/moment/src/lib/units/day-of-week.js b/nodejs/node_modules/moment/src/lib/units/day-of-week.js new file mode 100755 index 0000000..438160b --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/day-of-week.js @@ -0,0 +1,364 @@ +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match1to2, matchWord, regexEscape } from '../parse/regex'; +import { addWeekParseToken } from '../parse/token'; +import toInt from '../utils/to-int'; +import isArray from '../utils/is-array'; +import indexOf from '../utils/index-of'; +import hasOwnProp from '../utils/has-own-prop'; +import { createUTC } from '../create/utc'; +import getParsingFlags from '../create/parsing-flags'; + +// FORMATTING + +addFormatToken('d', 0, 'do', 'day'); + +addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); +}); + +addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); +}); + +addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); +}); + +addFormatToken('e', 0, 0, 'weekday'); +addFormatToken('E', 0, 0, 'isoWeekday'); + +// ALIASES + +addUnitAlias('day', 'd'); +addUnitAlias('weekday', 'e'); +addUnitAlias('isoWeekday', 'E'); + +// PRIORITY +addUnitPriority('day', 11); +addUnitPriority('weekday', 11); +addUnitPriority('isoWeekday', 11); + +// PARSING + +addRegexToken('d', match1to2); +addRegexToken('e', match1to2); +addRegexToken('E', match1to2); +addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); +}); +addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); +}); +addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); +}); + +addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } +}); + +addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); +}); + +// HELPERS + +function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; +} + +function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; +} + +// LOCALES + +export var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); +export function localeWeekdays (m, format) { + if (!m) { + return isArray(this._weekdays) ? this._weekdays : + this._weekdays['standalone']; + } + return isArray(this._weekdays) ? this._weekdays[m.day()] : + this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; +} + +export var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); +export function localeWeekdaysShort (m) { + return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; +} + +export var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); +export function localeWeekdaysMin (m) { + return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; +} + +function handleStrictParse(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + + for (i = 0; i < 7; ++i) { + mom = createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } +} + +export function localeWeekdaysParse (weekdayName, format, strict) { + var i, mom, regex; + + if (this._weekdaysParseExact) { + return handleStrictParse.call(this, weekdayName, format, strict); + } + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + + mom = createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } +} + +// MOMENTS + +export function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } +} + +export function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); +} + +export function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } +} + +var defaultWeekdaysRegex = matchWord; +export function weekdaysRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } +} + +var defaultWeekdaysShortRegex = matchWord; +export function weekdaysShortRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } +} + +var defaultWeekdaysMinRegex = matchWord; +export function weekdaysMinRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } +} + + +function computeWeekdaysParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); +} diff --git a/nodejs/node_modules/moment/src/lib/units/day-of-year.js b/nodejs/node_modules/moment/src/lib/units/day-of-year.js new file mode 100755 index 0000000..6fe931c --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/day-of-year.js @@ -0,0 +1,36 @@ +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match3, match1to3 } from '../parse/regex'; +import { daysInYear } from './year'; +import { createUTCDate } from '../create/date-from-array'; +import { addParseToken } from '../parse/token'; +import toInt from '../utils/to-int'; + +// FORMATTING + +addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + +// ALIASES + +addUnitAlias('dayOfYear', 'DDD'); + +// PRIORITY +addUnitPriority('dayOfYear', 4); + +// PARSING + +addRegexToken('DDD', match1to3); +addRegexToken('DDDD', match3); +addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); +}); + +// HELPERS + +// MOMENTS + +export function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); +} diff --git a/nodejs/node_modules/moment/src/lib/units/hour.js b/nodejs/node_modules/moment/src/lib/units/hour.js new file mode 100755 index 0000000..d717a79 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/hour.js @@ -0,0 +1,144 @@ +import { makeGetSet } from '../moment/get-set'; +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match1to2, match2, match3to4, match5to6 } from '../parse/regex'; +import { addParseToken } from '../parse/token'; +import { HOUR, MINUTE, SECOND } from './constants'; +import toInt from '../utils/to-int'; +import zeroFill from '../utils/zero-fill'; +import getParsingFlags from '../create/parsing-flags'; + +// FORMATTING + +function hFormat() { + return this.hours() % 12 || 12; +} + +function kFormat() { + return this.hours() || 24; +} + +addFormatToken('H', ['HH', 2], 0, 'hour'); +addFormatToken('h', ['hh', 2], 0, hFormat); +addFormatToken('k', ['kk', 2], 0, kFormat); + +addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); +}); + +addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); +}); + +addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); +}); + +addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); +}); + +function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); +} + +meridiem('a', true); +meridiem('A', false); + +// ALIASES + +addUnitAlias('hour', 'h'); + +// PRIORITY +addUnitPriority('hour', 13); + +// PARSING + +function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; +} + +addRegexToken('a', matchMeridiem); +addRegexToken('A', matchMeridiem); +addRegexToken('H', match1to2); +addRegexToken('h', match1to2); +addRegexToken('k', match1to2); +addRegexToken('HH', match1to2, match2); +addRegexToken('hh', match1to2, match2); +addRegexToken('kk', match1to2, match2); + +addRegexToken('hmm', match3to4); +addRegexToken('hmmss', match5to6); +addRegexToken('Hmm', match3to4); +addRegexToken('Hmmss', match5to6); + +addParseToken(['H', 'HH'], HOUR); +addParseToken(['k', 'kk'], function (input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; +}); +addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; +}); +addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; +}); +addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; +}); +addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; +}); +addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); +}); +addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); +}); + +// LOCALES + +export function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); +} + +export var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; +export function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } +} + + +// MOMENTS + +// Setting the hour should keep the time, because the user explicitly +// specified which hour they want. So trying to maintain the same hour (in +// a new timezone) makes sense. Adding/subtracting hours does not follow +// this rule. +export var getSetHour = makeGetSet('Hours', true); diff --git a/nodejs/node_modules/moment/src/lib/units/millisecond.js b/nodejs/node_modules/moment/src/lib/units/millisecond.js new file mode 100755 index 0000000..27c9512 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/millisecond.js @@ -0,0 +1,69 @@ +import { makeGetSet } from '../moment/get-set'; +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match1, match2, match3, match1to3, matchUnsigned } from '../parse/regex'; +import { addParseToken } from '../parse/token'; +import { MILLISECOND } from './constants'; +import toInt from '../utils/to-int'; + +// FORMATTING + +addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); +}); + +addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); +}); + +addFormatToken(0, ['SSS', 3], 0, 'millisecond'); +addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; +}); +addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; +}); +addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; +}); +addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; +}); +addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; +}); +addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; +}); + + +// ALIASES + +addUnitAlias('millisecond', 'ms'); + +// PRIORITY + +addUnitPriority('millisecond', 16); + +// PARSING + +addRegexToken('S', match1to3, match1); +addRegexToken('SS', match1to3, match2); +addRegexToken('SSS', match1to3, match3); + +var token; +for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); +} + +function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); +} + +for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); +} +// MOMENTS + +export var getSetMillisecond = makeGetSet('Milliseconds', false); diff --git a/nodejs/node_modules/moment/src/lib/units/minute.js b/nodejs/node_modules/moment/src/lib/units/minute.js new file mode 100755 index 0000000..9f76032 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/minute.js @@ -0,0 +1,29 @@ +import { makeGetSet } from '../moment/get-set'; +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match1to2, match2 } from '../parse/regex'; +import { addParseToken } from '../parse/token'; +import { MINUTE } from './constants'; + +// FORMATTING + +addFormatToken('m', ['mm', 2], 0, 'minute'); + +// ALIASES + +addUnitAlias('minute', 'm'); + +// PRIORITY + +addUnitPriority('minute', 14); + +// PARSING + +addRegexToken('m', match1to2); +addRegexToken('mm', match1to2, match2); +addParseToken(['m', 'mm'], MINUTE); + +// MOMENTS + +export var getSetMinute = makeGetSet('Minutes', false); diff --git a/nodejs/node_modules/moment/src/lib/units/month.js b/nodejs/node_modules/moment/src/lib/units/month.js new file mode 100755 index 0000000..f504ed3 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/month.js @@ -0,0 +1,290 @@ +import { get } from '../moment/get-set'; +import hasOwnProp from '../utils/has-own-prop'; +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match1to2, match2, matchWord, regexEscape } from '../parse/regex'; +import { addParseToken } from '../parse/token'; +import { hooks } from '../utils/hooks'; +import { MONTH } from './constants'; +import toInt from '../utils/to-int'; +import isArray from '../utils/is-array'; +import isNumber from '../utils/is-number'; +import mod from '../utils/mod'; +import indexOf from '../utils/index-of'; +import { createUTC } from '../create/utc'; +import getParsingFlags from '../create/parsing-flags'; +import { isLeapYear } from '../units/year'; + +export function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); +} + +// FORMATTING + +addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; +}); + +addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); +}); + +addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); +}); + +// ALIASES + +addUnitAlias('month', 'M'); + +// PRIORITY + +addUnitPriority('month', 8); + +// PARSING + +addRegexToken('M', match1to2); +addRegexToken('MM', match1to2, match2); +addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); +}); +addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); +}); + +addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; +}); + +addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } +}); + +// LOCALES + +var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; +export var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); +export function localeMonths (m, format) { + if (!m) { + return isArray(this._months) ? this._months : + this._months['standalone']; + } + return isArray(this._months) ? this._months[m.month()] : + this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; +} + +export var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); +export function localeMonthsShort (m, format) { + if (!m) { + return isArray(this._monthsShort) ? this._monthsShort : + this._monthsShort['standalone']; + } + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; +} + +function handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } +} + +export function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; + + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format, strict); + } + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } +} + +// MOMENTS + +export function setMonth (mom, value) { + var dayOfMonth; + + if (!mom.isValid()) { + // No op + return mom; + } + + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (!isNumber(value)) { + return mom; + } + } + } + + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; +} + +export function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, 'Month'); + } +} + +export function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); +} + +var defaultMonthsShortRegex = matchWord; +export function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } +} + +var defaultMonthsRegex = matchWord; +export function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } +} + +function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); +} diff --git a/nodejs/node_modules/moment/src/lib/units/offset.js b/nodejs/node_modules/moment/src/lib/units/offset.js new file mode 100755 index 0000000..752358f --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/offset.js @@ -0,0 +1,235 @@ +import zeroFill from '../utils/zero-fill'; +import { createDuration } from '../duration/create'; +import { addSubtract } from '../moment/add-subtract'; +import { isMoment, copyConfig } from '../moment/constructor'; +import { addFormatToken } from '../format/format'; +import { addRegexToken, matchOffset, matchShortOffset } from '../parse/regex'; +import { addParseToken } from '../parse/token'; +import { createLocal } from '../create/local'; +import { prepareConfig } from '../create/from-anything'; +import { createUTC } from '../create/utc'; +import isDate from '../utils/is-date'; +import toInt from '../utils/to-int'; +import isUndefined from '../utils/is-undefined'; +import compareArrays from '../utils/compare-arrays'; +import { hooks } from '../utils/hooks'; + +// FORMATTING + +function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); +} + +offset('Z', ':'); +offset('ZZ', ''); + +// PARSING + +addRegexToken('Z', matchShortOffset); +addRegexToken('ZZ', matchShortOffset); +addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); +}); + +// HELPERS + +// timezone chunker +// '+10:00' > ['10', '00'] +// '-1530' > ['-15', '30'] +var chunkOffset = /([\+\-]|\d\d)/gi; + +function offsetFromString(matcher, string) { + var matches = (string || '').match(matcher); + + if (matches === null) { + return null; + } + + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); + + return minutes === 0 ? + 0 : + parts[0] === '+' ? minutes : -minutes; +} + +// Return a moment from input, that is local/utc/zone equivalent to model. +export function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } +} + +function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; +} + +// HOOKS + +// This function will be called whenever a moment is mutated. +// It is intended to keep the offset in sync with the timezone. +hooks.updateOffset = function () {}; + +// MOMENTS + +// keepLocalTime = true means only change the timezone, without +// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> +// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset +// +0200, so we adjust the time as needed, to be valid. +// +// Keeping the time actually adds/subtracts (one hour) +// from the actual represented time. That is why we call updateOffset +// a second time. In case it wants us to change the offset again +// _changeInProgress == true case, then we have to adjust, because +// there is no such time in the given timezone. +export function getSetOffset (input, keepLocalTime, keepMinutes) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; + } + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract(this, createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } +} + +export function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } +} + +export function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); +} + +export function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; +} + +export function setOffsetToParsedOffset () { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === 'string') { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } + else { + this.utcOffset(0, true); + } + } + return this; +} + +export function hasAlignedHourOffset (input) { + if (!this.isValid()) { + return false; + } + input = input ? createLocal(input).utcOffset() : 0; + + return (this.utcOffset() - input) % 60 === 0; +} + +export function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); +} + +export function isDaylightSavingTimeShifted () { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; +} + +export function isLocal () { + return this.isValid() ? !this._isUTC : false; +} + +export function isUtcOffset () { + return this.isValid() ? this._isUTC : false; +} + +export function isUtc () { + return this.isValid() ? this._isUTC && this._offset === 0 : false; +} diff --git a/nodejs/node_modules/moment/src/lib/units/priorities.js b/nodejs/node_modules/moment/src/lib/units/priorities.js new file mode 100755 index 0000000..699017c --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/priorities.js @@ -0,0 +1,16 @@ +var priorities = {}; + +export function addUnitPriority(unit, priority) { + priorities[unit] = priority; +} + +export function getPrioritizedUnits(unitsObj) { + var units = []; + for (var u in unitsObj) { + units.push({unit: u, priority: priorities[u]}); + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; +} diff --git a/nodejs/node_modules/moment/src/lib/units/quarter.js b/nodejs/node_modules/moment/src/lib/units/quarter.js new file mode 100755 index 0000000..a6d409a --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/quarter.js @@ -0,0 +1,32 @@ +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match1 } from '../parse/regex'; +import { addParseToken } from '../parse/token'; +import { MONTH } from './constants'; +import toInt from '../utils/to-int'; + +// FORMATTING + +addFormatToken('Q', 0, 'Qo', 'quarter'); + +// ALIASES + +addUnitAlias('quarter', 'Q'); + +// PRIORITY + +addUnitPriority('quarter', 7); + +// PARSING + +addRegexToken('Q', match1); +addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; +}); + +// MOMENTS + +export function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); +} diff --git a/nodejs/node_modules/moment/src/lib/units/second.js b/nodejs/node_modules/moment/src/lib/units/second.js new file mode 100755 index 0000000..1793711 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/second.js @@ -0,0 +1,29 @@ +import { makeGetSet } from '../moment/get-set'; +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match1to2, match2 } from '../parse/regex'; +import { addParseToken } from '../parse/token'; +import { SECOND } from './constants'; + +// FORMATTING + +addFormatToken('s', ['ss', 2], 0, 'second'); + +// ALIASES + +addUnitAlias('second', 's'); + +// PRIORITY + +addUnitPriority('second', 15); + +// PARSING + +addRegexToken('s', match1to2); +addRegexToken('ss', match1to2, match2); +addParseToken(['s', 'ss'], SECOND); + +// MOMENTS + +export var getSetSecond = makeGetSet('Seconds', false); diff --git a/nodejs/node_modules/moment/src/lib/units/timestamp.js b/nodejs/node_modules/moment/src/lib/units/timestamp.js new file mode 100755 index 0000000..a49e1e4 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/timestamp.js @@ -0,0 +1,20 @@ +import { addFormatToken } from '../format/format'; +import { addRegexToken, matchTimestamp, matchSigned } from '../parse/regex'; +import { addParseToken } from '../parse/token'; +import toInt from '../utils/to-int'; + +// FORMATTING + +addFormatToken('X', 0, 0, 'unix'); +addFormatToken('x', 0, 0, 'valueOf'); + +// PARSING + +addRegexToken('x', matchSigned); +addRegexToken('X', matchTimestamp); +addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); +}); +addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); +}); diff --git a/nodejs/node_modules/moment/src/lib/units/timezone.js b/nodejs/node_modules/moment/src/lib/units/timezone.js new file mode 100755 index 0000000..20c81cd --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/timezone.js @@ -0,0 +1,16 @@ +import { addFormatToken } from '../format/format'; + +// FORMATTING + +addFormatToken('z', 0, 0, 'zoneAbbr'); +addFormatToken('zz', 0, 0, 'zoneName'); + +// MOMENTS + +export function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; +} + +export function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; +} diff --git a/nodejs/node_modules/moment/src/lib/units/units.js b/nodejs/node_modules/moment/src/lib/units/units.js new file mode 100755 index 0000000..6f45f1c --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/units.js @@ -0,0 +1,20 @@ +// Side effect imports +import './day-of-month'; +import './day-of-week'; +import './day-of-year'; +import './hour'; +import './millisecond'; +import './minute'; +import './month'; +import './offset'; +import './quarter'; +import './second'; +import './timestamp'; +import './timezone'; +import './week-year'; +import './week'; +import './year'; + +import { normalizeUnits } from './aliases'; + +export { normalizeUnits }; diff --git a/nodejs/node_modules/moment/src/lib/units/week-calendar-utils.js b/nodejs/node_modules/moment/src/lib/units/week-calendar-utils.js new file mode 100755 index 0000000..5be8a5f --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/week-calendar-utils.js @@ -0,0 +1,65 @@ +import { daysInYear } from './year'; +import { createLocal } from '../create/local'; +import { createUTCDate } from '../create/date-from-array'; + +// start-of-first-week - start-of-year +function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + + return -fwdlw + fwd - 1; +} + +// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday +export function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + + return { + year: resYear, + dayOfYear: resDayOfYear + }; +} + +export function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; + + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; +} + +export function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; +} diff --git a/nodejs/node_modules/moment/src/lib/units/week-year.js b/nodejs/node_modules/moment/src/lib/units/week-year.js new file mode 100755 index 0000000..7fa5425 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/week-year.js @@ -0,0 +1,107 @@ +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match1to2, match1to4, match1to6, match2, match4, match6, matchSigned } from '../parse/regex'; +import { addWeekParseToken } from '../parse/token'; +import { weekOfYear, weeksInYear, dayOfYearFromWeeks } from './week-calendar-utils'; +import toInt from '../utils/to-int'; +import { hooks } from '../utils/hooks'; +import { createLocal } from '../create/local'; +import { createUTCDate } from '../create/date-from-array'; + +// FORMATTING + +addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; +}); + +addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; +}); + +function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); +} + +addWeekYearFormatToken('gggg', 'weekYear'); +addWeekYearFormatToken('ggggg', 'weekYear'); +addWeekYearFormatToken('GGGG', 'isoWeekYear'); +addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + +// ALIASES + +addUnitAlias('weekYear', 'gg'); +addUnitAlias('isoWeekYear', 'GG'); + +// PRIORITY + +addUnitPriority('weekYear', 1); +addUnitPriority('isoWeekYear', 1); + + +// PARSING + +addRegexToken('G', matchSigned); +addRegexToken('g', matchSigned); +addRegexToken('GG', match1to2, match2); +addRegexToken('gg', match1to2, match2); +addRegexToken('GGGG', match1to4, match4); +addRegexToken('gggg', match1to4, match4); +addRegexToken('GGGGG', match1to6, match6); +addRegexToken('ggggg', match1to6, match6); + +addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); +}); + +addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = hooks.parseTwoDigitYear(input); +}); + +// MOMENTS + +export function getSetWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); +} + +export function getSetISOWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); +} + +export function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); +} + +export function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); +} + +function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } +} + +function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; +} diff --git a/nodejs/node_modules/moment/src/lib/units/week.js b/nodejs/node_modules/moment/src/lib/units/week.js new file mode 100755 index 0000000..da64ffe --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/week.js @@ -0,0 +1,67 @@ +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match1to2, match2 } from '../parse/regex'; +import { addWeekParseToken } from '../parse/token'; +import toInt from '../utils/to-int'; +import { createLocal } from '../create/local'; +import { weekOfYear } from './week-calendar-utils'; + +// FORMATTING + +addFormatToken('w', ['ww', 2], 'wo', 'week'); +addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + +// ALIASES + +addUnitAlias('week', 'w'); +addUnitAlias('isoWeek', 'W'); + +// PRIORITIES + +addUnitPriority('week', 5); +addUnitPriority('isoWeek', 5); + +// PARSING + +addRegexToken('w', match1to2); +addRegexToken('ww', match1to2, match2); +addRegexToken('W', match1to2); +addRegexToken('WW', match1to2, match2); + +addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); +}); + +// HELPERS + +// LOCALES + +export function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; +} + +export var defaultLocaleWeek = { + 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. +}; + +export function localeFirstDayOfWeek () { + return this._week.dow; +} + +export function localeFirstDayOfYear () { + return this._week.doy; +} + +// MOMENTS + +export function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); +} + +export function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); +} diff --git a/nodejs/node_modules/moment/src/lib/units/year.js b/nodejs/node_modules/moment/src/lib/units/year.js new file mode 100755 index 0000000..8f3f94c --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/units/year.js @@ -0,0 +1,75 @@ +import { makeGetSet } from '../moment/get-set'; +import { addFormatToken } from '../format/format'; +import { addUnitAlias } from './aliases'; +import { addUnitPriority } from './priorities'; +import { addRegexToken, match1to2, match1to4, match1to6, match2, match4, match6, matchSigned } from '../parse/regex'; +import { addParseToken } from '../parse/token'; +import { hooks } from '../utils/hooks'; +import { YEAR } from './constants'; +import toInt from '../utils/to-int'; + +// FORMATTING + +addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; +}); + +addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; +}); + +addFormatToken(0, ['YYYY', 4], 0, 'year'); +addFormatToken(0, ['YYYYY', 5], 0, 'year'); +addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + +// ALIASES + +addUnitAlias('year', 'y'); + +// PRIORITIES + +addUnitPriority('year', 1); + +// PARSING + +addRegexToken('Y', matchSigned); +addRegexToken('YY', match1to2, match2); +addRegexToken('YYYY', match1to4, match4); +addRegexToken('YYYYY', match1to6, match6); +addRegexToken('YYYYYY', match1to6, match6); + +addParseToken(['YYYYY', 'YYYYYY'], YEAR); +addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); +}); +addParseToken('YY', function (input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); +}); +addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); +}); + +// HELPERS + +export function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; +} + +export function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; +} + +// HOOKS + +hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); +}; + +// MOMENTS + +export var getSetYear = makeGetSet('FullYear', true); + +export function getIsLeapYear () { + return isLeapYear(this.year()); +} diff --git a/nodejs/node_modules/moment/src/lib/utils/abs-ceil.js b/nodejs/node_modules/moment/src/lib/utils/abs-ceil.js new file mode 100755 index 0000000..7cf9329 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/abs-ceil.js @@ -0,0 +1,7 @@ +export default function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } +} diff --git a/nodejs/node_modules/moment/src/lib/utils/abs-floor.js b/nodejs/node_modules/moment/src/lib/utils/abs-floor.js new file mode 100755 index 0000000..401c7f0 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/abs-floor.js @@ -0,0 +1,8 @@ +export default function absFloor (number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } +} diff --git a/nodejs/node_modules/moment/src/lib/utils/abs-round.js b/nodejs/node_modules/moment/src/lib/utils/abs-round.js new file mode 100755 index 0000000..98f54bc --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/abs-round.js @@ -0,0 +1,7 @@ +export default function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } +} diff --git a/nodejs/node_modules/moment/src/lib/utils/compare-arrays.js b/nodejs/node_modules/moment/src/lib/utils/compare-arrays.js new file mode 100755 index 0000000..2eb274b --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/compare-arrays.js @@ -0,0 +1,16 @@ +import toInt from './to-int'; + +// compare two arrays, return the number of differences +export default function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/defaults.js b/nodejs/node_modules/moment/src/lib/utils/defaults.js new file mode 100755 index 0000000..45c5e87 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/defaults.js @@ -0,0 +1,10 @@ +// Pick the first defined of two or three arguments. +export default function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/deprecate.js b/nodejs/node_modules/moment/src/lib/utils/deprecate.js new file mode 100755 index 0000000..8b4c87a --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/deprecate.js @@ -0,0 +1,55 @@ +import extend from './extend'; +import { hooks } from './hooks'; +import isUndefined from './is-undefined'; + +function warn(msg) { + if (hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } +} + +export function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = []; + var arg; + for (var i = 0; i < arguments.length; i++) { + arg = ''; + if (typeof arguments[i] === 'object') { + arg += '\n[' + i + '] '; + for (var key in arguments[0]) { + arg += key + ': ' + arguments[0][key] + ', '; + } + arg = arg.slice(0, -2); // Remove trailing comma and space + } else { + arg = arguments[i]; + } + args.push(arg); + } + warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); +} + +var deprecations = {}; + +export function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } +} + +hooks.suppressDeprecationWarnings = false; +hooks.deprecationHandler = null; diff --git a/nodejs/node_modules/moment/src/lib/utils/extend.js b/nodejs/node_modules/moment/src/lib/utils/extend.js new file mode 100755 index 0000000..ba74a0b --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/extend.js @@ -0,0 +1,19 @@ +import hasOwnProp from './has-own-prop'; + +export default function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/has-own-prop.js b/nodejs/node_modules/moment/src/lib/utils/has-own-prop.js new file mode 100755 index 0000000..4d2403c --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/has-own-prop.js @@ -0,0 +1,3 @@ +export default function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); +} diff --git a/nodejs/node_modules/moment/src/lib/utils/hooks.js b/nodejs/node_modules/moment/src/lib/utils/hooks.js new file mode 100755 index 0000000..02a5bd3 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/hooks.js @@ -0,0 +1,13 @@ +export { hooks, setHookCallback }; + +var hookCallback; + +function hooks () { + return hookCallback.apply(null, arguments); +} + +// This is done to register the method called with moment() +// without creating circular dependencies. +function setHookCallback (callback) { + hookCallback = callback; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/index-of.js b/nodejs/node_modules/moment/src/lib/utils/index-of.js new file mode 100755 index 0000000..92298cf --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/index-of.js @@ -0,0 +1,18 @@ +var indexOf; + +if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; +} else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; +} + +export { indexOf as default }; diff --git a/nodejs/node_modules/moment/src/lib/utils/is-array.js b/nodejs/node_modules/moment/src/lib/utils/is-array.js new file mode 100755 index 0000000..2d0e0f3 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/is-array.js @@ -0,0 +1,3 @@ +export default function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/is-date.js b/nodejs/node_modules/moment/src/lib/utils/is-date.js new file mode 100755 index 0000000..69c4d0e --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/is-date.js @@ -0,0 +1,3 @@ +export default function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/is-function.js b/nodejs/node_modules/moment/src/lib/utils/is-function.js new file mode 100755 index 0000000..12304b1 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/is-function.js @@ -0,0 +1,3 @@ +export default function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/is-number.js b/nodejs/node_modules/moment/src/lib/utils/is-number.js new file mode 100755 index 0000000..74d6137 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/is-number.js @@ -0,0 +1,3 @@ +export default function isNumber(input) { + return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/is-object-empty.js b/nodejs/node_modules/moment/src/lib/utils/is-object-empty.js new file mode 100755 index 0000000..695c3d2 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/is-object-empty.js @@ -0,0 +1,13 @@ +export default function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return (Object.getOwnPropertyNames(obj).length === 0); + } else { + var k; + for (k in obj) { + if (obj.hasOwnProperty(k)) { + return false; + } + } + return true; + } +} diff --git a/nodejs/node_modules/moment/src/lib/utils/is-object.js b/nodejs/node_modules/moment/src/lib/utils/is-object.js new file mode 100755 index 0000000..1113538 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/is-object.js @@ -0,0 +1,5 @@ +export default function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return input != null && Object.prototype.toString.call(input) === '[object Object]'; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/is-undefined.js b/nodejs/node_modules/moment/src/lib/utils/is-undefined.js new file mode 100755 index 0000000..de57a8b --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/is-undefined.js @@ -0,0 +1,3 @@ +export default function isUndefined(input) { + return input === void 0; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/keys.js b/nodejs/node_modules/moment/src/lib/utils/keys.js new file mode 100755 index 0000000..2da4e32 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/keys.js @@ -0,0 +1,19 @@ +import hasOwnProp from './has-own-prop'; + +var keys; + +if (Object.keys) { + keys = Object.keys; +} else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; +} + +export { keys as default }; diff --git a/nodejs/node_modules/moment/src/lib/utils/map.js b/nodejs/node_modules/moment/src/lib/utils/map.js new file mode 100755 index 0000000..1cbc563 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/map.js @@ -0,0 +1,7 @@ +export default function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/mod.js b/nodejs/node_modules/moment/src/lib/utils/mod.js new file mode 100755 index 0000000..8046cda --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/mod.js @@ -0,0 +1,3 @@ +export default function mod(n, x) { + return ((n % x) + x) % x; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/some.js b/nodejs/node_modules/moment/src/lib/utils/some.js new file mode 100755 index 0000000..1bd3186 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/some.js @@ -0,0 +1,19 @@ +var some; +if (Array.prototype.some) { + some = Array.prototype.some; +} else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; + + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } + + return false; + }; +} + +export { some as default }; diff --git a/nodejs/node_modules/moment/src/lib/utils/to-int.js b/nodejs/node_modules/moment/src/lib/utils/to-int.js new file mode 100755 index 0000000..fb48941 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/to-int.js @@ -0,0 +1,12 @@ +import absFloor from './abs-floor'; + +export default function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + + return value; +} diff --git a/nodejs/node_modules/moment/src/lib/utils/zero-fill.js b/nodejs/node_modules/moment/src/lib/utils/zero-fill.js new file mode 100755 index 0000000..7009ec9 --- /dev/null +++ b/nodejs/node_modules/moment/src/lib/utils/zero-fill.js @@ -0,0 +1,7 @@ +export default function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; +} diff --git a/nodejs/node_modules/moment/src/locale/af.js b/nodejs/node_modules/moment/src/locale/af.js new file mode 100755 index 0000000..7af0324 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/af.js @@ -0,0 +1,64 @@ +//! 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/ar-dz.js b/nodejs/node_modules/moment/src/locale/ar-dz.js new file mode 100755 index 0000000..f01a30d --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ar-dz.js @@ -0,0 +1,51 @@ +//! moment.js locale configuration +//! locale : Arabic (Algeria) [ar-dz] +//! author : Noureddine LOUAHEDJ : https://github.com/noureddineme + +import moment from '../moment'; + +export default moment.defineLocale('ar-dz', { + 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 : 4 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ar-kw.js b/nodejs/node_modules/moment/src/locale/ar-kw.js new file mode 100755 index 0000000..684abb7 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ar-kw.js @@ -0,0 +1,50 @@ +//! 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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/ar-ly.js b/nodejs/node_modules/moment/src/locale/ar-ly.js new file mode 100755 index 0000000..b6b5002 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ar-ly.js @@ -0,0 +1,113 @@ +//! 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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/ar-ma.js b/nodejs/node_modules/moment/src/locale/ar-ma.js new file mode 100755 index 0000000..b1af907 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ar-ma.js @@ -0,0 +1,52 @@ +//! 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 : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ar-sa.js b/nodejs/node_modules/moment/src/locale/ar-sa.js new file mode 100755 index 0000000..65ba6a1 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ar-sa.js @@ -0,0 +1,96 @@ +//! 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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ar-tn.js b/nodejs/node_modules/moment/src/locale/ar-tn.js new file mode 100755 index 0000000..952f3bf --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ar-tn.js @@ -0,0 +1,51 @@ +//! 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ar.js b/nodejs/node_modules/moment/src/locale/ar.js new file mode 100755 index 0000000..92f368d --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ar.js @@ -0,0 +1,128 @@ +//! 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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/az.js b/nodejs/node_modules/moment/src/locale/az.js new file mode 100755 index 0000000..4fea428 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/az.js @@ -0,0 +1,97 @@ +//! 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 : 'birneçə 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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/be.js b/nodejs/node_modules/moment/src/locale/be.js new file mode 100755 index 0000000..e106f24 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/be.js @@ -0,0 +1,126 @@ +//! 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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/bg.js b/nodejs/node_modules/moment/src/locale/bg.js new file mode 100755 index 0000000..5ce4dca --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/bg.js @@ -0,0 +1,82 @@ +//! 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 дни', + 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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/bm.js b/nodejs/node_modules/moment/src/locale/bm.js new file mode 100755 index 0000000..887a750 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/bm.js @@ -0,0 +1,50 @@ +//! 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/bn.js b/nodejs/node_modules/moment/src/locale/bn.js new file mode 100755 index 0000000..a859a23 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/bn.js @@ -0,0 +1,110 @@ +//! 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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/bo.js b/nodejs/node_modules/moment/src/locale/bo.js new file mode 100755 index 0000000..a536d48 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/bo.js @@ -0,0 +1,111 @@ +//! 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 : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.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 : '[བདུན་ཕྲག་རྗེས་མ], 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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/br.js b/nodejs/node_modules/moment/src/locale/br.js new file mode 100755 index 0000000..7208f79 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/br.js @@ -0,0 +1,100 @@ +//! 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); +} + +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('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY h[e]mm A', + LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A' + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/bs.js b/nodejs/node_modules/moment/src/locale/bs.js new file mode 100755 index 0000000..f605c4d --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/bs.js @@ -0,0 +1,143 @@ +//! 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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/ca.js b/nodejs/node_modules/moment/src/locale/ca.js new file mode 100755 index 0000000..8d1df57 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ca.js @@ -0,0 +1,80 @@ +//! 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/cs.js b/nodejs/node_modules/moment/src/locale/cs.js new file mode 100755 index 0000000..6171ab1 --- /dev/null +++ b/nodejs/node_modules/moment/src/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('_'); +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'; + } + break; + 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'; + } + break; + 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'; + } + break; + 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'; + } + break; + 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'; + } + break; + 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'; + } + break; + } +} + +export default moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (červenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + shortMonthsParse : (function (monthsShort) { + var i, _shortMonthsParse = []; + for (i = 0; i < 12; i++) { + _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i'); + } + return _shortMonthsParse; + }(monthsShort)), + longMonthsParse : (function (months) { + var i, _longMonthsParse = []; + for (i = 0; i < 12; i++) { + _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i'); + } + return _longMonthsParse; + }(months)), + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/cv.js b/nodejs/node_modules/moment/src/locale/cv.js new file mode 100755 index 0000000..d97d4d9 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/cv.js @@ -0,0 +1,54 @@ +//! 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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/cy.js b/nodejs/node_modules/moment/src/locale/cy.js new file mode 100755 index 0000000..eb2e54c --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/cy.js @@ -0,0 +1,73 @@ +//! 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/da.js b/nodejs/node_modules/moment/src/locale/da.js new file mode 100755 index 0000000..a06c6e0 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/da.js @@ -0,0 +1,51 @@ +//! 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/de-at.js b/nodejs/node_modules/moment/src/locale/de-at.js new file mode 100755 index 0000000..4ed974c --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/de-at.js @@ -0,0 +1,70 @@ +//! 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'], + '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, + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/de-ch.js b/nodejs/node_modules/moment/src/locale/de-ch.js new file mode 100755 index 0000000..c448345 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/de-ch.js @@ -0,0 +1,69 @@ +//! 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'], + '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, + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/de.js b/nodejs/node_modules/moment/src/locale/de.js new file mode 100755 index 0000000..4574656 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/de.js @@ -0,0 +1,69 @@ +//! 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'], + '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, + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/dv.js b/nodejs/node_modules/moment/src/locale/dv.js new file mode 100755 index 0000000..3268843 --- /dev/null +++ b/nodejs/node_modules/moment/src/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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/el.js b/nodejs/node_modules/moment/src/locale/el.js new file mode 100755 index 0000000..5e43ae3 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/el.js @@ -0,0 +1,89 @@ +//! moment.js locale configuration +//! locale : Greek [el] +//! author : Aggelos Karalias : https://github.com/mehiel + +import moment from '../moment'; +import isFunction from '../lib/utils/is-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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/en-au.js b/nodejs/node_modules/moment/src/locale/en-au.js new file mode 100755 index 0000000..04e61e4 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/en-au.js @@ -0,0 +1,59 @@ +//! 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 : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/en-ca.js b/nodejs/node_modules/moment/src/locale/en-ca.js new file mode 100755 index 0000000..008baed --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/en-ca.js @@ -0,0 +1,54 @@ +//! 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; + } +}); diff --git a/nodejs/node_modules/moment/src/locale/en-gb.js b/nodejs/node_modules/moment/src/locale/en-gb.js new file mode 100755 index 0000000..da235be --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/en-gb.js @@ -0,0 +1,59 @@ +//! 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/en-ie.js b/nodejs/node_modules/moment/src/locale/en-ie.js new file mode 100755 index 0000000..725ff9e --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/en-ie.js @@ -0,0 +1,59 @@ +//! 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/en-il.js b/nodejs/node_modules/moment/src/locale/en-il.js new file mode 100755 index 0000000..da293eb --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/en-il.js @@ -0,0 +1,54 @@ +//! 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', + 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; + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/en-nz.js b/nodejs/node_modules/moment/src/locale/en-nz.js new file mode 100755 index 0000000..ee7c468 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/en-nz.js @@ -0,0 +1,58 @@ +//! 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/eo.js b/nodejs/node_modules/moment/src/locale/eo.js new file mode 100755 index 0000000..66c1ac0 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/eo.js @@ -0,0 +1,65 @@ +//! 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 + +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_mar_apr_maj_jun_jul_aŭg_sep_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 : 'D[-a de] MMMM, YYYY', + LLL : 'D[-a de] MMMM, YYYY HH:mm', + LLLL : 'dddd, [la] D[-a de] MMMM, 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 [je] LT', + lastDay : '[Hieraŭ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'post %s', + past : 'antaŭ %s', + s : 'sekundoj', + ss : '%d sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : '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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/es-do.js b/nodejs/node_modules/moment/src/locale/es-do.js new file mode 100755 index 0000000..c839785 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/es-do.js @@ -0,0 +1,83 @@ +//! 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('_'); + +var 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]; +var 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', + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/es-us.js b/nodejs/node_modules/moment/src/locale/es-us.js new file mode 100755 index 0000000..9fa1460 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/es-us.js @@ -0,0 +1,74 @@ +//! moment.js locale configuration +//! locale : Spanish (United States) [es-us] +//! author : bustta : https://github.com/bustta + +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('_'); + +export default moment.defineLocale('es-us', { + 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()]; + } + }, + monthsParseExact : true, + 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 : 'MM/DD/YYYY', + LL : 'MMMM [de] D [de] YYYY', + LLL : 'MMMM [de] D [de] YYYY h:mm A', + LLLL : 'dddd, MMMM [de] D [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', + 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 : 6 // The week that contains Jan 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/es.js b/nodejs/node_modules/moment/src/locale/es.js new file mode 100755 index 0000000..4dc588a --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/es.js @@ -0,0 +1,83 @@ +//! moment.js locale configuration +//! locale : Spanish [es] +//! author : Julio Napurí : https://github.com/julionc + +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('_'); + +var 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]; +var 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', { + 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', + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/et.js b/nodejs/node_modules/moment/src/locale/et.js new file mode 100755 index 0000000..22415e7 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/et.js @@ -0,0 +1,73 @@ +//! moment.js locale configuration +//! locale : Estonian [et] +//! author : Henry Kehlmann : https://github.com/madhenry +//! improvements : Illimar Tambek : https://github.com/ragulka + +import moment from '../moment'; + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'ss': [number + 'sekundi', number + 'sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; +} + +export default moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.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' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/eu.js b/nodejs/node_modules/moment/src/locale/eu.js new file mode 100755 index 0000000..d544788 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/eu.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration +//! locale : Basque [eu] +//! author : Eneko Illarramendi : https://github.com/eillarra + +import moment from '../moment'; + +export default moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + monthsParseExact : true, + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] HH:mm', + llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + ss : '%d segundo', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/fa.js b/nodejs/node_modules/moment/src/locale/fa.js new file mode 100755 index 0000000..cf503c1 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/fa.js @@ -0,0 +1,98 @@ +//! moment.js locale configuration +//! locale : Persian [fa] +//! author : Ebrahim Byagowi : https://github.com/ebraminio + +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('fa', { + months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.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 /بعد از ظهر/.test(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, '،'); + }, + dayOfMonthOrdinalParse: /\d{1,2}م/, + ordinal : '%dم', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/fi.js b/nodejs/node_modules/moment/src/locale/fi.js new file mode 100755 index 0000000..c505292 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/fi.js @@ -0,0 +1,101 @@ +//! moment.js locale configuration +//! locale : Finnish [fi] +//! author : Tarmo Aidantausta : https://github.com/bleadof + +import moment from '../moment'; + +var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; +function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'ss': + return isFuture ? 'sekunnin' : 'sekuntia'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; +} +function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; +} + +export default moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] HH.mm', + llll : 'ddd, Do MMM YYYY, [klo] HH.mm' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/fo.js b/nodejs/node_modules/moment/src/locale/fo.js new file mode 100755 index 0000000..5efc4cc --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/fo.js @@ -0,0 +1,52 @@ +//! moment.js locale configuration +//! locale : Faroese [fo] +//! author : Ragnar Johannesen : https://github.com/ragnar123 + +import moment from '../moment'; + +export default moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.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 : '[Í dag kl.] LT', + nextDay : '[Í morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[Í gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + ss : '%d sekundir', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt á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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/fr-ca.js b/nodejs/node_modules/moment/src/locale/fr-ca.js new file mode 100755 index 0000000..4825a6d --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/fr-ca.js @@ -0,0 +1,66 @@ +//! moment.js locale configuration +//! locale : French (Canada) [fr-ca] +//! author : Jonathan Abourbih : https://github.com/jonbca + +import moment from '../moment'; + +export default moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/fr-ch.js b/nodejs/node_modules/moment/src/locale/fr-ch.js new file mode 100755 index 0000000..febd401 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/fr-ch.js @@ -0,0 +1,70 @@ +//! moment.js locale configuration +//! locale : French (Switzerland) [fr-ch] +//! author : Gaspard Bucher : https://github.com/gaspard + +import moment from '../moment'; + +export default moment.defineLocale('fr-ch', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_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 : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/fr.js b/nodejs/node_modules/moment/src/locale/fr.js new file mode 100755 index 0000000..81399dc --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/fr.js @@ -0,0 +1,75 @@ +//! moment.js locale configuration +//! locale : French [fr] +//! author : John Fischer : https://github.com/jfroffice + +import moment from '../moment'; + +export default moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_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 : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|)/, + ordinal : function (number, period) { + switch (period) { + // TODO: Return 'e' when day of month > 1. Move this case inside + // block for masculine words below. + // See https://github.com/moment/moment/issues/3375 + case 'D': + return number + (number === 1 ? 'er' : ''); + + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/fy.js b/nodejs/node_modules/moment/src/locale/fy.js new file mode 100755 index 0000000..b4b2096 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/fy.js @@ -0,0 +1,67 @@ +//! moment.js locale configuration +//! locale : Frisian [fy] +//! author : Robin van der Vliet : https://github.com/robin0van0der0v + +import moment from '../moment'; + +var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + +export default moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + monthsParseExact : true, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.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: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + ss : '%d sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/gd.js b/nodejs/node_modules/moment/src/locale/gd.js new file mode 100755 index 0000000..b3653d2 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/gd.js @@ -0,0 +1,68 @@ +//! moment.js locale configuration +//! locale : Scottish Gaelic [gd] +//! author : Jon Ashdown : https://github.com/jonashdown + +import moment from '../moment'; + +var months = [ + 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd' +]; + +var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh']; + +var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne']; + +var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis']; + +var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa']; + +export default moment.defineLocale('gd', { + months : months, + monthsShort : monthsShort, + monthsParseExact : true, + weekdays : weekdays, + weekdaysShort : weekdaysShort, + weekdaysMin : weekdaysMin, + 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 : '[An-diugh aig] LT', + nextDay : '[A-màireach aig] LT', + nextWeek : 'dddd [aig] LT', + lastDay : '[An-dè aig] LT', + lastWeek : 'dddd [seo chaidh] [aig] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ann an %s', + past : 'bho chionn %s', + s : 'beagan diogan', + ss : '%d diogan', + m : 'mionaid', + mm : '%d mionaidean', + h : 'uair', + hh : '%d uairean', + d : 'latha', + dd : '%d latha', + M : 'mìos', + MM : '%d mìosan', + y : 'bliadhna', + yy : '%d bliadhna' + }, + dayOfMonthOrdinalParse : /\d{1,2}(d|na|mh)/, + ordinal : function (number) { + var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/gl.js b/nodejs/node_modules/moment/src/locale/gl.js new file mode 100755 index 0000000..206a8f6 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/gl.js @@ -0,0 +1,69 @@ +//! moment.js locale configuration +//! locale : Galician [gl] +//! author : Juan G. Hurtado : https://github.com/juanghurtado + +import moment from '../moment'; + +export default moment.defineLocale('gl', { + months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'), + monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mé_xo_ve_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 '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str.indexOf('un') === 0) { + return 'n' + str; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/gom-latn.js b/nodejs/node_modules/moment/src/locale/gom-latn.js new file mode 100755 index 0000000..39ad91e --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/gom-latn.js @@ -0,0 +1,114 @@ +//! moment.js locale configuration +//! locale : Konkani Latin script [gom-latn] +//! author : The Discoverer : https://github.com/WikiDiscoverer + +import moment from '../moment'; + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['thodde secondanim', 'thodde second'], + 'ss': [number + ' secondanim', number + ' second'], + 'm': ['eka mintan', 'ek minute'], + 'mm': [number + ' mintanim', number + ' mintam'], + 'h': ['eka horan', 'ek hor'], + 'hh': [number + ' horanim', number + ' horam'], + 'd': ['eka disan', 'ek dis'], + 'dd': [number + ' disanim', number + ' dis'], + 'M': ['eka mhoinean', 'ek mhoino'], + 'MM': [number + ' mhoineanim', number + ' mhoine'], + 'y': ['eka vorsan', 'ek voros'], + 'yy': [number + ' vorsanim', number + ' vorsam'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; +} + +export default moment.defineLocale('gom-latn', { + months : 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'), + monthsShort : 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son\'var'.split('_'), + weekdaysShort : 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'), + weekdaysMin : 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'A h:mm [vazta]', + LTS : 'A h:mm:ss [vazta]', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY A h:mm [vazta]', + LLLL : 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', + llll: 'ddd, D MMM YYYY, A h:mm [vazta]' + }, + calendar : { + sameDay: '[Aiz] LT', + nextDay: '[Faleam] LT', + nextWeek: '[Ieta to] dddd[,] LT', + lastDay: '[Kal] LT', + lastWeek: '[Fatlo] dddd[,] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s', + past : '%s adim', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse : /\d{1,2}(er)/, + ordinal : function (number, period) { + switch (period) { + // the ordinal 'er' only applies to day of the month + case 'D': + return number + 'er'; + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + case 'w': + case 'W': + return number; + } + }, + 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: /rati|sokalli|donparam|sanje/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'rati') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'sokalli') { + return hour; + } else if (meridiem === 'donparam') { + return hour > 12 ? hour : hour + 12; + } else if (meridiem === 'sanje') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'rati'; + } else if (hour < 12) { + return 'sokalli'; + } else if (hour < 16) { + return 'donparam'; + } else if (hour < 20) { + return 'sanje'; + } else { + return 'rati'; + } + } +}); diff --git a/nodejs/node_modules/moment/src/locale/gu.js b/nodejs/node_modules/moment/src/locale/gu.js new file mode 100755 index 0000000..ecde951 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/gu.js @@ -0,0 +1,115 @@ +//! moment.js locale configuration +//! locale : Gujarati [gu] +//! author : Kaushik Thanki : https://github.com/Kaushik1987 + +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('gu', { + months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'), + monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'), + 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: '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]; + }); + }, + // Gujarati notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati. + 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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'સાંજ') { + return hour + 12; + } + }, + 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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/he.js b/nodejs/node_modules/moment/src/locale/he.js new file mode 100755 index 0000000..02af634 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/he.js @@ -0,0 +1,91 @@ +//! moment.js locale configuration +//! locale : Hebrew [he] +//! author : Tomer Cohen : https://github.com/tomer +//! author : Moshe Simantov : https://github.com/DevelopmentIL +//! author : Tal Ater : https://github.com/TalAter + +import moment from '../moment'; + +export default moment.defineLocale('he', { + months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + 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', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM 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 : function (number) { + if (number === 2) { + return 'שעתיים'; + } + return number + ' שעות'; + }, + d : 'יום', + dd : function (number) { + if (number === 2) { + return 'יומיים'; + } + return number + ' ימים'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיים'; + } + return number + ' חודשים'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיים'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שנים'; + } + }, + meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i, + isPM : function (input) { + return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 5) { + return 'לפנות בוקר'; + } else if (hour < 10) { + return 'בבוקר'; + } else if (hour < 12) { + return isLower ? 'לפנה"צ' : 'לפני הצהריים'; + } else if (hour < 18) { + return isLower ? 'אחה"צ' : 'אחרי הצהריים'; + } else { + return 'בערב'; + } + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/hi.js b/nodejs/node_modules/moment/src/locale/hi.js new file mode 100755 index 0000000..f347160 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/hi.js @@ -0,0 +1,116 @@ +//! moment.js locale configuration +//! locale : Hindi [hi] +//! author : Mayank Singhal : https://github.com/mayanksinghal + +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('hi', { + months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'), + monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'), + 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 : '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]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + 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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + 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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/hr.js b/nodejs/node_modules/moment/src/locale/hr.js new file mode 100755 index 0000000..aa3b853 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/hr.js @@ -0,0 +1,145 @@ +//! moment.js locale configuration +//! locale : Croatian [hr] +//! author : Bojan Marković : https://github.com/bmarkovic + +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('hr', { + months : { + format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'), + standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_') + }, + monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/hu.js b/nodejs/node_modules/moment/src/locale/hu.js new file mode 100755 index 0000000..1e075de --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/hu.js @@ -0,0 +1,103 @@ +//! moment.js locale configuration +//! locale : Hungarian [hu] +//! author : Adam Brunner : https://github.com/adambrunner + +import moment from '../moment'; + +var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' '); +function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'ss': + return num + (isFuture || withoutSuffix) ? ' másodperc' : ' másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + return ''; +} +function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; +} + +export default moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D. H:mm', + LLLL : 'YYYY. MMMM D., dddd H:mm' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/hy-am.js b/nodejs/node_modules/moment/src/locale/hy-am.js new file mode 100755 index 0000000..1918a57 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/hy-am.js @@ -0,0 +1,87 @@ +//! moment.js locale configuration +//! locale : Armenian [hy-am] +//! author : Armendarabyan : https://github.com/armendarabyan + +import moment from '../moment'; + +export default moment.defineLocale('hy-am', { + months : { + format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'), + standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_') + }, + monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'), + weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'), + 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 () { + return '[անցած] 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 տարի' + }, + meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/, + isPM: function (input) { + return /^(ցերեկվա|երեկոյան)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'գիշերվա'; + } else if (hour < 12) { + return 'առավոտվա'; + } else if (hour < 17) { + return 'ցերեկվա'; + } else { + return 'երեկոյան'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-ին'; + } + return number + '-րդ'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/id.js b/nodejs/node_modules/moment/src/locale/id.js new file mode 100755 index 0000000..52b1ccc --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/id.js @@ -0,0 +1,74 @@ +//! moment.js locale configuration +//! locale : Indonesian [id] +//! author : Mohammad Satrio Utomo : https://github.com/tyok +//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +import moment from '../moment'; + +export default moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + ss : '%d detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/is.js b/nodejs/node_modules/moment/src/locale/is.js new file mode 100755 index 0000000..51fb8e6 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/is.js @@ -0,0 +1,124 @@ +//! moment.js locale configuration +//! locale : Icelandic [is] +//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +import moment from '../moment'; + +function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; +} +function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'ss': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum'); + } + return result + 'sekúnda'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } +} + +export default moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : 'klukkustund', + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/it.js b/nodejs/node_modules/moment/src/locale/it.js new file mode 100755 index 0000000..a7ce117 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/it.js @@ -0,0 +1,62 @@ +//! moment.js locale configuration +//! locale : Italian [it] +//! author : Lorenzo : https://github.com/aliem +//! author: Mattia Larentis: https://github.com/nostalgiaz + +import moment from '../moment'; + +export default moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), + weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), + weekdaysMin : 'do_lu_ma_me_gi_ve_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: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + ss : '%d secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ja.js b/nodejs/node_modules/moment/src/locale/ja.js new file mode 100755 index 0000000..9812a73 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ja.js @@ -0,0 +1,84 @@ +//! moment.js locale configuration +//! locale : Japanese [ja] +//! author : LI Long : https://github.com/baryon + +import moment from '../moment'; + +export default moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : '日_月_火_水_木_金_土'.split('_'), + weekdaysMin : '日_月_火_水_木_金_土'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日 dddd HH:mm', + l : 'YYYY/MM/DD', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日(ddd) HH:mm' + }, + meridiemParse: /午前|午後/i, + isPM : function (input) { + return input === '午後'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return '午前'; + } else { + return '午後'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : function (now) { + if (now.week() < this.week()) { + return '[来週]dddd LT'; + } else { + return 'dddd LT'; + } + }, + lastDay : '[昨日] LT', + lastWeek : function (now) { + if (this.week() < now.week()) { + return '[先週]dddd LT'; + } else { + return 'dddd LT'; + } + }, + sameElse : 'L' + }, + dayOfMonthOrdinalParse : /\d{1,2}日/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + default: + return number; + } + }, + relativeTime : { + future : '%s後', + past : '%s前', + s : '数秒', + ss : '%d秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1日', + dd : '%d日', + M : '1ヶ月', + MM : '%dヶ月', + y : '1年', + yy : '%d年' + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/jv.js b/nodejs/node_modules/moment/src/locale/jv.js new file mode 100755 index 0000000..31fc9ad --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/jv.js @@ -0,0 +1,74 @@ +//! moment.js locale configuration +//! locale : Javanese [jv] +//! author : Rony Lantip : https://github.com/lantip +//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa + +import moment from '../moment'; + +export default moment.defineLocale('jv', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'), + weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /enjing|siyang|sonten|ndalu/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'enjing') { + return hour; + } else if (meridiem === 'siyang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sonten' || meridiem === 'ndalu') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'enjing'; + } else if (hours < 15) { + return 'siyang'; + } else if (hours < 19) { + return 'sonten'; + } else { + return 'ndalu'; + } + }, + calendar : { + sameDay : '[Dinten puniko pukul] LT', + nextDay : '[Mbenjang pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kala wingi pukul] LT', + lastWeek : 'dddd [kepengker pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'wonten ing %s', + past : '%s ingkang kepengker', + s : 'sawetawis detik', + ss : '%d detik', + m : 'setunggal menit', + mm : '%d menit', + h : 'setunggal jam', + hh : '%d jam', + d : 'sedinten', + dd : '%d dinten', + M : 'sewulan', + MM : '%d wulan', + y : 'setaun', + yy : '%d taun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/ka.js b/nodejs/node_modules/moment/src/locale/ka.js new file mode 100755 index 0000000..169734b --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ka.js @@ -0,0 +1,81 @@ +//! moment.js locale configuration +//! locale : Georgian [ka] +//! author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +import moment from '../moment'; + +export default moment.defineLocale('ka', { + months : { + standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'), + format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_') + }, + monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'), + weekdays : { + standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'), + format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'), + isFormat: /(წინა|შემდეგ)/ + }, + weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'), + weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.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 : '[დღეს] LT[-ზე]', + nextDay : '[ხვალ] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინა] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წამი|წუთი|საათი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რამდენიმე წამი', + ss : '%d წამი', + m : 'წუთი', + mm : '%d წუთი', + h : 'საათი', + hh : '%d საათი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + if (number === 1) { + return number + '-ლი'; + } + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/kk.js b/nodejs/node_modules/moment/src/locale/kk.js new file mode 100755 index 0000000..1917a9b --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/kk.js @@ -0,0 +1,78 @@ +//! moment.js locale configuration +//! locale : Kazakh [kk] +//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan + +import moment from '../moment'; + +var suffixes = { + 0: '-ші', + 1: '-ші', + 2: '-ші', + 3: '-ші', + 4: '-ші', + 5: '-ші', + 6: '-шы', + 7: '-ші', + 8: '-ші', + 9: '-шы', + 10: '-шы', + 20: '-шы', + 30: '-шы', + 40: '-шы', + 50: '-ші', + 60: '-шы', + 70: '-ші', + 80: '-ші', + 90: '-шы', + 100: '-ші' +}; + +export default moment.defineLocale('kk', { + months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'), + monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'), + weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'), + 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', + 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 жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/km.js b/nodejs/node_modules/moment/src/locale/km.js new file mode 100755 index 0000000..b364ffe --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/km.js @@ -0,0 +1,101 @@ +//! moment.js locale configuration +//! locale : Cambodian [km] +//! author : Kruy Vanna : https://github.com/kruyvanna + +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('km', { + 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 ឆ្នាំ' + }, + dayOfMonthOrdinalParse : /ទី\d{1,2}/, + ordinal : 'ទី%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]; + }); + }, + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/kn.js b/nodejs/node_modules/moment/src/locale/kn.js new file mode 100755 index 0000000..d4b65e8 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/kn.js @@ -0,0 +1,117 @@ +//! moment.js locale configuration +//! locale : Kannada [kn] +//! author : Rajeev Naik : https://github.com/rajeevnaikte + +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('kn', { + months : 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'), + monthsShort : 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'), + 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 : '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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'ಸಂಜೆ') { + return hour + 12; + } + }, + 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 'ರಾತ್ರಿ'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/, + ordinal : function (number) { + return number + 'ನೇ'; + }, + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/ko.js b/nodejs/node_modules/moment/src/locale/ko.js new file mode 100755 index 0000000..d2da13d --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ko.js @@ -0,0 +1,74 @@ +//! moment.js locale configuration +//! locale : Korean [ko] +//! author : Kyungwook, Park : https://github.com/kyungw00k +//! author : Jeeeyul Lee + +import moment from '../moment'; + +export default moment.defineLocale('ko', { + months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), + weekdaysShort : '일_월_화_수_목_금_토'.split('_'), + weekdaysMin : '일_월_화_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY년 MMMM D일', + LLL : 'YYYY년 MMMM D일 A h:mm', + LLLL : 'YYYY년 MMMM D일 dddd A h:mm', + l : 'YYYY.MM.DD.', + ll : 'YYYY년 MMMM D일', + lll : 'YYYY년 MMMM D일 A h:mm', + llll : 'YYYY년 MMMM D일 dddd 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 : '1분', + mm : '%d분', + h : '한 시간', + hh : '%d시간', + d : '하루', + dd : '%d일', + M : '한 달', + MM : '%d달', + y : '일 년', + yy : '%d년' + }, + dayOfMonthOrdinalParse : /\d{1,2}(일|월|주)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '일'; + case 'M': + return number + '월'; + case 'w': + case 'W': + return number + '주'; + default: + return number; + } + }, + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ky.js b/nodejs/node_modules/moment/src/locale/ky.js new file mode 100755 index 0000000..aa7f1b2 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ky.js @@ -0,0 +1,79 @@ +//! moment.js locale configuration +//! locale : Kyrgyz [ky] +//! author : Chyngyz Arystan uulu : https://github.com/chyngyz + + +import moment from '../moment'; + +var suffixes = { + 0: '-чү', + 1: '-чи', + 2: '-чи', + 3: '-чү', + 4: '-чү', + 5: '-чи', + 6: '-чы', + 7: '-чи', + 8: '-чи', + 9: '-чу', + 10: '-чу', + 20: '-чы', + 30: '-чу', + 40: '-чы', + 50: '-чү', + 60: '-чы', + 70: '-чи', + 80: '-чи', + 90: '-чу', + 100: '-чү' +}; + +export default moment.defineLocale('ky', { + months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'), + monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'), + 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', + 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 жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/lb.js b/nodejs/node_modules/moment/src/locale/lb.js new file mode 100755 index 0000000..8574277 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/lb.js @@ -0,0 +1,129 @@ +//! moment.js locale configuration +//! locale : Luxembourgish [lb] +//! author : mweimerskirch : https://github.com/mweimerskirch +//! author : David Raison : https://github.com/kwisatz + +import moment from '../moment'; + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; +} +function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; +} +function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; +} +/** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ +function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } +} + +export default moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm [Auer]', + LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + ss : '%d Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/lo.js b/nodejs/node_modules/moment/src/locale/lo.js new file mode 100755 index 0000000..3226dd5 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/lo.js @@ -0,0 +1,62 @@ +//! moment.js locale configuration +//! locale : Lao [lo] +//! author : Ryan Hart : https://github.com/ryanhart2 + +import moment from '../moment'; + +export default moment.defineLocale('lo', { + 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 : '1 ນາທີ', + mm : '%d ນາທີ', + h : '1 ຊົ່ວໂມງ', + hh : '%d ຊົ່ວໂມງ', + d : '1 ມື້', + dd : '%d ມື້', + M : '1 ເດືອນ', + MM : '%d ເດືອນ', + y : '1 ປີ', + yy : '%d ປີ' + }, + dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/, + ordinal : function (number) { + return 'ທີ່' + number; + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/lt.js b/nodejs/node_modules/moment/src/locale/lt.js new file mode 100755 index 0000000..d006e07 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/lt.js @@ -0,0 +1,110 @@ +//! moment.js locale configuration +//! locale : Lithuanian [lt] +//! author : Mindaugas Mozūras : https://github.com/mmozuras + +import moment from '../moment'; + +var units = { + 'ss' : 'sekundė_sekundžių_sekundes', + 'm' : 'minutė_minutės_minutę', + 'mm': 'minutės_minučių_minutes', + 'h' : 'valanda_valandos_valandą', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dieną', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mėnuo_mėnesio_mėnesį', + 'MM': 'mėnesiai_mėnesių_mėnesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' +}; +function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundės'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } +} +function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); +} +function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); +} +function forms(key) { + return units[key].split('_'); +} +function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } +} +export default moment.defineLocale('lt', { + months : { + format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'), + standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'), + isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/ + }, + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : { + format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'), + standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'), + isFormat: /dddd HH:mm/ + }, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]' + }, + calendar : { + sameDay : '[Šiandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[Praėjusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieš %s', + s : translateSeconds, + ss : translate, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/lv.js b/nodejs/node_modules/moment/src/locale/lv.js new file mode 100755 index 0000000..d13b47b --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/lv.js @@ -0,0 +1,90 @@ +//! moment.js locale configuration +//! locale : Latvian [lv] +//! author : Kristaps Karlsons : https://github.com/skakri +//! author : Jānis Elmeris : https://github.com/JanisE + +import moment from '../moment'; + +var units = { + 'ss': 'sekundes_sekundēm_sekunde_sekundes'.split('_'), + 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'h': 'stundas_stundām_stunda_stundas'.split('_'), + 'hh': 'stundas_stundām_stunda_stundas'.split('_'), + 'd': 'dienas_dienām_diena_dienas'.split('_'), + 'dd': 'dienas_dienām_diena_dienas'.split('_'), + 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'y': 'gada_gadiem_gads_gadi'.split('_'), + 'yy': 'gada_gadiem_gads_gadi'.split('_') +}; +/** + * @param withoutSuffix boolean true = a length of time; false = before/after a period of time. + */ +function format(forms, number, withoutSuffix) { + if (withoutSuffix) { + // E.g. "21 minūte", "3 minūtes". + return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3]; + } else { + // E.g. "21 minūtes" as in "pēc 21 minūtes". + // E.g. "3 minūtēm" as in "pēc 3 minūtēm". + return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1]; + } +} +function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); +} +function relativeTimeWithSingular(number, withoutSuffix, key) { + return format(units[key], number, withoutSuffix); +} +function relativeSeconds(number, withoutSuffix) { + return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm'; +} + +export default moment.defineLocale('lv', { + months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY.', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, HH:mm', + LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm' + }, + calendar : { + sameDay : '[Šodien pulksten] LT', + nextDay : '[Rīt pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[Pagājušā] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'pēc %s', + past : 'pirms %s', + s : relativeSeconds, + ss : relativeTimeWithPlural, + m : relativeTimeWithSingular, + mm : relativeTimeWithPlural, + h : relativeTimeWithSingular, + hh : relativeTimeWithPlural, + d : relativeTimeWithSingular, + dd : relativeTimeWithPlural, + M : relativeTimeWithSingular, + MM : relativeTimeWithPlural, + y : relativeTimeWithSingular, + yy : relativeTimeWithPlural + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/me.js b/nodejs/node_modules/moment/src/locale/me.js new file mode 100755 index 0000000..120c997 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/me.js @@ -0,0 +1,103 @@ +//! moment.js locale configuration +//! locale : Montenegrin [me] +//! author : Miodrag Nikač : https://github.com/miodragnikac + +import moment from '../moment'; + +var translator = { + words: { //Different grammatical cases + ss: ['sekund', 'sekunda', 'sekundi'], + m: ['jedan minut', 'jednog minuta'], + mm: ['minut', 'minuta', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mjesec', 'mjeseca', 'mjeseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } +}; + +export default moment.defineLocale('me', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._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: '[sjutra 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če u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedjelje] [u] LT', + '[prošlog] [ponedjeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srijede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'nekoliko sekundi', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mjesec', + MM : translator.translate, + y : 'godinu', + yy : translator.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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/mi.js b/nodejs/node_modules/moment/src/locale/mi.js new file mode 100755 index 0000000..0c105e5 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/mi.js @@ -0,0 +1,55 @@ +//! moment.js locale configuration +//! locale : Maori [mi] +//! author : John Corrigan : https://github.com/johnideal + +import moment from '../moment'; + +export default moment.defineLocale('mi', { + months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'), + monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'), + monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i, + weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'), + weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY [i] HH:mm', + LLLL: 'dddd, D MMMM YYYY [i] HH:mm' + }, + calendar: { + sameDay: '[i teie mahana, i] LT', + nextDay: '[apopo i] LT', + nextWeek: 'dddd [i] LT', + lastDay: '[inanahi i] LT', + lastWeek: 'dddd [whakamutunga i] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'i roto i %s', + past: '%s i mua', + s: 'te hēkona ruarua', + ss: '%d hēkona', + m: 'he meneti', + mm: '%d meneti', + h: 'te haora', + hh: '%d haora', + d: 'he ra', + dd: '%d ra', + M: 'he marama', + MM: '%d marama', + y: 'he tau', + yy: '%d tau' + }, + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/mk.js b/nodejs/node_modules/moment/src/locale/mk.js new file mode 100755 index 0000000..6d6e0b4 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/mk.js @@ -0,0 +1,82 @@ +//! moment.js locale configuration +//! locale : Macedonian [mk] +//! author : Borislav Mickov : https://github.com/B0k0 + +import moment from '../moment'; + +export default moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'), + weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'), + weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.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 дена', + 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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ml.js b/nodejs/node_modules/moment/src/locale/ml.js new file mode 100755 index 0000000..306566d --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ml.js @@ -0,0 +1,73 @@ +//! moment.js locale configuration +//! locale : Malayalam [ml] +//! author : Floyd Pink : https://github.com/floydpink + +import moment from '../moment'; + +export default moment.defineLocale('ml', { + months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'), + 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 : '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 വർഷം' + }, + meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'രാത്രി' && hour >= 4) || + meridiem === 'ഉച്ച കഴിഞ്ഞ്' || + meridiem === 'വൈകുന്നേരം') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാത്രി'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉച്ച കഴിഞ്ഞ്'; + } else if (hour < 20) { + return 'വൈകുന്നേരം'; + } else { + return 'രാത്രി'; + } + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/mn.js b/nodejs/node_modules/moment/src/locale/mn.js new file mode 100755 index 0000000..80a3c2f --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/mn.js @@ -0,0 +1,96 @@ +//! moment.js locale configuration +//! locale : Mongolian [mn] +//! author : Javkhlantugs Nyamdorj : https://github.com/javkhaanj7 + +import moment from '../moment'; + +function translate(number, withoutSuffix, key, isFuture) { + switch (key) { + case 's': + return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын'; + case 'ss': + return number + (withoutSuffix ? ' секунд' : ' секундын'); + case 'm': + case 'mm': + return number + (withoutSuffix ? ' минут' : ' минутын'); + case 'h': + case 'hh': + return number + (withoutSuffix ? ' цаг' : ' цагийн'); + case 'd': + case 'dd': + return number + (withoutSuffix ? ' өдөр' : ' өдрийн'); + case 'M': + case 'MM': + return number + (withoutSuffix ? ' сар' : ' сарын'); + case 'y': + case 'yy': + return number + (withoutSuffix ? ' жил' : ' жилийн'); + default: + return number; + } +} + +export default moment.defineLocale('mn', { + months : 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split('_'), + monthsShort : '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split('_'), + monthsParseExact : true, + weekdays : 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'), + weekdaysShort : 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'), + weekdaysMin : 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY оны MMMMын D', + LLL : 'YYYY оны MMMMын D HH:mm', + LLLL : 'dddd, YYYY оны MMMMын D HH:mm' + }, + meridiemParse: /ҮӨ|ҮХ/i, + 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 : 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 : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + ' өдөр'; + default: + return number; + } + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/mr.js b/nodejs/node_modules/moment/src/locale/mr.js new file mode 100755 index 0000000..415644a --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/mr.js @@ -0,0 +1,153 @@ +//! moment.js locale configuration +//! locale : Marathi [mr] +//! author : Harshad Kale : https://github.com/kalehv +//! author : Vivek Athalye : https://github.com/vnathalye + +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' +}; + +function relativeTimeMr(number, withoutSuffix, string, isFuture) +{ + var output = ''; + if (withoutSuffix) { + switch (string) { + case 's': output = 'काही सेकंद'; break; + case 'ss': output = '%d सेकंद'; break; + case 'm': output = 'एक मिनिट'; break; + case 'mm': output = '%d मिनिटे'; break; + case 'h': output = 'एक तास'; break; + case 'hh': output = '%d तास'; break; + case 'd': output = 'एक दिवस'; break; + case 'dd': output = '%d दिवस'; break; + case 'M': output = 'एक महिना'; break; + case 'MM': output = '%d महिने'; break; + case 'y': output = 'एक वर्ष'; break; + case 'yy': output = '%d वर्षे'; break; + } + } + else { + switch (string) { + case 's': output = 'काही सेकंदां'; break; + case 'ss': output = '%d सेकंदां'; break; + case 'm': output = 'एका मिनिटा'; break; + case 'mm': output = '%d मिनिटां'; break; + case 'h': output = 'एका तासा'; break; + case 'hh': output = '%d तासां'; break; + case 'd': output = 'एका दिवसा'; break; + case 'dd': output = '%d दिवसां'; break; + case 'M': output = 'एका महिन्या'; break; + case 'MM': output = '%d महिन्यां'; break; + case 'y': output = 'एका वर्षा'; break; + case 'yy': output = '%d वर्षां'; break; + } + } + return output.replace(/%d/i, number); +} + +export default moment.defineLocale('mr', { + months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'), + 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 : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future: '%sमध्ये', + past: '%sपूर्वी', + s: relativeTimeMr, + ss: relativeTimeMr, + m: relativeTimeMr, + mm: relativeTimeMr, + h: relativeTimeMr, + hh: relativeTimeMr, + d: relativeTimeMr, + dd: relativeTimeMr, + M: relativeTimeMr, + MM: relativeTimeMr, + y: relativeTimeMr, + yy: relativeTimeMr + }, + 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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + 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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ms-my.js b/nodejs/node_modules/moment/src/locale/ms-my.js new file mode 100755 index 0000000..03fcaa9 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ms-my.js @@ -0,0 +1,75 @@ +//! moment.js locale configuration +//! locale : Malay [ms-my] +//! note : DEPRECATED, the correct one is [ms] +//! author : Weldan Jamili : https://github.com/weldan + +import moment from '../moment'; + +export default moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + ss : '%d saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ms.js b/nodejs/node_modules/moment/src/locale/ms.js new file mode 100755 index 0000000..9f69147 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ms.js @@ -0,0 +1,74 @@ +//! moment.js locale configuration +//! locale : Malay [ms] +//! author : Weldan Jamili : https://github.com/weldan + +import moment from '../moment'; + +export default moment.defineLocale('ms', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + ss : '%d saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/mt.js b/nodejs/node_modules/moment/src/locale/mt.js new file mode 100755 index 0000000..4953fa2 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/mt.js @@ -0,0 +1,51 @@ +//! moment.js locale configuration +//! locale : Maltese (Malta) [mt] +//! author : Alessandro Maruccia : https://github.com/alesma + +import moment from '../moment'; + +export default moment.defineLocale('mt', { + months : 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'), + monthsShort : 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'), + weekdays : 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'), + weekdaysShort : 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'), + weekdaysMin : 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.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 : '[Illum fil-]LT', + nextDay : '[Għada fil-]LT', + nextWeek : 'dddd [fil-]LT', + lastDay : '[Il-bieraħ fil-]LT', + lastWeek : 'dddd [li għadda] [fil-]LT', + sameElse : 'L' + }, + relativeTime : { + future : 'f’ %s', + past : '%s ilu', + s : 'ftit sekondi', + ss : '%d sekondi', + m : 'minuta', + mm : '%d minuti', + h : 'siegħa', + hh : '%d siegħat', + d : 'ġurnata', + dd : '%d ġranet', + M : 'xahar', + MM : '%d xhur', + y : 'sena', + yy : '%d sni' + }, + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/my.js b/nodejs/node_modules/moment/src/locale/my.js new file mode 100755 index 0000000..7e98f7f --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/my.js @@ -0,0 +1,87 @@ +//! moment.js locale configuration +//! locale : Burmese [my] +//! author : Squar team, mysquar.com +//! author : David Rossellat : https://github.com/gholadr +//! author : Tin Aung Lin : https://github.com/thanyawzinmin + +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('my', { + months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'), + 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 [မှာ]', + 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]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/nb.js b/nodejs/node_modules/moment/src/locale/nb.js new file mode 100755 index 0000000..27bb88e --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/nb.js @@ -0,0 +1,55 @@ +//! moment.js locale configuration +//! locale : Norwegian Bokmål [nb] +//! authors : Espen Hovlandsdal : https://github.com/rexxars +//! Sigurd Gartmann : https://github.com/sigurdga + +import moment from '../moment'; + +export default moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'), + monthsParseExact : true, + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i går kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'noen sekunder', + ss : '%d sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en måned', + MM : '%d måneder', + y : 'ett å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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ne.js b/nodejs/node_modules/moment/src/locale/ne.js new file mode 100755 index 0000000..841198d --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ne.js @@ -0,0 +1,115 @@ +//! moment.js locale configuration +//! locale : Nepalese [ne] +//! author : suvash : https://github.com/suvash + +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('ne', { + months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'), + monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'), + monthsParseExact : true, + weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'), + weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'), + weekdaysParseExact : true, + 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 बजे' + }, + 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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'साँझ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राति'; + } else if (hour < 12) { + return 'बिहान'; + } else if (hour < 16) { + return 'दिउँसो'; + } else if (hour < 20) { + 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 बर्ष' + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/nl-be.js b/nodejs/node_modules/moment/src/locale/nl-be.js new file mode 100755 index 0000000..d7a8d54 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/nl-be.js @@ -0,0 +1,80 @@ +//! moment.js locale configuration +//! locale : Dutch (Belgium) [nl-be] +//! author : Joris Röling : https://github.com/jorisroling +//! author : Jacob Middag : https://github.com/middagj + +import moment from '../moment'; + +var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + +var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; +var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + +export default moment.defineLocale('nl-be', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.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: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + ss : '%d seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + 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'); + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/nl.js b/nodejs/node_modules/moment/src/locale/nl.js new file mode 100755 index 0000000..70c9837 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/nl.js @@ -0,0 +1,80 @@ +//! moment.js locale configuration +//! locale : Dutch [nl] +//! author : Joris Röling : https://github.com/jorisroling +//! author : Jacob Middag : https://github.com/middagj + +import moment from '../moment'; + +var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + +var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; +var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + +export default moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.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: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + ss : '%d seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + 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'); + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/nn.js b/nodejs/node_modules/moment/src/locale/nn.js new file mode 100755 index 0000000..ea8ca7b --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/nn.js @@ -0,0 +1,52 @@ +//! moment.js locale configuration +//! locale : Nynorsk [nn] +//! author : https://github.com/mechuwind + +import moment from '../moment'; + +export default moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_må_ty_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 [kl.] H:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I går klokka] LT', + lastWeek: '[Føregåande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s sidan', + s : 'nokre sekund', + ss : '%d sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein månad', + MM : '%d månader', + y : 'eit å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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/pa-in.js b/nodejs/node_modules/moment/src/locale/pa-in.js new file mode 100755 index 0000000..6b85350 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/pa-in.js @@ -0,0 +1,116 @@ +//! moment.js locale configuration +//! locale : Punjabi (India) [pa-in] +//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit + +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('pa-in', { + // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi. + 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]; + }); + }, + // Punjabi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi. + 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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'ਸ਼ਾਮ') { + return hour + 12; + } + }, + 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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/pl.js b/nodejs/node_modules/moment/src/locale/pl.js new file mode 100755 index 0000000..4a46277 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/pl.js @@ -0,0 +1,117 @@ +//! moment.js locale configuration +//! locale : Polish [pl] +//! author : Rafal Hirsz : https://github.com/evoL + +import moment from '../moment'; + +var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'); +function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); +} +function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'ss': + return result + (plural(number) ? 'sekundy' : 'sekund'); + case 'm': + return withoutSuffix ? 'minuta' : 'minutę'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinę'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiące' : 'miesięcy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } +} + +export default moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (!momentToFormat) { + return monthsNominative; + } else if (format === '') { + // Hack: if format empty we know this is used to generate + // RegExp by moment. Give then back both valid forms of months + // in RegExp ready format. + return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')'; + } else if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), + weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), + weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.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: '[Dziś o] LT', + nextDay: '[Jutro o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[W niedzielę o] LT'; + + case 2: + return '[We wtorek o] LT'; + + case 3: + return '[W środę o] LT'; + + case 6: + return '[W sobotę o] LT'; + + default: + return '[W] dddd [o] LT'; + } + }, + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszłą niedzielę o] LT'; + case 3: + return '[W zeszłą środę o] LT'; + case 6: + return '[W zeszłą sobotę o] LT'; + default: + return '[W zeszły] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzień', + dd : '%d dni', + M : 'miesiąc', + MM : translate, + y : 'rok', + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/pt-br.js b/nodejs/node_modules/moment/src/locale/pt-br.js new file mode 100755 index 0000000..bcfe245 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/pt-br.js @@ -0,0 +1,53 @@ +//! moment.js locale configuration +//! locale : Portuguese (Brazil) [pt-br] +//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +import moment from '../moment'; + +export default moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'poucos segundos', + ss : '%d segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal : '%dº' +}); + diff --git a/nodejs/node_modules/moment/src/locale/pt.js b/nodejs/node_modules/moment/src/locale/pt.js new file mode 100755 index 0000000..9a63a49 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/pt.js @@ -0,0 +1,57 @@ +//! moment.js locale configuration +//! locale : Portuguese [pt] +//! author : Jefferson : https://github.com/jalex79 + +import moment from '../moment'; + +export default moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + ss : '%d segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ro.js b/nodejs/node_modules/moment/src/locale/ro.js new file mode 100755 index 0000000..af621d5 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ro.js @@ -0,0 +1,68 @@ +//! moment.js locale configuration +//! locale : Romanian [ro] +//! author : Vlad Gurdiga : https://github.com/gurdiga +//! author : Valentin Agachi : https://github.com/avaly + +import moment from '../moment'; + +function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'ss': 'secunde', + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + return number + separator + format[key]; +} + +export default moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.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' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + ss : relativeTimeWithPlural, + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ru.js b/nodejs/node_modules/moment/src/locale/ru.js new file mode 100755 index 0000000..29046af --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ru.js @@ -0,0 +1,175 @@ +//! moment.js locale configuration +//! locale : Russian [ru] +//! author : Viktorminator : https://github.com/Viktorminator +//! Author : Menelion Elensúle : https://github.com/Oire +//! author : Коренберг Марк : https://github.com/socketpair + +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': 'час_часа_часов', + 'dd': 'день_дня_дней', + 'MM': 'месяц_месяца_месяцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } +} +var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; + +// http://new.gramota.ru/spravka/rules/139-prop : § 103 +// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637 +// CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753 +export default moment.defineLocale('ru', { + months : { + format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'), + standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_') + }, + monthsShort : { + // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ? + format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'), + standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_') + }, + weekdays : { + standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'), + format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'), + isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/ + }, + weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + + // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки + monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, + + // копия предыдущего + monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, + + // полные названия с падежами + monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i, + + // Выражение, которое соотвествует только сокращённым формам + monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i, + 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: '[Сегодня, в] LT', + nextDay: '[Завтра, в] LT', + lastDay: '[Вчера, в] LT', + nextWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В следующее] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В следующий] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В следующую] dddd, [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd, [в] LT'; + } else { + return '[В] dddd, [в] LT'; + } + } + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В прошлое] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В прошлый] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В прошлую] dddd, [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd, [в] LT'; + } else { + return '[В] dddd, [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'несколько секунд', + ss : relativeTimeWithPlural, + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'час', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'месяц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночи|утра|дня|вечера/i, + 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': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-я'; + default: + return number; + } + }, + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/sd.js b/nodejs/node_modules/moment/src/locale/sd.js new file mode 100755 index 0000000..9747ad4 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/sd.js @@ -0,0 +1,89 @@ +//! moment.js locale configuration +//! locale : Sindhi [sd] +//! author : Narain Sagar : https://github.com/narainsagar + +import moment from '../moment'; + +var months = [ + 'جنوري', + 'فيبروري', + 'مارچ', + 'اپريل', + 'مئي', + 'جون', + 'جولاءِ', + 'آگسٽ', + 'سيپٽمبر', + 'آڪٽوبر', + 'نومبر', + 'ڊسمبر' +]; +var days = [ + 'آچر', + 'سومر', + 'اڱارو', + 'اربع', + 'خميس', + 'جمع', + 'ڇنڇر' +]; + +export default moment.defineLocale('sd', { + months : months, + monthsShort : months, + weekdays : days, + weekdaysShort : days, + weekdaysMin : days, + 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 'صبح'; + } + 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 : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/se.js b/nodejs/node_modules/moment/src/locale/se.js new file mode 100755 index 0000000..dd10cda --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/se.js @@ -0,0 +1,52 @@ +//! moment.js locale configuration +//! locale : Northern Sami [se] +//! authors : Bård Rolstad Henriksen : https://github.com/karamell + + +import moment from '../moment'; + +export default moment.defineLocale('se', { + months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'), + monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'), + weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'), + weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'), + weekdaysMin : 's_v_m_g_d_b_L'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'MMMM D. [b.] YYYY', + LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm', + LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm' + }, + calendar : { + sameDay: '[otne ti] LT', + nextDay: '[ihttin ti] LT', + nextWeek: 'dddd [ti] LT', + lastDay: '[ikte ti] LT', + lastWeek: '[ovddit] dddd [ti] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s geažes', + past : 'maŋit %s', + s : 'moadde sekunddat', + ss: '%d sekunddat', + m : 'okta minuhta', + mm : '%d minuhtat', + h : 'okta diimmu', + hh : '%d diimmut', + d : 'okta beaivi', + dd : '%d beaivvit', + M : 'okta mánnu', + MM : '%d mánut', + y : 'okta jahki', + yy : '%d jagit' + }, + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/si.js b/nodejs/node_modules/moment/src/locale/si.js new file mode 100755 index 0000000..ed3caf3 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/si.js @@ -0,0 +1,62 @@ +//! moment.js locale configuration +//! locale : Sinhalese [si] +//! author : Sampath Sitinamaluwa : https://github.com/sampathsris + +import moment from '../moment'; + +/*jshint -W100*/ +export default moment.defineLocale('si', { + months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'), + monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'), + weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'), + weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'), + weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'a h:mm', + LTS : 'a h:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY MMMM D', + LLL : 'YYYY MMMM D, a h:mm', + LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss' + }, + 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' + }, + dayOfMonthOrdinalParse: /\d{1,2} වැනි/, + ordinal : function (number) { + return number + ' වැනි'; + }, + meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./, + isPM : function (input) { + return input === 'ප.ව.' || input === 'පස් වරු'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'ප.ව.' : 'පස් වරු'; + } else { + return isLower ? 'පෙ.ව.' : 'පෙර වරු'; + } + } +}); diff --git a/nodejs/node_modules/moment/src/locale/sk.js b/nodejs/node_modules/moment/src/locale/sk.js new file mode 100755 index 0000000..3cd3ee1 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/sk.js @@ -0,0 +1,149 @@ +//! moment.js locale configuration +//! locale : Slovak [sk] +//! author : Martin Minka : https://github.com/k2s +//! based on work of petrbela : https://github.com/petrbela + +import moment from '../moment'; + +var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); +function plural(n) { + return (n > 1) && (n < 5); +} +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 sekúnd' : 'pár sekundami'; + case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'sekundy' : 'sekúnd'); + } else { + return result + 'sekundami'; + } + break; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + 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' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } +} + +export default moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_št_pi_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' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo štvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[včera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/sl.js b/nodejs/node_modules/moment/src/locale/sl.js new file mode 100755 index 0000000..b37b7ed --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/sl.js @@ -0,0 +1,164 @@ +//! moment.js locale configuration +//! locale : Slovenian [sl] +//! author : Robert Sedovšek : https://github.com/sedovsek + +import moment from '../moment'; + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami'; + case 'ss': + if (number === 1) { + result += withoutSuffix ? 'sekundo' : 'sekundi'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah'; + } else { + result += withoutSuffix || isFuture ? 'sekund' : 'sekund'; + } + return result; + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += withoutSuffix ? 'minuta' : 'minuto'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'minuti' : 'minutama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'minute' : 'minutami'; + } else { + result += withoutSuffix || isFuture ? 'minut' : 'minutami'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += withoutSuffix ? 'ura' : 'uro'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'uri' : 'urama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'ure' : 'urami'; + } else { + result += withoutSuffix || isFuture ? 'ur' : 'urami'; + } + return result; + case 'd': + return withoutSuffix || isFuture ? 'en dan' : 'enim dnem'; + case 'dd': + if (number === 1) { + result += withoutSuffix || isFuture ? 'dan' : 'dnem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'dni' : 'dnevoma'; + } else { + result += withoutSuffix || isFuture ? 'dni' : 'dnevi'; + } + return result; + case 'M': + return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem'; + case 'MM': + if (number === 1) { + result += withoutSuffix || isFuture ? 'mesec' : 'mesecem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'meseca' : 'mesecema'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'mesece' : 'meseci'; + } else { + result += withoutSuffix || isFuture ? 'mesecev' : 'meseci'; + } + return result; + case 'y': + return withoutSuffix || isFuture ? 'eno leto' : 'enim letom'; + case 'yy': + if (number === 1) { + result += withoutSuffix || isFuture ? 'leto' : 'letom'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'leti' : 'letoma'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'leta' : 'leti'; + } else { + result += withoutSuffix || isFuture ? 'let' : 'leti'; + } + return result; + } +} + +export default moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_če_pe_so'.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 : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[včeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + return '[prejšnjo] [nedeljo] [ob] LT'; + case 3: + return '[prejšnjo] [sredo] [ob] LT'; + case 6: + return '[prejšnjo] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejšnji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'čez %s', + past : 'pred %s', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + 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 : 7 // The week that contains Jan 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/sq.js b/nodejs/node_modules/moment/src/locale/sq.js new file mode 100755 index 0000000..1280db7 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/sq.js @@ -0,0 +1,62 @@ +//! moment.js locale configuration +//! locale : Albanian [sq] +//! author : Flakërim Ismani : https://github.com/flakerimi +//! author : Menelion Elensúle : https://github.com/Oire +//! author : Oerd Cukalla : https://github.com/oerd + +import moment from '../moment'; + +export default moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + weekdaysParseExact : true, + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + 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 : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + ss : '%d sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/sr-cyrl.js b/nodejs/node_modules/moment/src/locale/sr-cyrl.js new file mode 100755 index 0000000..fc10aee --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/sr-cyrl.js @@ -0,0 +1,102 @@ +//! moment.js locale configuration +//! locale : Serbian Cyrillic [sr-cyrl] +//! author : Milan Janačković : https://github.com/milan-j + +import moment from '../moment'; + +var translator = { + words: { //Different grammatical cases + ss: ['секунда', 'секунде', 'секунди'], + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један сат', 'једног сата'], + hh: ['сат', 'сата', 'сати'], + dd: ['дан', 'дана', 'дана'], + MM: ['месец', 'месеца', 'месеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } +}; + +export default moment.defineLocale('sr-cyrl', { + months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'), + monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'), + monthsParseExact: true, + weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'), + weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'), + weekdaysMin: 'не_по_ут_ср_че_пе_су'.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: '[данас у] LT', + nextDay: '[сутра у] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [среду] [у] LT'; + case 6: + return '[у] [суботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [среде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [суботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико секунди', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'месец', + MM : translator.translate, + y : 'годину', + yy : translator.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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/sr.js b/nodejs/node_modules/moment/src/locale/sr.js new file mode 100755 index 0000000..2118262 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/sr.js @@ -0,0 +1,102 @@ +//! moment.js locale configuration +//! locale : Serbian [sr] +//! author : Milan Janačković : https://github.com/milan-j + +import moment from '../moment'; + +var translator = { + words: { //Different grammatical cases + ss: ['sekunda', 'sekunde', 'sekundi'], + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } +}; + +export default moment.defineLocale('sr', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'), + weekdaysShort: 'ned._pon._uto._sre._č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] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juče u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedelje] [u] LT', + '[prošlog] [ponedeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/ss.js b/nodejs/node_modules/moment/src/locale/ss.js new file mode 100755 index 0000000..7cc5f24 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ss.js @@ -0,0 +1,81 @@ +//! moment.js locale configuration +//! locale : siSwati [ss] +//! author : Nicolai Davies : https://github.com/nicolaidavies + + +import moment from '../moment'; + +export default moment.defineLocale('ss', { + months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'), + monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'), + weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'), + weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'), + weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'), + weekdaysParseExact : true, + 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 : '[Namuhla nga] LT', + nextDay : '[Kusasa nga] LT', + nextWeek : 'dddd [nga] LT', + lastDay : '[Itolo nga] LT', + lastWeek : 'dddd [leliphelile] [nga] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'nga %s', + past : 'wenteka nga %s', + s : 'emizuzwana lomcane', + ss : '%d mzuzwana', + m : 'umzuzu', + mm : '%d emizuzu', + h : 'lihora', + hh : '%d emahora', + d : 'lilanga', + dd : '%d emalanga', + M : 'inyanga', + MM : '%d tinyanga', + y : 'umnyaka', + yy : '%d iminyaka' + }, + meridiemParse: /ekuseni|emini|entsambama|ebusuku/, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'ekuseni'; + } else if (hours < 15) { + return 'emini'; + } else if (hours < 19) { + return 'entsambama'; + } else { + return 'ebusuku'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ekuseni') { + return hour; + } else if (meridiem === 'emini') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') { + if (hour === 0) { + return 0; + } + return hour + 12; + } + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/sv.js b/nodejs/node_modules/moment/src/locale/sv.js new file mode 100755 index 0000000..8afce35 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/sv.js @@ -0,0 +1,61 @@ +//! moment.js locale configuration +//! locale : Swedish [sv] +//! author : Jens Alm : https://github.com/ulmus + +import moment from '../moment'; + +export default moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D MMMM YYYY [kl.] HH:mm', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd D MMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[Igår] LT', + nextWeek: '[På] dddd LT', + lastWeek: '[I] dddd[s] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'några sekunder', + ss : '%d sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en månad', + MM : '%d månader', + y : 'ett år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/sw.js b/nodejs/node_modules/moment/src/locale/sw.js new file mode 100755 index 0000000..833de80 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/sw.js @@ -0,0 +1,51 @@ +//! moment.js locale configuration +//! locale : Swahili [sw] +//! author : Fahad Kassim : https://github.com/fadsel + +import moment from '../moment'; + +export default moment.defineLocale('sw', { + months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'), + weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'), + weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.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 : '[leo saa] LT', + nextDay : '[kesho saa] LT', + nextWeek : '[wiki ijayo] dddd [saat] LT', + lastDay : '[jana] LT', + lastWeek : '[wiki iliyopita] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s baadaye', + past : 'tokea %s', + s : 'hivi punde', + ss : 'sekunde %d', + m : 'dakika moja', + mm : 'dakika %d', + h : 'saa limoja', + hh : 'masaa %d', + d : 'siku moja', + dd : 'masiku %d', + M : 'mwezi mmoja', + MM : 'miezi %d', + y : 'mwaka mmoja', + yy : 'miaka %d' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ta.js b/nodejs/node_modules/moment/src/locale/ta.js new file mode 100755 index 0000000..9969cb5 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ta.js @@ -0,0 +1,121 @@ +//! moment.js locale configuration +//! locale : Tamil [ta] +//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + +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('ta', { + months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'), + 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', + 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 ஆண்டுகள்' + }, + dayOfMonthOrdinalParse: /\d{1,2}வது/, + ordinal : function (number) { + return number + 'வது'; + }, + 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]; + }); + }, + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமம்'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நண்பகல்'; // நண்பகல் + } else if (hour < 18) { + return ' எற்பாடு'; // எற்பாடு + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமம்'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமம்') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நண்பகல்') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/te.js b/nodejs/node_modules/moment/src/locale/te.js new file mode 100755 index 0000000..8fd2767 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/te.js @@ -0,0 +1,80 @@ +//! moment.js locale configuration +//! locale : Telugu [te] +//! author : Krishna Chaitanya Thota : https://github.com/kcthota + +import moment from '../moment'; + +export default moment.defineLocale('te', { + months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'), + monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'), + 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 : '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 సంవత్సరాలు' + }, + dayOfMonthOrdinalParse : /\d{1,2}వ/, + ordinal : '%dవ', + 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 >= 10 ? hour : hour + 12; + } else if (meridiem === 'సాయంత్రం') { + return hour + 12; + } + }, + 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 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/tet.js b/nodejs/node_modules/moment/src/locale/tet.js new file mode 100755 index 0000000..a4e9e19 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/tet.js @@ -0,0 +1,60 @@ +//! moment.js locale configuration +//! locale : Tetun Dili (East Timor) [tet] +//! author : Joshua Brooks : https://github.com/joshbrooks +//! author : Onorio De J. Afonso : https://github.com/marobo +//! author : Sonia Simoes : https://github.com/soniasimoes + +import moment from '../moment'; + +export default moment.defineLocale('tet', { + months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'), + weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'), + weekdaysMin : 'Do_Seg_Te_Ku_Ki_Ses_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: '[Ohin iha] LT', + nextDay: '[Aban iha] LT', + nextWeek: 'dddd [iha] LT', + lastDay: '[Horiseik iha] LT', + lastWeek: 'dddd [semana kotuk] [iha] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'iha %s', + past : '%s liuba', + s : 'minutu balun', + ss : 'minutu %d', + m : 'minutu ida', + mm : 'minutu %d', + h : 'oras ida', + hh : 'oras %d', + d : 'loron ida', + dd : 'loron %d', + M : 'fulan ida', + MM : 'fulan %d', + y : 'tinan ida', + yy : 'tinan %d' + }, + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/tg.js b/nodejs/node_modules/moment/src/locale/tg.js new file mode 100755 index 0000000..9f15e1a --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/tg.js @@ -0,0 +1,107 @@ +//! moment.js locale configuration +//! locale : Tajik [tg] +//! author : Orif N. Jr. : https://github.com/orif-jr + +import moment from '../moment'; + +var suffixes = { + 0: '-ум', + 1: '-ум', + 2: '-юм', + 3: '-юм', + 4: '-ум', + 5: '-ум', + 6: '-ум', + 7: '-ум', + 8: '-ум', + 9: '-ум', + 10: '-ум', + 12: '-ум', + 13: '-ум', + 20: '-ум', + 30: '-юм', + 40: '-ум', + 50: '-ум', + 60: '-ум', + 70: '-ум', + 80: '-ум', + 90: '-ум', + 100: '-ум' +}; + +export default moment.defineLocale('tg', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'), + 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 : 'dddd[и] [ҳафтаи оянда соати] LT', + lastWeek : 'dddd[и] [ҳафтаи гузашта соати] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'баъди %s', + past : '%s пеш', + s : 'якчанд сония', + m : 'як дақиқа', + mm : '%d дақиқа', + h : 'як соат', + hh : '%d соат', + d : 'як рӯз', + dd : '%d рӯз', + M : 'як моҳ', + MM : '%d моҳ', + y : 'як сол', + yy : '%d сол' + }, + 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 >= 11 ? hour : hour + 12; + } else if (meridiem === 'бегоҳ') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'шаб'; + } else if (hour < 11) { + return 'субҳ'; + } else if (hour < 16) { + return 'рӯз'; + } else if (hour < 19) { + return 'бегоҳ'; + } else { + return 'шаб'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/, + ordinal: function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1th is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/th.js b/nodejs/node_modules/moment/src/locale/th.js new file mode 100755 index 0000000..9f8771f --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/th.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration +//! locale : Thai [th] +//! author : Kridsada Thanabulpong : https://github.com/sirn + +import moment from '../moment'; + +export default moment.defineLocale('th', { + months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'), + monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'), + monthsParseExact: true, + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.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' + }, + 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 : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } +}); diff --git a/nodejs/node_modules/moment/src/locale/tl-ph.js b/nodejs/node_modules/moment/src/locale/tl-ph.js new file mode 100755 index 0000000..26c4824 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/tl-ph.js @@ -0,0 +1,54 @@ +//! moment.js locale configuration +//! locale : Tagalog (Philippines) [tl-ph] +//! author : Dan Hagman : https://github.com/hagmandan + +import moment from '../moment'; + +export default moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY HH:mm', + LLLL : 'dddd, MMMM DD, YYYY HH:mm' + }, + calendar : { + sameDay: 'LT [ngayong araw]', + nextDay: '[Bukas ng] LT', + nextWeek: 'LT [sa susunod na] dddd', + lastDay: 'LT [kahapon]', + lastWeek: 'LT [noong nakaraang] dddd', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + ss : '%d segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/tlh.js b/nodejs/node_modules/moment/src/locale/tlh.js new file mode 100755 index 0000000..324edc6 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/tlh.js @@ -0,0 +1,113 @@ +//! moment.js locale configuration +//! locale : Klingon [tlh] +//! author : Dominika Kruk : https://github.com/amaranthrose + +import moment from '../moment'; + +var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_'); + +function translateFuture(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'leS' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'waQ' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'nem' : + time + ' pIq'; + return time; +} + +function translatePast(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'Hu’' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'wen' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'ben' : + time + ' ret'; + return time; +} + +function translate(number, withoutSuffix, string, isFuture) { + var numberNoun = numberAsNoun(number); + switch (string) { + case 'ss': + return numberNoun + ' lup'; + case 'mm': + return numberNoun + ' tup'; + case 'hh': + return numberNoun + ' rep'; + case 'dd': + return numberNoun + ' jaj'; + case 'MM': + return numberNoun + ' jar'; + case 'yy': + return numberNoun + ' DIS'; + } +} + +function numberAsNoun(number) { + var hundred = Math.floor((number % 1000) / 100), + ten = Math.floor((number % 100) / 10), + one = number % 10, + word = ''; + if (hundred > 0) { + word += numbersNouns[hundred] + 'vatlh'; + } + if (ten > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH'; + } + if (one > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[one]; + } + return (word === '') ? 'pagh' : word; +} + +export default moment.defineLocale('tlh', { + months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'), + monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'), + monthsParseExact : true, + weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.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: '[DaHjaj] LT', + nextDay: '[wa’leS] LT', + nextWeek: 'LLL', + lastDay: '[wa’Hu’] LT', + lastWeek: 'LLL', + sameElse: 'L' + }, + relativeTime : { + future : translateFuture, + past : translatePast, + s : 'puS lup', + ss : translate, + m : 'wa’ tup', + mm : translate, + h : 'wa’ rep', + hh : translate, + d : 'wa’ jaj', + dd : translate, + M : 'wa’ jar', + MM : translate, + y : 'wa’ DIS', + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/tr.js b/nodejs/node_modules/moment/src/locale/tr.js new file mode 100755 index 0000000..b5e8ad7 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/tr.js @@ -0,0 +1,90 @@ + +//! moment.js locale configuration +//! locale : Turkish [tr] +//! authors : Erhan Gundogan : https://github.com/erhangundogan, +//! Burak Yiğit Kaya: https://github.com/BYK + +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('tr', { + months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.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 : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[gelecek] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + ss : '%d saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinal: function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'Do': + case 'DD': + return number; + default: + 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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/tzl.js b/nodejs/node_modules/moment/src/locale/tzl.js new file mode 100755 index 0000000..2a59458 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/tzl.js @@ -0,0 +1,84 @@ +//! moment.js locale configuration +//! locale : Talossan [tzl] +//! author : Robin van der Vliet : https://github.com/robin0van0der0v +//! author : Iustì Canun + +import moment from '../moment'; + +// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals. +// This is currently too difficult (maybe even impossible) to add. +export default moment.defineLocale('tzl', { + months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'), + monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'), + weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'), + weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'), + weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM [dallas] YYYY', + LLL : 'D. MMMM [dallas] YYYY HH.mm', + LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm' + }, + meridiemParse: /d\'o|d\'a/i, + isPM : function (input) { + return 'd\'o' === input.toLowerCase(); + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'd\'o' : 'D\'O'; + } else { + return isLower ? 'd\'a' : 'D\'A'; + } + }, + calendar : { + sameDay : '[oxhi à] LT', + nextDay : '[demà à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[ieiri à] LT', + lastWeek : '[sür el] dddd [lasteu à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'osprei %s', + past : 'ja%s', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + 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. + } +}); + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['viensas secunds', '\'iensas secunds'], + 'ss': [number + ' secunds', '' + number + ' secunds'], + 'm': ['\'n míut', '\'iens míut'], + 'mm': [number + ' míuts', '' + number + ' míuts'], + 'h': ['\'n þora', '\'iensa þora'], + 'hh': [number + ' þoras', '' + number + ' þoras'], + 'd': ['\'n ziua', '\'iensa ziua'], + 'dd': [number + ' ziuas', '' + number + ' ziuas'], + 'M': ['\'n mes', '\'iens mes'], + 'MM': [number + ' mesen', '' + number + ' mesen'], + 'y': ['\'n ar', '\'iens ar'], + 'yy': [number + ' ars', '' + number + ' ars'] + }; + return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]); +} + diff --git a/nodejs/node_modules/moment/src/locale/tzm-latn.js b/nodejs/node_modules/moment/src/locale/tzm-latn.js new file mode 100755 index 0000000..23d2efa --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/tzm-latn.js @@ -0,0 +1,50 @@ +//! moment.js locale configuration +//! locale : Central Atlas Tamazight Latin [tzm-latn] +//! author : Abdel Said : https://github.com/abdelsaid + +import moment from '../moment'; + +export default moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.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: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + ss : '%d imik', + m : 'minuḍ', + mm : '%d minuḍ', + h : 'saɛa', + hh : '%d tassaɛin', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/tzm.js b/nodejs/node_modules/moment/src/locale/tzm.js new file mode 100755 index 0000000..04c1954 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/tzm.js @@ -0,0 +1,50 @@ +//! moment.js locale configuration +//! locale : Central Atlas Tamazight [tzm] +//! author : Abdel Said : https://github.com/abdelsaid + +import moment from '../moment'; + +export default moment.defineLocale('tzm', { + months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + 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', + 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 oⵙⵙⴰⵏ', + M : 'ⴰⵢoⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔⵏ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙⵏ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ug-cn.js b/nodejs/node_modules/moment/src/locale/ug-cn.js new file mode 100755 index 0000000..5a9a9fc --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ug-cn.js @@ -0,0 +1,110 @@ +//! moment.js language configuration +//! locale : Uyghur (China) [ug-cn] +//! author: boyaq : https://github.com/boyaq + +import moment from '../moment'; + +export default moment.defineLocale('ug-cn', { + months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( + '_' + ), + monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( + '_' + ), + weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split( + '_' + ), + weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), + weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'YYYY-MM-DD', + LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى', + LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', + LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm' + }, + meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ( + meridiem === 'يېرىم كېچە' || + meridiem === 'سەھەر' || + meridiem === 'چۈشتىن بۇرۇن' + ) { + return hour; + } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') { + return hour + 12; + } else { + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return 'يېرىم كېچە'; + } else if (hm < 900) { + return 'سەھەر'; + } else if (hm < 1130) { + return 'چۈشتىن بۇرۇن'; + } else if (hm < 1230) { + return 'چۈش'; + } else if (hm < 1800) { + 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 يىل' + }, + + dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/, + ordinal: function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '-كۈنى'; + case 'w': + case 'W': + return number + '-ھەپتە'; + default: + return number; + } + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week: { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow: 1, // Monday is the first day of the week. + doy: 7 // The week that contains Jan 1st is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/uk.js b/nodejs/node_modules/moment/src/locale/uk.js new file mode 100755 index 0000000..889e017 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/uk.js @@ -0,0 +1,144 @@ +//! moment.js locale configuration +//! locale : Ukrainian [uk] +//! author : zemlanin : https://github.com/zemlanin +//! 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); + } +} +function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_') + }; + + if (!m) { + return weekdays['nominative']; + } + + var nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + return weekdays[nounCase][m.day()]; +} +function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; +} + +export default moment.defineLocale('uk', { + months : { + 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'), + 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') + }, + monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), + weekdays : weekdaysCaseReplace, + 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: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька секунд', + ss : relativeTimeWithPlural, + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'місяць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + 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 + '-й'; + 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 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/ur.js b/nodejs/node_modules/moment/src/locale/ur.js new file mode 100755 index 0000000..56f1818 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/ur.js @@ -0,0 +1,90 @@ +//! moment.js locale configuration +//! locale : Urdu [ur] +//! author : Sawood Alam : https://github.com/ibnesayeed +//! author : Zack : https://github.com/ZackVision + +import moment from '../moment'; + +var months = [ + 'جنوری', + 'فروری', + 'مارچ', + 'اپریل', + 'مئی', + 'جون', + 'جولائی', + 'اگست', + 'ستمبر', + 'اکتوبر', + 'نومبر', + 'دسمبر' +]; +var days = [ + 'اتوار', + 'پیر', + 'منگل', + 'بدھ', + 'جمعرات', + 'جمعہ', + 'ہفتہ' +]; + +export default moment.defineLocale('ur', { + months : months, + monthsShort : months, + weekdays : days, + weekdaysShort : days, + weekdaysMin : days, + 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 'صبح'; + } + 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 : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/uz-latn.js b/nodejs/node_modules/moment/src/locale/uz-latn.js new file mode 100755 index 0000000..2ba7ea6 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/uz-latn.js @@ -0,0 +1,50 @@ +//! moment.js locale configuration +//! locale : Uzbek Latin [uz-latn] +//! author : Rasulbek Mirzayev : github.com/Rasulbeeek + +import moment from '../moment'; + +export default moment.defineLocale('uz-latn', { + months : 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'), + monthsShort : 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'), + weekdays : 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'), + weekdaysShort : 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'), + weekdaysMin : 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'D MMMM YYYY, dddd HH:mm' + }, + calendar : { + sameDay : '[Bugun soat] LT [da]', + nextDay : '[Ertaga] LT [da]', + nextWeek : 'dddd [kuni soat] LT [da]', + lastDay : '[Kecha soat] LT [da]', + lastWeek : '[O\'tgan] dddd [kuni soat] LT [da]', + sameElse : 'L' + }, + relativeTime : { + future : 'Yaqin %s ichida', + past : 'Bir necha %s oldin', + s : 'soniya', + ss : '%d soniya', + m : 'bir daqiqa', + mm : '%d daqiqa', + h : 'bir soat', + hh : '%d soat', + d : 'bir kun', + dd : '%d kun', + M : 'bir oy', + MM : '%d oy', + y : 'bir yil', + yy : '%d yil' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/uz.js b/nodejs/node_modules/moment/src/locale/uz.js new file mode 100755 index 0000000..ff0f7ca --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/uz.js @@ -0,0 +1,50 @@ +//! moment.js locale configuration +//! locale : Uzbek [uz] +//! author : Sardor Muminov : https://github.com/muminoff + +import moment from '../moment'; + +export default moment.defineLocale('uz', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + 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 : 'D MMMM YYYY, dddd 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 : 7 // The week that contains Jan 4th is the first week of the year. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/vi.js b/nodejs/node_modules/moment/src/locale/vi.js new file mode 100755 index 0000000..ad7f4b0 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/vi.js @@ -0,0 +1,71 @@ +//! moment.js locale configuration +//! locale : Vietnamese [vi] +//! author : Bang Nguyen : https://github.com/bangnk + +import moment from '../moment'; + +export default moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + monthsParseExact : true, + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysParseExact : true, + meridiemParse: /sa|ch/i, + isPM : function (input) { + return /^ch$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'sa' : 'SA'; + } else { + return isLower ? 'ch' : 'CH'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY HH:mm', + LLLL : 'dddd, D MMMM [năm] YYYY HH:mm', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tới lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tới', + past : '%s trước', + s : 'vài giây', + ss : '%d giây' , + m : 'một phút', + mm : '%d phút', + h : 'một giờ', + hh : '%d giờ', + d : 'một ngày', + dd : '%d ngày', + M : 'một tháng', + MM : '%d tháng', + y : 'một năm', + yy : '%d năm' + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + 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. + } +}); + diff --git a/nodejs/node_modules/moment/src/locale/x-pseudo.js b/nodejs/node_modules/moment/src/locale/x-pseudo.js new file mode 100755 index 0000000..c50320d --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/x-pseudo.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration +//! locale : Pseudo [x-pseudo] +//! author : Andrew Hood : https://github.com/andrewhood125 + +import moment from '../moment'; + +export default moment.defineLocale('x-pseudo', { + months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'), + monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'), + monthsParseExact : true, + weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'), + weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'), + weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[T~ódá~ý át] LT', + nextDay : '[T~ómó~rró~w át] LT', + nextWeek : 'dddd [át] LT', + lastDay : '[Ý~ést~érdá~ý át] LT', + lastWeek : '[L~ást] dddd [át] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'í~ñ %s', + past : '%s á~gó', + s : 'á ~féw ~sécó~ñds', + ss : '%d s~écóñ~ds', + m : 'á ~míñ~úté', + mm : '%d m~íñú~tés', + h : 'á~ñ hó~úr', + hh : '%d h~óúrs', + d : 'á ~dáý', + dd : '%d d~áýs', + M : 'á ~móñ~th', + MM : '%d m~óñt~hs', + y : 'á ~ýéár', + yy : '%d ý~éárs' + }, + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/yo.js b/nodejs/node_modules/moment/src/locale/yo.js new file mode 100755 index 0000000..dcd6cd2 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/yo.js @@ -0,0 +1,51 @@ +//! moment.js locale configuration +//! locale : Yoruba Nigeria [yo] +//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe + +import moment from '../moment'; + +export default moment.defineLocale('yo', { + months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'), + monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'), + weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'), + weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'), + weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.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 : '[Ònì ni] LT', + nextDay : '[Ọ̀la ni] LT', + nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', + lastDay : '[Àna ni] LT', + lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ní %s', + past : '%s kọjá', + s : 'ìsẹjú aayá die', + ss :'aayá %d', + m : 'ìsẹjú kan', + mm : 'ìsẹjú %d', + h : 'wákati kan', + hh : 'wákati %d', + d : 'ọjọ́ kan', + dd : 'ọjọ́ %d', + M : 'osù kan', + MM : 'osù %d', + y : 'ọdún kan', + yy : 'ọdún %d' + }, + dayOfMonthOrdinalParse : /ọjọ́\s\d{1,2}/, + ordinal : 'ọjọ́ %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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/zh-cn.js b/nodejs/node_modules/moment/src/locale/zh-cn.js new file mode 100755 index 0000000..d9e6e7e --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/zh-cn.js @@ -0,0 +1,102 @@ +//! moment.js locale configuration +//! locale : Chinese (China) [zh-cn] +//! author : suupic : https://github.com/suupic +//! author : Zeno Zeng : https://github.com/zenozeng + +import moment from '../moment'; + +export default moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日Ah点mm分', + LLLL : 'YYYY年M月D日ddddAh点mm分', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上午') { + return hour; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } else { + // '中午' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%s前', + s : '几秒', + ss : '%d 秒', + m : '1 分钟', + mm : '%d 分钟', + h : '1 小时', + hh : '%d 小时', + d : '1 天', + dd : '%d 天', + M : '1 个月', + MM : '%d 个月', + y : '1 年', + yy : '%d 年' + }, + week : { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + 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. + } +}); diff --git a/nodejs/node_modules/moment/src/locale/zh-hk.js b/nodejs/node_modules/moment/src/locale/zh-hk.js new file mode 100755 index 0000000..9943541 --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/zh-hk.js @@ -0,0 +1,96 @@ +//! moment.js locale configuration +//! locale : Chinese (Hong Kong) [zh-hk] +//! author : Ben : https://github.com/ben-lin +//! author : Chris Lam : https://github.com/hehachris +//! author : Konstantin : https://github.com/skfd + +import moment from '../moment'; + +export default moment.defineLocale('zh-hk', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日dddd HH:mm', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + ss : '%d 秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' + } +}); diff --git a/nodejs/node_modules/moment/src/locale/zh-tw.js b/nodejs/node_modules/moment/src/locale/zh-tw.js new file mode 100755 index 0000000..5ad0d9c --- /dev/null +++ b/nodejs/node_modules/moment/src/locale/zh-tw.js @@ -0,0 +1,95 @@ +//! moment.js locale configuration +//! locale : Chinese (Taiwan) [zh-tw] +//! author : Ben : https://github.com/ben-lin +//! author : Chris Lam : https://github.com/hehachris + +import moment from '../moment'; + +export default moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日dddd HH:mm', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天] LT', + nextDay : '[明天] LT', + nextWeek : '[下]dddd LT', + lastDay : '[昨天] LT', + lastWeek : '[上]dddd LT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + ss : '%d 秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' + } +}); diff --git a/nodejs/node_modules/moment/src/moment.js b/nodejs/node_modules/moment/src/moment.js new file mode 100755 index 0000000..9516d28 --- /dev/null +++ b/nodejs/node_modules/moment/src/moment.js @@ -0,0 +1,95 @@ +//! moment.js +//! version : 2.22.2 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +import { hooks as moment, setHookCallback } from './lib/utils/hooks'; + +moment.version = '2.22.2'; + +import { + min, + max, + now, + isMoment, + momentPrototype as fn, + createUTC as utc, + createUnix as unix, + createLocal as local, + createInvalid as invalid, + createInZone as parseZone +} from './lib/moment/moment'; + +import { + getCalendarFormat +} from './lib/moment/calendar'; + +import { + defineLocale, + updateLocale, + getSetGlobalLocale as locale, + getLocale as localeData, + listLocales as locales, + listMonths as months, + listMonthsShort as monthsShort, + listWeekdays as weekdays, + listWeekdaysMin as weekdaysMin, + listWeekdaysShort as weekdaysShort +} from './lib/locale/locale'; + +import { + isDuration, + createDuration as duration, + getSetRelativeTimeRounding as relativeTimeRounding, + getSetRelativeTimeThreshold as relativeTimeThreshold +} from './lib/duration/duration'; + +import { normalizeUnits } from './lib/units/units'; + +import isDate from './lib/utils/is-date'; + +setHookCallback(local); + +moment.fn = fn; +moment.min = min; +moment.max = max; +moment.now = now; +moment.utc = utc; +moment.unix = unix; +moment.months = months; +moment.isDate = isDate; +moment.locale = locale; +moment.invalid = invalid; +moment.duration = duration; +moment.isMoment = isMoment; +moment.weekdays = weekdays; +moment.parseZone = parseZone; +moment.localeData = localeData; +moment.isDuration = isDuration; +moment.monthsShort = monthsShort; +moment.weekdaysMin = weekdaysMin; +moment.defineLocale = defineLocale; +moment.updateLocale = updateLocale; +moment.locales = locales; +moment.weekdaysShort = weekdaysShort; +moment.normalizeUnits = normalizeUnits; +moment.relativeTimeRounding = relativeTimeRounding; +moment.relativeTimeThreshold = relativeTimeThreshold; +moment.calendarFormat = getCalendarFormat; +moment.prototype = fn; + +// currently HTML5 input type only supports 24-hour formats +moment.HTML5_FMT = { + DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // + DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // + DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // + DATE: 'YYYY-MM-DD', // + TIME: 'HH:mm', // + TIME_SECONDS: 'HH:mm:ss', // + TIME_MS: 'HH:mm:ss.SSS', // + WEEK: 'YYYY-[W]WW', // + MONTH: 'YYYY-MM' // +}; + +export default moment; diff --git a/nodejs/node_modules/node-schedule/.eslintrc b/nodejs/node_modules/node-schedule/.eslintrc new file mode 100755 index 0000000..d564a82 --- /dev/null +++ b/nodejs/node_modules/node-schedule/.eslintrc @@ -0,0 +1,17 @@ +{ + "env": { + "node": true, + "es6": true + }, + "rules": { + "eqeqeq": ["error", "smart"], + "indent": ["error", 2, { "SwitchCase": 1 }], + "no-constant-condition": "off", + "no-redeclare": "warn", + "no-underscore-dangle": "off", + "no-use-before-define": ["warn","nofunc"], + "quotes": ["error", "single"], + "space-before-blocks": "error", + "strict": "error" + } +} diff --git a/nodejs/node_modules/node-schedule/.travis.yml b/nodejs/node_modules/node-schedule/.travis.yml new file mode 100755 index 0000000..a560547 --- /dev/null +++ b/nodejs/node_modules/node-schedule/.travis.yml @@ -0,0 +1,15 @@ +language: node_js +node_js: + - "0.12" + - "0.10" + - "4" + - "6" + - "7" +before_script: > + if nvm ls-remote --lts | grep "$(nvm current)"; then + echo "running on a LTS node version, linting" + npm test + else + echo "running on a non-LTS node version, skipping linting" + fi +script: ./node_modules/.bin/istanbul cover ./node_modules/.bin/nodeunit test && cat ./coverage/lcov.info | ./node_modules/.bin/coveralls && rm -rf ./coverage diff --git a/nodejs/node_modules/node-schedule/CONTRIBUTING.md b/nodejs/node_modules/node-schedule/CONTRIBUTING.md new file mode 100755 index 0000000..ebb0783 --- /dev/null +++ b/nodejs/node_modules/node-schedule/CONTRIBUTING.md @@ -0,0 +1,31 @@ +## Rules +1. **No `--force` pushes** or modifying the git history in any way +2. Follow existing code style +3. Pull requests with tests are much more likely to be accepted +4. Follow the guidelines below + +## Bugfix or Feature? + +This project uses the [gitflow workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow). Simply put, you need to decide if your contribution will be a bug fix that could be released as a patch, or a feature that will end up being a minor or major release. + +### Found a bug that can be fixed without affecting the API? + +1. **Fork** this repo +2. Create a new branch from `master` to work in +3. **Add tests** if needed +4. Make sure your code **lints** by running `npm run lint` +5. Make sure your code **passes tests** by running `npm test` +6. Submit a **pull request** against the `master` branch + +### New feature or anything that would result in a change to the API? + +1. **Fork** this repo +2. Create a new branch from `develop` to work in +3. **Add tests** to as needed +4. Make sure your code **lints** by running `npm run lint` +5. Make sure your code **passes tests** by running `npm test` +6. Submit a **pull request** against the `develop` branch + +## Releases + +Declaring formal releases remains the prerogative of the project maintainer. diff --git a/nodejs/node_modules/node-schedule/LICENSE b/nodejs/node_modules/node-schedule/LICENSE new file mode 100755 index 0000000..6ead200 --- /dev/null +++ b/nodejs/node_modules/node-schedule/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2015 Matt Patenaude. + +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. diff --git a/nodejs/node_modules/node-schedule/README.md b/nodejs/node_modules/node-schedule/README.md new file mode 100755 index 0000000..0c371f6 --- /dev/null +++ b/nodejs/node_modules/node-schedule/README.md @@ -0,0 +1,256 @@ +# Node Schedule + +[![NPM version](http://img.shields.io/npm/v/node-schedule.svg)](https://www.npmjs.com/package/node-schedule) +[![Downloads](https://img.shields.io/npm/dm/node-schedule.svg)](https://www.npmjs.com/package/node-schedule) +[![Build Status](https://travis-ci.org/node-schedule/node-schedule.svg?branch=master)](https://travis-ci.org/node-schedule/node-schedule) +[![Join the chat at https://gitter.im/node-schedule/node-schedule](https://img.shields.io/badge/gitter-chat-green.svg)](https://gitter.im/node-schedule/node-schedule?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +[![NPM](https://nodei.co/npm/node-schedule.png?downloads=true)](https://nodei.co/npm/node-schedule/) + +Node Schedule is a flexible cron-like and not-cron-like job scheduler for Node.js. +It allows you to schedule jobs (arbitrary functions) for execution at +specific dates, with optional recurrence rules. It only uses a single timer +at any given time (rather than reevaluating upcoming jobs every second/minute). + +## Usage + +### Installation + +You can install using [npm](https://www.npmjs.com/package/node-schedule). + +``` +npm install node-schedule +``` + +### Overview + +Node Schedule is for time-based scheduling, not interval-based scheduling. +While you can easily bend it to your will, if you only want to do something like +"run this function every 5 minutes", you'll find `setInterval` much easier to use, +and far more appropriate. But if you want to, say, "run this function at the :20 +and :50 of every hour on the third Tuesday of every month," you'll find that +Node Schedule suits your needs better. Additionally, Node Schedule has Windows +support unlike true cron since the node runtime is now fully supported. + +Note that Node Schedule is designed for in-process scheduling, i.e. scheduled jobs +will only fire as long as your script is running, and the schedule will disappear +when execution completes. If you need to schedule jobs that will persist even when +your script *isn't* running, consider using actual [cron]. + +### Jobs and Scheduling + +Every scheduled job in Node Schedule is represented by a `Job` object. You can +create jobs manually, then execute the `schedule()` method to apply a schedule, +or use the convenience function `scheduleJob()` as demonstrated below. + +`Job` objects are `EventEmitter`'s, and emit a `run` event after each execution. +They also emit a `scheduled` event each time they're scheduled to run, and a +`canceled` event when an invocation is canceled before it's executed (both events +receive a JavaScript date object as a parameter). Note that jobs are scheduled the +first time immediately, so if you create a job using the `scheduleJob()` +convenience method, you'll miss the first `scheduled` event, but you can query the +invocation manually (see below). Also note that `canceled` is the single-L American +spelling. + +### Cron-style Scheduling + +The cron format consists of: +``` +* * * * * * +┬ ┬ ┬ ┬ ┬ ┬ +│ │ │ │ │ │ +│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun) +│ │ │ │ └───── month (1 - 12) +│ │ │ └────────── day of month (1 - 31) +│ │ └─────────────── hour (0 - 23) +│ └──────────────────── minute (0 - 59) +└───────────────────────── second (0 - 59, OPTIONAL) +``` + +Examples with the cron format: + +```js +var schedule = require('node-schedule'); + +var j = schedule.scheduleJob('42 * * * *', function(){ + console.log('The answer to life, the universe, and everything!'); +}); +``` + +Execute a cron job when the minute is 42 (e.g. 19:42, 20:42, etc.). + +And: + +```js +var j = schedule.scheduleJob('0 17 ? * 0,4-6', function(){ + console.log('Today is recognized by Rebecca Black!'); +}); +``` + +Execute a cron job every 5 Minutes = */5 * * * * + +You can also get when it is scheduled to run for every invocation of the job: +```js +var j = schedule.scheduleJob('0 1 * * *', function(fireDate){ + console.log('This job was supposed to run at ' + fireDate + ', but actually ran at ' + new Date()); +}); +``` +This is useful when you need to check if there is a delay of the job invocation when the system is busy, or save a record of all invocations of a job for audit purpose. +#### Unsupported Cron Features + +Currently, `W` (nearest weekday), `L` (last day of month/week), and `#` (nth weekday +of the month) are not supported. Most other features supported by popular cron +implementations should work just fine. + +[cron-parser] is used to parse crontab instructions. + +### Date-based Scheduling + +Say you very specifically want a function to execute at 5:30am on December 21, 2012. +Remember - in JavaScript - 0 - January, 11 - December. + +```js +var schedule = require('node-schedule'); +var date = new Date(2012, 11, 21, 5, 30, 0); + +var j = schedule.scheduleJob(date, function(){ + console.log('The world is going to end today.'); +}); +``` + +To use current data in the future you can use binding: + +```js +var schedule = require('node-schedule'); +var date = new Date(2012, 11, 21, 5, 30, 0); +var x = 'Tada!'; +var j = schedule.scheduleJob(date, function(y){ + console.log(y); +}.bind(null,x)); +x = 'Changing Data'; +``` +This will log 'Tada!' when the scheduled Job runs, rather than 'Changing Data', +which x changes to immediately after scheduling. + +### Recurrence Rule Scheduling + +You can build recurrence rules to specify when a job should recur. For instance, +consider this rule, which executes the function every hour at 42 minutes after the hour: + +```js +var schedule = require('node-schedule'); + +var rule = new schedule.RecurrenceRule(); +rule.minute = 42; + +var j = schedule.scheduleJob(rule, function(){ + console.log('The answer to life, the universe, and everything!'); +}); +``` + +You can also use arrays to specify a list of acceptable values, and the `Range` +object to specify a range of start and end values, with an optional step parameter. +For instance, this will print a message on Thursday, Friday, Saturday, and Sunday at 5pm: + +```js +var rule = new schedule.RecurrenceRule(); +rule.dayOfWeek = [0, new schedule.Range(4, 6)]; +rule.hour = 17; +rule.minute = 0; + +var j = schedule.scheduleJob(rule, function(){ + console.log('Today is recognized by Rebecca Black!'); +}); +``` + +#### RecurrenceRule properties + +- `second` +- `minute` +- `hour` +- `date` +- `month` +- `year` +- `dayOfWeek` + +> **Note**: It's worth noting that the default value of a component of a recurrence rule is +> `null` (except for second, which is 0 for familiarity with cron). *If we did not +> explicitly set `minute` to 0 above, the message would have instead been logged at +> 5:00pm, 5:01pm, 5:02pm, ..., 5:59pm.* Probably not what you want. + +#### Object Literal Syntax + +To make things a little easier, an object literal syntax is also supported, like +in this example which will log a message every Sunday at 2:30pm: + +```js +var j = schedule.scheduleJob({hour: 14, minute: 30, dayOfWeek: 0}, function(){ + console.log('Time for tea!'); +}); +``` + +#### Set StartTime and EndTime + +It will run after 5 seconds and stop after 10 seconds in this example. +The ruledat supports the above. + +```js +let startTime = new Date(Date.now() + 5000); +let endTime = new Date(startTime.getTime() + 5000); +var j = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){ + console.log('Time for tea!'); +}); +``` + +### Handle Jobs and Job Invocations + +There are some function to get informations for a Job and to handle the Job and +Invocations. + + +#### job.cancel(reshedule) +You can invalidate any job with the `cancel()` method: + +```js +j.cancel(); +``` +All planned invocations will be canceled. When you set the parameter ***reschedule*** +to true then the Job is newly scheduled afterwards. + +#### job.cancelNext(reshedule) +This method invalidates the next planned invocation or the job. +When you set the parameter ***reschedule*** to true then the Job is newly scheduled +afterwards. + +#### job.reschedule(spec) +This method cancels all pending invocation and registers the Job completely new again using the given specification. +Return true/false on success/failure. + +#### job.nextInvocation() +This method returns a Date object for the planned next Invocation for this Job. If no invocation is planned the method returns null. + +## Contributing + +This module was originally developed by [Matt Patenaude], and is now maintained by +[Tejas Manohar] and [other wonderful contributors]. + +We'd love to get your contributions. Individuals making significant and valuable +contributions are given commit-access to the project to contribute as they see fit. + +Before jumping in, check out our [Contributing] page guide! + +## Copyright and license + +Copyright 2015 Matt Patenaude. + +Licensed under the **[MIT License] [license]**. + + +[cron]: http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5 +[Contributing]: https://github.com/node-schedule/node-schedule/blob/master/CONTRIBUTING.md +[Matt Patenaude]: https://github.com/mattpat +[Tejas Manohar]: http://tejas.io +[license]: https://github.com/node-schedule/node-schedule/blob/master/LICENSE +[Tejas Manohar]: https://github.com/tejasmanohar +[other wonderful contributors]: https://github.com/node-schedule/node-schedule/graphs/contributors +[cron-parser]: https://github.com/harrisiirak/cron-parser diff --git a/nodejs/node_modules/node-schedule/lib/schedule.js b/nodejs/node_modules/node-schedule/lib/schedule.js new file mode 100755 index 0000000..64bdfbd --- /dev/null +++ b/nodejs/node_modules/node-schedule/lib/schedule.js @@ -0,0 +1,648 @@ + +'use strict'; + +/* + node-schedule + A cron-like and not-cron-like job scheduler for Node. +*/ + +var events = require('events'), + util = require('util'), + cronParser = require('cron-parser'), + CronDate = require('cron-parser/lib/date'), + lt = require('long-timeout'), + sorted = require('sorted-array-functions'); + +/* Job object */ +var anonJobCounter = 0; +var scheduledJobs = {}; + +function isValidDate(date) { + // Taken from http://stackoverflow.com/a/12372720/1562178 + // If getTime() returns NaN it'll return false anyway + return date.getTime() === date.getTime(); +} + +function Job(name, job, callback) { + // setup a private pendingInvocations variable + var pendingInvocations = []; + + //setup a private number of invocations variable + var triggeredJobs = 0; + + // Set scope vars + var jobName = name && typeof name === 'string' ? name : ''; + this.job = name && typeof name === 'function' ? name : job; + + // Make sure callback is actually a callback + if (this.job === name) { + // Name wasn't provided and maybe a callback is there + this.callback = typeof job === 'function' ? job : false; + } else { + // Name was provided, and maybe a callback is there + this.callback = typeof callback === 'function' ? callback : false; + } + + // Check for generator + if (typeof this.job === 'function' && + this.job.prototype && + this.job.prototype.next) { + this.job = function() { + return this.next().value; + }.bind(this.job.call(this)); + } + + // define properties + Object.defineProperty(this, 'name', { + value: jobName, + writable: false, + enumerable: true + }); + + // method that require private access + this.trackInvocation = function(invocation) { + // add to our invocation list + sorted.add(pendingInvocations, invocation, sorter); + return true; + }; + this.stopTrackingInvocation = function(invocation) { + var invIdx = pendingInvocations.indexOf(invocation); + if (invIdx > -1) { + pendingInvocations.splice(invIdx, 1); + return true; + } + + return false; + }; + this.triggeredJobs = function() { + return triggeredJobs; + }; + this.setTriggeredJobs = function(triggeredJob) { + triggeredJobs = triggeredJob; + }; + this.cancel = function(reschedule) { + reschedule = (typeof reschedule == 'boolean') ? reschedule : false; + + var inv, newInv; + var newInvs = []; + for (var j = 0; j < pendingInvocations.length; j++) { + inv = pendingInvocations[j]; + + cancelInvocation(inv); + + if (reschedule && inv.recurrenceRule.recurs) { + newInv = scheduleNextRecurrence(inv.recurrenceRule, this, inv.fireDate, inv.endDate); + if (newInv !== null) { + newInvs.push(newInv); + } + } + } + + pendingInvocations = []; + + for (var k = 0; k < newInvs.length; k++) { + this.trackInvocation(newInvs[k]); + } + + // remove from scheduledJobs if reschedule === false + if (!reschedule) { + if (this.name) { + delete scheduledJobs[this.name]; + } + } + + return true; + }; + this.cancelNext = function(reschedule) { + reschedule = (typeof reschedule == 'boolean') ? reschedule : true; + + if (!pendingInvocations.length) { + return false; + } + + var newInv; + var nextInv = pendingInvocations.shift(); + + cancelInvocation(nextInv); + + if (reschedule && nextInv.recurrenceRule.recurs) { + newInv = scheduleNextRecurrence(nextInv.recurrenceRule, this, nextInv.fireDate, nextInv.endDate); + if (newInv !== null) { + this.trackInvocation(newInv); + } + } + + return true; + }; + this.reschedule = function(spec) { + var inv; + var cInvs = pendingInvocations.slice(); + + for (var j = 0; j < cInvs.length; j++) { + inv = cInvs[j]; + + cancelInvocation(inv); + } + + pendingInvocations = []; + + if (this.schedule(spec)) { + this.setTriggeredJobs(0); + return true; + } else { + pendingInvocations = cInvs; + return false; + } + }; + this.nextInvocation = function() { + if (!pendingInvocations.length) { + return null; + } + return pendingInvocations[0].fireDate; + }; + this.pendingInvocations = function() { + return pendingInvocations; + }; +} + +util.inherits(Job, events.EventEmitter); + +Job.prototype.invoke = function(fireDate) { + if (typeof this.job == 'function') { + this.setTriggeredJobs(this.triggeredJobs() + 1); + this.job(fireDate); + } else { + this.job.execute(fireDate); + } +}; + +Job.prototype.runOnDate = function(date) { + return this.schedule(date); +}; + +Job.prototype.schedule = function(spec) { + var self = this; + var success = false; + var inv; + var start; + var end; + var tz; + + if (typeof spec === 'object' && spec.rule) { + start = spec.start || undefined; + end = spec.end || undefined; + tz = spec.tz; + spec = spec.rule; + + if (start) { + if (!(start instanceof Date)) { + start = new Date(start); + } + + start = new CronDate(start, tz); + if (!isValidDate(start) || start.getTime() < Date.now()) { + start = undefined; + } + } + + if (end && !(end instanceof Date) && !isValidDate(end = new Date(end))) { + end = undefined; + } + + if (end) { + end = new CronDate(end, tz); + } + } + + try { + var res = cronParser.parseExpression(spec, { currentDate: start, tz: tz }); + inv = scheduleNextRecurrence(res, self, start, end); + if (inv !== null) { + success = self.trackInvocation(inv); + } + } catch (err) { + var type = typeof spec; + if ((type === 'string') || (type === 'number')) { + spec = new Date(spec); + } + + if ((spec instanceof Date) && (isValidDate(spec))) { + spec = new CronDate(spec); + if (spec.getTime() >= Date.now()) { + inv = new Invocation(self, spec); + scheduleInvocation(inv); + success = self.trackInvocation(inv); + } + } else if (type === 'object') { + if (!(spec instanceof RecurrenceRule)) { + var r = new RecurrenceRule(); + if ('year' in spec) { + r.year = spec.year; + } + if ('month' in spec) { + r.month = spec.month; + } + if ('date' in spec) { + r.date = spec.date; + } + if ('dayOfWeek' in spec) { + r.dayOfWeek = spec.dayOfWeek; + } + if ('hour' in spec) { + r.hour = spec.hour; + } + if ('minute' in spec) { + r.minute = spec.minute; + } + if ('second' in spec) { + r.second = spec.second; + } + + spec = r; + } + + spec.tz = tz; + inv = scheduleNextRecurrence(spec, self, start, end); + if (inv !== null) { + success = self.trackInvocation(inv); + } + } + } + + scheduledJobs[this.name] = this; + return success; +}; + +/* API + invoke() + runOnDate(date) + schedule(date || recurrenceRule || cronstring) + cancel(reschedule = false) + cancelNext(reschedule = true) + + Property constraints + name: readonly + job: readwrite +*/ + +/* DoesntRecur rule */ +var DoesntRecur = new RecurrenceRule(); +DoesntRecur.recurs = false; + +/* Invocation object */ +function Invocation(job, fireDate, recurrenceRule, endDate) { + this.job = job; + this.fireDate = fireDate; + this.endDate = endDate; + this.recurrenceRule = recurrenceRule || DoesntRecur; + + this.timerID = null; +} + +function sorter(a, b) { + return (a.fireDate.getTime() - b.fireDate.getTime()); +} + +/* Range object */ +function Range(start, end, step) { + this.start = start || 0; + this.end = end || 60; + this.step = step || 1; +} + +Range.prototype.contains = function(val) { + if (this.step === null || this.step === 1) { + return (val >= this.start && val <= this.end); + } else { + for (var i = this.start; i < this.end; i += this.step) { + if (i === val) { + return true; + } + } + + return false; + } +}; + +/* RecurrenceRule object */ +/* + Interpreting each property: + null - any value is valid + number - fixed value + Range - value must fall in range + array - value must validate against any item in list + + NOTE: Cron months are 1-based, but RecurrenceRule months are 0-based. +*/ +function RecurrenceRule(year, month, date, dayOfWeek, hour, minute, second) { + this.recurs = true; + + this.year = (year == null) ? null : year; + this.month = (month == null) ? null : month; + this.date = (date == null) ? null : date; + this.dayOfWeek = (dayOfWeek == null) ? null : dayOfWeek; + this.hour = (hour == null) ? null : hour; + this.minute = (minute == null) ? null : minute; + this.second = (second == null) ? 0 : second; +} + +RecurrenceRule.prototype.isValid = function() { + function isValidType(num) { + if (Array.isArray(num) || (num instanceof Array)) { + return num.every(function(e) { + return isValidType(e); + }); + } + return !(Number.isNaN(Number(num)) && !(num instanceof Range)); + } + if (this.month !== null && (this.month < 0 || this.month > 11 || !isValidType(this.month))) { + return false; + } + if (this.dayOfWeek !== null && (this.dayOfWeek < 0 || this.dayOfWeek > 6 || !isValidType(this.dayOfWeek))) { + return false; + } + if (this.hour !== null && (this.hour < 0 || this.hour > 23 || !isValidType(this.hour))) { + return false; + } + if (this.minute !== null && (this.minute < 0 || this.minute > 59 || !isValidType(this.minute))) { + return false; + } + if (this.second !== null && (this.second < 0 || this.second > 59 || !isValidType(this.second))) { + return false; + } + if (this.date !== null) { + if(!isValidType(this.date)) { + return false; + } + switch (this.month) { + case 3: + case 5: + case 8: + case 10: + if (this.date < 1 || this. date > 30) { + return false; + } + break; + case 1: + if (this.date < 1 || this. date > 29) { + return false; + } + break; + default: + if (this.date < 1 || this. date > 31) { + return false; + } + } + } + return true; +}; + +RecurrenceRule.prototype.nextInvocationDate = function(base) { + base = ((base instanceof CronDate) || (base instanceof Date)) ? base : (new Date()); + if (!this.recurs) { + return null; + } + + if(!this.isValid()) { + return null; + } + + var now = new CronDate(Date.now(), this.tz); + var fullYear = now.getFullYear(); + if ((this.year !== null) && + (typeof this.year == 'number') && + (this.year < fullYear)) { + return null; + } + + var next = new CronDate(base.getTime(), this.tz); + next.addSecond(); + + while (true) { + if (this.year !== null) { + fullYear = next.getFullYear(); + if ((typeof this.year == 'number') && (this.year < fullYear)) { + next = null; + break; + } + + if (!recurMatch(fullYear, this.year)) { + next.addYear(); + next.setMonth(0); + next.setDate(1); + next.setHours(0); + next.setMinutes(0); + next.setSeconds(0); + continue; + } + } + if (this.month != null && !recurMatch(next.getMonth(), this.month)) { + next.addMonth(); + continue; + } + if (this.date != null && !recurMatch(next.getDate(), this.date)) { + next.addDay(); + continue; + } + if (this.dayOfWeek != null && !recurMatch(next.getDay(), this.dayOfWeek)) { + next.addDay(); + continue; + } + if (this.hour != null && !recurMatch(next.getHours(), this.hour)) { + next.addHour(); + continue; + } + if (this.minute != null && !recurMatch(next.getMinutes(), this.minute)) { + next.addMinute(); + continue; + } + if (this.second != null && !recurMatch(next.getSeconds(), this.second)) { + next.addSecond(); + continue; + } + + break; + } + + return next ? next.toDate() : null; +}; + +function recurMatch(val, matcher) { + if (matcher == null) { + return true; + } + + if (typeof matcher === 'number') { + return (val === matcher); + } else if(typeof matcher === 'string') { + return (val === Number(matcher)); + } else if (matcher instanceof Range) { + return matcher.contains(val); + } else if (Array.isArray(matcher) || (matcher instanceof Array)) { + for (var i = 0; i < matcher.length; i++) { + if (recurMatch(val, matcher[i])) { + return true; + } + } + } + + return false; +} + +/* Date-based scheduler */ +function runOnDate(date, job) { + var now = Date.now(); + var then = date.getTime(); + + return lt.setTimeout(function() { + if (then > Date.now()) + runOnDate(date, job); + else + job(); + }, (then < now ? 0 : then - now)); +} + +var invocations = []; +var currentInvocation = null; + +function scheduleInvocation(invocation) { + sorted.add(invocations, invocation, sorter); + prepareNextInvocation(); + var date = invocation.fireDate instanceof CronDate ? invocation.fireDate.toDate() : invocation.fireDate; + invocation.job.emit('scheduled', date); +} + +function prepareNextInvocation() { + if (invocations.length > 0 && currentInvocation !== invocations[0]) { + if (currentInvocation !== null) { + lt.clearTimeout(currentInvocation.timerID); + currentInvocation.timerID = null; + currentInvocation = null; + } + + currentInvocation = invocations[0]; + + var job = currentInvocation.job; + var cinv = currentInvocation; + currentInvocation.timerID = runOnDate(currentInvocation.fireDate, function() { + currentInvocationFinished(); + + if (job.callback) { + job.callback(); + } + + if (cinv.recurrenceRule.recurs || cinv.recurrenceRule._endDate === null) { + var inv = scheduleNextRecurrence(cinv.recurrenceRule, cinv.job, cinv.fireDate, cinv.endDate); + if (inv !== null) { + inv.job.trackInvocation(inv); + } + } + + job.stopTrackingInvocation(cinv); + + job.invoke(cinv.fireDate instanceof CronDate ? cinv.fireDate.toDate() : cinv.fireDate); + job.emit('run'); + }); + } +} + +function currentInvocationFinished() { + invocations.shift(); + currentInvocation = null; + prepareNextInvocation(); +} + +function cancelInvocation(invocation) { + var idx = invocations.indexOf(invocation); + if (idx > -1) { + invocations.splice(idx, 1); + if (invocation.timerID !== null) { + lt.clearTimeout(invocation.timerID); + } + + if (currentInvocation === invocation) { + currentInvocation = null; + } + + invocation.job.emit('canceled', invocation.fireDate); + prepareNextInvocation(); + } +} + +/* Recurrence scheduler */ +function scheduleNextRecurrence(rule, job, prevDate, endDate) { + + prevDate = (prevDate instanceof CronDate) ? prevDate : new CronDate(); + + var date = (rule instanceof RecurrenceRule) ? rule.nextInvocationDate(prevDate) : rule.next(); + if (date === null) { + return null; + } + + if ((endDate instanceof CronDate) && date.getTime() > endDate.getTime()) { + return null; + } + + var inv = new Invocation(job, date, rule, endDate); + scheduleInvocation(inv); + + return inv; +} + +/* Convenience methods */ +function scheduleJob() { + if (arguments.length < 2) { + return null; + } + + var name = (arguments.length >= 3 && typeof arguments[0] === 'string') ? arguments[0] : null; + var spec = name ? arguments[1] : arguments[0]; + var method = name ? arguments[2] : arguments[1]; + var callback = name ? arguments[3] : arguments[2]; + + var job = new Job(name, method, callback); + + if (job.schedule(spec)) { + return job; + } + + return null; +} + +function rescheduleJob(job, spec) { + if (job instanceof Job) { + if (job.reschedule(spec)) { + return job; + } + } else if (typeof job == 'string' || job instanceof String) { + if (job in scheduledJobs && scheduledJobs.hasOwnProperty(job)) { + if (scheduledJobs[job].reschedule(spec)) { + return scheduledJobs[job]; + } + } + } + return null; +} + +function cancelJob(job) { + var success = false; + if (job instanceof Job) { + success = job.cancel(); + } else if (typeof job == 'string' || job instanceof String) { + if (job in scheduledJobs && scheduledJobs.hasOwnProperty(job)) { + success = scheduledJobs[job].cancel(); + } + } + + return success; +} + +/* Public API */ +module.exports.Job = Job; +module.exports.Range = Range; +module.exports.RecurrenceRule = RecurrenceRule; +module.exports.Invocation = Invocation; +module.exports.scheduleJob = scheduleJob; +module.exports.rescheduleJob = rescheduleJob; +module.exports.scheduledJobs = scheduledJobs; +module.exports.cancelJob = cancelJob; diff --git a/nodejs/node_modules/node-schedule/package.json b/nodejs/node_modules/node-schedule/package.json new file mode 100755 index 0000000..1fd4317 --- /dev/null +++ b/nodejs/node_modules/node-schedule/package.json @@ -0,0 +1,70 @@ +{ + "_args": [ + [ + "node-schedule@1.3.0", + "/www/wwwroot/Adminx.cc/nodejs" + ] + ], + "_from": "node-schedule@1.3.0", + "_id": "node-schedule@1.3.0", + "_inBundle": false, + "_integrity": "sha512-NNwO9SUPjBwFmPh3vXiPVEhJLn4uqYmZYvJV358SRGM06BR4UoIqxJpeJwDDXB6atULsgQA97MfD1zMd5xsu+A==", + "_location": "/node-schedule", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "node-schedule@1.3.0", + "name": "node-schedule", + "escapedName": "node-schedule", + "rawSpec": "1.3.0", + "saveSpec": null, + "fetchSpec": "1.3.0" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.0.tgz", + "_spec": "1.3.0", + "_where": "/www/wwwroot/Adminx.cc/nodejs", + "author": { + "name": "Matt Patenaude", + "email": "matt@mattpatenaude.com", + "url": "http://mattpatenaude.com" + }, + "bugs": { + "url": "https://github.com/node-schedule/node-schedule/issues" + }, + "dependencies": { + "cron-parser": "^2.4.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.0.0" + }, + "description": "A cron-like and not-cron-like job scheduler for Node.", + "devDependencies": { + "coveralls": "^2.11.2", + "eslint": "^3.19.0", + "istanbul": "^0.4.5", + "nodeunit": "^0.10.2", + "sinon": "^1.14.1" + }, + "homepage": "https://github.com/node-schedule/node-schedule#readme", + "keywords": [ + "schedule", + "task", + "job", + "cron" + ], + "license": "MIT", + "main": "./lib/schedule.js", + "name": "node-schedule", + "repository": { + "type": "git", + "url": "git+https://github.com/node-schedule/node-schedule.git" + }, + "scripts": { + "lint": "eslint lib test", + "test": "nodeunit" + }, + "version": "1.3.0" +} diff --git a/nodejs/node_modules/node-schedule/test/.eslintrc b/nodejs/node_modules/node-schedule/test/.eslintrc new file mode 100755 index 0000000..194f187 --- /dev/null +++ b/nodejs/node_modules/node-schedule/test/.eslintrc @@ -0,0 +1,5 @@ +{ + "rules": { + "quotes": ["off"] + } +} diff --git a/nodejs/node_modules/node-schedule/test/cancel-long-running-jobs.js b/nodejs/node_modules/node-schedule/test/cancel-long-running-jobs.js new file mode 100755 index 0000000..9ea3897 --- /dev/null +++ b/nodejs/node_modules/node-schedule/test/cancel-long-running-jobs.js @@ -0,0 +1,24 @@ +'use strict'; + +var schedule = require('../lib/schedule'); + +module.exports = { + 'Cancel Long Running Job': { + 'should work even when recurring jobs are to be run on the past': function (test) { + var ok = true; + var job = schedule.scheduleJob('*/1 * * * * *', function () { + test.ok(ok); + var time = Date.now(); + while (ok && (Date.now() - time < 2000)) { + } + }); + + test.ok(job); + setTimeout(function () { + job.cancel(); + test.done(); + ok = false; + }, 2100); + } + } +}; diff --git a/nodejs/node_modules/node-schedule/test/convenience-method-test.js b/nodejs/node_modules/node-schedule/test/convenience-method-test.js new file mode 100755 index 0000000..a4a58a0 --- /dev/null +++ b/nodejs/node_modules/node-schedule/test/convenience-method-test.js @@ -0,0 +1,713 @@ + +'use strict'; + +var sinon = require('sinon'); +var main = require('../package.json').main; +var schedule = require('../' + main); + +var clock; + +module.exports = { + setUp: function(cb) { + clock = sinon.useFakeTimers(); + cb(); + }, + ".scheduleJob": { + "Returns Job instance": function(test) { + var job = schedule.scheduleJob(new Date(Date.now() + 1000), function() {}); + + test.ok(job instanceof schedule.Job); + + job.cancel(); + test.done(); + } + }, + ".scheduleJob(Date, fn)": { + "Runs job once at some date": function(test) { + test.expect(1); + + schedule.scheduleJob(new Date(Date.now() + 3000), function() { + test.ok(true); + }); + + setTimeout(function() { + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Job doesn't emit initial 'scheduled' event": function(test) { + var job = schedule.scheduleJob(new Date(Date.now() + 1000), function() {}); + + job.on('scheduled', function() { + test.ok(false); + }); + + setTimeout(function() { + test.done(); + }, 1250); + + clock.tick(1250); + }, + "Won't run job if scheduled in the past": function(test) { + test.expect(1); + var job = schedule.scheduleJob(new Date(Date.now() - 3000), function() { + test.ok(false); + }); + + test.equal(job, null); + + setTimeout(function() { + test.done(); + }, 1000); + + clock.tick(1000); + } + }, + ".scheduleJob(RecurrenceRule, fn)": { + "Runs job at interval based on recur rule, repeating indefinitely": function(test) { + test.expect(3); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + var job = schedule.scheduleJob(rule, function() { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Job doesn't emit initial 'scheduled' event": function(test) { + /* + * If this was Job#schedule it'd fire 4 times. + */ + test.expect(3); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + var job = new schedule.scheduleJob(rule, function() {}); + + job.on('scheduled', function(runOnDate) { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Doesn't invoke job if recur rule schedules it in the past": function(test) { + test.expect(1); + var rule = new schedule.RecurrenceRule(); + rule.year = 1960; + + var job = schedule.scheduleJob(rule, function() { + test.ok(false); + }); + + test.equal(job, null); + + setTimeout(function() { + test.done(); + }, 1000); + + clock.tick(1000); + } + }, + ".scheduleJob({...}, fn)": { + "Runs job at interval based on object, repeating indefinitely": function(test) { + test.expect(3); + + var job = new schedule.scheduleJob({ + second: null // Fire every second + }, function() { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Job doesn't emit initial 'scheduled' event": function(test) { + /* + * With Job#schedule this would be 3: + * scheduled at time 0 + * scheduled at time 1000 + * scheduled at time 2000 + */ + test.expect(2); + + var job = schedule.scheduleJob({ + second: null // fire every second + }, function() {}); + + job.on('scheduled', function() { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 2250); + + clock.tick(2250); + }, + "Doesn't invoke job if object schedules it in the past": function(test) { + test.expect(1); + + var job = schedule.scheduleJob({ + year: 1960 + }, function() { + test.ok(false); + }); + + test.equal(job, null); + + setTimeout(function() { + test.done(); + }, 1000); + + clock.tick(1000); + } + }, + ".scheduleJob({...}, {...}, fn)": { + "Callback called for each job if callback is provided": function(test) { + test.expect(3); + + var job = new schedule.scheduleJob({ + second: null // Fire every second + }, function() {}, function() { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + } + }, + ".rescheduleJob(job, {...})": { + "Reschedule jobs from object based to object based": function(test) { + test.expect(3); + + var job = new schedule.scheduleJob({ + second: null + }, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job, { + minute: null + }); + }, 3250); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 5000); + + clock.tick(5000); + }, + "Reschedule jobs from every minutes to every second": function(test) { + test.expect(3); + + var timeout = 60 * 1000; + + var job = new schedule.scheduleJob({ + minute: null + }, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job, { + second: null + }); + }, timeout); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout + 2250); + + clock.tick(timeout + 2250); + } + }, + ".rescheduleJob(job, Date)": { + "Reschedule jobs from Date to Date": function(test) { + test.expect(1); + + var job = new schedule.scheduleJob(new Date(Date.now() + 3000), function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job, new Date(Date.now() + 5000)); + }, 1000); + + setTimeout(function() { + test.done(); + }, 6150); + + clock.tick(6150); + }, + "Reschedule jobs that has been executed": function(test) { + test.expect(2); + + var job = new schedule.scheduleJob(new Date(Date.now() + 1000), function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job, new Date(Date.now() + 2000)); + }, 2000); + + setTimeout(function() { + test.done(); + }, 5150); + + clock.tick(5150); + } + }, + ".rescheduleJob(job, RecurrenceRule)": { + "Reschedule jobs from RecurrenceRule to RecurrenceRule": function(test) { + test.expect(3); + + var timeout = 60 * 1000; + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + var job = schedule.scheduleJob(rule, function() { + test.ok(true); + }); + + var newRule = new schedule.RecurrenceRule(); + newRule.minute = null; + + setTimeout(function() { + schedule.rescheduleJob(job, newRule); + }, 2250); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout + 2250); + + clock.tick(timeout + 2250); + }, + "Reschedule jobs from RecurrenceRule to Date": function(test) { + test.expect(3); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + var job = schedule.scheduleJob(rule, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job, new Date(Date.now() + 2000)); + }, 2150); + + setTimeout(function() { + test.done(); + }, 4250); + + clock.tick(4250); + }, + "Reschedule jobs from RecurrenceRule to {...}": function(test) { + test.expect(3); + + var timeout = 60 * 1000; + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + var job = schedule.scheduleJob(rule, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job, { + minute: null + }); + }, 2150); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout + 2150); + + clock.tick(timeout + 2150); + }, + "Reschedule jobs that is not available": function(test) { + test.expect(4); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + var job = schedule.scheduleJob(rule, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(null, new Date(Date.now() + 2000)); + }, 2150); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 4250); + + clock.tick(4250); + } + }, + '.rescheduleJob("job name", {...})': { + "Reschedule jobs from object based to object based": function(test) { + test.expect(3); + + var job = new schedule.scheduleJob({ + second: null + }, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job.name, { + minute: null + }); + }, 3250); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 5000); + + clock.tick(5000); + }, + "Reschedule jobs from every minutes to every second": function(test) { + test.expect(3); + + var timeout = 60 * 1000; + + var job = new schedule.scheduleJob({ + minute: null + }, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job.name, { + second: null + }); + }, timeout); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout + 2250); + + clock.tick(timeout + 2250); + } + }, + '.rescheduleJob("job name", Date)': { + "Reschedule jobs from Date to Date": function(test) { + test.expect(1); + + var job = new schedule.scheduleJob(new Date(Date.now() + 3000), function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job.name, new Date(Date.now() + 5000)); + }, 1000); + + setTimeout(function() { + test.done(); + }, 6150); + + clock.tick(6150); + }, + "Reschedule jobs that has been executed": function(test) { + test.expect(2); + + var job = new schedule.scheduleJob(new Date(Date.now() + 1000), function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job.name, new Date(Date.now() + 2000)); + }, 2000); + + setTimeout(function() { + test.done(); + }, 5150); + + clock.tick(5150); + } + }, + '.rescheduleJob("job name", RecurrenceRule)': { + "Reschedule jobs from RecurrenceRule to RecurrenceRule": function(test) { + test.expect(3); + + var timeout = 60 * 1000; + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + var job = schedule.scheduleJob(rule, function() { + test.ok(true); + }); + + var newRule = new schedule.RecurrenceRule(); + newRule.minute = null; + + setTimeout(function() { + schedule.rescheduleJob(job.name, newRule); + }, 2250); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout + 2250); + + clock.tick(timeout + 2250); + }, + "Reschedule jobs from RecurrenceRule to Date": function(test) { + test.expect(3); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + var job = schedule.scheduleJob(rule, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job.name, new Date(Date.now() + 2000)); + }, 2150); + + setTimeout(function() { + test.done(); + }, 4250); + + clock.tick(4250); + }, + "Reschedule jobs from RecurrenceRule to {...}": function(test) { + test.expect(3); + + var timeout = 60 * 1000; + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + var job = schedule.scheduleJob(rule, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob(job.name, { + minute: null + }); + }, 2150); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout + 2150); + + clock.tick(timeout + 2150); + }, + "Reschedule jobs that is not available": function(test) { + test.expect(4); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + var job = schedule.scheduleJob(rule, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.rescheduleJob("Blah", new Date(Date.now() + 2000)); + }, 2150); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 4250); + + clock.tick(4250); + } + }, + ".cancelJob(Job)": { + "Prevents all future invocations of Job passed in": function(test) { + test.expect(2); + + var job = schedule.scheduleJob({ + second: null + }, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.cancelJob(job); + }, 2250); + + setTimeout(function() { + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Can cancel Jobs scheduled with Job#schedule": function(test) { + test.expect(2); + + var job = new schedule.Job(function() { + test.ok(true); + }); + + job.schedule({ + second: null + }); + + setTimeout(function() { + schedule.cancelJob(job); + }, 2250); + + setTimeout(function() { + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Job emits 'canceled' event": function(test) { + test.expect(1); + + var job = schedule.scheduleJob({ + second: null + }, function() {}); + + job.on('canceled', function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.cancelJob(job); + test.done(); + }, 1250); + + clock.tick(1250); + } + }, + '.cancelJob("job name")': { + "Prevents all future invocations of Job identified by name": function(test) { + test.expect(2); + + var job = schedule.scheduleJob({ + second: null + }, function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.cancelJob(job.name); + }, 2250); + + setTimeout(function() { + test.done(); + }, 3250); + + clock.tick(3250); + }, + /* + "Can cancel Jobs scheduled with Job#schedule": function(test) { + test.expect(2); + + var job = new schedule.Job(function() { + test.ok(true); + }); + + job.schedule({ + second: null + }); + + setTimeout(function() { + schedule.cancelJob(job.name); + }, 2250); + + setTimeout(function() { + test.done(); + }, 3250); + },*/ + "Job emits 'canceled' event": function(test) { + test.expect(1); + + var job = schedule.scheduleJob({ + second: null + }, function() {}); + + job.on('canceled', function() { + test.ok(true); + }); + + setTimeout(function() { + schedule.cancelJob(job.name); + test.done(); + }, 1250); + + clock.tick(1250); + }, + "Does nothing if no job found by that name": function(test) { + test.expect(3); + + var job = schedule.scheduleJob({ + second: null + }, function() { + test.ok(true); + }); + + setTimeout(function() { + // This cancel should not affect anything + schedule.cancelJob('blah'); + }, 2250); + + setTimeout(function() { + job.cancel(); // prevent tests from hanging + test.done(); + }, 3250); + + clock.tick(3250); + } + }, + '.pendingInvocations()': { + "Retrieves pendingInvocations of the job": function(test) { + var job = schedule.scheduleJob(new Date(Date.now() + 1000), function() {}); + + test.ok(job instanceof schedule.Job); + test.ok(job.pendingInvocations()[0].job); + + job.cancel(); + test.done(); + } + }, + tearDown: function(cb) { + clock.restore(); + cb(); + } +}; diff --git a/nodejs/node_modules/node-schedule/test/date-convenience-methods-test.js b/nodejs/node_modules/node-schedule/test/date-convenience-methods-test.js new file mode 100755 index 0000000..10826bc --- /dev/null +++ b/nodejs/node_modules/node-schedule/test/date-convenience-methods-test.js @@ -0,0 +1,59 @@ + +'use strict'; + +var sinon = require('sinon'); +var main = require('../package.json').main; +var schedule = require('../' + main); + +var clock; + +module.exports = { + setUp: function(cb) { + clock = sinon.useFakeTimers(); + cb(); + }, + "Date string": { + "Should accept a valid date string": function(test) { + test.expect(1); + + schedule.scheduleJob(new Date(Date.now() + 1000).toString(), function() { + test.ok(true); + }); + + setTimeout(function() { + test.done(); + }, 1250); + + clock.tick(1250); + }, + "Should not accept invalid string as valid date": function(test) { + test.expect(1); + + var job = schedule.scheduleJob("hello!!", function() { + }); + + test.equal(job, null); + test.done(); + + } + }, + "UTC": { + "Should accept a valid UTC date in milliseconds": function(test) { + test.expect(1); + + schedule.scheduleJob(new Date(Date.now() + 1000).getTime(), function() { + test.ok(true); + }); + + setTimeout(function() { + test.done(); + }, 1250); + + clock.tick(1250); + } + }, + tearDown: function(cb) { + clock.restore(); + cb(); + } +}; diff --git a/nodejs/node_modules/node-schedule/test/es6/job-test.js b/nodejs/node_modules/node-schedule/test/es6/job-test.js new file mode 100755 index 0000000..754a866 --- /dev/null +++ b/nodejs/node_modules/node-schedule/test/es6/job-test.js @@ -0,0 +1,33 @@ + +'use strict'; + +module.exports = function(schedule) { + return { + jobInGenerator: function(test) { + test.expect(1); + + var job = new schedule.Job(function*() { + test.ok(true); + }); + + job.runOnDate(new Date(Date.now() + 3000)); + + setTimeout(function() { + test.done(); + }, 3250); + }, + jobContextInGenerator: function(test) { + test.expect(1); + + var job = new schedule.Job('name of job', function*() { + test.ok(this.name === 'name of job'); + }); + + job.runOnDate(new Date(Date.now() + 3000)); + + setTimeout(function() { + test.done(); + }, 3250); + } + } +} diff --git a/nodejs/node_modules/node-schedule/test/job-test.js b/nodejs/node_modules/node-schedule/test/job-test.js new file mode 100755 index 0000000..3beff80 --- /dev/null +++ b/nodejs/node_modules/node-schedule/test/job-test.js @@ -0,0 +1,517 @@ + +'use strict'; + +var sinon = require('sinon'); +var main = require('../package.json').main; +var schedule = require('../' + main); + +var es6; +try { + eval('(function* () {})()'); + es6 = require('./es6/job-test')(schedule); +} catch (e) {} + +var clock; + +module.exports = { + setUp: function(cb) { + clock = sinon.useFakeTimers(); + cb(); + }, + "Job constructor": { + "Accepts Job name and function to run": function(test) { + var job = new schedule.Job('the job', function() {}); + + test.equal(job.name, 'the job'); + test.done(); + }, + "Job name is optional and will be auto-generated": function(test) { + var job = new schedule.Job(); + + test.ok(job.name); + test.done(); + }, + "Uses unique names across auto-generated Job names": function(test) { + var job1 = new schedule.Job(); + var job2 = new schedule.Job(); + + test.notEqual(job1.name, job2.name); + test.done(); + } + }, + "#schedule(Date)": { + "Runs job once at some date": function(test) { + test.expect(1); + + var job = new schedule.Job(function() { + test.ok(true); + }); + + job.schedule(new Date(Date.now() + 3000)); + + setTimeout(function() { + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Cancel next job before it runs": function(test) { + test.expect(1); + + var job = new schedule.Job(function() { + test.ok(true); + }); + + job.schedule(new Date(Date.now() + 1500)); + job.schedule(new Date(Date.now() + 3000)); + job.cancelNext(); + setTimeout(function() { + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Run job on specified date": function(test) { + test.expect(1); + + var job = new schedule.Job(function() { + test.ok(true); + }); + + job.runOnDate(new Date(Date.now() + 3000)); + + setTimeout(function() { + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Run job in generator": function(test) { + if (!es6) { + test.expect(0); + test.done(); + return; + } + + es6.jobInGenerator(test); + + clock.tick(3250); + }, + "Context is passed into generator correctly": function(test) { + if (!es6) { + test.expect(0); + test.done(); + return; + } + + es6.jobContextInGenerator(test); + + clock.tick(3250); + }, + "Won't run job if scheduled in the past": function(test) { + test.expect(0); + + var job = new schedule.Job(function() { + test.ok(false); + }); + + job.schedule(new Date(Date.now() - 3000)); + + setTimeout(function() { + test.done(); + }, 1000); + + clock.tick(1000); + }, + "Jobs still run after scheduling a Job in the past": function(test) { + test.expect(1); + + var pastJob = new schedule.Job(function() { + // Should not run, blow up if it does + test.ok(false); + }); + + pastJob.schedule(new Date(Date.now() - 3000)); + + var job = new schedule.Job(function() { + test.ok(true); + }); + + job.schedule(new Date(Date.now() + 3000)); + + setTimeout(function() { + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Job emits 'scheduled' event with 'run at' Date": function(test) { + test.expect(1); + + var date = new Date(Date.now() + 3000); + var job = new schedule.Job(function() { + test.done(); + }); + + job.on('scheduled', function(runAtDate) { + test.equal(runAtDate.getTime(), date.getTime()); + }); + + job.schedule(date); + clock.tick(3250); + } + }, + "#schedule(Date, fn)": { + "Runs job once at some date, calls callback when done": function(test) { + test.expect(1); + + var job = new schedule.Job(function() {}, function() { + test.ok(true); + }); + + job.schedule(new Date(Date.now() + 3000)); + + setTimeout(function() { + test.done(); + }, 3250); + + clock.tick(3250); + } + }, + "#schedule(RecurrenceRule)": { + "Runs job at interval based on recur rule, repeating indefinitely": function(test) { + test.expect(3); + + var job = new schedule.Job(function() { + test.ok(true); + }); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + job.schedule(rule); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Job emits 'scheduled' event for every next invocation": function(test) { + // Job will run 3 times but be scheduled 4 times, 4th run never happens + // due to cancel. + test.expect(4); + + var job = new schedule.Job(function() {}); + + job.on('scheduled', function(runOnDate) { + test.ok(true); + }); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // fire every second + + job.schedule(rule); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Doesn't invoke job if recur rule schedules it in the past": function(test) { + test.expect(0); + + var job = new schedule.Job(function() { + test.ok(false); + }); + + var rule = new schedule.RecurrenceRule(); + rule.year = 2000; + + job.schedule(rule); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 1000); + + clock.tick(1000); + } + }, + "#schedule({...})": { + "Runs job at interval based on object, repeating indefinitely": function(test) { + test.expect(3); + + var job = new schedule.Job(function() { + test.ok(true); + }); + + job.schedule({ + second: null // fire every second + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Job emits 'scheduled' event for every next invocation": function(test) { + // Job will run 3 times but be scheduled 4 times, 4th run never happens + // due to cancel. + test.expect(4); + + var job = new schedule.Job(function() {}); + + job.on('scheduled', function(runOnDate) { + test.ok(true); + }); + + job.schedule({ + second: null // Fire every second + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Doesn't invoke job if object schedules it in the past": function(test) { + test.expect(0); + + var job = new schedule.Job(function() { + test.ok(false); + }); + + job.schedule({ + year: 2000 + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 1000); + + clock.tick(1000); + } + }, + "#schedule('jobName', {...})": { + "Runs job with a custom name input": function(test) { + test.expect(3); + + var job = new schedule.Job('jobName', function() { + test.equal(job.name, 'jobName'); + }); + + job.schedule({ + second: null // fire every second + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + } + }, + "#schedule({...}, {...})": { + "Runs job and run callback when job is done if callback is provided": function(test) { + test.expect(3); + + var job = new schedule.Job(function() {}, function() { + test.ok(true); + }); + + job.schedule({ + second: null // fire every second + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Runs job with a custom name input and run callback when job is done": function(test) { + test.expect(3); + + var job = new schedule.Job('MyJob', function() {}, function() { + test.equal(job.name, 'MyJob'); + }); + + job.schedule({ + second: null // fire every second + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + } + }, + "#cancel": { + "Prevents all future invocations": function(test) { + test.expect(1); + + var job = new schedule.Job(function() { + test.ok(true); + }); + + job.schedule({ + second: null // fire every second + }); + + setTimeout(function() { + job.cancel(); + }, 1250); + + setTimeout(function() { + test.done(); + }, 2250); + + clock.tick(2250); + }, + "Job emits 'canceled' event": function(test) { + test.expect(1); + + var job = new schedule.Job(function() {}); + + job.on('canceled', function() { + test.ok(true); + }); + + job.schedule({ + second: null // fire every second + }); + + setTimeout(function() { + job.cancel(); + }, 1250); + + setTimeout(function() { + test.done(); + }, 2250); + + clock.tick(2250); + }, + "Job is added to scheduledJobs when created and removed when cancelled": function(test) { + test.expect(4); + + var job1 = new schedule.Job('cancelJob', function() {}); + job1.schedule({ + second: null // fire every second + }); + + var job2 = schedule.scheduleJob('second', + { second: null }, + function() {}, + function() {}); + + test.strictEqual(schedule.scheduledJobs.cancelJob, job1); + test.strictEqual(schedule.scheduledJobs.second, job2); + setTimeout(function() { + job1.cancel(); + job2.cancel(); + test.strictEqual(schedule.scheduledJobs.cancelJob, undefined); + test.strictEqual(schedule.scheduledJobs.second, undefined); + test.done(); + }, 1250); + + clock.tick(1250); + } + }, + "#reschedule": { + "When rescheduled counter will be reset to zero": function(test) { + + var job = new schedule.scheduleJob({ + second: null + }, function() {}); + + setTimeout(function() { + test.equal(job.triggeredJobs(), 3); + schedule.rescheduleJob(job, { + minute: null + }); + }, 3250); + + setTimeout(function() { + job.cancel(); + test.equal(job.triggeredJobs(), 0); + test.done(); + }, 5000); + + clock.tick(5000); + } + }, + "When invoked": { + "Job emits 'run' event": function(test) { + test.expect(1); + + var job = new schedule.Job(function() {}); + + job.on('run', function() { + test.ok(true); + }); + + job.schedule(new Date(Date.now() + 3000)); + + setTimeout(function() { + test.done(); + }, 3250); + + clock.tick(3250); + }, + "Job counter increase properly": function(test) { + var job = new schedule.Job(function() {}); + + job.schedule({ + second: null // fire every second + }); + + setTimeout(function() { + job.cancel(); + test.equal(job.triggeredJobs(), 2); + test.done(); + }, 2250); + + clock.tick(2250); + }, + "Job gets invoked with the fire date": function (test) { + test.expect(2); + var prevFireDate; + var job = new schedule.Job(function (fireDate) { + if (!prevFireDate) { + test.ok(fireDate instanceof Date); + } else { + test.equal(fireDate.getTime() - prevFireDate.getTime(), 1000); + } + prevFireDate = fireDate; + }); + + job.schedule({ + second: null // fire every second + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 2250); + + clock.tick(2250); + } + }, + tearDown: function(cb) { + clock.restore(); + cb(); + } +}; diff --git a/nodejs/node_modules/node-schedule/test/range-test.js b/nodejs/node_modules/node-schedule/test/range-test.js new file mode 100755 index 0000000..e325928 --- /dev/null +++ b/nodejs/node_modules/node-schedule/test/range-test.js @@ -0,0 +1,77 @@ + +'use strict'; + +var main = require('../package.json').main; +var schedule = require('../' + main); + +module.exports = { + "step defaults to 1": function(test) { + var range = new schedule.Range(2, 6); + + test.equals(1, range.step); + + test.done(); + }, + "when step is 1": { + "setUp": function(done) { + this.range = new schedule.Range(2, 6, 1); + + done(); + }, + "includes start value": function(test) { + test.ok(this.range.contains(2)); + + test.done(); + }, + "includes end value": function(test) { + test.ok(this.range.contains(6)); + + test.done(); + }, + "includes value between start and end": function(test) { + test.ok(this.range.contains(3)); + + test.done(); + }, + "excludes values outside of start and end": function(test) { + test.ok(!this.range.contains(1)); + test.ok(!this.range.contains(7)); + + test.done(); + } + }, + "when step > 1": { + "setUp": function(done) { + this.range = new schedule.Range(2, 6, 2); + + done(); + }, + "includes start value": function(test) { + test.ok(this.range.contains(2)); + + test.done(); + }, + "excludes end value": function(test) { + test.ok(!this.range.contains(6)); + + test.done(); + }, + "includes value between start and end that is evenly divisible by step": function(test) { + test.ok(this.range.contains(4)); + + test.done(); + }, + "excludes value between start and end that is not evenly divisible by step": function(test) { + test.ok(!this.range.contains(5)); + + test.done(); + }, + "excludes values outside of start and end": function(test) { + test.ok(!this.range.contains(1)); + test.ok(!this.range.contains(7)); + + test.done(); + } + } + +}; diff --git a/nodejs/node_modules/node-schedule/test/recurrence-rule-test.js b/nodejs/node_modules/node-schedule/test/recurrence-rule-test.js new file mode 100755 index 0000000..7654bae --- /dev/null +++ b/nodejs/node_modules/node-schedule/test/recurrence-rule-test.js @@ -0,0 +1,375 @@ + +'use strict'; + +var main = require('../package.json').main; +var schedule = require('../' + main); +var sinon = require('sinon'); +var clock; + +// 12:30:15 pm Thursday 29 April 2010 in the timezone this code is being run in +var base = new Date(2010, 3, 29, 12, 30, 15, 0); +var baseMs = base.getTime(); + +module.exports = { + "setUp": function(cb) { + clock = sinon.useFakeTimers(baseMs); + cb(); + }, + "tearDown": function(cb) { + clock.restore(); + cb(); + }, + "#nextInvocationDate(Date)": { + "next second": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.second = null; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 3, 29, 12, 30, 16, 0), next); + test.done(); + }, + "next 25th second": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.second = 25; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 3, 29, 12, 30, 25, 0), next); + test.done(); + }, + "next 5th second (minutes incremented)": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.second = 5; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 3, 29, 12, 31, 5, 0), next); + test.done(); + }, + "next 40th minute": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.minute = 40; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 3, 29, 12, 40, 0, 0), next); + test.done(); + }, + "next 1st minute (hours incremented)": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.minute = 1; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 3, 29, 13, 1, 0, 0), next); + test.done(); + }, + "next 23rd hour": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.hour = 23; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 3, 29, 23, 0, 0, 0), next); + test.done(); + }, + "next 3rd hour (days incremented)": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.hour = 3; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 3, 30, 3, 0, 0, 0), next); + test.done(); + }, + "next Friday": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.dayOfWeek = 5; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 3, 30, 0, 0, 0, 0), next); + test.done(); + }, + "next Monday (months incremented)": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.dayOfWeek = 1; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 4, 3, 0, 0, 0, 0), next); + test.done(); + }, + "next 30th date": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.date = 30; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 3, 30, 0, 0, 0, 0), next); + test.done(); + }, + "next 5th date (months incremented)": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.date = 5; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 4, 5, 0, 0, 0, 0), next); + test.done(); + }, + "next October": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.month = 9; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 9, 1, 0, 0, 0, 0), next); + test.done(); + }, + "next February (years incremented)": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.month = 1; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2011, 1, 1, 0, 0, 0, 0), next); + test.done(); + }, + "in the year 2040": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.year = 2040; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2040, 0, 1, 0, 0, 0, 0), next); + test.done(); + }, + "using past year": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.year = 2000; + + var next = rule.nextInvocationDate(base); + + test.equal(null, next); + test.done(); + }, + "using mixed time components": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.second = 50; + rule.minute = 5; + rule.hour = 10; + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 3, 30, 10, 5, 50, 0), next); + test.done(); + }, + /* + "using date and dayOfWeek together": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.dayOfWeek = 4; // This is Thursday April 1st + rule.date = 10; // This is Saturday April 10th + + var next = rule.nextInvocationDate(base); + + test.deepEqual(new Date(2010, 3, 1, 0, 0, 0, 0), next); + test.done(); + }*/ + "returns null when no invocations left": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.year = 2000; + + var next = rule.nextInvocationDate(base); + + test.strictEqual(null, next); + test.done(); + }, + "specify span of components using Range": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.minute = new schedule.Range(4, 6); + + var next; + + next = rule.nextInvocationDate(base); + test.deepEqual(new Date(2010, 3, 29, 13, 4, 0, 0), next); + + next = rule.nextInvocationDate(next); + test.deepEqual(new Date(2010, 3, 29, 13, 5, 0, 0), next); + + next = rule.nextInvocationDate(next); + test.deepEqual(new Date(2010, 3, 29, 13, 6, 0, 0), next); + + next = rule.nextInvocationDate(next); + test.deepEqual(new Date(2010, 3, 29, 14, 4, 0, 0), next); + + test.done(); + }, + "specify intervals within span of components using Range with step": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.minute = new schedule.Range(4, 8, 2); + + var next; + + next = rule.nextInvocationDate(base); + test.deepEqual(new Date(2010, 3, 29, 13, 4, 0, 0), next); + + next = rule.nextInvocationDate(next); + test.deepEqual(new Date(2010, 3, 29, 13, 6, 0, 0), next); + + /* Should Range stay inclusive on both ends when step > 1 + next = rule.nextInvocationDate(next); + test.deepEqual(new Date(2010, 3, 29, 13, 8, 0, 0), next); + */ + + next = rule.nextInvocationDate(next); + test.deepEqual(new Date(2010, 3, 29, 14, 4, 0, 0), next); + + test.done(); + }, + "specify span and explicit components using Array of Ranges and Numbers": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.minute = [2, new schedule.Range(4, 6)]; + + var next; + + next = rule.nextInvocationDate(base); + test.deepEqual(new Date(2010, 3, 29, 13, 2, 0, 0), next); + + next = rule.nextInvocationDate(next); + test.deepEqual(new Date(2010, 3, 29, 13, 4, 0, 0), next); + + next = rule.nextInvocationDate(next); + test.deepEqual(new Date(2010, 3, 29, 13, 5, 0, 0), next); + + next = rule.nextInvocationDate(next); + test.deepEqual(new Date(2010, 3, 29, 13, 6, 0, 0), next); + + next = rule.nextInvocationDate(next); + test.deepEqual(new Date(2010, 3, 29, 14, 2, 0, 0), next); + + test.done(); + }, + "From 31th May schedule the 1st of every June": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.second = 0; + rule.minute = 0; + rule.hour = 0; + rule.date = 1; + rule.month = 5; + + var next; + var base1 = new Date(2010, 4, 31, 12, 30, 15, 0); + + next = rule.nextInvocationDate(base1); + test.deepEqual(new Date(2010, 5, 1, 0, 0, 0, 0), next); + + next = rule.nextInvocationDate(next); + test.deepEqual(new Date(2011, 5, 1, 0, 0, 0, 0), next); + + test.done(); + }, + "With the year set should not loop indefinetely": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.second = 0; + rule.minute = 0; + rule.hour = 0; + rule.date = 1; + rule.month = 5; + rule.year = 2010; + + var next; + var base1 = new Date(2010, 4, 31, 12, 30, 15, 0); + + next = rule.nextInvocationDate(base1); + test.deepEqual(new Date(2010, 5, 1, 0, 0, 0, 0), next); + + next = rule.nextInvocationDate(next); + test.equal(next, null); + + test.done(); + }, + "using rule with string properties": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.second = '50'; + rule.minute = '5'; + rule.hour = '10'; + var next = rule.nextInvocationDate(base); + test.deepEqual(new Date(2010, 3, 30, 10, 5, 50, 0), next); + test.done(); + }, + "nextInvocationDate on an invalid month should return null": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.month = 12; + var next = rule.nextInvocationDate(); + test.equal(next, null); + + var rule2 = new schedule.RecurrenceRule(); + rule2.month = 'asdfasdf'; + var next2 = rule2.nextInvocationDate(next); + test.equal(next2, null); + + test.done(); + }, + "nextInvocationDate on an invalid second should return null": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.second = 60; + var next = rule.nextInvocationDate(); + test.equal(next, null); + + var rule2 = new schedule.RecurrenceRule(); + rule2.second = 'asdfasdf'; + var next2 = rule2.nextInvocationDate(); + test.equal(next2, null); + + test.done(); + }, + "nextInvocationDate on an invalid hour should return null": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.hour = 24; + var next = rule.nextInvocationDate(); + test.equal(next, null); + + var rule2 = new schedule.RecurrenceRule(); + rule2.hour = 'asdfasdf'; + var next2 = rule2.nextInvocationDate(); + test.equal(next2, null); + + test.done(); + }, + "nextInvocationDate on an invalid date should return null": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.date = 90; + var next = rule.nextInvocationDate(); + test.equal(next, null); + + // Test February + var rule2 = new schedule.RecurrenceRule(); + rule2.month = 1; + rule2.date = 30; + var next2 = rule2.nextInvocationDate(); + test.equal(next2, null); + + var rule3 = new schedule.RecurrenceRule(); + rule3.date = 'asdfasdf'; + var next3 = rule3.nextInvocationDate(); + test.equal(next3, null); + + test.done(); + }, + "nextInvocationDate on an invalid dayOfWeek should return null": function(test) { + var rule = new schedule.RecurrenceRule(); + rule.dayOfWeek = 90; + var next = rule.nextInvocationDate(); + test.equal(next, null); + + var rule2 = new schedule.RecurrenceRule(); + rule2.dayOfWeek = 'asdfasdf'; + var next2 = rule.nextInvocationDate(); + test.equal(next2, null); + + test.done(); + } + } +}; diff --git a/nodejs/node_modules/node-schedule/test/schedule-cron-jobs.js b/nodejs/node_modules/node-schedule/test/schedule-cron-jobs.js new file mode 100755 index 0000000..0818355 --- /dev/null +++ b/nodejs/node_modules/node-schedule/test/schedule-cron-jobs.js @@ -0,0 +1,134 @@ + +'use strict'; + +var sinon = require('sinon'); +var main = require('../package.json').main; +var schedule = require('../' + main); + +var clock; + +module.exports = { + ".scheduleJob(cron_expr, fn)": { + setUp: function(cb) { + clock = sinon.useFakeTimers(); + cb(); + }, + "Runs job every second": function(test) { + test.expect(3); + + var timeout = 3 * 1000 + 150; + + var job = schedule.scheduleJob('* * * * * *', function() { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout); + + clock.tick(timeout); + }, + "Runs job every minute": function(test) { + test.expect(3); + + var timeout = 3 * 60 * 1000 + 150; + + var job = schedule.scheduleJob('0 * * * * *', function() { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout); + + clock.tick(timeout); + }, + "Runs job every hour": function(test) { + test.expect(3); + + var timeout = 3 * 60 * 60 * 1000 + 150; + + var job = schedule.scheduleJob('0 0 * * * *', function() { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout); + + clock.tick(timeout); + }, + "Runs job every day": function(test) { + test.expect(3); + + var timeout = 3 * 24 * 60 * 60 * 1000 + 150; + + var job = schedule.scheduleJob('0 0 0 * * *', function() { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout); + + clock.tick(timeout); + }, + "Runs job every week": function(test) { + test.expect(3); + + var timeout = 3 * 7 * 24 * 60 * 60 * 1000 + 150; + + var job = schedule.scheduleJob('0 0 0 * * 1', function() { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout); + + clock.tick(timeout); + }, + "Runs job every month": function(test) { + test.expect(48); + + var timeout = 4 * 365.25 * 24 * 60 * 60 * 1000 + 150; + + var job = schedule.scheduleJob('0 0 0 1 * *', function() { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout); + + clock.tick(timeout); + + }, + "Runs job every year": function(test) { + test.expect(4); + + var timeout = 4 * 365.25 * 24 * 60 * 60 * 1000 + 150; + + var job = schedule.scheduleJob('0 0 0 1 1 *', function() { + test.ok(true); + }); + + setTimeout(function() { + job.cancel(); + test.done(); + }, timeout); + + clock.tick(timeout); + }, + tearDown: function(cb) { + clock.restore(); + cb(); + } + } +}; diff --git a/nodejs/node_modules/node-schedule/test/start-end-test.js b/nodejs/node_modules/node-schedule/test/start-end-test.js new file mode 100755 index 0000000..51dacd2 --- /dev/null +++ b/nodejs/node_modules/node-schedule/test/start-end-test.js @@ -0,0 +1,327 @@ +'use strict'; + +var sinon = require('sinon'); +var main = require('../package.json').main; +var schedule = require('../' + main); + +var clock; + +module.exports = { + setUp: function (cb) { + clock = sinon.useFakeTimers(); + cb(); + }, + 'RecurrenceRule': { + 'no endTime , startTime less than now': function (test) { + test.expect(3); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // every second + + job.schedule({ + start: new Date(Date.now() - 2000), + rule: rule + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'no endTime , startTime greater than now': function (test) { + test.expect(1); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // every second + + job.schedule({ + start: new Date(Date.now() + 2000), + rule: rule + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'no startTime , endTime less than now': function (test) { + test.expect(0); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // every second + + job.schedule({ + end: new Date(Date.now() - 2000), + rule: rule + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'no startTime , endTime greater than now': function (test) { + test.expect(2); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // every second + + job.schedule({ + end: new Date(Date.now() + 2000), + rule: rule + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'has startTime and endTime': function (test) { + test.expect(1); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + var rule = new schedule.RecurrenceRule(); + rule.second = null; // every second + + job.schedule({ + start: new Date(Date.now() + 1000), + end: new Date(Date.now() + 2000), + rule: rule + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + } + }, + 'Object Literal': { + 'no endTime , startTime less than now': function (test) { + test.expect(3); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + job.schedule({ + start: new Date(Date.now() - 2000), + rule: { second: null } + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'no endTime , startTime greater than now': function (test) { + test.expect(1); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + job.schedule({ + start: new Date(Date.now() + 2000), + rule: { second: null } + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'no startTime , endTime less than now': function (test) { + test.expect(0); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + job.schedule({ + end: new Date(Date.now() - 2000), + rule: { second: null } + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'no startTime , endTime greater than now': function (test) { + test.expect(2); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + job.schedule({ + end: new Date(Date.now() + 2000), + rule: { second: null } + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'has startTime and endTime': function (test) { + test.expect(1); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + job.schedule({ + start: new Date(Date.now() + 1000), + end: new Date(Date.now() + 2000), + rule: { second: null } + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + } + }, + 'cron-style': { + 'no endTime , startTime less than now': function (test) { + test.expect(3); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + job.schedule({ + start: new Date(Date.now() - 2000), + rule: '*/1 * * * * *' + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'no endTime , startTime greater than now': function (test) { + test.expect(1); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + job.schedule({ + start: new Date(Date.now() + 2000), + rule: '*/1 * * * * *' + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'no startTime , endTime less than now': function (test) { + test.expect(0); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + job.schedule({ + end: new Date(Date.now() - 2000), + rule: '*/1 * * * * *' + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'no startTime , endTime greater than now': function (test) { + test.expect(2); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + job.schedule({ + end: new Date(Date.now() + 2000), + rule: '*/1 * * * * *' + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + }, + 'has startTime and endTime': function (test) { + test.expect(1); + + var job = new schedule.Job(function () { + test.ok(true); + }); + + job.schedule({ + start: new Date(Date.now() + 1000), + end: new Date(Date.now() + 2000), + rule: '*/1 * * * * *' + }); + + setTimeout(function () { + job.cancel(); + test.done(); + }, 3250); + + clock.tick(3250); + } + }, + tearDown: function (cb) { + clock.restore(); + cb(); + } +}; diff --git a/nodejs/node_modules/object-keys/.editorconfig b/nodejs/node_modules/object-keys/.editorconfig new file mode 100755 index 0000000..eaa2141 --- /dev/null +++ b/nodejs/node_modules/object-keys/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +indent_style = tab; +insert_final_newline = true; +quote_type = auto; +space_after_anonymous_functions = true; +space_after_control_statements = true; +spaces_around_operators = true; +trim_trailing_whitespace = true; +spaces_in_brackets = false; +end_of_line = lf; + diff --git a/nodejs/node_modules/object-keys/.eslintrc b/nodejs/node_modules/object-keys/.eslintrc new file mode 100755 index 0000000..9a8d5b0 --- /dev/null +++ b/nodejs/node_modules/object-keys/.eslintrc @@ -0,0 +1,17 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "complexity": [2, 23], + "id-length": [2, { "min": 1, "max": 40 }], + "max-params": [2, 3], + "max-statements": [2, 23], + "max-statements-per-line": [2, { "max": 2 }], + "no-extra-parens": [1], + "no-invalid-this": [1], + "no-restricted-syntax": [2, "BreakStatement", "ContinueStatement", "LabeledStatement", "WithStatement"], + "operator-linebreak": [2, "after"] + } +} diff --git a/nodejs/node_modules/object-keys/.jscs.json b/nodejs/node_modules/object-keys/.jscs.json new file mode 100755 index 0000000..4782896 --- /dev/null +++ b/nodejs/node_modules/object-keys/.jscs.json @@ -0,0 +1,175 @@ +{ + "es3": true, + + "additionalRules": [], + + "requireSemicolons": true, + + "disallowMultipleSpaces": true, + + "disallowIdentifierNames": [], + + "requireCurlyBraces": { + "allExcept": [], + "keywords": ["if", "else", "for", "while", "do", "try", "catch"] + }, + + "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"], + + "disallowSpaceAfterKeywords": [], + + "disallowSpaceBeforeComma": true, + "disallowSpaceAfterComma": false, + "disallowSpaceBeforeSemicolon": true, + + "disallowNodeTypes": [ + "DebuggerStatement", + "LabeledStatement", + "SwitchCase", + "SwitchStatement", + "WithStatement" + ], + + "requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] }, + + "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true }, + "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true }, + "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true }, + "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true }, + "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true }, + + "requireSpaceBetweenArguments": true, + + "disallowSpacesInsideParentheses": true, + + "disallowSpacesInsideArrayBrackets": true, + + "disallowQuotedKeysInObjects": { "allExcept": ["reserved"] }, + + "disallowSpaceAfterObjectKeys": true, + + "requireCommaBeforeLineBreak": true, + + "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"], + "requireSpaceAfterPrefixUnaryOperators": [], + + "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"], + "requireSpaceBeforePostfixUnaryOperators": [], + + "disallowSpaceBeforeBinaryOperators": [], + "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="], + + "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="], + "disallowSpaceAfterBinaryOperators": [], + + "disallowImplicitTypeConversion": ["binary", "string"], + + "disallowKeywords": ["with", "eval"], + + "requireKeywordsOnNewLine": [], + "disallowKeywordsOnNewLine": ["else"], + + "requireLineFeedAtFileEnd": true, + + "disallowTrailingWhitespace": true, + + "disallowTrailingComma": true, + + "excludeFiles": ["node_modules/**", "vendor/**"], + + "disallowMultipleLineStrings": true, + + "requireDotNotation": { "allExcept": ["keywords"] }, + + "requireParenthesesAroundIIFE": true, + + "validateLineBreaks": "LF", + + "validateQuoteMarks": { + "escape": true, + "mark": "'" + }, + + "disallowOperatorBeforeLineBreak": [], + + "requireSpaceBeforeKeywords": [ + "do", + "for", + "if", + "else", + "switch", + "case", + "try", + "catch", + "finally", + "while", + "with", + "return" + ], + + "validateAlignedFunctionParameters": { + "lineBreakAfterOpeningBraces": true, + "lineBreakBeforeClosingBraces": true + }, + + "requirePaddingNewLinesBeforeExport": true, + + "validateNewlineAfterArrayElements": { + "maximum": 7 + }, + + "requirePaddingNewLinesAfterUseStrict": true, + + "disallowArrowFunctions": true, + + "disallowMultiLineTernary": true, + + "validateOrderInObjectKeys": "asc-insensitive", + + "disallowIdenticalDestructuringNames": true, + + "disallowNestedTernaries": { "maxLevel": 1 }, + + "requireSpaceAfterComma": { "allExcept": ["trailing"] }, + "requireAlignedMultilineParams": false, + + "requireSpacesInGenerator": { + "afterStar": true + }, + + "disallowSpacesInGenerator": { + "beforeStar": true + }, + + "disallowVar": false, + + "requireArrayDestructuring": false, + + "requireEnhancedObjectLiterals": false, + + "requireObjectDestructuring": false, + + "requireEarlyReturn": false, + + "requireCapitalizedConstructorsNew": { + "allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"] + }, + + "requireImportAlphabetized": false, + + "requireSpaceBeforeObjectValues": true, + "requireSpaceBeforeDestructuredValues": true, + + "disallowSpacesInsideTemplateStringPlaceholders": true, + + "disallowArrayDestructuringReturn": false, + + "requireNewlineBeforeSingleStatementsInIf": false, + + "disallowUnusedVariables": true, + + "requireSpacesInsideImportedObjectBraces": true, + + "requireUseStrict": true +} + diff --git a/nodejs/node_modules/object-keys/.travis.yml b/nodejs/node_modules/object-keys/.travis.yml new file mode 100755 index 0000000..767256c --- /dev/null +++ b/nodejs/node_modules/object-keys/.travis.yml @@ -0,0 +1,225 @@ +language: node_js +os: + - linux +node_js: + - "10.4" + - "9.11" + - "8.11" + - "7.10" + - "6.14" + - "5.12" + - "4.9" + - "iojs-v3.3" + - "iojs-v2.5" + - "iojs-v1.8" + - "0.12" + - "0.10" + - "0.8" +before_install: + - 'case "${TRAVIS_NODE_VERSION}" in 0.*) export NPM_CONFIG_STRICT_SSL=false ;; esac' + - 'nvm install-latest-npm' +install: + - 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ] || [ "${TRAVIS_NODE_VERSION}" = "0.9" ]; then nvm install --latest-npm 0.8 && npm install && nvm use "${TRAVIS_NODE_VERSION}"; else npm install; fi;' +script: + - 'if [ -n "${PRETEST-}" ]; then npm run pretest ; fi' + - 'if [ -n "${POSTTEST-}" ]; then npm run posttest ; fi' + - 'if [ -n "${COVERAGE-}" ]; then npm run coverage ; fi' + - 'if [ -n "${TEST-}" ]; then npm run tests-only ; fi' +sudo: false +env: + - TEST=true +matrix: + fast_finish: true + include: + - node_js: "lts/*" + env: PRETEST=true + - node_js: "lts/*" + env: POSTTEST=true + - node_js: "4" + env: COVERAGE=true + - node_js: "10.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "10.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "10.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "10.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.10" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.10" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.13" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.12" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.11" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.10" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.11" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.10" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v3.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v3.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v3.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v2.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v2.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v2.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v2.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v2.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "0.11" + env: TEST=true ALLOW_FAILURE=true + - node_js: "0.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "0.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "0.4" + env: TEST=true ALLOW_FAILURE=true + allow_failures: + - os: osx + - env: TEST=true ALLOW_FAILURE=true + - env: COVERAGE=true diff --git a/nodejs/node_modules/object-keys/CHANGELOG.md b/nodejs/node_modules/object-keys/CHANGELOG.md new file mode 100755 index 0000000..27123c4 --- /dev/null +++ b/nodejs/node_modules/object-keys/CHANGELOG.md @@ -0,0 +1,220 @@ +1.0.12 / 2018-06-18 +================= + * [Fix] avoid accessing `window.applicationCache`, to avoid issues with latest Chrome on HTTP (#46) + +1.0.11 / 2016-07-05 +================= + * [Fix] exclude keys regarding the style (eg. `pageYOffset`) on `window` to avoid reflow (#32) + +1.0.10 / 2016-07-04 +================= + * [Fix] exclude `height` and `width` keys on `window` to avoid reflow (#31) + * [Fix] In IE 6, `window.external` makes `Object.keys` throw + * [Tests] up to `node` `v6.2`, `v5.10`, `v4.4` + * [Tests] use pretest/posttest for linting/security + * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config` + * [Dev Deps] remove unused eccheck script + dep + +1.0.9 / 2015-10-19 +================= + * [Fix] Blacklist 'frame' property on window (#16, #17) + * [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config` + +1.0.8 / 2015-10-14 +================= + * [Fix] wrap automation equality bug checking in try/catch, per [es5-shim#327](https://github.com/es-shims/es5-shim/issues/327) + * [Fix] Blacklist 'window.frameElement' per [es5-shim#322](https://github.com/es-shims/es5-shim/issues/322) + * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG + * [Tests] up to `io.js` `v3.3`, `node` `v4.2` + * [Dev Deps] update `eslint`, `tape`, `@ljharb/eslint-config`, `jscs` + +1.0.7 / 2015-07-18 +================= + * [Fix] A proper fix for 176f03335e90d5c8d0d8125a99f27819c9b9cdad / https://github.com/es-shims/es5-shim/issues/275 that doesn't break dontEnum/constructor fixes in IE 8. + * [Fix] Remove deprecation message in Chrome by touching deprecated window properties (#15) + * [Tests] Improve test output for automation equality bugfix + * [Tests] Test on `io.js` `v2.4` + +1.0.6 / 2015-07-09 +================= + * [Fix] Use an object lookup rather than ES5's `indexOf` (#14) + * [Tests] ES3 browsers don't have `Array.isArray` + * [Tests] Fix `no-shadow` rule, as well as an IE 8 bug caused by engine NFE shadowing bugs. + +1.0.5 / 2015-07-03 +================= + * [Fix] Fix a flabbergasting IE 8 bug where `localStorage.constructor.prototype === localStorage` throws + * [Tests] Test up to `io.js` `v2.3` + * [Dev Deps] Update `nsp`, `eslint` + +1.0.4 / 2015-05-23 +================= + * Fix a Safari 5.0 bug with `Object.keys` not working with `arguments` + * Test on latest `node` and `io.js` + * Update `jscs`, `tape`, `eslint`, `nsp`, `is`, `editorconfig-tools`, `covert` + +1.0.3 / 2015-01-06 +================= + * Revert "Make `object-keys` more robust against later environment tampering" to maintain ES3 compliance + +1.0.2 / 2014-12-28 +================= + * Update lots of dev dependencies + * Tweaks to README + * Make `object-keys` more robust against later environment tampering + +1.0.1 / 2014-09-03 +================= + * Update URLs and badges in README + +1.0.0 / 2014-08-26 +================= + * v1.0.0 + +0.6.1 / 2014-08-25 +================= + * v0.6.1 + * Updating dependencies (tape, covert, is) + * Update badges in readme + * Use separate var statements + +0.6.0 / 2014-04-23 +================= + * v0.6.0 + * Updating dependencies (tape, covert) + * Make sure boxed primitives, and arguments objects, work properly in ES3 browsers + * Improve test matrix: test all node versions, but only latest two stables are a failure + * Remove internal foreach shim. + +0.5.1 / 2014-03-09 +================= + * 0.5.1 + * Updating dependencies (tape, covert, is) + * Removing forEach from the module (but keeping it in tests) + +0.5.0 / 2014-01-30 +================= + * 0.5.0 + * Explicitly returning the shim, instead of returning native Object.keys when present + * Adding a changelog. + * Cleaning up IIFE wrapping + * Testing on node 0.4 through 0.11 + +0.4.0 / 2013-08-14 +================== + + * v0.4.0 + * In Chrome 4-10 and Safari 4, typeof (new RegExp) === 'function' + * If it's a string, make sure to use charAt instead of brackets. + * Only use Function#call if necessary. + * Making sure the context tests actually run. + * Better function detection + * Adding the android browser + * Fixing testling files + * Updating tape + * Removing the "is" dependency. + * Making an isArguments shim. + * Adding a local forEach shim and tests. + * Updating paths. + * Moving the shim test. + * v0.3.0 + +0.3.0 / 2013-05-18 +================== + + * README tweak. + * Fixing constructor enum issue. Fixes [#5](https://github.com/ljharb/object-keys/issues/5). + * Adding a test for [#5](https://github.com/ljharb/object-keys/issues/5) + * Updating readme. + * Updating dependencies. + * Giving credit to lodash. + * Make sure that a prototype's constructor property is not enumerable. Fixes [#3](https://github.com/ljharb/object-keys/issues/3). + * Adding additional tests to handle arguments objects, and to skip "prototype" in functions. Fixes [#2](https://github.com/ljharb/object-keys/issues/2). + * Fixing a typo on this test for [#3](https://github.com/ljharb/object-keys/issues/3). + * Adding node 0.10 to travis. + * Adding an IE < 9 test per [#3](https://github.com/ljharb/object-keys/issues/3) + * Adding an iOS 5 mobile Safari test per [#2](https://github.com/ljharb/object-keys/issues/2) + * Moving "indexof" and "is" to be dev dependencies. + * Making sure the shim works with functions. + * Flattening the tests. + +0.2.0 / 2013-05-10 +================== + + * v0.2.0 + * Object.keys should work with arrays. + +0.1.8 / 2013-05-10 +================== + + * v0.1.8 + * Upgrading dependencies. + * Using a simpler check. + * Fixing a bug in hasDontEnumBug browsers. + * Using the newest tape! + * Fixing this error test. + * "undefined" is probably a reserved word in ES3. + * Better test message. + +0.1.7 / 2013-04-17 +================== + + * Upgrading "is" once more. + * The key "null" is breaking some browsers. + +0.1.6 / 2013-04-17 +================== + + * v0.1.6 + * Upgrading "is" + +0.1.5 / 2013-04-14 +================== + + * Bumping version. + * Adding more testling browsers. + * Updating "is" + +0.1.4 / 2013-04-08 +================== + + * Using "is" instead of "is-extended". + +0.1.3 / 2013-04-07 +================== + + * Using "foreach" instead of my own shim. + * Removing "tap"; I'll just wait for "tape" to fix its node 0.10 bug. + +0.1.2 / 2013-04-03 +================== + + * Adding dependency status; moving links to an index at the bottom. + * Upgrading is-extended; version 0.1.2 + * Adding an npm version badge. + +0.1.1 / 2013-04-01 +================== + + * Adding Travis CI. + * Bumping the version. + * Adding indexOf since IE sucks. + * Adding a forEach shim since older browsers don't have Array#forEach. + * Upgrading tape - 0.3.2 uses Array#map + * Using explicit end instead of plan. + * Can't test with Array.isArray in older browsers. + * Using is-extended. + * Fixing testling files. + * JSHint/JSLint-ing. + * Removing an unused object. + * Using strict mode. + +0.1.0 / 2013-03-30 +================== + + * Changing the exports should have meant a higher version bump. + * Oops, fixing the repo URL. + * Adding more tests. + * 0.0.2 + * Merge branch 'export_one_thing'; closes [#1](https://github.com/ljharb/object-keys/issues/1) + * Move shim export to a separate file. diff --git a/nodejs/node_modules/object-keys/LICENSE b/nodejs/node_modules/object-keys/LICENSE new file mode 100755 index 0000000..28553fd --- /dev/null +++ b/nodejs/node_modules/object-keys/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (C) 2013 Jordan Harband + +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. \ No newline at end of file diff --git a/nodejs/node_modules/object-keys/README.md b/nodejs/node_modules/object-keys/README.md new file mode 100755 index 0000000..ed4c277 --- /dev/null +++ b/nodejs/node_modules/object-keys/README.md @@ -0,0 +1,76 @@ +#object-keys [![Version Badge][npm-version-svg]][package-url] + +[![Build Status][travis-svg]][travis-url] +[![dependency status][deps-svg]][deps-url] +[![dev dependency status][dev-deps-svg]][dev-deps-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][npm-badge-png]][package-url] + +[![browser support][testling-svg]][testling-url] + +An Object.keys shim. Invoke its "shim" method to shim Object.keys if it is unavailable. + +Most common usage: +```js +var keys = Object.keys || require('object-keys'); +``` + +## Example + +```js +var keys = require('object-keys'); +var assert = require('assert'); +var obj = { + a: true, + b: true, + c: true +}; + +assert.deepEqual(keys(obj), ['a', 'b', 'c']); +``` + +```js +var keys = require('object-keys'); +var assert = require('assert'); +/* when Object.keys is not present */ +delete Object.keys; +var shimmedKeys = keys.shim(); +assert.equal(shimmedKeys, keys); +assert.deepEqual(Object.keys(obj), keys(obj)); +``` + +```js +var keys = require('object-keys'); +var assert = require('assert'); +/* when Object.keys is present */ +var shimmedKeys = keys.shim(); +assert.equal(shimmedKeys, Object.keys); +assert.deepEqual(Object.keys(obj), keys(obj)); +``` + +## Source +Implementation taken directly from [es5-shim][es5-shim-url], with modifications, including from [lodash][lodash-url]. + +## Tests +Simply clone the repo, `npm install`, and run `npm test` + +[package-url]: https://npmjs.org/package/object-keys +[npm-version-svg]: http://versionbadg.es/ljharb/object-keys.svg +[travis-svg]: https://travis-ci.org/ljharb/object-keys.svg +[travis-url]: https://travis-ci.org/ljharb/object-keys +[deps-svg]: https://david-dm.org/ljharb/object-keys.svg +[deps-url]: https://david-dm.org/ljharb/object-keys +[dev-deps-svg]: https://david-dm.org/ljharb/object-keys/dev-status.svg +[dev-deps-url]: https://david-dm.org/ljharb/object-keys#info=devDependencies +[testling-svg]: https://ci.testling.com/ljharb/object-keys.png +[testling-url]: https://ci.testling.com/ljharb/object-keys +[es5-shim-url]: https://github.com/es-shims/es5-shim/blob/master/es5-shim.js#L542-589 +[lodash-url]: https://github.com/lodash/lodash +[npm-badge-png]: https://nodei.co/npm/object-keys.png?downloads=true&stars=true +[license-image]: http://img.shields.io/npm/l/object-keys.svg +[license-url]: LICENSE +[downloads-image]: http://img.shields.io/npm/dm/object-keys.svg +[downloads-url]: http://npm-stat.com/charts.html?package=object-keys + diff --git a/nodejs/node_modules/object-keys/index.js b/nodejs/node_modules/object-keys/index.js new file mode 100755 index 0000000..3f2463e --- /dev/null +++ b/nodejs/node_modules/object-keys/index.js @@ -0,0 +1,141 @@ +'use strict'; + +// modified from https://github.com/es-shims/es5-shim +var has = Object.prototype.hasOwnProperty; +var toStr = Object.prototype.toString; +var slice = Array.prototype.slice; +var isArgs = require('./isArguments'); +var isEnumerable = Object.prototype.propertyIsEnumerable; +var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString'); +var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype'); +var dontEnums = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' +]; +var equalsConstructorPrototype = function (o) { + var ctor = o.constructor; + return ctor && ctor.prototype === o; +}; +var excludedKeys = { + $applicationCache: true, + $console: true, + $external: true, + $frame: true, + $frameElement: true, + $frames: true, + $innerHeight: true, + $innerWidth: true, + $outerHeight: true, + $outerWidth: true, + $pageXOffset: true, + $pageYOffset: true, + $parent: true, + $scrollLeft: true, + $scrollTop: true, + $scrollX: true, + $scrollY: true, + $self: true, + $webkitIndexedDB: true, + $webkitStorageInfo: true, + $window: true +}; +var hasAutomationEqualityBug = (function () { + /* global window */ + if (typeof window === 'undefined') { return false; } + for (var k in window) { + try { + if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') { + try { + equalsConstructorPrototype(window[k]); + } catch (e) { + return true; + } + } + } catch (e) { + return true; + } + } + return false; +}()); +var equalsConstructorPrototypeIfNotBuggy = function (o) { + /* global window */ + if (typeof window === 'undefined' || !hasAutomationEqualityBug) { + return equalsConstructorPrototype(o); + } + try { + return equalsConstructorPrototype(o); + } catch (e) { + return false; + } +}; + +var keysShim = function keys(object) { + var isObject = object !== null && typeof object === 'object'; + var isFunction = toStr.call(object) === '[object Function]'; + var isArguments = isArgs(object); + var isString = isObject && toStr.call(object) === '[object String]'; + var theKeys = []; + + if (!isObject && !isFunction && !isArguments) { + throw new TypeError('Object.keys called on a non-object'); + } + + var skipProto = hasProtoEnumBug && isFunction; + if (isString && object.length > 0 && !has.call(object, 0)) { + for (var i = 0; i < object.length; ++i) { + theKeys.push(String(i)); + } + } + + if (isArguments && object.length > 0) { + for (var j = 0; j < object.length; ++j) { + theKeys.push(String(j)); + } + } else { + for (var name in object) { + if (!(skipProto && name === 'prototype') && has.call(object, name)) { + theKeys.push(String(name)); + } + } + } + + if (hasDontEnumBug) { + var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); + + for (var k = 0; k < dontEnums.length; ++k) { + if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) { + theKeys.push(dontEnums[k]); + } + } + } + return theKeys; +}; + +keysShim.shim = function shimObjectKeys() { + if (Object.keys) { + var keysWorksWithArguments = (function () { + // Safari 5.0 bug + return (Object.keys(arguments) || '').length === 2; + }(1, 2)); + if (!keysWorksWithArguments) { + var originalKeys = Object.keys; + Object.keys = function keys(object) { // eslint-disable-line func-name-matching + if (isArgs(object)) { + return originalKeys(slice.call(object)); + } else { + return originalKeys(object); + } + }; + } + } else { + Object.keys = keysShim; + } + return Object.keys || keysShim; +}; + +module.exports = keysShim; diff --git a/nodejs/node_modules/object-keys/isArguments.js b/nodejs/node_modules/object-keys/isArguments.js new file mode 100755 index 0000000..f2a2a90 --- /dev/null +++ b/nodejs/node_modules/object-keys/isArguments.js @@ -0,0 +1,17 @@ +'use strict'; + +var toStr = Object.prototype.toString; + +module.exports = function isArguments(value) { + var str = toStr.call(value); + var isArgs = str === '[object Arguments]'; + if (!isArgs) { + isArgs = str !== '[object Array]' && + value !== null && + typeof value === 'object' && + typeof value.length === 'number' && + value.length >= 0 && + toStr.call(value.callee) === '[object Function]'; + } + return isArgs; +}; diff --git a/nodejs/node_modules/object-keys/package.json b/nodejs/node_modules/object-keys/package.json new file mode 100755 index 0000000..9c34041 --- /dev/null +++ b/nodejs/node_modules/object-keys/package.json @@ -0,0 +1,122 @@ +{ + "_args": [ + [ + "object-keys@1.0.12", + "/www/wwwroot/Adminx.cc/nodejs" + ] + ], + "_from": "object-keys@1.0.12", + "_id": "object-keys@1.0.12", + "_inBundle": false, + "_integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "_location": "/object-keys", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "object-keys@1.0.12", + "name": "object-keys", + "escapedName": "object-keys", + "rawSpec": "1.0.12", + "saveSpec": null, + "fetchSpec": "1.0.12" + }, + "_requiredBy": [ + "/define-properties" + ], + "_resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "_spec": "1.0.12", + "_where": "/www/wwwroot/Adminx.cc/nodejs", + "author": { + "name": "Jordan Harband", + "email": "ljharb@gmail.com", + "url": "http://ljharb.codes" + }, + "bugs": { + "url": "https://github.com/ljharb/object-keys/issues" + }, + "contributors": [ + { + "name": "Jordan Harband", + "email": "ljharb@gmail.com", + "url": "http://ljharb.codes" + }, + { + "name": "Raynos", + "email": "raynos2@gmail.com" + }, + { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net" + }, + { + "name": "Ivan Starkov", + "email": "istarkov@gmail.com" + }, + { + "name": "Gary Katsevman", + "email": "git@gkatsev.com" + } + ], + "dependencies": {}, + "description": "An Object.keys replacement, in case Object.keys is not available. From https://github.com/es-shims/es5-shim", + "devDependencies": { + "@ljharb/eslint-config": "^12.2.1", + "covert": "^1.1.0", + "eslint": "^4.19.1", + "foreach": "^2.0.5", + "indexof": "^0.0.1", + "is": "^3.2.1", + "jscs": "^3.0.7", + "nsp": "^3.2.1", + "tape": "^4.9.1" + }, + "engines": { + "node": ">= 0.4" + }, + "homepage": "https://github.com/ljharb/object-keys#readme", + "keywords": [ + "Object.keys", + "keys", + "ES5", + "shim" + ], + "license": "MIT", + "main": "index.js", + "name": "object-keys", + "repository": { + "type": "git", + "url": "git://github.com/ljharb/object-keys.git" + }, + "scripts": { + "coverage": "covert test/*.js", + "coverage-quiet": "covert test/*.js --quiet", + "eslint": "eslint test/*.js *.js", + "jscs": "jscs test/*.js *.js", + "lint": "npm run --silent jscs && npm run --silent eslint", + "posttest": "npm run --silent security", + "pretest": "npm run --silent lint", + "security": "nsp check", + "test": "npm run --silent tests-only", + "tests-only": "node test/index.js" + }, + "testling": { + "files": "test/index.js", + "browsers": [ + "iexplore/6.0..latest", + "firefox/3.0..6.0", + "firefox/15.0..latest", + "firefox/nightly", + "chrome/4.0..10.0", + "chrome/20.0..latest", + "chrome/canary", + "opera/10.0..latest", + "opera/next", + "safari/4.0..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2" + ] + }, + "version": "1.0.12" +} diff --git a/nodejs/node_modules/object-keys/test/index.js b/nodejs/node_modules/object-keys/test/index.js new file mode 100755 index 0000000..5402465 --- /dev/null +++ b/nodejs/node_modules/object-keys/test/index.js @@ -0,0 +1,5 @@ +'use strict'; + +require('./isArguments'); + +require('./shim'); diff --git a/nodejs/node_modules/redis-commands/.travis.yml b/nodejs/node_modules/redis-commands/.travis.yml new file mode 100755 index 0000000..2badd29 --- /dev/null +++ b/nodejs/node_modules/redis-commands/.travis.yml @@ -0,0 +1,9 @@ +language: node_js +sudo: false +node_js: + - "6" + - "8" + - "9" + - "10" +after_success: + - CODECLIMATE_REPO_TOKEN=b57723fafcf0516f275d6b380cd506fd082ea88d86507eb82c8abd489b9b9a09 node ./node_modules/.bin/codeclimate-test-reporter < coverage/lcov.info diff --git a/nodejs/node_modules/redis-commands/LICENSE b/nodejs/node_modules/redis-commands/LICENSE new file mode 100755 index 0000000..39d23f8 --- /dev/null +++ b/nodejs/node_modules/redis-commands/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 NodeRedis + +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. + diff --git a/nodejs/node_modules/redis-commands/README.md b/nodejs/node_modules/redis-commands/README.md new file mode 100755 index 0000000..de51822 --- /dev/null +++ b/nodejs/node_modules/redis-commands/README.md @@ -0,0 +1,51 @@ +# Redis Commands + +[![Build Status](https://travis-ci.org/NodeRedis/redis-commands.png?branch=master)](https://travis-ci.org/NodeRedis/redis-commands) +[![Code Climate](https://codeclimate.com/github/NodeRedis/redis-commands/badges/gpa.svg)](https://codeclimate.com/github/NodeRedis/redis-commands) +[![Test Coverage](https://codeclimate.com/github/NodeRedis/redis-commands/badges/coverage.svg)](https://codeclimate.com/github/NodeRedis/redis-commands/coverage) + +This module exports all the commands that Redis supports. + +## Install + +```shell +$ npm install redis-commands +``` + +## Usage + +```javascript +var commands = require('redis-commands'); +``` + +`.list` is an array contains all the lowercased commands: + +```javascript +commands.list.forEach(function (command) { + console.log(command); +}); +``` + +`.exists()` is used to check if the command exists: + +```javascript +commands.exists('set') // true +commands.exists('other-command') // false +``` + +`.hasFlag()` is used to check if the command has the flag: + +```javascript +commands.hasFlag('set', 'readonly') // false +``` + +`.getKeyIndexes()` is used to get the indexes of keys in the command arguments: + +```javascript +commands.getKeyIndexes('set', ['key', 'value']) // [0] +commands.getKeyIndexes('mget', ['key1', 'key2']) // [0, 1] +``` + +## Acknowledgment + +Thank [@Yuan Chuan](https://github.com/yuanchuan) for the package name. The original redis-commands is renamed to [@yuanchuan/redis-commands](https://www.npmjs.com/package/@yuanchuan/redis-commands). diff --git a/nodejs/node_modules/redis-commands/changelog.md b/nodejs/node_modules/redis-commands/changelog.md new file mode 100755 index 0000000..3ddfc5f --- /dev/null +++ b/nodejs/node_modules/redis-commands/changelog.md @@ -0,0 +1,58 @@ +## v.1.3.5 - 28 Feb, 2018 + +Bugfix + +- Rebuild the commands with the latest stable release. + In v.1.3.3 the wrong Redis version was used. + +## v.1.3.4 - 26 Feb, 2018 + +Chore + +- Removed coverage folder from npm + +## v.1.3.3 - 24 Feb, 2018 + +Features + +- Rebuild the commands + +## v.1.3.2 - 24 Feb, 2018 + +Chore + +- Updated dependencies +- Fixed typos + +## v.1.3.1 - 25 Jan, 2017 + +Bugfix + +- Fix require for for webpack + +## v.1.3.0 - 20 Oct, 2016 + +Features + +- Rebuild the commands with the newest Redis unstable release + +## v.1.2.0 - 21 Apr, 2016 + +Features + +- Added support for `MIGRATE [...] KEYS key1, key2` (Redis >= v.3.0.6) +- Added build sanity check for unhandled commands with moveable keys +- Rebuild the commands with the newest unstable release +- Improved performance of .getKeyIndexes() + +Bugfix + +- Fixed command command returning the wrong arity due to a Redis bug +- Fixed brpop command returning the wrong keystop due to a Redis bug + +## v.1.1.0 - 09 Feb, 2016 + +Features + +- Added .exists() to check for command existence +- Improved performance of .hasFlag() diff --git a/nodejs/node_modules/redis-commands/commands.json b/nodejs/node_modules/redis-commands/commands.json new file mode 100755 index 0000000..140517b --- /dev/null +++ b/nodejs/node_modules/redis-commands/commands.json @@ -0,0 +1,1992 @@ +{ + "append": { + "arity": 3, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "asking": { + "arity": 1, + "flags": [ + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "auth": { + "arity": 2, + "flags": [ + "noscript", + "loading", + "stale", + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "bgrewriteaof": { + "arity": 1, + "flags": [ + "admin" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "bgsave": { + "arity": -1, + "flags": [ + "admin" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "bitcount": { + "arity": -2, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "bitfield": { + "arity": -2, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "bitop": { + "arity": -4, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 2, + "keyStop": -1, + "step": 1 + }, + "bitpos": { + "arity": -3, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "blpop": { + "arity": -3, + "flags": [ + "write", + "noscript" + ], + "keyStart": 1, + "keyStop": -2, + "step": 1 + }, + "brpop": { + "arity": -3, + "flags": [ + "write", + "noscript" + ], + "keyStart": 1, + "keyStop": -2, + "step": 1 + }, + "brpoplpush": { + "arity": 4, + "flags": [ + "write", + "denyoom", + "noscript" + ], + "keyStart": 1, + "keyStop": 2, + "step": 1 + }, + "bzpopmax": { + "arity": -2, + "flags": [ + "write", + "noscript", + "fast" + ], + "keyStart": 1, + "keyStop": -2, + "step": 1 + }, + "bzpopmin": { + "arity": -2, + "flags": [ + "write", + "noscript", + "fast" + ], + "keyStart": 1, + "keyStop": -2, + "step": 1 + }, + "client": { + "arity": -2, + "flags": [ + "admin", + "noscript" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "cluster": { + "arity": -2, + "flags": [ + "admin" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "command": { + "arity": 1, + "flags": [ + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "config": { + "arity": -2, + "flags": [ + "admin", + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "dbsize": { + "arity": 1, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "debug": { + "arity": -2, + "flags": [ + "admin", + "noscript" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "decr": { + "arity": 2, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "decrby": { + "arity": 3, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "del": { + "arity": -2, + "flags": [ + "write" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "discard": { + "arity": 1, + "flags": [ + "noscript", + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "dump": { + "arity": 2, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "echo": { + "arity": 2, + "flags": [ + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "eval": { + "arity": -3, + "flags": [ + "noscript", + "movablekeys" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "evalsha": { + "arity": -3, + "flags": [ + "noscript", + "movablekeys" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "exec": { + "arity": 1, + "flags": [ + "noscript", + "skip_monitor" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "exists": { + "arity": -2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "expire": { + "arity": 3, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "expireat": { + "arity": 3, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "flushall": { + "arity": -1, + "flags": [ + "write" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "flushdb": { + "arity": -1, + "flags": [ + "write" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "geoadd": { + "arity": -5, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "geodist": { + "arity": -4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "geohash": { + "arity": -2, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "geopos": { + "arity": -2, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "georadius": { + "arity": -6, + "flags": [ + "write", + "movablekeys" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "georadius_ro": { + "arity": -6, + "flags": [ + "readonly", + "movablekeys" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "georadiusbymember": { + "arity": -5, + "flags": [ + "write", + "movablekeys" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "georadiusbymember_ro": { + "arity": -5, + "flags": [ + "readonly", + "movablekeys" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "get": { + "arity": 2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "getbit": { + "arity": 3, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "getrange": { + "arity": 4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "getset": { + "arity": 3, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hdel": { + "arity": -3, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hexists": { + "arity": 3, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hget": { + "arity": 3, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hgetall": { + "arity": 2, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hincrby": { + "arity": 4, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hincrbyfloat": { + "arity": 4, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hkeys": { + "arity": 2, + "flags": [ + "readonly", + "sort_for_script" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hlen": { + "arity": 2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hmget": { + "arity": -3, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hmset": { + "arity": -4, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "host:": { + "arity": -1, + "flags": [ + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "hscan": { + "arity": -3, + "flags": [ + "readonly", + "random" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hset": { + "arity": -4, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hsetnx": { + "arity": 4, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hstrlen": { + "arity": 3, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "hvals": { + "arity": 2, + "flags": [ + "readonly", + "sort_for_script" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "incr": { + "arity": 2, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "incrby": { + "arity": 3, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "incrbyfloat": { + "arity": 3, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "info": { + "arity": -1, + "flags": [ + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "keys": { + "arity": 2, + "flags": [ + "readonly", + "sort_for_script" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "lastsave": { + "arity": 1, + "flags": [ + "random", + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "latency": { + "arity": -2, + "flags": [ + "admin", + "noscript", + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "lindex": { + "arity": 3, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "linsert": { + "arity": 5, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "llen": { + "arity": 2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "lpop": { + "arity": 2, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "lpush": { + "arity": -3, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "lpushx": { + "arity": -3, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "lrange": { + "arity": 4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "lrem": { + "arity": 4, + "flags": [ + "write" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "lset": { + "arity": 4, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "ltrim": { + "arity": 4, + "flags": [ + "write" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "memory": { + "arity": -2, + "flags": [ + "readonly" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "mget": { + "arity": -2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "migrate": { + "arity": -6, + "flags": [ + "write", + "movablekeys" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "module": { + "arity": -2, + "flags": [ + "admin", + "noscript" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "monitor": { + "arity": 1, + "flags": [ + "admin", + "noscript" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "move": { + "arity": 3, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "mset": { + "arity": -3, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": -1, + "step": 2 + }, + "msetnx": { + "arity": -3, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": -1, + "step": 2 + }, + "multi": { + "arity": 1, + "flags": [ + "noscript", + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "object": { + "arity": -2, + "flags": [ + "readonly" + ], + "keyStart": 2, + "keyStop": 2, + "step": 1 + }, + "persist": { + "arity": 2, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "pexpire": { + "arity": 3, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "pexpireat": { + "arity": 3, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "pfadd": { + "arity": -2, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "pfcount": { + "arity": -2, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "pfdebug": { + "arity": -3, + "flags": [ + "write" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "pfmerge": { + "arity": -2, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "pfselftest": { + "arity": 1, + "flags": [ + "admin" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "ping": { + "arity": -1, + "flags": [ + "stale", + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "post": { + "arity": -1, + "flags": [ + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "psetex": { + "arity": 4, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "psubscribe": { + "arity": -2, + "flags": [ + "pubsub", + "noscript", + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "psync": { + "arity": 3, + "flags": [ + "readonly", + "admin", + "noscript" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "pttl": { + "arity": 2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "publish": { + "arity": 3, + "flags": [ + "pubsub", + "loading", + "stale", + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "pubsub": { + "arity": -2, + "flags": [ + "pubsub", + "random", + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "punsubscribe": { + "arity": -1, + "flags": [ + "pubsub", + "noscript", + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "quit": { + "arity": 1, + "flags": [ + "loading", + "stale", + "readonly" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "randomkey": { + "arity": 1, + "flags": [ + "readonly", + "random" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "readonly": { + "arity": 1, + "flags": [ + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "readwrite": { + "arity": 1, + "flags": [ + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "rename": { + "arity": 3, + "flags": [ + "write" + ], + "keyStart": 1, + "keyStop": 2, + "step": 1 + }, + "renamenx": { + "arity": 3, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 2, + "step": 1 + }, + "replconf": { + "arity": -1, + "flags": [ + "admin", + "noscript", + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "restore": { + "arity": -4, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "restore-asking": { + "arity": -4, + "flags": [ + "write", + "denyoom", + "asking" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "role": { + "arity": 1, + "flags": [ + "noscript", + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "rpop": { + "arity": 2, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "rpoplpush": { + "arity": 3, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 2, + "step": 1 + }, + "rpush": { + "arity": -3, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "rpushx": { + "arity": -3, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "sadd": { + "arity": -3, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "save": { + "arity": 1, + "flags": [ + "admin", + "noscript" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "scan": { + "arity": -2, + "flags": [ + "readonly", + "random" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "scard": { + "arity": 2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "script": { + "arity": -2, + "flags": [ + "noscript" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "sdiff": { + "arity": -2, + "flags": [ + "readonly", + "sort_for_script" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "sdiffstore": { + "arity": -3, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "select": { + "arity": 2, + "flags": [ + "loading", + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "set": { + "arity": -3, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "setbit": { + "arity": 4, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "setex": { + "arity": 4, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "setnx": { + "arity": 3, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "setrange": { + "arity": 4, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "shutdown": { + "arity": -1, + "flags": [ + "admin", + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "sinter": { + "arity": -2, + "flags": [ + "readonly", + "sort_for_script" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "sinterstore": { + "arity": -3, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "sismember": { + "arity": 3, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "slaveof": { + "arity": 3, + "flags": [ + "admin", + "noscript", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "slowlog": { + "arity": -2, + "flags": [ + "admin" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "smembers": { + "arity": 2, + "flags": [ + "readonly", + "sort_for_script" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "smove": { + "arity": 4, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 2, + "step": 1 + }, + "sort": { + "arity": -2, + "flags": [ + "write", + "denyoom", + "movablekeys" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "spop": { + "arity": -2, + "flags": [ + "write", + "random", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "srandmember": { + "arity": -2, + "flags": [ + "readonly", + "random" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "srem": { + "arity": -3, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "sscan": { + "arity": -3, + "flags": [ + "readonly", + "random" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "strlen": { + "arity": 2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "subscribe": { + "arity": -2, + "flags": [ + "pubsub", + "noscript", + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "substr": { + "arity": 4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "sunion": { + "arity": -2, + "flags": [ + "readonly", + "sort_for_script" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "sunionstore": { + "arity": -3, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "swapdb": { + "arity": 3, + "flags": [ + "write", + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "sync": { + "arity": 1, + "flags": [ + "readonly", + "admin", + "noscript" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "time": { + "arity": 1, + "flags": [ + "random", + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "touch": { + "arity": -2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "ttl": { + "arity": 2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "type": { + "arity": 2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "unlink": { + "arity": -2, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "unsubscribe": { + "arity": -1, + "flags": [ + "pubsub", + "noscript", + "loading", + "stale" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "unwatch": { + "arity": 1, + "flags": [ + "noscript", + "fast" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "wait": { + "arity": 3, + "flags": [ + "noscript" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "watch": { + "arity": -2, + "flags": [ + "noscript", + "fast" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "xack": { + "arity": -3, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "xadd": { + "arity": -5, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "xclaim": { + "arity": -5, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "xdel": { + "arity": -2, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "xgroup": { + "arity": -2, + "flags": [ + "write", + "denyoom" + ], + "keyStart": 2, + "keyStop": 2, + "step": 1 + }, + "xinfo": { + "arity": -2, + "flags": [ + "readonly" + ], + "keyStart": 2, + "keyStop": 2, + "step": 1 + }, + "xlen": { + "arity": 2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "xpending": { + "arity": -3, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "xrange": { + "arity": -4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "xread": { + "arity": -3, + "flags": [ + "readonly", + "noscript", + "movablekeys" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "xreadgroup": { + "arity": -3, + "flags": [ + "write", + "noscript", + "movablekeys" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "xrevrange": { + "arity": -4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "xtrim": { + "arity": -2, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zadd": { + "arity": -4, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zcard": { + "arity": 2, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zcount": { + "arity": 4, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zincrby": { + "arity": 4, + "flags": [ + "write", + "denyoom", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zinterstore": { + "arity": -4, + "flags": [ + "write", + "denyoom", + "movablekeys" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + }, + "zlexcount": { + "arity": 4, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zpopmax": { + "arity": -2, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "zpopmin": { + "arity": -2, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": -1, + "step": 1 + }, + "zrange": { + "arity": -4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zrangebylex": { + "arity": -4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zrangebyscore": { + "arity": -4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zrank": { + "arity": 3, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zrem": { + "arity": -3, + "flags": [ + "write", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zremrangebylex": { + "arity": 4, + "flags": [ + "write" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zremrangebyrank": { + "arity": 4, + "flags": [ + "write" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zremrangebyscore": { + "arity": 4, + "flags": [ + "write" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zrevrange": { + "arity": -4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zrevrangebylex": { + "arity": -4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zrevrangebyscore": { + "arity": -4, + "flags": [ + "readonly" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zrevrank": { + "arity": 3, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zscan": { + "arity": -3, + "flags": [ + "readonly", + "random" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zscore": { + "arity": 3, + "flags": [ + "readonly", + "fast" + ], + "keyStart": 1, + "keyStop": 1, + "step": 1 + }, + "zunionstore": { + "arity": -4, + "flags": [ + "write", + "denyoom", + "movablekeys" + ], + "keyStart": 0, + "keyStop": 0, + "step": 0 + } +} \ No newline at end of file diff --git a/nodejs/node_modules/redis-commands/index.js b/nodejs/node_modules/redis-commands/index.js new file mode 100755 index 0000000..8b58437 --- /dev/null +++ b/nodejs/node_modules/redis-commands/index.js @@ -0,0 +1,155 @@ +'use strict' + +var commands = require('./commands.json') + +/** + * Redis command list + * + * All commands are lowercased. + * + * @var {string[]} + * @public + */ +exports.list = Object.keys(commands) + +var flags = {} +exports.list.forEach(function (commandName) { + flags[commandName] = commands[commandName].flags.reduce(function (flags, flag) { + flags[flag] = true + return flags + }, {}) +}) +/** + * Check if the command exists + * + * @param {string} commandName - the command name + * @return {boolean} result + * @public + */ +exports.exists = function (commandName) { + return Boolean(commands[commandName]) +} + +/** + * Check if the command has the flag + * + * Some of possible flags: readonly, noscript, loading + * @param {string} commandName - the command name + * @param {string} flag - the flag to check + * @return {boolean} result + * @public + */ +exports.hasFlag = function (commandName, flag) { + if (!flags[commandName]) { + throw new Error('Unknown command ' + commandName) + } + + return Boolean(flags[commandName][flag]) +} + +/** + * Get indexes of keys in the command arguments + * + * @param {string} commandName - the command name + * @param {string[]} args - the arguments of the command + * @param {object} [options] - options + * @param {boolean} [options.parseExternalKey] - parse external keys + * @return {number[]} - the list of the index + * @public + * + * @example + * ```javascript + * getKeyIndexes('set', ['key', 'value']) // [0] + * getKeyIndexes('mget', ['key1', 'key2']) // [0, 1] + * ``` + */ +exports.getKeyIndexes = function (commandName, args, options) { + var command = commands[commandName] + if (!command) { + throw new Error('Unknown command ' + commandName) + } + + if (!Array.isArray(args)) { + throw new Error('Expect args to be an array') + } + + var keys = [] + var i, keyStart, keyStop, parseExternalKey + switch (commandName) { + case 'zunionstore': + case 'zinterstore': + keys.push(0) + // fall through + case 'eval': + case 'evalsha': + keyStop = Number(args[1]) + 2 + for (i = 2; i < keyStop; i++) { + keys.push(i) + } + break + case 'sort': + parseExternalKey = options && options.parseExternalKey + keys.push(0) + for (i = 1; i < args.length - 1; i++) { + if (typeof args[i] !== 'string') { + continue + } + var directive = args[i].toUpperCase() + if (directive === 'GET') { + i += 1 + if (args[i] !== '#') { + if (parseExternalKey) { + keys.push([i, getExternalKeyNameLength(args[i])]) + } else { + keys.push(i) + } + } + } else if (directive === 'BY') { + i += 1 + if (parseExternalKey) { + keys.push([i, getExternalKeyNameLength(args[i])]) + } else { + keys.push(i) + } + } else if (directive === 'STORE') { + i += 1 + keys.push(i) + } + } + break + case 'migrate': + if (args[2] === '') { + for (i = 5; i < args.length - 1; i++) { + if (args[i].toUpperCase() === 'KEYS') { + for (var j = i + 1; j < args.length; j++) { + keys.push(j) + } + break + } + } + } else { + keys.push(2) + } + break + default: + // step has to be at least one in this case, otherwise the command does not contain a key + if (command.step > 0) { + keyStart = command.keyStart - 1 + keyStop = command.keyStop > 0 ? command.keyStop : args.length + command.keyStop + 1 + for (i = keyStart; i < keyStop; i += command.step) { + keys.push(i) + } + } + break + } + + return keys +} + +function getExternalKeyNameLength (key) { + if (typeof key !== 'string') { + key = String(key) + } + var hashPos = key.indexOf('->') + return hashPos === -1 ? key.length : hashPos +} diff --git a/nodejs/node_modules/redis-commands/package.json b/nodejs/node_modules/redis-commands/package.json new file mode 100755 index 0000000..4a28ca3 --- /dev/null +++ b/nodejs/node_modules/redis-commands/package.json @@ -0,0 +1,72 @@ +{ + "_args": [ + [ + "redis-commands@1.4.0", + "/www/wwwroot/Adminx.cc/nodejs" + ] + ], + "_from": "redis-commands@1.4.0", + "_id": "redis-commands@1.4.0", + "_inBundle": false, + "_integrity": "sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw==", + "_location": "/redis-commands", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "redis-commands@1.4.0", + "name": "redis-commands", + "escapedName": "redis-commands", + "rawSpec": "1.4.0", + "saveSpec": null, + "fetchSpec": "1.4.0" + }, + "_requiredBy": [ + "/redis" + ], + "_resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.4.0.tgz", + "_spec": "1.4.0", + "_where": "/www/wwwroot/Adminx.cc/nodejs", + "author": { + "name": "luin", + "email": "i@zihua.li", + "url": "http://zihua.li" + }, + "bugs": { + "url": "https://github.com/NodeRedis/redis-commands/issues" + }, + "description": "Redis commands", + "devDependencies": { + "chai": "^4.0.1", + "codeclimate-test-reporter": "^0.4.0", + "ioredis": "^3.0.0", + "istanbul": "^0.4.3", + "mocha": "^5.0.0", + "safe-stable-stringify": "^1.0.0", + "snazzy": "^8.0.0", + "standard": "^11.0.0" + }, + "homepage": "https://github.com/NodeRedis/redis-commands", + "keywords": [ + "redis", + "commands", + "prefix" + ], + "license": "MIT", + "main": "index.js", + "name": "redis-commands", + "repository": { + "type": "git", + "url": "git+https://github.com/NodeRedis/redis-commands.git" + }, + "scripts": { + "build": "node tools/build", + "coverage": "node ./node_modules/istanbul/lib/cli.js cover --preserve-comments ./node_modules/mocha/bin/_mocha -- -R spec", + "coverage:check": "node ./node_modules/istanbul/lib/cli.js check-coverage --branch 100 --statement 100", + "lint": "standard --fix --verbose | snazzy", + "posttest": "npm run coverage && npm run coverage:check", + "pretest": "npm run lint", + "test": "mocha" + }, + "version": "1.4.0" +} diff --git a/nodejs/node_modules/redis-commands/tools/build.js b/nodejs/node_modules/redis-commands/tools/build.js new file mode 100755 index 0000000..f5fca0a --- /dev/null +++ b/nodejs/node_modules/redis-commands/tools/build.js @@ -0,0 +1,62 @@ +var fs = require('fs') +var path = require('path') +var stringify = require('safe-stable-stringify') +var commandPath = path.join(__dirname, '..', 'commands.json') +var redisCommands = require('../') + +var Redis = require('ioredis') +var redis = new Redis(process.env.REDIS_URI) + +redis.command().then(function (res) { + redis.disconnect() + + // Find all special handled cases + var movableKeys = String(redisCommands.getKeyIndexes).match(/case '[a-z-]+':/g).map(function (entry) { + return entry.replace(/^case '|':$/g, '') + }) + + var commands = res.reduce(function (prev, current) { + var currentCommandPos = movableKeys.indexOf(current[0]) + if (currentCommandPos !== -1 && current[2].indexOf('movablekeys') !== -1) { + movableKeys.splice(currentCommandPos, 1) + } + // https://github.com/antirez/redis/issues/2598 + if (current[0] === 'brpop' && current[4] === 1) { + current[4] = -2 + } + prev[current[0]] = { + arity: current[1] || 1, // https://github.com/antirez/redis/pull/2986 + flags: current[2], + keyStart: current[3], + keyStop: current[4], + step: current[5] + } + return prev + }, {}) + + // Future proof. Redis might implement this at some point + // https://github.com/antirez/redis/pull/2982 + if (!commands.quit) { + commands.quit = { + arity: 1, + flags: [ + 'loading', + 'stale', + 'readonly' + ], + keyStart: 0, + keyStop: 0, + step: 0 + } + } + + if (movableKeys.length !== 0) { + throw new Error('Not all commands (\'' + movableKeys.join('\', \'') + '\') with the "movablekeys" flag are handled in the code') + } + + // Use safe-stable-stringify instead fo JSON.stringify + // for easier diffing + var content = stringify(commands, null, ' ') + + fs.writeFileSync(commandPath, content) +}) diff --git a/nodejs/node_modules/redis-parser/.npmignore b/nodejs/node_modules/redis-parser/.npmignore new file mode 100755 index 0000000..af7d371 --- /dev/null +++ b/nodejs/node_modules/redis-parser/.npmignore @@ -0,0 +1,15 @@ +# IntelliJ project files +.idea +*.iml +out +gen + +# Unrelevant files and folders +benchmark +coverage +test +.travis.yml +.gitignore +*.log +.vscode +.codeclimate.yml \ No newline at end of file diff --git a/nodejs/node_modules/redis-parser/LICENSE b/nodejs/node_modules/redis-parser/LICENSE new file mode 100755 index 0000000..39d23f8 --- /dev/null +++ b/nodejs/node_modules/redis-parser/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 NodeRedis + +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. + diff --git a/nodejs/node_modules/redis-parser/README.md b/nodejs/node_modules/redis-parser/README.md new file mode 100755 index 0000000..ff448f0 --- /dev/null +++ b/nodejs/node_modules/redis-parser/README.md @@ -0,0 +1,163 @@ +[![Build Status](https://travis-ci.org/NodeRedis/node-redis-parser.png?branch=master)](https://travis-ci.org/NodeRedis/node-redis-parser) +[![Test Coverage](https://codeclimate.com/github/NodeRedis/node-redis-parser/badges/coverage.svg)](https://codeclimate.com/github/NodeRedis/node-redis-parser/coverage) +[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/) + +# redis-parser + +A high performance javascript redis parser built for [node_redis](https://github.com/NodeRedis/node_redis) and [ioredis](https://github.com/luin/ioredis). Parses all [RESP](http://redis.io/topics/protocol) data. + +## Install + +Install with [NPM](https://npmjs.org/): + + npm install redis-parser + +## Usage + +```js +var Parser = require('redis-parser'); + +var myParser = new Parser(options); +``` + +### Options + +* `returnReply`: *function*; mandatory +* `returnError`: *function*; mandatory +* `returnFatalError`: *function*; optional, defaults to the returnError function +* `returnBuffers`: *boolean*; optional, defaults to false +* `stringNumbers`: *boolean*; optional, defaults to false + +### Functions + +* `reset()`: reset the parser to it's initial state +* `setReturnBuffers(boolean)`: (JSParser only) set the returnBuffers option on/off without resetting the parser +* `setStringNumbers(boolean)`: (JSParser only) set the stringNumbers option on/off without resetting the parser + +### Error classes + +* `RedisError` sub class of Error +* `ReplyError` sub class of RedisError +* `ParserError` sub class of RedisError + +All Redis errors will be returned as `ReplyErrors` while a parser error is returned as `ParserError`. +All error classes are exported by the parser. + +### Example + +```js +var Parser = require("redis-parser"); + +function Library () {} + +Library.prototype.returnReply = function (reply) { ... } +Library.prototype.returnError = function (err) { ... } +Library.prototype.returnFatalError = function (err) { ... } + +var lib = new Library(); + +var parser = new Parser({ + returnReply: function(reply) { + lib.returnReply(reply); + }, + returnError: function(err) { + lib.returnError(err); + }, + returnFatalError: function (err) { + lib.returnFatalError(err); + } +}); + +Library.prototype.streamHandler = function () { + this.stream.on('data', function (buffer) { + // Here the data (e.g. `new Buffer('$5\r\nHello\r\n'`)) is passed to the parser and the result is passed to either function depending on the provided data. + parser.execute(buffer); + }); +}; +``` +You do not have to use the returnFatalError function. Fatal errors will be returned in the normal error function in that case. + +And if you want to return buffers instead of strings, you can do this by adding the `returnBuffers` option. + +If you handle with big numbers that are to large for JS (Number.MAX_SAFE_INTEGER === 2^53 - 16) please use the `stringNumbers` option. That way all numbers are going to be returned as String and you can handle them safely. + +```js +// Same functions as in the first example + +var parser = new Parser({ + returnReply: function(reply) { + lib.returnReply(reply); + }, + returnError: function(err) { + lib.returnError(err); + }, + returnBuffers: true, // All strings are returned as Buffer e.g. + stringNumbers: true // All numbers are returned as String +}); + +// The streamHandler as above +``` + +## Protocol errors + +To handle protocol errors (this is very unlikely to happen) gracefully you should add the returnFatalError option, reject any still running command (they might have been processed properly but the reply is just wrong), destroy the socket and reconnect. Note that while doing this no new command may be added, so all new commands have to be buffered in the meantime, otherwise a chunk might still contain partial data of a following command that was already processed properly but answered in the same chunk as the command that resulted in the protocol error. + +## Contribute + +The parser is highly optimized but there may still be further optimizations possible. + + npm install + npm test + npm run benchmark + +Currently the benchmark compares the performance against the hiredis parser: + + HIREDIS: $ multiple chunks in a bulk string x 859,880 ops/sec ±1.22% (82 runs sampled) + HIREDIS BUF: $ multiple chunks in a bulk string x 608,869 ops/sec ±1.72% (85 runs sampled) + JS PARSER: $ multiple chunks in a bulk string x 910,590 ops/sec ±0.87% (89 runs sampled) + JS PARSER BUF: $ multiple chunks in a bulk string x 1,299,507 ops/sec ±2.18% (84 runs sampled) + + HIREDIS: + multiple chunks in a string x 1,787,203 ops/sec ±0.58% (96 runs sampled) + HIREDIS BUF: + multiple chunks in a string x 943,584 ops/sec ±1.62% (87 runs sampled) + JS PARSER: + multiple chunks in a string x 2,008,264 ops/sec ±1.01% (91 runs sampled) + JS PARSER BUF: + multiple chunks in a string x 2,045,546 ops/sec ±0.78% (91 runs sampled) + + HIREDIS: $ 4mb bulk string x 310 ops/sec ±1.58% (75 runs sampled) + HIREDIS BUF: $ 4mb bulk string x 471 ops/sec ±2.28% (78 runs sampled) + JS PARSER: $ 4mb bulk string x 747 ops/sec ±2.43% (85 runs sampled) + JS PARSER BUF: $ 4mb bulk string x 846 ops/sec ±5.52% (72 runs sampled) + + HIREDIS: + simple string x 2,324,866 ops/sec ±1.61% (90 runs sampled) + HIREDIS BUF: + simple string x 1,085,823 ops/sec ±2.47% (82 runs sampled) + JS PARSER: + simple string x 4,567,358 ops/sec ±1.97% (81 runs sampled) + JS PARSER BUF: + simple string x 5,433,901 ops/sec ±0.66% (93 runs sampled) + + HIREDIS: : integer x 2,332,946 ops/sec ±0.47% (93 runs sampled) + JS PARSER: : integer x 17,730,449 ops/sec ±0.73% (91 runs sampled) + JS PARSER STR: : integer x 12,942,037 ops/sec ±0.51% (92 runs sampled) + + HIREDIS: : big integer x 2,012,572 ops/sec ±0.33% (93 runs sampled) + JS PARSER: : big integer x 10,210,923 ops/sec ±0.94% (94 runs sampled) + JS PARSER STR: : big integer x 4,453,320 ops/sec ±0.52% (94 runs sampled) + + HIREDIS: * array x 44,479 ops/sec ±0.55% (94 runs sampled) + HIREDIS BUF: * array x 14,391 ops/sec ±1.04% (86 runs sampled) + JS PARSER: * array x 53,796 ops/sec ±2.08% (79 runs sampled) + JS PARSER BUF: * array x 72,428 ops/sec ±0.72% (93 runs sampled) + + HIREDIS: * big nested array x 217 ops/sec ±0.97% (83 runs sampled) + HIREDIS BUF: * big nested array x 255 ops/sec ±2.28% (77 runs sampled) + JS PARSER: * big nested array x 242 ops/sec ±1.10% (85 runs sampled) + JS PARSER BUF: * big nested array x 375 ops/sec ±1.21% (88 runs sampled) + + HIREDIS: - error x 78,821 ops/sec ±0.80% (93 runs sampled) + JS PARSER: - error x 143,382 ops/sec ±0.75% (92 runs sampled) + + Platform info: + Ubuntu 16.10 + Node.js 7.4.0 + Intel(R) Core(TM) i7-5600U CPU + +## License + +[MIT](./LICENSE) diff --git a/nodejs/node_modules/redis-parser/changelog.md b/nodejs/node_modules/redis-parser/changelog.md new file mode 100755 index 0000000..5cd9470 --- /dev/null +++ b/nodejs/node_modules/redis-parser/changelog.md @@ -0,0 +1,138 @@ +## v.2.6.0 - 03 Apr, 2017 + +Internals + +- Use Buffer.allocUnsafe instead of new Buffer() with modern Node.js versions + +## v.2.5.0 - 11 Mar, 2017 + +Features + +- Added a `ParserError` class to differentiate them to ReplyErrors. The class is also exported + +Bugfixes + +- All errors now show their error message again next to the error name in the stack trace +- ParserErrors now show the offset and buffer attributes while being logged + +## v.2.4.1 - 05 Feb, 2017 + +Bugfixes + +- Fixed minimal memory consumption overhead for chunked buffers + +## v.2.4.0 - 25 Jan, 2017 + +Features + +- Added `reset` function to reset the parser to it's initial values +- Added `setReturnBuffers` function to reset the returnBuffers option (Only for the JSParser) +- Added `setStringNumbers` function to reset the stringNumbers option (Only for the JSParser) +- All Errors are now of sub classes of the new `RedisError` class. It is also exported. +- Improved bulk string chunked data handling performance + +Bugfixes + +- Parsing time for big nested arrays is now linear + +## v.2.3.0 - 25 Nov, 2016 + +Features + +- Parsing time for big arrays (e.g. 4mb+) is now linear and works well for arbitrary array sizes + +This case is a magnitude faster than before + + OLD STR: * big array x 1.09 ops/sec ±2.15% (7 runs sampled) + OLD BUF: * big array x 1.23 ops/sec ±2.67% (8 runs sampled) + + NEW STR: * big array x 273 ops/sec ±2.09% (85 runs sampled) + NEW BUF: * big array x 259 ops/sec ±1.32% (85 runs sampled) + (~10mb array with 1000 entries) + +## v.2.2.0 - 18 Nov, 2016 + +Features + +- Improve `stringNumbers` parsing performance by up to 100% + +Bugfixes + +- Do not unref the interval anymore due to issues with NodeJS + +## v.2.1.1 - 31 Oct, 2016 + +Bugfixes + +- Remove erroneously added const to support Node.js 0.10 + +## v.2.1.0 - 30 Oct, 2016 + +Features + +- Improve parser errors by adding more detailed information to them +- Accept manipulated Object.prototypes +- Unref the interval if used + +## v.2.0.4 - 21 Jul, 2016 + +Bugfixes + +- Fixed multi byte characters getting corrupted + +## v.2.0.3 - 17 Jun, 2016 + +Bugfixes + +- Fixed parser not working with huge buffers (e.g. 300 MB) + +## v.2.0.2 - 08 Jun, 2016 + +Bugfixes + +- Fixed parser with returnBuffers option returning corrupted data + +## v.2.0.1 - 04 Jun, 2016 + +Bugfixes + +- Fixed multiple parsers working concurrently resulting in faulty data in some cases + +## v.2.0.0 - 29 May, 2016 + +The javascript parser got completely rewritten by [Michael Diarmid](https://github.com/Salakar) and [Ruben Bridgewater](https://github.com/BridgeAR) and is now a lot faster than the hiredis parser. +Therefore the hiredis parser was deprecated and should only be used for testing purposes and benchmarking comparison. + +All Errors returned by the parser are from now on of class ReplyError + +Features + +- Improved performance by up to 15x as fast as before +- Improved options validation +- Added ReplyError Class +- Added parser benchmark +- Switched default parser from hiredis to JS, no matter if hiredis is installed or not + +Removed + +- Deprecated hiredis support + +## v.1.3.0 - 27 Mar, 2016 + +Features + +- Added `auto` as parser name option to check what parser is available +- Non existing requested parsers falls back into auto mode instead of always choosing the JS parser + +## v.1.2.0 - 27 Mar, 2016 + +Features + +- Added `stringNumbers` option to make sure all numbers are returned as string instead of a js number for precision +- The parser is from now on going to print warnings if a parser is explicitly requested that does not exist and gracefully chooses the JS parser + +## v.1.1.0 - 26 Jan, 2016 + +Features + +- The parser is from now on going to reset itself on protocol errors diff --git a/nodejs/node_modules/redis-parser/index.js b/nodejs/node_modules/redis-parser/index.js new file mode 100755 index 0000000..a0c777d --- /dev/null +++ b/nodejs/node_modules/redis-parser/index.js @@ -0,0 +1,6 @@ +'use strict' + +module.exports = require('./lib/parser') +module.exports.ReplyError = require('./lib/replyError') +module.exports.RedisError = require('./lib/redisError') +module.exports.ParserError = require('./lib/redisError') diff --git a/nodejs/node_modules/redis-parser/lib/hiredis.js b/nodejs/node_modules/redis-parser/lib/hiredis.js new file mode 100755 index 0000000..0f94fbe --- /dev/null +++ b/nodejs/node_modules/redis-parser/lib/hiredis.js @@ -0,0 +1,62 @@ +'use strict' + +var hiredis = require('hiredis') +var ReplyError = require('../lib/replyError') +var ParserError = require('../lib/parserError') + +/** + * Parse data + * @param parser + * @returns {*} + */ +function parseData (parser, data) { + try { + return parser.reader.get() + } catch (err) { + // Protocol errors land here + // Reset the parser. Otherwise new commands can't be processed properly + parser.reader = new hiredis.Reader(parser.options) + parser.returnFatalError(new ParserError(err.message, JSON.stringify(data), -1)) + } +} + +/** + * Hiredis Parser + * @param options + * @constructor + */ +function HiredisReplyParser (options) { + this.returnError = options.returnError + this.returnFatalError = options.returnFatalError || options.returnError + this.returnReply = options.returnReply + this.name = 'hiredis' + this.options = { + return_buffers: !!options.returnBuffers + } + this.reader = new hiredis.Reader(this.options) +} + +HiredisReplyParser.prototype.execute = function (data) { + this.reader.feed(data) + var reply = parseData(this, data) + + while (reply !== undefined) { + if (reply && reply.name === 'Error') { + this.returnError(new ReplyError(reply.message)) + } else { + this.returnReply(reply) + } + reply = parseData(this, data) + } +} + +/** + * Reset the parser values to the initial state + * + * @returns {undefined} + */ +HiredisReplyParser.prototype.reset = function () { + this.reader = new hiredis.Reader(this.options) +} + +module.exports = HiredisReplyParser diff --git a/nodejs/node_modules/redis-parser/lib/parser.js b/nodejs/node_modules/redis-parser/lib/parser.js new file mode 100755 index 0000000..4ba6a18 --- /dev/null +++ b/nodejs/node_modules/redis-parser/lib/parser.js @@ -0,0 +1,581 @@ +'use strict' + +var StringDecoder = require('string_decoder').StringDecoder +var decoder = new StringDecoder() +var ReplyError = require('./replyError') +var ParserError = require('./parserError') +var bufferPool = bufferAlloc(32 * 1024) +var bufferOffset = 0 +var interval = null +var counter = 0 +var notDecreased = 0 +var isModern = typeof Buffer.allocUnsafe === 'function' + +/** + * For backwards compatibility + * @param len + * @returns {Buffer} + */ + +function bufferAlloc (len) { + return isModern ? Buffer.allocUnsafe(len) : new Buffer(len) +} + +/** + * Used for lengths and numbers only, faster perf on arrays / bulks + * @param parser + * @returns {*} + */ +function parseSimpleNumbers (parser) { + var offset = parser.offset + var length = parser.buffer.length - 1 + var number = 0 + var sign = 1 + + if (parser.buffer[offset] === 45) { + sign = -1 + offset++ + } + + while (offset < length) { + var c1 = parser.buffer[offset++] + if (c1 === 13) { // \r\n + parser.offset = offset + 1 + return sign * number + } + number = (number * 10) + (c1 - 48) + } +} + +/** + * Used for integer numbers in case of the returnNumbers option + * + * The maximimum possible integer to use is: Math.floor(Number.MAX_SAFE_INTEGER / 10) + * Staying in a SMI Math.floor((Math.pow(2, 32) / 10) - 1) is even more efficient though + * + * @param parser + * @returns {*} + */ +function parseStringNumbers (parser) { + var offset = parser.offset + var length = parser.buffer.length - 1 + var number = 0 + var res = '' + + if (parser.buffer[offset] === 45) { + res += '-' + offset++ + } + + while (offset < length) { + var c1 = parser.buffer[offset++] + if (c1 === 13) { // \r\n + parser.offset = offset + 1 + if (number !== 0) { + res += number + } + return res + } else if (number > 429496728) { + res += (number * 10) + (c1 - 48) + number = 0 + } else if (c1 === 48 && number === 0) { + res += 0 + } else { + number = (number * 10) + (c1 - 48) + } + } +} + +/** + * Returns a string or buffer of the provided offset start and + * end ranges. Checks `optionReturnBuffers`. + * + * If returnBuffers is active, all return values are returned as buffers besides numbers and errors + * + * @param parser + * @param start + * @param end + * @returns {*} + */ +function convertBufferRange (parser, start, end) { + parser.offset = end + 2 + if (parser.optionReturnBuffers === true) { + return parser.buffer.slice(start, end) + } + + return parser.buffer.toString('utf-8', start, end) +} + +/** + * Parse a '+' redis simple string response but forward the offsets + * onto convertBufferRange to generate a string. + * @param parser + * @returns {*} + */ +function parseSimpleString (parser) { + var start = parser.offset + var offset = start + var buffer = parser.buffer + var length = buffer.length - 1 + + while (offset < length) { + if (buffer[offset++] === 13) { // \r\n + return convertBufferRange(parser, start, offset - 1) + } + } +} + +/** + * Returns the string length via parseSimpleNumbers + * @param parser + * @returns {*} + */ +function parseLength (parser) { + var string = parseSimpleNumbers(parser) + if (string !== undefined) { + return string + } +} + +/** + * Parse a ':' redis integer response + * + * If stringNumbers is activated the parser always returns numbers as string + * This is important for big numbers (number > Math.pow(2, 53)) as js numbers + * are 64bit floating point numbers with reduced precision + * + * @param parser + * @returns {*} + */ +function parseInteger (parser) { + if (parser.optionStringNumbers) { + return parseStringNumbers(parser) + } + return parseSimpleNumbers(parser) +} + +/** + * Parse a '$' redis bulk string response + * @param parser + * @returns {*} + */ +function parseBulkString (parser) { + var length = parseLength(parser) + if (length === undefined) { + return + } + if (length === -1) { + return null + } + var offsetEnd = parser.offset + length + if (offsetEnd + 2 > parser.buffer.length) { + parser.bigStrSize = offsetEnd + 2 + parser.bigOffset = parser.offset + parser.totalChunkSize = parser.buffer.length + parser.bufferCache.push(parser.buffer) + return + } + + return convertBufferRange(parser, parser.offset, offsetEnd) +} + +/** + * Parse a '-' redis error response + * @param parser + * @returns {Error} + */ +function parseError (parser) { + var string = parseSimpleString(parser) + if (string !== undefined) { + if (parser.optionReturnBuffers === true) { + string = string.toString() + } + return new ReplyError(string) + } +} + +/** + * Parsing error handler, resets parser buffer + * @param parser + * @param error + */ +function handleError (parser, error) { + parser.buffer = null + parser.returnFatalError(error) +} + +/** + * Parse a '*' redis array response + * @param parser + * @returns {*} + */ +function parseArray (parser) { + var length = parseLength(parser) + if (length === undefined) { + return + } + if (length === -1) { + return null + } + var responses = new Array(length) + return parseArrayElements(parser, responses, 0) +} + +/** + * Push a partly parsed array to the stack + * + * @param parser + * @param elem + * @param i + * @returns {undefined} + */ +function pushArrayCache (parser, elem, pos) { + parser.arrayCache.push(elem) + parser.arrayPos.push(pos) +} + +/** + * Parse chunked redis array response + * @param parser + * @returns {*} + */ +function parseArrayChunks (parser) { + var tmp = parser.arrayCache.pop() + var pos = parser.arrayPos.pop() + if (parser.arrayCache.length) { + var res = parseArrayChunks(parser) + if (!res) { + pushArrayCache(parser, tmp, pos) + return + } + tmp[pos++] = res + } + return parseArrayElements(parser, tmp, pos) +} + +/** + * Parse redis array response elements + * @param parser + * @param responses + * @param i + * @returns {*} + */ +function parseArrayElements (parser, responses, i) { + var bufferLength = parser.buffer.length + while (i < responses.length) { + var offset = parser.offset + if (parser.offset >= bufferLength) { + pushArrayCache(parser, responses, i) + return + } + var response = parseType(parser, parser.buffer[parser.offset++]) + if (response === undefined) { + if (!parser.arrayCache.length) { + parser.offset = offset + } + pushArrayCache(parser, responses, i) + return + } + responses[i] = response + i++ + } + + return responses +} + +/** + * Called the appropriate parser for the specified type. + * @param parser + * @param type + * @returns {*} + */ +function parseType (parser, type) { + switch (type) { + case 36: // $ + return parseBulkString(parser) + case 58: // : + return parseInteger(parser) + case 43: // + + return parseSimpleString(parser) + case 42: // * + return parseArray(parser) + case 45: // - + return parseError(parser) + default: + return handleError(parser, new ParserError( + 'Protocol error, got ' + JSON.stringify(String.fromCharCode(type)) + ' as reply type byte', + JSON.stringify(parser.buffer), + parser.offset + )) + } +} + +// All allowed options including their typeof value +var optionTypes = { + returnError: 'function', + returnFatalError: 'function', + returnReply: 'function', + returnBuffers: 'boolean', + stringNumbers: 'boolean', + name: 'string' +} + +/** + * Javascript Redis Parser + * @param options + * @constructor + */ +function JavascriptRedisParser (options) { + if (!(this instanceof JavascriptRedisParser)) { + return new JavascriptRedisParser(options) + } + if (!options || !options.returnError || !options.returnReply) { + throw new TypeError('Please provide all return functions while initiating the parser') + } + for (var key in options) { + // eslint-disable-next-line valid-typeof + if (optionTypes.hasOwnProperty(key) && typeof options[key] !== optionTypes[key]) { + throw new TypeError('The options argument contains the property "' + key + '" that is either unknown or of a wrong type') + } + } + if (options.name === 'hiredis') { + /* istanbul ignore next: hiredis is only supported for legacy usage */ + try { + var Hiredis = require('./hiredis') + console.error(new TypeError('Using hiredis is discouraged. Please use the faster JS parser by removing the name option.').stack.replace('Error', 'Warning')) + return new Hiredis(options) + } catch (e) { + console.error(new TypeError('Hiredis is not installed. Please remove the `name` option. The (faster) JS parser is used instead.').stack.replace('Error', 'Warning')) + } + } + this.optionReturnBuffers = !!options.returnBuffers + this.optionStringNumbers = !!options.stringNumbers + this.returnError = options.returnError + this.returnFatalError = options.returnFatalError || options.returnError + this.returnReply = options.returnReply + this.name = 'javascript' + this.reset() +} + +/** + * Reset the parser values to the initial state + * + * @returns {undefined} + */ +JavascriptRedisParser.prototype.reset = function () { + this.offset = 0 + this.buffer = null + this.bigStrSize = 0 + this.bigOffset = 0 + this.totalChunkSize = 0 + this.bufferCache = [] + this.arrayCache = [] + this.arrayPos = [] +} + +/** + * Set the returnBuffers option + * + * @param returnBuffers + * @returns {undefined} + */ +JavascriptRedisParser.prototype.setReturnBuffers = function (returnBuffers) { + if (typeof returnBuffers !== 'boolean') { + throw new TypeError('The returnBuffers argument has to be a boolean') + } + this.optionReturnBuffers = returnBuffers +} + +/** + * Set the stringNumbers option + * + * @param stringNumbers + * @returns {undefined} + */ +JavascriptRedisParser.prototype.setStringNumbers = function (stringNumbers) { + if (typeof stringNumbers !== 'boolean') { + throw new TypeError('The stringNumbers argument has to be a boolean') + } + this.optionStringNumbers = stringNumbers +} + +/** + * Decrease the bufferPool size over time + * @returns {undefined} + */ +function decreaseBufferPool () { + if (bufferPool.length > 50 * 1024) { + // Balance between increasing and decreasing the bufferPool + if (counter === 1 || notDecreased > counter * 2) { + // Decrease the bufferPool by 10% by removing the first 10% of the current pool + var sliceLength = Math.floor(bufferPool.length / 10) + if (bufferOffset <= sliceLength) { + bufferOffset = 0 + } else { + bufferOffset -= sliceLength + } + bufferPool = bufferPool.slice(sliceLength, bufferPool.length) + } else { + notDecreased++ + counter-- + } + } else { + clearInterval(interval) + counter = 0 + notDecreased = 0 + interval = null + } +} + +/** + * Check if the requested size fits in the current bufferPool. + * If it does not, reset and increase the bufferPool accordingly. + * + * @param length + * @returns {undefined} + */ +function resizeBuffer (length) { + if (bufferPool.length < length + bufferOffset) { + var multiplier = length > 1024 * 1024 * 75 ? 2 : 3 + if (bufferOffset > 1024 * 1024 * 111) { + bufferOffset = 1024 * 1024 * 50 + } + bufferPool = bufferAlloc(length * multiplier + bufferOffset) + bufferOffset = 0 + counter++ + if (interval === null) { + interval = setInterval(decreaseBufferPool, 50) + } + } +} + +/** + * Concat a bulk string containing multiple chunks + * + * Notes: + * 1) The first chunk might contain the whole bulk string including the \r + * 2) We are only safe to fully add up elements that are neither the first nor any of the last two elements + * + * @param parser + * @returns {String} + */ +function concatBulkString (parser) { + var list = parser.bufferCache + var chunks = list.length + var offset = parser.bigStrSize - parser.totalChunkSize + parser.offset = offset + if (offset <= 2) { + if (chunks === 2) { + return list[0].toString('utf8', parser.bigOffset, list[0].length + offset - 2) + } + chunks-- + offset = list[list.length - 2].length + offset + } + var res = decoder.write(list[0].slice(parser.bigOffset)) + for (var i = 1; i < chunks - 1; i++) { + res += decoder.write(list[i]) + } + res += decoder.end(list[i].slice(0, offset - 2)) + return res +} + +/** + * Concat the collected chunks from parser.bufferCache. + * + * Increases the bufferPool size beforehand if necessary. + * + * @param parser + * @returns {Buffer} + */ +function concatBulkBuffer (parser) { + var list = parser.bufferCache + var chunks = list.length + var length = parser.bigStrSize - parser.bigOffset - 2 + var offset = parser.bigStrSize - parser.totalChunkSize + parser.offset = offset + if (offset <= 2) { + if (chunks === 2) { + return list[0].slice(parser.bigOffset, list[0].length + offset - 2) + } + chunks-- + offset = list[list.length - 2].length + offset + } + resizeBuffer(length) + var start = bufferOffset + list[0].copy(bufferPool, start, parser.bigOffset, list[0].length) + bufferOffset += list[0].length - parser.bigOffset + for (var i = 1; i < chunks - 1; i++) { + list[i].copy(bufferPool, bufferOffset) + bufferOffset += list[i].length + } + list[i].copy(bufferPool, bufferOffset, 0, offset - 2) + bufferOffset += offset - 2 + return bufferPool.slice(start, bufferOffset) +} + +/** + * Parse the redis buffer + * @param buffer + * @returns {undefined} + */ +JavascriptRedisParser.prototype.execute = function execute (buffer) { + if (this.buffer === null) { + this.buffer = buffer + this.offset = 0 + } else if (this.bigStrSize === 0) { + var oldLength = this.buffer.length + var remainingLength = oldLength - this.offset + var newBuffer = bufferAlloc(remainingLength + buffer.length) + this.buffer.copy(newBuffer, 0, this.offset, oldLength) + buffer.copy(newBuffer, remainingLength, 0, buffer.length) + this.buffer = newBuffer + this.offset = 0 + if (this.arrayCache.length) { + var arr = parseArrayChunks(this) + if (!arr) { + return + } + this.returnReply(arr) + } + } else if (this.totalChunkSize + buffer.length >= this.bigStrSize) { + this.bufferCache.push(buffer) + var tmp = this.optionReturnBuffers ? concatBulkBuffer(this) : concatBulkString(this) + this.bigStrSize = 0 + this.bufferCache = [] + this.buffer = buffer + if (this.arrayCache.length) { + this.arrayCache[0][this.arrayPos[0]++] = tmp + tmp = parseArrayChunks(this) + if (!tmp) { + return + } + } + this.returnReply(tmp) + } else { + this.bufferCache.push(buffer) + this.totalChunkSize += buffer.length + return + } + + while (this.offset < this.buffer.length) { + var offset = this.offset + var type = this.buffer[this.offset++] + var response = parseType(this, type) + if (response === undefined) { + if (!this.arrayCache.length) { + this.offset = offset + } + return + } + + if (type === 45) { + this.returnError(response) + } else { + this.returnReply(response) + } + } + + this.buffer = null +} + +module.exports = JavascriptRedisParser diff --git a/nodejs/node_modules/redis-parser/lib/parserError.js b/nodejs/node_modules/redis-parser/lib/parserError.js new file mode 100755 index 0000000..883e554 --- /dev/null +++ b/nodejs/node_modules/redis-parser/lib/parserError.js @@ -0,0 +1,25 @@ +'use strict' + +var util = require('util') +var assert = require('assert') +var RedisError = require('./redisError') +var ADD_STACKTRACE = false + +function ParserError (message, buffer, offset) { + assert(buffer) + assert.strictEqual(typeof offset, 'number') + RedisError.call(this, message, ADD_STACKTRACE) + this.offset = offset + this.buffer = buffer + Error.captureStackTrace(this, ParserError) +} + +util.inherits(ParserError, RedisError) + +Object.defineProperty(ParserError.prototype, 'name', { + value: 'ParserError', + configurable: true, + writable: true +}) + +module.exports = ParserError diff --git a/nodejs/node_modules/redis-parser/lib/redisError.js b/nodejs/node_modules/redis-parser/lib/redisError.js new file mode 100755 index 0000000..374bbb7 --- /dev/null +++ b/nodejs/node_modules/redis-parser/lib/redisError.js @@ -0,0 +1,24 @@ +'use strict' + +var util = require('util') + +function RedisError (message, stack) { + Object.defineProperty(this, 'message', { + value: message || '', + configurable: true, + writable: true + }) + if (stack || stack === undefined) { + Error.captureStackTrace(this, RedisError) + } +} + +util.inherits(RedisError, Error) + +Object.defineProperty(RedisError.prototype, 'name', { + value: 'RedisError', + configurable: true, + writable: true +}) + +module.exports = RedisError diff --git a/nodejs/node_modules/redis-parser/lib/replyError.js b/nodejs/node_modules/redis-parser/lib/replyError.js new file mode 100755 index 0000000..080214e --- /dev/null +++ b/nodejs/node_modules/redis-parser/lib/replyError.js @@ -0,0 +1,23 @@ +'use strict' + +var util = require('util') +var RedisError = require('./redisError') +var ADD_STACKTRACE = false + +function ReplyError (message) { + var tmp = Error.stackTraceLimit + Error.stackTraceLimit = 2 + RedisError.call(this, message, ADD_STACKTRACE) + Error.captureStackTrace(this, ReplyError) + Error.stackTraceLimit = tmp +} + +util.inherits(ReplyError, RedisError) + +Object.defineProperty(ReplyError.prototype, 'name', { + value: 'ReplyError', + configurable: true, + writable: true +}) + +module.exports = ReplyError diff --git a/nodejs/node_modules/redis-parser/package.json b/nodejs/node_modules/redis-parser/package.json new file mode 100755 index 0000000..4d13186 --- /dev/null +++ b/nodejs/node_modules/redis-parser/package.json @@ -0,0 +1,81 @@ +{ + "_args": [ + [ + "redis-parser@2.6.0", + "/www/wwwroot/Adminx.cc/nodejs" + ] + ], + "_from": "redis-parser@2.6.0", + "_id": "redis-parser@2.6.0", + "_inBundle": false, + "_integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=", + "_location": "/redis-parser", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "redis-parser@2.6.0", + "name": "redis-parser", + "escapedName": "redis-parser", + "rawSpec": "2.6.0", + "saveSpec": null, + "fetchSpec": "2.6.0" + }, + "_requiredBy": [ + "/redis" + ], + "_resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "_spec": "2.6.0", + "_where": "/www/wwwroot/Adminx.cc/nodejs", + "author": { + "name": "Ruben Bridgewater" + }, + "bugs": { + "url": "https://github.com/NodeRedis/node-redis-parser/issues" + }, + "description": "Javascript Redis protocol (RESP) parser", + "devDependencies": { + "benchmark": "^2.1.0", + "codeclimate-test-reporter": "^0.4.0", + "hiredis": "^0.5.0", + "intercept-stdout": "^0.1.2", + "istanbul": "^0.4.0", + "mocha": "^3.1.2", + "standard": "^9.0.0" + }, + "directories": { + "test": "test", + "lib": "lib" + }, + "engines": { + "node": ">=0.10.0" + }, + "homepage": "https://github.com/NodeRedis/node-redis-parser#readme", + "keywords": [ + "redis", + "protocol", + "parser", + "database", + "javascript", + "node", + "nodejs", + "resp", + "hiredis" + ], + "license": "MIT", + "main": "index.js", + "name": "redis-parser", + "repository": { + "type": "git", + "url": "git+https://github.com/NodeRedis/node-redis-parser.git" + }, + "scripts": { + "benchmark": "node ./benchmark", + "coverage": "node ./node_modules/istanbul/lib/cli.js cover --preserve-comments ./node_modules/mocha/bin/_mocha -- -R spec", + "coverage:check": "node ./node_modules/istanbul/lib/cli.js check-coverage --branch 100 --statement 100", + "lint": "standard --fix", + "posttest": "npm run lint && npm run coverage:check", + "test": "npm run coverage" + }, + "version": "2.6.0" +} diff --git a/nodejs/node_modules/redis/.eslintignore b/nodejs/node_modules/redis/.eslintignore new file mode 100755 index 0000000..fd16de3 --- /dev/null +++ b/nodejs/node_modules/redis/.eslintignore @@ -0,0 +1,4 @@ +node_modules/** +coverage/** +**.md +**.log diff --git a/nodejs/node_modules/redis/.eslintrc b/nodejs/node_modules/redis/.eslintrc new file mode 100755 index 0000000..75c7334 --- /dev/null +++ b/nodejs/node_modules/redis/.eslintrc @@ -0,0 +1,108 @@ +env: + node: true + es6: false + +rules: + # Possible Errors + # http://eslint.org/docs/rules/#possible-errors + comma-dangle: [2, "only-multiline"] + no-constant-condition: 2 + no-control-regex: 2 + no-debugger: 2 + no-dupe-args: 2 + no-dupe-keys: 2 + no-duplicate-case: 2 + no-empty: 2 + no-empty-character-class: 2 + no-ex-assign: 2 + no-extra-boolean-cast : 2 + no-extra-parens: [2, "functions"] + no-extra-semi: 2 + no-func-assign: 2 + no-invalid-regexp: 2 + no-irregular-whitespace: 2 + no-negated-in-lhs: 2 + no-obj-calls: 2 + no-regex-spaces: 2 + no-sparse-arrays: 2 + no-inner-declarations: 2 + no-unexpected-multiline: 2 + no-unreachable: 2 + use-isnan: 2 + valid-typeof: 2 + + # Best Practices + # http://eslint.org/docs/rules/#best-practices + array-callback-return: 2 + block-scoped-var: 2 + dot-notation: 2 + eqeqeq: 2 + no-else-return: 2 + no-extend-native: 2 + no-floating-decimal: 2 + no-extra-bind: 2 + no-fallthrough: 2 + no-labels: 2 + no-lone-blocks: 2 + no-loop-func: 2 + no-multi-spaces: 2 + no-multi-str: 2 + no-native-reassign: 2 + no-new-wrappers: 2 + no-octal: 2 + no-proto: 2 + no-redeclare: 2 + no-return-assign: 2 + no-self-assign: 2 + no-self-compare: 2 + no-sequences: 2 + no-throw-literal: 2 + no-useless-call: 2 + no-useless-concat: 2 + no-useless-escape: 2 + no-void: 2 + no-unmodified-loop-condition: 2 + yoda: 2 + + # Strict Mode + # http://eslint.org/docs/rules/#strict-mode + strict: [2, "global"] + + # Variables + # http://eslint.org/docs/rules/#variables + no-delete-var: 2 + no-shadow-restricted-names: 2 + no-undef: 2 + no-unused-vars: [2, {"args": "none"}] + + # http://eslint.org/docs/rules/#nodejs-and-commonjs + no-mixed-requires: 2 + no-new-require: 2 + no-path-concat: 2 + + # Stylistic Issues + # http://eslint.org/docs/rules/#stylistic-issues + comma-spacing: 2 + eol-last: 2 + indent: [2, 4, {SwitchCase: 2}] + keyword-spacing: 2 + max-len: [2, 200, 2] + new-parens: 2 + no-mixed-spaces-and-tabs: 2 + no-multiple-empty-lines: [2, {max: 2}] + no-trailing-spaces: 2 + quotes: [2, "single", "avoid-escape"] + semi: 2 + space-before-blocks: [2, "always"] + space-before-function-paren: [2, "always"] + space-in-parens: [2, "never"] + space-infix-ops: 2 + space-unary-ops: 2 + +globals: + it: true + describe: true + before: true + after: true + beforeEach: true + afterEach: true diff --git a/nodejs/node_modules/redis/.github/ISSUE_TEMPLATE.md b/nodejs/node_modules/redis/.github/ISSUE_TEMPLATE.md new file mode 100755 index 0000000..42f2d3e --- /dev/null +++ b/nodejs/node_modules/redis/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,15 @@ +_Thanks for wanting to report an issue you've found in node_redis. Please delete +this text and fill in the template below. Please note that the issue tracker is only +for bug reports or feature requests. If you have a question, please ask that on [gitter]. +If unsure about something, just do as best as you're able._ + +_Note that it will be much easier to fix the issue if a test case that reproduces +the problem is provided. It is of course not always possible to reduce your code +to a small test case, but it's highly appreciated to have as much data as possible. +Thank you!_ + +* **Version**: What node_redis and what redis version is the issue happening on? +* **Platform**: What platform / version? (For example Node.js 0.10 or Node.js 5.7.0 on Windows 7 / Ubuntu 15.10 / Azure) +* **Description**: Description of your issue, stack traces from errors and code that reproduces the issue + +[gitter]: https://gitter.im/NodeRedis/node_redis?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge \ No newline at end of file diff --git a/nodejs/node_modules/redis/.github/PULL_REQUEST_TEMPLATE.md b/nodejs/node_modules/redis/.github/PULL_REQUEST_TEMPLATE.md new file mode 100755 index 0000000..9706621 --- /dev/null +++ b/nodejs/node_modules/redis/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,14 @@ +### Pull Request check-list + +_Please make sure to review and check all of these items:_ + +- [ ] Does `npm test` pass with this change (including linting)? +- [ ] Is the new or changed code fully tested? +- [ ] Is a documentation update included (if this change modifies existing APIs, or introduces new ones)? + +_NOTE: these things are not required to open a PR and can be done +afterwards / while the PR is open._ + +### Description of change + +_Please provide a description of the change here._ \ No newline at end of file diff --git a/nodejs/node_modules/redis/.npmignore b/nodejs/node_modules/redis/.npmignore new file mode 100755 index 0000000..b0238e0 --- /dev/null +++ b/nodejs/node_modules/redis/.npmignore @@ -0,0 +1,10 @@ +examples/ +benchmarks/ +test/ +.nyc_output/ +coverage/ +.tern-port +*.log +*.rdb +*.out +*.yml diff --git a/nodejs/node_modules/redis/LICENSE b/nodejs/node_modules/redis/LICENSE new file mode 100755 index 0000000..710407f --- /dev/null +++ b/nodejs/node_modules/redis/LICENSE @@ -0,0 +1,24 @@ +LICENSE - "MIT License" + +Copyright (c) 2016 by NodeRedis + +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. \ No newline at end of file diff --git a/nodejs/node_modules/redis/README.md b/nodejs/node_modules/redis/README.md new file mode 100755 index 0000000..205503b --- /dev/null +++ b/nodejs/node_modules/redis/README.md @@ -0,0 +1,965 @@ +redis - a node.js redis client +=========================== + +[![Build Status](https://travis-ci.org/NodeRedis/node_redis.svg?branch=master)](https://travis-ci.org/NodeRedis/node_redis) +[![Coverage Status](https://coveralls.io/repos/NodeRedis/node_redis/badge.svg?branch=)](https://coveralls.io/r/NodeRedis/node_redis?branch=) +[![Windows Tests](https://img.shields.io/appveyor/ci/BridgeAR/node-redis/master.svg?label=Windows%20Tests)](https://ci.appveyor.com/project/BridgeAR/node-redis/branch/master) +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/NodeRedis/node_redis?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +This is a complete and feature rich Redis client for node.js. __It supports all +Redis commands__ and focuses on high performance. + +Install with: + + npm install redis + +## Usage Example + +```js +var redis = require("redis"), + client = redis.createClient(); + +// if you'd like to select database 3, instead of 0 (default), call +// client.select(3, function() { /* ... */ }); + +client.on("error", function (err) { + console.log("Error " + err); +}); + +client.set("string key", "string val", redis.print); +client.hset("hash key", "hashtest 1", "some value", redis.print); +client.hset(["hash key", "hashtest 2", "some other value"], redis.print); +client.hkeys("hash key", function (err, replies) { + console.log(replies.length + " replies:"); + replies.forEach(function (reply, i) { + console.log(" " + i + ": " + reply); + }); + client.quit(); +}); +``` + +This will display: + + mjr:~/work/node_redis (master)$ node example.js + Reply: OK + Reply: 0 + Reply: 0 + 2 replies: + 0: hashtest 1 + 1: hashtest 2 + mjr:~/work/node_redis (master)$ + +Note that the API is entirely asynchronous. To get data back from the server, +you'll need to use a callback. From v.2.6 on the API supports camelCase and +snake_case and all options / variables / events etc. can be used either way. It +is recommended to use camelCase as this is the default for the Node.js +landscape. + +### Promises + +You can also use node_redis with promises by promisifying node_redis with +[bluebird](https://github.com/petkaantonov/bluebird) as in: + +```js +var redis = require('redis'); +bluebird.promisifyAll(redis.RedisClient.prototype); +bluebird.promisifyAll(redis.Multi.prototype); +``` + +It'll add a *Async* to all node_redis functions (e.g. return client.getAsync().then()) + +```js +// We expect a value 'foo': 'bar' to be present +// So instead of writing client.get('foo', cb); you have to write: +return client.getAsync('foo').then(function(res) { + console.log(res); // => 'bar' +}); + +// Using multi with promises looks like: + +return client.multi().get('foo').execAsync().then(function(res) { + console.log(res); // => 'bar' +}); +``` + +### Sending Commands + +Each Redis command is exposed as a function on the `client` object. +All functions take either an `args` Array plus optional `callback` Function or +a variable number of individual arguments followed by an optional callback. +Examples: + +```js +client.hmset(["key", "test keys 1", "test val 1", "test keys 2", "test val 2"], function (err, res) {}); +// Works the same as +client.hmset("key", ["test keys 1", "test val 1", "test keys 2", "test val 2"], function (err, res) {}); +// Or +client.hmset("key", "test keys 1", "test val 1", "test keys 2", "test val 2", function (err, res) {}); +``` + +Note that in either form the `callback` is optional: + +```js +client.set("some key", "some val"); +client.set(["some other key", "some val"]); +``` + +If the key is missing, reply will be null. Only if the [Redis Command +Reference](http://redis.io/commands) states something else it will not be null. + +```js +client.get("missingkey", function(err, reply) { + // reply is null when the key is missing + console.log(reply); +}); +``` + +For a list of Redis commands, see [Redis Command Reference](http://redis.io/commands) + +Minimal parsing is done on the replies. Commands that return a integer return +JavaScript Numbers, arrays return JavaScript Array. `HGETALL` returns an Object +keyed by the hash keys. All strings will either be returned as string or as +buffer depending on your setting. Please be aware that sending null, undefined +and Boolean values will result in the value coerced to a string! + +# Redis Commands + +This library is a 1 to 1 mapping to [Redis commands](https://redis.io/commands). +It is not a cache library so please refer to Redis commands page for full usage +details. + +Example setting key to auto expire using [SET command](https://redis.io/commands/set) + +```js +// this key will expire after 10 seconds +client.set('key', 'value!', 'EX', 10); +``` + +# API + +## Connection and other Events + +`client` will emit some events about the state of the connection to the Redis server. + +### "ready" + +`client` will emit `ready` once a connection is established. Commands issued +before the `ready` event are queued, then replayed just before this event is +emitted. + +### "connect" + +`client` will emit `connect` as soon as the stream is connected to the server. + +### "reconnecting" + +`client` will emit `reconnecting` when trying to reconnect to the Redis server +after losing the connection. Listeners are passed an object containing `delay` +(in ms) and `attempt` (the attempt #) attributes. + +### "error" + +`client` will emit `error` when encountering an error connecting to the Redis +server or when any other in node_redis occurs. If you use a command without +callback and encounter a ReplyError it is going to be emitted to the error +listener. + +So please attach the error listener to node_redis. + +### "end" + +`client` will emit `end` when an established Redis server connection has closed. + +### "drain" (deprecated) + +`client` will emit `drain` when the TCP connection to the Redis server has been +buffering, but is now writable. This event can be used to stream commands in to +Redis and adapt to backpressure. + +If the stream is buffering `client.should_buffer` is set to true. Otherwise the +variable is always set to false. That way you can decide when to reduce your +send rate and resume sending commands when you get `drain`. + +You can also check the return value of each command as it will also return the +backpressure indicator (deprecated). If false is returned the stream had to +buffer. + +### "warning" + +`client` will emit `warning` when password was set but none is needed and if a +deprecated option / function / similar is used. + +### "idle" (deprecated) + +`client` will emit `idle` when there are no outstanding commands that are +awaiting a response. + +## redis.createClient() +If you have `redis-server` running on the same machine as node, then the +defaults for port and host are probably fine and you don't need to supply any +arguments. `createClient()` returns a `RedisClient` object. Otherwise, +`createClient()` accepts these arguments: + +* `redis.createClient([options])` +* `redis.createClient(unix_socket[, options])` +* `redis.createClient(redis_url[, options])` +* `redis.createClient(port[, host][, options])` + +__Tip:__ If the Redis server runs on the same machine as the client consider +using unix sockets if possible to increase throughput. + +#### `options` object properties +| Property | Default | Description | +|-----------|-----------|-------------| +| host | 127.0.0.1 | IP address of the Redis server | +| port | 6379 | Port of the Redis server | +| path | null | The UNIX socket string of the Redis server | +| url | null | The URL of the Redis server. Format: `[redis:]//[[user][:password@]][host][:port][/db-number][?db=db-number[&password=bar[&option=value]]]` (More info avaliable at [IANA](http://www.iana.org/assignments/uri-schemes/prov/redis)). | +| parser | javascript | __Deprecated__ Use either the built-in JS parser [`javascript`]() or the native [`hiredis`]() parser. __Note__ `node_redis` < 2.6 uses hiredis as default if installed. This changed in v.2.6.0. | +| string_numbers | null | Set to `true`, `node_redis` will return Redis number values as Strings instead of javascript Numbers. Useful if you need to handle big numbers (above `Number.MAX_SAFE_INTEGER === 2^53`). Hiredis is incapable of this behavior, so setting this option to `true` will result in the built-in javascript parser being used no matter the value of the `parser` option. | +| return_buffers | false | If set to `true`, then all replies will be sent to callbacks as Buffers instead of Strings. | +| detect_buffers | false | If set to `true`, then replies will be sent to callbacks as Buffers. This option lets you switch between Buffers and Strings on a per-command basis, whereas `return_buffers` applies to every command on a client. __Note__: This doesn't work properly with the pubsub mode. A subscriber has to either always return Strings or Buffers. | +| socket_keepalive | true | If set to `true`, the keep-alive functionality is enabled on the underlying socket. | +| no_ready_check | false | When a connection is established to the Redis server, the server might still be loading the database from disk. While loading, the server will not respond to any commands. To work around this, `node_redis` has a "ready check" which sends the `INFO` command to the server. The response from the `INFO` command indicates whether the server is ready for more commands. When ready, `node_redis` emits a `ready` event. Setting `no_ready_check` to `true` will inhibit this check. | +| enable_offline_queue | true | By default, if there is no active connection to the Redis server, commands are added to a queue and are executed once the connection has been established. Setting `enable_offline_queue` to `false` will disable this feature and the callback will be executed immediately with an error, or an error will be emitted if no callback is specified. | +| retry_max_delay | null | __Deprecated__ _Please use `retry_strategy` instead._ By default, every time the client tries to connect and fails, the reconnection delay almost doubles. This delay normally grows infinitely, but setting `retry_max_delay` limits it to the maximum value provided in milliseconds. | +| connect_timeout | 3600000 | __Deprecated__ _Please use `retry_strategy` instead._ Setting `connect_timeout` limits the total time for the client to connect and reconnect. The value is provided in milliseconds and is counted from the moment a new client is created or from the time the connection is lost. The last retry is going to happen exactly at the timeout time. Default is to try connecting until the default system socket timeout has been exceeded and to try reconnecting until 1h has elapsed. | +| max_attempts | 0 | __Deprecated__ _Please use `retry_strategy` instead._ By default, a client will try reconnecting until connected. Setting `max_attempts` limits total amount of connection attempts. Setting this to 1 will prevent any reconnect attempt. | +| retry_unfulfilled_commands | false | If set to `true`, all commands that were unfulfilled while the connection is lost will be retried after the connection has been reestablished. Use this with caution if you use state altering commands (e.g. `incr`). This is especially useful if you use blocking commands. | +| password | null | If set, client will run Redis auth command on connect. Alias `auth_pass` __Note__ `node_redis` < 2.5 must use `auth_pass` | +| db | null | If set, client will run Redis `select` command on connect. | +| family | IPv4 | You can force using IPv6 if you set the family to 'IPv6'. See Node.js [net](https://nodejs.org/api/net.html) or [dns](https://nodejs.org/api/dns.html) modules on how to use the family type. | +| disable_resubscribing | false | If set to `true`, a client won't resubscribe after disconnecting. | +| rename_commands | null | Passing an object with renamed commands to use instead of the original functions. For example, if you renamed the command KEYS to "DO-NOT-USE" then the rename_commands object would be: `{ KEYS : "DO-NOT-USE" }` . See the [Redis security topics](http://redis.io/topics/security) for more info. | +| tls | null | An object containing options to pass to [tls.connect](http://nodejs.org/api/tls.html#tls_tls_connect_port_host_options_callback) to set up a TLS connection to Redis (if, for example, it is set up to be accessible via a tunnel). | +| prefix | null | A string used to prefix all used keys (e.g. `namespace:test`). Please be aware that the `keys` command will not be prefixed. The `keys` command has a "pattern" as argument and no key and it would be impossible to determine the existing keys in Redis if this would be prefixed. | +| retry_strategy | function | A function that receives an options object as parameter including the retry `attempt`, the `total_retry_time` indicating how much time passed since the last time connected, the `error` why the connection was lost and the number of `times_connected` in total. If you return a number from this function, the retry will happen exactly after that time in milliseconds. If you return a non-number, no further retry will happen and all offline commands are flushed with errors. Return an error to return that specific error to all offline commands. Example below. | + +```js +var redis = require("redis"); +var client = redis.createClient({detect_buffers: true}); + +client.set("foo_rand000000000000", "OK"); + +// This will return a JavaScript String +client.get("foo_rand000000000000", function (err, reply) { + console.log(reply.toString()); // Will print `OK` +}); + +// This will return a Buffer since original key is specified as a Buffer +client.get(new Buffer("foo_rand000000000000"), function (err, reply) { + console.log(reply.toString()); // Will print `` +}); +client.quit(); +``` + +retry_strategy example + +```js +var client = redis.createClient({ + retry_strategy: function (options) { + if (options.error && options.error.code === 'ECONNREFUSED') { + // End reconnecting on a specific error and flush all commands with + // a individual error + return new Error('The server refused the connection'); + } + if (options.total_retry_time > 1000 * 60 * 60) { + // End reconnecting after a specific timeout and flush all commands + // with a individual error + return new Error('Retry time exhausted'); + } + if (options.attempt > 10) { + // End reconnecting with built in error + return undefined; + } + // reconnect after + return Math.min(options.attempt * 100, 3000); + } +}); +``` + +## client.auth(password[, callback]) + +When connecting to a Redis server that requires authentication, the `AUTH` +command must be sent as the first command after connecting. This can be tricky +to coordinate with reconnections, the ready check, etc. To make this easier, +`client.auth()` stashes `password` and will send it after each connection, +including reconnections. `callback` is invoked only once, after the response to +the very first `AUTH` command sent. +NOTE: Your call to `client.auth()` should not be inside the ready handler. If +you are doing this wrong, `client` will emit an error that looks +something like this `Error: Ready check failed: ERR operation not permitted`. + +## backpressure + +### stream + +The client exposed the used [stream](https://nodejs.org/api/stream.html) in +`client.stream` and if the stream or client had to +[buffer](https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback) +the command in `client.should_buffer`. In combination this can be used to +implement backpressure by checking the buffer state before sending a command and +listening to the stream +[drain](https://nodejs.org/api/stream.html#stream_event_drain) event. + +## client.quit() + +This sends the quit command to the redis server and ends cleanly right after all +running commands were properly handled. If this is called while reconnecting +(and therefore no connection to the redis server exists) it is going to end the +connection right away instead of resulting in further reconnections! All offline +commands are going to be flushed with an error in that case. + +## client.end(flush) + +Forcibly close the connection to the Redis server. Note that this does not wait +until all replies have been parsed. If you want to exit cleanly, call +`client.quit()` as mentioned above. + +You should set flush to true, if you are not absolutely sure you do not care +about any other commands. If you set flush to false all still running commands +will silently fail. + +This example closes the connection to the Redis server before the replies have +been read. You probably don't want to do this: + +```js +var redis = require("redis"), + client = redis.createClient(); + +client.set("foo_rand000000000000", "some fantastic value", function (err, reply) { + // This will either result in an error (flush parameter is set to true) + // or will silently fail and this callback will not be called at all (flush set to false) + console.log(err); +}); +client.end(true); // No further commands will be processed +client.get("foo_rand000000000000", function (err, reply) { + console.log(err); // => 'The connection has already been closed.' +}); +``` + +`client.end()` without the flush parameter set to true should NOT be used in production! + +## Error handling (>= v.2.6) + +Currently the following error subclasses exist: + +* `RedisError`: _All errors_ returned by the client +* `ReplyError` subclass of `RedisError`: All errors returned by __Redis__ itself +* `AbortError` subclass of `RedisError`: All commands that could not finish due + to what ever reason +* `ParserError` subclass of `RedisError`: Returned in case of a parser error + (this should not happen) +* `AggregateError` subclass of `AbortError`: Emitted in case multiple unresolved + commands without callback got rejected in debug_mode instead of lots of + `AbortError`s. + +All error classes are exported by the module. + +Example: +```js +var redis = require('./'); +var assert = require('assert'); +var client = redis.createClient(); + +client.on('error', function (err) { + assert(err instanceof Error); + assert(err instanceof redis.AbortError); + assert(err instanceof redis.AggregateError); + // The set and get get aggregated in here + assert.strictEqual(err.errors.length, 2); + assert.strictEqual(err.code, 'NR_CLOSED'); +}); +client.set('foo', 123, 'bar', function (err, res) { // Too many arguments + assert(err instanceof redis.ReplyError); // => true + assert.strictEqual(err.command, 'SET'); + assert.deepStrictEqual(err.args, ['foo', 123, 'bar']); + + redis.debug_mode = true; + client.set('foo', 'bar'); + client.get('foo'); + process.nextTick(function () { + // Force closing the connection while the command did not yet return + client.end(true); + redis.debug_mode = false; + }); +}); + +``` + +Every `ReplyError` contains the `command` name in all-caps and the arguments (`args`). + +If node_redis emits a library error because of another error, the triggering +error is added to the returned error as `origin` attribute. + +___Error codes___ + +node_redis returns a `NR_CLOSED` error code if the clients connection dropped. +If a command unresolved command got rejected a `UNCERTAIN_STATE` code is +returned. A `CONNECTION_BROKEN` error code is used in case node_redis gives up +to reconnect. + +## client.unref() + +Call `unref()` on the underlying socket connection to the Redis server, allowing +the program to exit once no more commands are pending. + +This is an **experimental** feature, and only supports a subset of the Redis +protocol. Any commands where client state is saved on the Redis server, e.g. +`*SUBSCRIBE` or the blocking `BL*` commands will *NOT* work with `.unref()`. + +```js +var redis = require("redis") +var client = redis.createClient() + +/* + Calling unref() will allow this program to exit immediately after the get + command finishes. Otherwise the client would hang as long as the + client-server connection is alive. +*/ +client.unref() +client.get("foo", function (err, value){ + if (err) throw(err) + console.log(value) +}) +``` + +## Friendlier hash commands + +Most Redis commands take a single String or an Array of Strings as arguments, +and replies are sent back as a single String or an Array of Strings. When +dealing with hash values, there are a couple of useful exceptions to this. + +### client.hgetall(hash, callback) + +The reply from an HGETALL command will be converted into a JavaScript Object by +`node_redis`. That way you can interact with the responses using JavaScript +syntax. + +Example: + +```js +client.hmset("hosts", "mjr", "1", "another", "23", "home", "1234"); +client.hgetall("hosts", function (err, obj) { + console.dir(obj); +}); +``` + +Output: + +```js +{ mjr: '1', another: '23', home: '1234' } +``` + +### client.hmset(hash, obj[, callback]) + +Multiple values in a hash can be set by supplying an object: + +```js +client.HMSET(key2, { + "0123456789": "abcdefghij", // NOTE: key and value will be coerced to strings + "some manner of key": "a type of value" +}); +``` + +The properties and values of this Object will be set as keys and values in the +Redis hash. + +### client.hmset(hash, key1, val1, ... keyn, valn, [callback]) + +Multiple values may also be set by supplying a list: + +```js +client.HMSET(key1, "0123456789", "abcdefghij", "some manner of key", "a type of value"); +``` + +## Publish / Subscribe + +Example of the publish / subscribe API. This program opens two +client connections, subscribes to a channel on one of them, and publishes to that +channel on the other: + +```js +var redis = require("redis"); +var sub = redis.createClient(), pub = redis.createClient(); +var msg_count = 0; + +sub.on("subscribe", function (channel, count) { + pub.publish("a nice channel", "I am sending a message."); + pub.publish("a nice channel", "I am sending a second message."); + pub.publish("a nice channel", "I am sending my last message."); +}); + +sub.on("message", function (channel, message) { + console.log("sub channel " + channel + ": " + message); + msg_count += 1; + if (msg_count === 3) { + sub.unsubscribe(); + sub.quit(); + pub.quit(); + } +}); + +sub.subscribe("a nice channel"); +``` + +When a client issues a `SUBSCRIBE` or `PSUBSCRIBE`, that connection is put into +a "subscriber" mode. At that point, only commands that modify the subscription +set are valid and quit (and depending on the redis version ping as well). When +the subscription set is empty, the connection is put back into regular mode. + +If you need to send regular commands to Redis while in subscriber mode, just +open another connection with a new client (hint: use `client.duplicate()`). + +## Subscriber Events + +If a client has subscriptions active, it may emit these events: + +### "message" (channel, message) + +Client will emit `message` for every message received that matches an active subscription. +Listeners are passed the channel name as `channel` and the message as `message`. + +### "pmessage" (pattern, channel, message) + +Client will emit `pmessage` for every message received that matches an active +subscription pattern. Listeners are passed the original pattern used with +`PSUBSCRIBE` as `pattern`, the sending channel name as `channel`, and the +message as `message`. + +### "message_buffer" (channel, message) + +This is the same as the `message` event with the exception, that it is always +going to emit a buffer. If you listen to the `message` event at the same time as +the `message_buffer`, it is always going to emit a string. + +### "pmessage_buffer" (pattern, channel, message) + +This is the same as the `pmessage` event with the exception, that it is always +going to emit a buffer. If you listen to the `pmessage` event at the same time +as the `pmessage_buffer`, it is always going to emit a string. + +### "subscribe" (channel, count) + +Client will emit `subscribe` in response to a `SUBSCRIBE` command. Listeners are +passed the channel name as `channel` and the new count of subscriptions for this +client as `count`. + +### "psubscribe" (pattern, count) + +Client will emit `psubscribe` in response to a `PSUBSCRIBE` command. Listeners +are passed the original pattern as `pattern`, and the new count of subscriptions +for this client as `count`. + +### "unsubscribe" (channel, count) + +Client will emit `unsubscribe` in response to a `UNSUBSCRIBE` command. Listeners +are passed the channel name as `channel` and the new count of subscriptions for +this client as `count`. When `count` is 0, this client has left subscriber mode +and no more subscriber events will be emitted. + +### "punsubscribe" (pattern, count) + +Client will emit `punsubscribe` in response to a `PUNSUBSCRIBE` command. +Listeners are passed the channel name as `channel` and the new count of +subscriptions for this client as `count`. When `count` is 0, this client has +left subscriber mode and no more subscriber events will be emitted. + +## client.multi([commands]) + +`MULTI` commands are queued up until an `EXEC` is issued, and then all commands +are run atomically by Redis. The interface in `node_redis` is to return an +individual `Multi` object by calling `client.multi()`. If any command fails to +queue, all commands are rolled back and none is going to be executed (For +further information look at +[transactions](http://redis.io/topics/transactions)). + +```js +var redis = require("./index"), + client = redis.createClient(), set_size = 20; + +client.sadd("bigset", "a member"); +client.sadd("bigset", "another member"); + +while (set_size > 0) { + client.sadd("bigset", "member " + set_size); + set_size -= 1; +} + +// multi chain with an individual callback +client.multi() + .scard("bigset") + .smembers("bigset") + .keys("*", function (err, replies) { + // NOTE: code in this callback is NOT atomic + // this only happens after the the .exec call finishes. + client.mget(replies, redis.print); + }) + .dbsize() + .exec(function (err, replies) { + console.log("MULTI got " + replies.length + " replies"); + replies.forEach(function (reply, index) { + console.log("Reply " + index + ": " + reply.toString()); + }); + }); +``` + +### Multi.exec([callback]) + +`client.multi()` is a constructor that returns a `Multi` object. `Multi` objects +share all of the same command methods as `client` objects do. Commands are +queued up inside the `Multi` object until `Multi.exec()` is invoked. + +If your code contains an syntax error an EXECABORT error is going to be thrown +and all commands are going to be aborted. That error contains a `.errors` +property that contains the concrete errors. +If all commands were queued successfully and an error is thrown by redis while +processing the commands that error is going to be returned in the result array! +No other command is going to be aborted though than the onces failing. + +You can either chain together `MULTI` commands as in the above example, or you +can queue individual commands while still sending regular client command as in +this example: + +```js +var redis = require("redis"), + client = redis.createClient(), multi; + +// start a separate multi command queue +multi = client.multi(); +multi.incr("incr thing", redis.print); +multi.incr("incr other thing", redis.print); + +// runs immediately +client.mset("incr thing", 100, "incr other thing", 1, redis.print); + +// drains multi queue and runs atomically +multi.exec(function (err, replies) { + console.log(replies); // 101, 2 +}); +``` + +In addition to adding commands to the `MULTI` queue individually, you can also +pass an array of commands and arguments to the constructor: + +```js +var redis = require("redis"), + client = redis.createClient(), multi; + +client.multi([ + ["mget", "multifoo", "multibar", redis.print], + ["incr", "multifoo"], + ["incr", "multibar"] +]).exec(function (err, replies) { + console.log(replies); +}); +``` + +### Multi.exec_atomic([callback]) + +Identical to Multi.exec but with the difference that executing a single command +will not use transactions. + +## client.batch([commands]) + +Identical to .multi without transactions. This is recommended if you want to +execute many commands at once but don't have to rely on transactions. + +`BATCH` commands are queued up until an `EXEC` is issued, and then all commands +are run atomically by Redis. The interface in `node_redis` is to return an +individual `Batch` object by calling `client.batch()`. The only difference +between .batch and .multi is that no transaction is going to be used. +Be aware that the errors are - just like in multi statements - in the result. +Otherwise both, errors and results could be returned at the same time. + +If you fire many commands at once this is going to boost the execution speed +significantly compared to firing the same commands in a loop without waiting for +the result! See the benchmarks for further comparison. Please remember that all +commands are kept in memory until they are fired. + +## Monitor mode + +Redis supports the `MONITOR` command, which lets you see all commands received +by the Redis server across all client connections, including from other client +libraries and other computers. + +A `monitor` event is going to be emitted for every command fired from any client +connected to the server including the monitoring client itself. The callback for +the `monitor` event takes a timestamp from the Redis server, an array of command +arguments and the raw monitoring string. + +Example: + +```js +var client = require("redis").createClient(); +client.monitor(function (err, res) { + console.log("Entering monitoring mode."); +}); +client.set('foo', 'bar'); + +client.on("monitor", function (time, args, raw_reply) { + console.log(time + ": " + args); // 1458910076.446514:['set', 'foo', 'bar'] +}); +``` + +# Extras + +Some other things you might like to know about. + +## client.server_info + +After the ready probe completes, the results from the INFO command are saved in +the `client.server_info` object. + +The `versions` key contains an array of the elements of the version string for +easy comparison. + + > client.server_info.redis_version + '2.3.0' + > client.server_info.versions + [ 2, 3, 0 ] + +## redis.print() + +A handy callback function for displaying return values when testing. Example: + +```js +var redis = require("redis"), + client = redis.createClient(); + +client.on("connect", function () { + client.set("foo_rand000000000000", "some fantastic value", redis.print); + client.get("foo_rand000000000000", redis.print); +}); +``` + +This will print: + + Reply: OK + Reply: some fantastic value + +Note that this program will not exit cleanly because the client is still connected. + +## Multi-word commands + +To execute redis multi-word commands like `SCRIPT LOAD` or `CLIENT LIST` pass +the second word as first parameter: + + client.script('load', 'return 1'); + client.multi().script('load', 'return 1').exec(...); + client.multi([['script', 'load', 'return 1']]).exec(...); + +## client.duplicate([options][, callback]) + +Duplicate all current options and return a new redisClient instance. All options +passed to the duplicate function are going to replace the original option. If +you pass a callback, duplicate is going to wait until the client is ready and +returns it in the callback. If an error occurs in the meanwhile, that is going +to return an error instead in the callback. + +One example of when to use duplicate() would be to accommodate the connection- +blocking redis commands BRPOP, BLPOP, and BRPOPLPUSH. If these commands +are used on the same redisClient instance as non-blocking commands, the +non-blocking ones may be queued up until after the blocking ones finish. + + var Redis=require('redis'); + var client = Redis.createClient(); + var clientBlocking = client.duplicate(); + + var get = function() { + console.log("get called"); + client.get("any_key",function() { console.log("get returned"); }); + setTimeout( get, 1000 ); + }; + var brpop = function() { + console.log("brpop called"); + clientBlocking.brpop("nonexistent", 5, function() { + console.log("brpop return"); + setTimeout( brpop, 1000 ); + }); + }; + get(); + brpop(); + +Another reason to use duplicate() is when multiple DBs on the same server are +accessed via the redis SELECT command. Each DB could use its own connection. + +## client.send_command(command_name[, [args][, callback]]) + +All Redis commands have been added to the `client` object. However, if new +commands are introduced before this library is updated or if you want to add +individual commands you can use `send_command()` to send arbitrary commands to +Redis. + +All commands are sent as multi-bulk commands. `args` can either be an Array of +arguments, or omitted / set to undefined. + +## client.add_command(command_name) + +Calling add_command will add a new command to the prototype. The exact command +name will be used when calling using this new command. Using arbitrary arguments +is possible as with any other command. + +## client.connected + +Boolean tracking the state of the connection to the Redis server. + +## client.command_queue_length + +The number of commands that have been sent to the Redis server but not yet +replied to. You can use this to enforce some kind of maximum queue depth for +commands while connected. + +## client.offline_queue_length + +The number of commands that have been queued up for a future connection. You can +use this to enforce some kind of maximum queue depth for pre-connection +commands. + +### Commands with Optional and Keyword arguments + +This applies to anything that uses an optional `[WITHSCORES]` or `[LIMIT offset +count]` in the [redis.io/commands](http://redis.io/commands) documentation. + +Example: + +```js +var args = [ 'myzset', 1, 'one', 2, 'two', 3, 'three', 99, 'ninety-nine' ]; +client.zadd(args, function (err, response) { + if (err) throw err; + console.log('added '+response+' items.'); + + // -Infinity and +Infinity also work + var args1 = [ 'myzset', '+inf', '-inf' ]; + client.zrevrangebyscore(args1, function (err, response) { + if (err) throw err; + console.log('example1', response); + // write your code here + }); + + var max = 3, min = 1, offset = 1, count = 2; + var args2 = [ 'myzset', max, min, 'WITHSCORES', 'LIMIT', offset, count ]; + client.zrevrangebyscore(args2, function (err, response) { + if (err) throw err; + console.log('example2', response); + // write your code here + }); +}); +``` + +## Performance + +Much effort has been spent to make `node_redis` as fast as possible for common +operations. + +``` +Lenovo T450s, i7-5600U and 12gb memory +clients: 1, NodeJS: 6.2.0, Redis: 3.2.0, parser: javascript, connected by: tcp + PING, 1/1 avg/max: 0.02/ 5.26 2501ms total, 46916 ops/sec + PING, batch 50/1 avg/max: 0.06/ 4.35 2501ms total, 755178 ops/sec + SET 4B str, 1/1 avg/max: 0.02/ 4.75 2501ms total, 40856 ops/sec + SET 4B str, batch 50/1 avg/max: 0.11/ 1.51 2501ms total, 432727 ops/sec + SET 4B buf, 1/1 avg/max: 0.05/ 2.76 2501ms total, 20659 ops/sec + SET 4B buf, batch 50/1 avg/max: 0.25/ 1.76 2501ms total, 194962 ops/sec + GET 4B str, 1/1 avg/max: 0.02/ 1.55 2501ms total, 45156 ops/sec + GET 4B str, batch 50/1 avg/max: 0.09/ 3.15 2501ms total, 524110 ops/sec + GET 4B buf, 1/1 avg/max: 0.02/ 3.07 2501ms total, 44563 ops/sec + GET 4B buf, batch 50/1 avg/max: 0.10/ 3.18 2501ms total, 473171 ops/sec + SET 4KiB str, 1/1 avg/max: 0.03/ 1.54 2501ms total, 32627 ops/sec + SET 4KiB str, batch 50/1 avg/max: 0.34/ 1.89 2501ms total, 146861 ops/sec + SET 4KiB buf, 1/1 avg/max: 0.05/ 2.85 2501ms total, 20688 ops/sec + SET 4KiB buf, batch 50/1 avg/max: 0.36/ 1.83 2501ms total, 138165 ops/sec + GET 4KiB str, 1/1 avg/max: 0.02/ 1.37 2501ms total, 39389 ops/sec + GET 4KiB str, batch 50/1 avg/max: 0.24/ 1.81 2501ms total, 208157 ops/sec + GET 4KiB buf, 1/1 avg/max: 0.02/ 2.63 2501ms total, 39918 ops/sec + GET 4KiB buf, batch 50/1 avg/max: 0.31/ 8.56 2501ms total, 161575 ops/sec + INCR, 1/1 avg/max: 0.02/ 4.69 2501ms total, 45685 ops/sec + INCR, batch 50/1 avg/max: 0.09/ 3.06 2501ms total, 539964 ops/sec + LPUSH, 1/1 avg/max: 0.02/ 3.04 2501ms total, 41253 ops/sec + LPUSH, batch 50/1 avg/max: 0.12/ 1.94 2501ms total, 425090 ops/sec + LRANGE 10, 1/1 avg/max: 0.02/ 2.28 2501ms total, 39850 ops/sec + LRANGE 10, batch 50/1 avg/max: 0.25/ 1.85 2501ms total, 194302 ops/sec + LRANGE 100, 1/1 avg/max: 0.05/ 2.93 2501ms total, 21026 ops/sec + LRANGE 100, batch 50/1 avg/max: 1.52/ 2.89 2501ms total, 32767 ops/sec + SET 4MiB str, 1/1 avg/max: 5.16/ 15.55 2502ms total, 193 ops/sec + SET 4MiB str, batch 20/1 avg/max: 89.73/ 99.96 2513ms total, 223 ops/sec + SET 4MiB buf, 1/1 avg/max: 2.23/ 8.35 2501ms total, 446 ops/sec + SET 4MiB buf, batch 20/1 avg/max: 41.47/ 50.91 2530ms total, 482 ops/sec + GET 4MiB str, 1/1 avg/max: 2.79/ 10.91 2502ms total, 358 ops/sec + GET 4MiB str, batch 20/1 avg/max: 101.61/118.11 2541ms total, 197 ops/sec + GET 4MiB buf, 1/1 avg/max: 2.32/ 14.93 2502ms total, 430 ops/sec + GET 4MiB buf, batch 20/1 avg/max: 65.01/ 84.72 2536ms total, 308 ops/sec + ``` + +## Debugging + +To get debug output run your `node_redis` application with `NODE_DEBUG=redis`. + +This is also going to result in good stack traces opposed to useless ones +otherwise for any async operation. +If you only want to have good stack traces but not the debug output run your +application in development mode instead (`NODE_ENV=development`). + +Good stack traces are only activated in development and debug mode as this +results in a significant performance penalty. + +___Comparison___: +Useless stack trace: +``` +ReplyError: ERR wrong number of arguments for 'set' command + at parseError (/home/ruben/repos/redis/node_modules/redis-parser/lib/parser.js:158:12) + at parseType (/home/ruben/repos/redis/node_modules/redis-parser/lib/parser.js:219:14) +``` +Good stack trace: +``` +ReplyError: ERR wrong number of arguments for 'set' command + at new Command (/home/ruben/repos/redis/lib/command.js:9:902) + at RedisClient.set (/home/ruben/repos/redis/lib/commands.js:9:3238) + at Context. (/home/ruben/repos/redis/test/good_stacks.spec.js:20:20) + at callFnAsync (/home/ruben/repos/redis/node_modules/mocha/lib/runnable.js:349:8) + at Test.Runnable.run (/home/ruben/repos/redis/node_modules/mocha/lib/runnable.js:301:7) + at Runner.runTest (/home/ruben/repos/redis/node_modules/mocha/lib/runner.js:422:10) + at /home/ruben/repos/redis/node_modules/mocha/lib/runner.js:528:12 + at next (/home/ruben/repos/redis/node_modules/mocha/lib/runner.js:342:14) + at /home/ruben/repos/redis/node_modules/mocha/lib/runner.js:352:7 + at next (/home/ruben/repos/redis/node_modules/mocha/lib/runner.js:284:14) + at Immediate._onImmediate (/home/ruben/repos/redis/node_modules/mocha/lib/runner.js:320:5) + at processImmediate [as _immediateCallback] (timers.js:383:17) +``` + +## How to Contribute +- Open a pull request or an issue about what you want to implement / change. We're glad for any help! + - Please be aware that we'll only accept fully tested code. + +## Contributors + +The original author of node_redis is [Matthew Ranney](https://github.com/mranney) + +The current lead maintainer is [Ruben Bridgewater](https://github.com/BridgeAR) + +Many [others](https://github.com/NodeRedis/node_redis/graphs/contributors) +contributed to `node_redis` too. Thanks to all of them! + +## License + +[MIT](LICENSE) + +### Consolidation: It's time for celebration + +Right now there are two great redis clients around and both have some advantages +above each other. We speak about ioredis and node_redis. So after talking to +each other about how we could improve in working together we (that is @luin and +@BridgeAR) decided to work towards a single library on the long run. But step by +step. + +First of all, we want to split small parts of our libraries into others so that +we're both able to use the same code. Those libraries are going to be maintained +under the NodeRedis organization. This is going to reduce the maintenance +overhead, allows others to use the very same code, if they need it and it's way +easyer for others to contribute to both libraries. + +We're very happy about this step towards working together as we both want to +give you the best redis experience possible. + +If you want to join our cause by help maintaining something, please don't +hesitate to contact either one of us. diff --git a/nodejs/node_modules/redis/changelog.md b/nodejs/node_modules/redis/changelog.md new file mode 100755 index 0000000..d650f9b --- /dev/null +++ b/nodejs/node_modules/redis/changelog.md @@ -0,0 +1,845 @@ +# Changelog + +## v.2.8.0 - 31 Jul, 2017 + +Features + +- Accept UPPER_CASE commands in send_command +- Add arbitrary commands to the prototype by using `Redis.addCommand(name)` + +Bugfixes + +- Fixed not always copying subscribe unsubscribe arguments +- Fixed emitting internal errors while reconnecting with auth +- Fixed crashing with invalid url option + +## v.2.7.1 - 14 Mar, 2017 + +Bugfixes + +- Fixed monitor mode not working in combination with IPv6 (2.6.0 regression) + +## v.2.7.0 - 11 Mar, 2017 + +Features + +- All returned errors are from now a subclass of `RedisError`. + +Bugfixes + +- Fixed rename_commands not accepting `null` as value +- Fixed `AbortError`s and `AggregateError`s not showing the error message in the stack trace + +## v.2.6.5 - 15 Jan, 2017 + +Bugfixes + +- Fixed parser not being reset in case the redis connection closed ASAP for overcoming of output buffer limits +- Fixed parser reset if (p)message_buffer listener is attached + +## v.2.6.4 - 12 Jan, 2017 + +Bugfixes + +- Fixed monitor mode not working in combination with IPv6, sockets or lua scripts (2.6.0 regression) + +## v.2.6.3 - 31 Oct, 2016 + +Bugfixes + +- Do not change the tls setting to camel_case +- Fix domain handling in combination with the offline queue (2.5.3 regression) + +## v.2.6.2 - 16 Jun, 2016 + +Bugfixes + +- Fixed individual callbacks of a transaction not being called (2.6.0 regression) + +## v.2.6.1 - 02 Jun, 2016 + +Bugfixes + +- Fixed invalid function name being exported + +## v.2.6.0 - 01 Jun, 2016 + +In addition to the pre-releases the following changes exist in v.2.6.0: + +Features + +- Updated [redis-parser](https://github.com/NodeRedis/node-redis-parser) dependency ([changelog](https://github.com/NodeRedis/node-redis-parser/releases/tag/v.2.0.0)) + - The JS parser is from now on the new default as it is a lot faster than the hiredis parser + - This is no BC as there is no changed behavior for the user at all but just a performance improvement. Explicitly requireing the Hiredis parser is still possible. +- Added name property to all Redis functions (Node.js >= 4.0) +- Improved stack traces in development and debug mode + +Bugfixes + +- Reverted support for `__proto__` (v.2.6.0-2) to prevent and breaking change + +Deprecations + +- The `parser` option is deprecated and should be removed. The built-in Javascript parser is a lot faster than the hiredis parser and has more features + +## v.2.6.0-2 - 29 Apr, 2016 + +Features + +- Added support for the new [CLIENT REPLY ON|OFF|SKIP](http://redis.io/commands/client-reply) command (Redis v.3.2) +- Added support for camelCase + - The Node.js landscape default is to use camelCase. node_redis is a bit out of the box here + but from now on it is possible to use both, just as you prefer! + - If there's any documented variable missing as camelCased, please open a issue for it +- Improve error handling significantly + - Only emit an error if the error has not already been handled in a callback + - Improved unspecific error messages e.g. "Connection gone from end / close event" + - Added `args` to command errors to improve identification of the error + - Added origin to errors if there's e.g. a connection error + - Added ReplyError class. All Redis errors are from now on going to be of that class + - Added AbortError class. A subclass of AbortError. All unresolved and by node_redis rejected commands are from now on of that class + - Added AggregateError class. If a unresolved and by node_redis rejected command has no callback and + this applies to more than a single command, the errors for the commands without callback are aggregated + to a single error that is emitted in debug_mode in that case. +- Added `message_buffer` / `pmessage_buffer` events. That event is always going to emit a buffer + - Listening to the `message` event at the same time is always going to return the same message as string +- Added callback option to the duplicate function +- Added support for `__proto__` and other reserved keywords as hgetall field +- Updated [redis-commands](https://github.com/NodeRedis/redis-commands) dependency ([changelog](https://github.com/NodeRedis/redis-commands/releases/tag/v.1.2.0)) + +Bugfixes + +- Fixed v.2.5.0 auth command regression (under special circumstances a reconnect would not authenticate properly) +- Fixed v.2.6.0-0 pub sub mode and quit command regressions: + - Entering pub sub mode not working if a earlier called and still running command returned an error + - Unsubscribe callback not called if unsubscribing from all channels and resubscribing right away + - Quit command resulting in an error in some cases +- Fixed special handled functions in batch and multi context not working the same as without (e.g. select and info) + - Be aware that not all commands work in combination with transactions but they all work with batch +- Fixed address always set to 127.0.0.1:6379 in case host / port is set in the `tls` options instead of the general options + +## v.2.6.0-1 - 01 Apr, 2016 + +A second pre-release with further fixes. This is likely going to be released as 2.6.0 stable without further changes. + +Features + +- Added type validations for client.send_command arguments + +Bugfixes + +- Fixed client.send_command not working properly with every command and every option +- Fixed pub sub mode unsubscribing from all channels in combination with the new `string_numbers` option crashing +- Fixed pub sub mode unsubscribing from all channels not respected while reconnecting +- Fixed pub sub mode events in combination with the `string_numbers` option emitting the number of channels not as number + +## v.2.6.0-0 - 27 Mar, 2016 + +This is mainly a very important bug fix release with some smaller features. + +Features + +- Monitor and pub sub mode now work together with the offline queue + - All commands that were send after a connection loss are now going to be send after reconnecting +- Activating monitor mode does now work together with arbitrary commands including pub sub mode +- Pub sub mode is completely rewritten and all known issues fixed +- Added `string_numbers` option to get back strings instead of numbers +- Quit command is from now on always going to end the connection properly + +Bugfixes + +- Fixed calling monitor command while other commands are still running +- Fixed monitor and pub sub mode not working together +- Fixed monitor mode not working in combination with the offline queue +- Fixed pub sub mode not working in combination with the offline queue +- Fixed pub sub mode resubscribing not working with non utf8 buffer channels +- Fixed pub sub mode crashing if calling unsubscribe / subscribe in various combinations +- Fixed pub sub mode emitting unsubscribe even if no channels were unsubscribed +- Fixed pub sub mode emitting a message without a message published +- Fixed quit command not ending the connection and resulting in further reconnection if called while reconnecting + +The quit command did not end connections earlier if the connection was down at that time and this could have +lead to strange situations, therefor this was fixed to end the connection right away in those cases. + +## v.2.5.3 - 21 Mar, 2016 + +Bugfixes + +- Revert throwing on invalid data types and print a warning instead + +## v.2.5.2 - 16 Mar, 2016 + +Bugfixes + +- Fixed breaking changes against Redis 2.4 introduced in 2.5.0 / 2.5.1 + +## v.2.5.1 - 15 Mar, 2016 + +Bugfixes + +- Fixed info command not working anymore with optional section argument + +## v.2.5.0 - 15 Mar, 2016 + +Same changelog as the pre-release + +## v.2.5.0-1 - 07 Mar, 2016 + +This is a big release with some substantial underlining changes. Therefor this is released as a pre-release and I encourage anyone who's able to, to test this out. + +It took way to long to release this one and the next release cycles will be shorter again. + +This release is also going to deprecate a couple things to prepare for a future v.3 (it'll still take a while to v.3). + +Features + +- The parsers moved into the [redis-parser](https://github.com/NodeRedis/node-redis-parser) module and will be maintained in there from now on + - Improve js parser speed significantly for big SUNION/SINTER/LRANGE/ZRANGE +- Improve redis-url parsing to also accept the database-number and options as query parameters as suggested in [IANA](http://www.iana.org/assignments/uri-schemes/prov/redis) +- Added a `retry_unfulfilled_commands` option + - Setting this to 'true' results in retrying all commands that were not fulfilled on a connection loss after the reconnect. Use with caution +- Added a `db` option to select the database while connecting (this is [not recommended](https://groups.google.com/forum/#!topic/redis-db/vS5wX8X4Cjg)) +- Added a `password` option as alias for auth_pass +- The client.server_info is from now on updated while using the info command +- Gracefuly handle redis protocol errors from now on +- Added a `warning` emitter that receives node_redis warnings like auth not required and deprecation messages +- Added a `retry_strategy` option that replaces all reconnect options +- The reconnecting event from now on also receives: + - The error message why the reconnect happened (params.error) + - The amount of times the client was connected (params.times_connected) + - The total reconnecting time since the last time connected (params.total_retry_time) +- Always respect the command execution order no matter if the reply could be returned sync or not (former exceptions: [#937](https://github.com/NodeRedis/node_redis/issues/937#issuecomment-167525939)) +- redis.createClient is now checking input values stricter and detects more faulty input +- Started refactoring internals into individual modules +- Pipelining speed improvements + +Bugfixes + +- Fixed explicit undefined as a command callback in a multi context +- Fixed hmset failing to detect the first key as buffer or date if the key is of that type +- Fixed do not run toString on an array argument and throw a "invalid data" error instead + - This is not considered as breaking change, as this is likely a error in your code and if you want to have such a behavior you should handle this beforehand + - The same applies to Map / Set and individual Object types +- Fixed redis url not accepting the protocol being omitted or protocols other than the redis protocol for convenience +- Fixed parsing the db keyspace even if the first database does not begin with a zero +- Fixed handling of errors occurring while receiving pub sub messages +- Fixed huge string pipelines crashing NodeJS (Pipeline size above 256mb) +- Fixed rename_commands and prefix option not working together +- Fixed ready being emitted to early in case a slave is still syncing / master down + +Deprecations + +- Using any command with a argument being set to null or undefined is deprecated + - From v.3.0.0 on using a command with such an argument will return an error instead + - If you want to keep the old behavior please use a precheck in your code that converts the arguments to a string. + - Using SET or SETEX with a undefined or null value will from now on also result in converting the value to "null" / "undefined" to have a consistent behavior. This is not considered as breaking change, as it returned an error earlier. +- Using .end(flush) without the flush parameter is deprecated and the flush parameter should explicitly be used + - From v.3.0.0 on using .end without flush will result in an error + - Using .end without flush means that any command that did not yet return is going to silently fail. Therefor this is considered harmful and you should explicitly silence such errors if you are sure you want this +- Depending on the return value of a command to detect the backpressure is deprecated + - From version 3.0.0 on node_redis might not return true / false as a return value anymore. Please rely on client.should_buffer instead +- The `socket_nodelay` option is deprecated and will be removed in v.3.0.0 + - If you want to buffer commands you should use [.batch or .multi](./README.md) instead. This is necessary to reduce the amount of different options and this is very likely reducing your throughput if set to false. + - If you are sure you want to activate the NAGLE algorithm you can still activate it by using client.stream.setNoDelay(false) +- The `max_attempts` option is deprecated and will be removed in v.3.0.0. Please use the `retry_strategy` instead +- The `retry_max_delay` option is deprecated and will be removed in v.3.0.0. Please use the `retry_strategy` instead +- The drain event is deprecated and will be removed in v.3.0.0. Please listen to the stream drain event instead +- The idle event is deprecated and will likely be removed in v.3.0.0. If you rely on this feature please open a new ticket in node_redis with your use case +- Redis < v. 2.6 is not officially supported anymore and might not work in all cases. Please update to a newer redis version as it is not possible to test for these old versions +- Removed non documented command syntax (adding the callback to an arguments array instead of passing it as individual argument) + +## v.2.4.2 - 27 Nov, 2015 + +Bugfixes + +- Fixed not emitting ready after reconnect with disable_resubscribing ([@maxgalbu](https://github.com/maxgalbu)) + +## v.2.4.1 - 25 Nov, 2015 + +Bugfixes + +- Fixed a js parser regression introduced in 2.4.0 ([@BridgeAR](https://github.com/BridgeAR)) + +## v.2.4.0 - 25 Nov, 2015 + +Features + +- Added `tls` option to initiate a connection to a redis server behind a TLS proxy. Thanks ([@paddybyers](https://github.com/paddybyers)) +- Added `prefix` option to auto key prefix any command with the provided prefix ([@luin](https://github.com/luin) & [@BridgeAR](https://github.com/BridgeAR)) +- Added `url` option to pass the connection url with the options object ([@BridgeAR](https://github.com/BridgeAR)) +- Added `client.duplicate([options])` to duplicate the current client and return a new one with the same options ([@BridgeAR](https://github.com/BridgeAR)) +- Improve performance by up to 20% on almost all use cases ([@BridgeAR](https://github.com/BridgeAR)) + +Bugfixes + +- Fixed js parser handling big values slow ([@BridgeAR](https://github.com/BridgeAR)) + - The speed is now on par with the hiredis parser. + +## v.2.3.1 - 18 Nov, 2015 + +Bugfixes + +- Fixed saving buffers with charsets other than utf-8 while using multi ([@BridgeAR](https://github.com/BridgeAR)) +- Fixed js parser handling big values very slow ([@BridgeAR](https://github.com/BridgeAR)) + - The speed is up to ~500% faster than before but still up to ~50% slower than the hiredis parser. + +## v.2.3.0 - 30 Oct, 2015 + +Features + +- Improve speed further for: ([@BridgeAR](https://github.com/BridgeAR)) + - saving big strings (up to +300%) + - using .multi / .batch (up to +50% / on Node.js 0.10.x +300%) + - saving small buffers +- Increased coverage to 99% ([@BridgeAR](https://github.com/BridgeAR)) +- Refactored manual backpressure control ([@BridgeAR](https://github.com/BridgeAR)) + - Removed the high water mark and low water mark. Such a mechanism should be implemented by a user instead + - The `drain` event is from now on only emitted if the stream really had to buffer +- Reduced the default connect_timeout to be one hour instead of 24h ([@BridgeAR](https://github.com/BridgeAR)) +- Added .path to redis.createClient(options); ([@BridgeAR](https://github.com/BridgeAR)) +- Ignore info command, if not available on server ([@ivanB1975](https://github.com/ivanB1975)) + +Bugfixes + +- Fixed a js parser error that could result in a timeout ([@BridgeAR](https://github.com/BridgeAR)) +- Fixed .multi / .batch used with Node.js 0.10.x not working properly after a reconnect ([@BridgeAR](https://github.com/BridgeAR)) +- Fixed fired but not yet returned commands not being rejected after a connection loss ([@BridgeAR](https://github.com/BridgeAR)) +- Fixed connect_timeout not respected if no connection has ever been established ([@gagle](https://github.com/gagle) & [@benjie](https://github.com/benjie)) +- Fixed return_buffers in pub sub mode ([@komachi](https://github.com/komachi)) + +## v.2.2.5 - 18 Oct, 2015 + +Bugfixes + +- Fixed undefined options passed to a new instance not accepted (possible with individual .createClient functions) ([@BridgeAR](https://github.com/BridgeAR)) + +## v.2.2.4 - 17 Oct, 2015 + +Bugfixes + +- Fixed unspecific error message for unresolvable commands ([@BridgeAR](https://github.com/BridgeAR)) +- Fixed not allowed command error in pubsub mode not being returned in a provided callback ([@BridgeAR](https://github.com/BridgeAR)) +- Fixed to many commands forbidden in pub sub mode ([@BridgeAR](https://github.com/BridgeAR)) +- Fixed mutation of the arguments array passed to .multi / .batch constructor ([@BridgeAR](https://github.com/BridgeAR)) +- Fixed mutation of the options object passed to createClient ([@BridgeAR](https://github.com/BridgeAR)) +- Fixed error callback in .multi not called if connection in broken mode ([@BridgeAR](https://github.com/BridgeAR)) + +## v.2.2.3 - 14 Oct, 2015 + +Bugfixes + +- Fixed multi not being executed on Node 0.10.x if node_redis not yet ready ([@BridgeAR](https://github.com/BridgeAR)) + +## v.2.2.2 - 14 Oct, 2015 + +Bugfixes + +- Fixed regular commands not being executed after a .multi until .exec was called ([@BridgeAR](https://github.com/BridgeAR)) + +## v.2.2.1 - 12 Oct, 2015 + +No code change + +## v.2.2.0 - 12 Oct, 2015 - The peregrino falcon + +The peregrino falcon is the fasted bird on earth and this is what this release is all about: Increased performance for heavy usage by up to **400%** [sic!] and increased overall performance for any command as well. Please check the benchmarks in the [README.md](README.md) for further details. + +Features + +- Added rename_commands options to handle renamed commands from the redis config ([@digmxl](https://github.com/digmxl) & [@BridgeAR](https://github.com/BridgeAR)) +- Added disable_resubscribing option to prevent a client from resubscribing after reconnecting ([@BridgeAR](https://github.com/BridgeAR)) +- Increased performance ([@BridgeAR](https://github.com/BridgeAR)) + - exchanging built in queue with [@petkaantonov](https://github.com/petkaantonov)'s [double-ended queue](https://github.com/petkaantonov/deque) + - prevent polymorphism + - optimize statements +- Added *.batch* command, similar to .multi but without transaction ([@BridgeAR](https://github.com/BridgeAR)) +- Improved pipelining to minimize the [RTT](http://redis.io/topics/pipelining) further ([@BridgeAR](https://github.com/BridgeAR)) + +Bugfixes + +- Fixed a javascript parser regression introduced in 2.0 that could result in timeouts on high load. ([@BridgeAR](https://github.com/BridgeAR)) + - I was not able to write a regression test for this, since the error seems to only occur under heavy load with special conditions. So please have a look for timeouts with the js parser, if you use it and report all issues and switch to the hiredis parser in the meanwhile. If you're able to come up with a reproducable test case, this would be even better :) +- Fixed should_buffer boolean for .exec, .select and .auth commands not being returned and fix a couple special conditions ([@BridgeAR](https://github.com/BridgeAR)) + +If you do not rely on transactions but want to reduce the RTT you can use .batch from now on. It'll behave just the same as .multi but it does not have any transaction and therefor won't roll back any failed commands.
        +Both .multi and .batch are from now on going to cache the commands and release them while calling .exec. + +Please consider using .batch instead of looping through a lot of commands one by one. This will significantly improve your performance. + +Here are some stats compared to ioredis 1.9.1 (Lenovo T450s i7-5600U): + + simple set + 82,496 op/s » ioredis + 112,617 op/s » node_redis + + simple get + 82,015 op/s » ioredis + 105,701 op/s » node_redis + + simple get with pipeline + 10,233 op/s » ioredis + 26,541 op/s » node_redis (using .batch) + + lrange 100 + 7,321 op/s » ioredis + 26,155 op/s » node_redis + + publish + 90,524 op/s » ioredis + 112,823 op/s » node_redis + + subscribe + 43,783 op/s » ioredis + 61,889 op/s » node_redis + +To conclude: we can proudly say that node_redis is very likely outperforming any other node redis client. + +Known issues + +- The pub sub system has some flaws and those will be addressed in the next minor release + +## v2.1.0 - Oct 02, 2015 + +Features: + +- Addded optional flush parameter to `.end`. If set to true, commands fired after using .end are going to be rejected instead of being ignored. (@crispy1989) +- Addded: host and port can now be provided in a single options object. E.g. redis.createClient({ host: 'localhost', port: 1337, max_attempts: 5 }); (@BridgeAR) +- Speedup common cases (@BridgeAR) + +Bugfixes: + +- Fix argument mutation while using the array notation with the multi constructor (@BridgeAR) +- Fix multi.hmset key not being type converted if used with an object and key not being a string (@BridgeAR) +- Fix parser errors not being catched properly (@BridgeAR) +- Fix a crash that could occur if a redis server does not return the info command as usual #541 (@BridgeAR) +- Explicitly passing undefined as a callback statement will work again. E.g. client.publish('channel', 'message', undefined); (@BridgeAR) + +## v2.0.1 - Sep 24, 2015 + +Bugfixes: + +- Fix argument mutation while using the array notation in combination with keys / callbacks ([#866](.)). (@BridgeAR) + +## v2.0.0 - Sep 21, 2015 + +This is the biggest release that node_redis had since it was released in 2010. A long list of outstanding bugs has been fixed, so we are very happy to present you redis 2.0 and we highly recommend updating as soon as possible. + +# What's new in 2.0 + +- Implemented a "connection is broken" mode if no connection could be established +- node_redis no longer throws under any circumstances, preventing it from terminating applications. +- Multi error handling is now working properly +- Consistent command behavior including multi +- Windows support +- Improved performance +- A lot of code cleanup +- Many bug fixes +- Better user support! + +## Features: + +- Added a "redis connection is broken" mode after reaching max connection attempts / exceeding connection timeout. (@BridgeAR) +- Added NODE_DEBUG=redis env to activate the debug_mode (@BridgeAR) +- Added a default connection timeout of 24h instead of never timing out as a default (@BridgeAR) +- Added: Network errors and other stream errors will from now on include the error code as `err.code` property (@BridgeAR) +- Added: Errors thrown by redis will now include the redis error code as `err.code` property. (@skeggse & @BridgeAR) +- Added: Errors thrown by node_redis will now include a `err.command` property for the command used (@BridgeAR) +- Added new commands and drop support for deprecated *substr* (@BridgeAR) +- Added new possibilities how to provide the command arguments (@BridgeAR) +- The entries in the keyspace of the server_info is now an object instead of a string. (@SinisterLight & @BridgeAR) +- Small speedup here and there (e.g. by not using .toLowerCase() anymore) (@BridgeAR) +- Full windows support (@bcoe) +- Increased coverage by 10% and add a lot of tests to make sure everything works as it should. We now reached 97% :-) (@BridgeAR) +- Remove dead code, clean up and refactor very old chunks (@BridgeAR) +- Don't flush the offline queue if reconnecting (@BridgeAR) +- Emit all errors insteaf of throwing sometimes and sometimes emitting them (@BridgeAR) +- *auth_pass* passwords are now checked to be a valid password (@jcppman & @BridgeAR) + +## Bug fixes: + +- Don't kill the app anymore by randomly throwing errors sync instead of emitting them (@BridgeAR) +- Don't catch user errors anymore occuring in callbacks (no try callback anymore & more fixes for the parser) (@BridgeAR) +- Early garbage collection of queued items (@dohse) +- Fix js parser returning errors as strings (@BridgeAR) +- Do not wrap errors into other errors (@BridgeAR) +- Authentication failures are now returned in the callback instead of being emitted (@BridgeAR) +- Fix a memory leak on reconnect (@rahar) +- Using `send_command` directly may now also be called without the args as stated in the [README.md](./README.md) (@BridgeAR) +- Fix the multi.exec error handling (@BridgeAR) +- Fix commands being inconsistent and behaving wrong (@BridgeAR) +- Channel names with spaces are now properly resubscribed after a reconnection (@pbihler) +- Do not try to reconnect after the connection timeout has been exceeded (@BridgeAR) +- Ensure the execution order is observed if using .eval (@BridgeAR) +- Fix commands not being rejected after calling .quit (@BridgeAR) +- Fix .auth calling the callback twice if already connected (@BridgeAR) +- Fix detect_buffers not working in pub sub mode and while monitoring (@BridgeAR) +- Fix channel names always being strings instead of buffers while return_buffers is true (@BridgeAR) +- Don't print any debug statements if not asked for (@BridgeAR) +- Fix a couple small other bugs + +## Breaking changes: + +1. redis.send_command commands have to be lower case from now on. This does only apply if you use `.send_command` directly instead of the convenient methods like `redis.command`. +2. Error messages have changed quite a bit. If you depend on a specific wording please check your application carfully. +3. Errors are from now on always either returned if a callback is present or emitted. They won't be thrown (neither sync, nor async). +4. The Multi error handling has changed a lot! + - All errors are from now on errors instead of strings (this only applied to the js parser). + - If an error occurs while queueing the commands an EXECABORT error will be returned including the failed commands as `.errors` property instead of an array with errors. + - If an error occurs while executing the commands and that command has a callback it'll return the error as first parameter (`err, undefined` instead of `null, undefined`). + - All the errors occuring while executing the commands will stay in the result value as error instance (if you used the js parser before they would have been strings). Be aware that the transaction won't be aborted if those error occurr! + - If `multi.exec` does not have a callback and an EXECABORT error occurrs, it'll emit that error instead. +5. If redis can't connect to your redis server it'll give up after a certain point of failures (either max connection attempts or connection timeout exceeded). If that is the case it'll emit an CONNECTION_BROKEN error. You'll have to initiate a new client to try again afterwards. +6. The offline queue is not flushed anymore on a reconnect. It'll stay until node_redis gives up trying to reach the server or until you close the connection. +7. Before this release node_redis catched user errors and threw them async back. This is not the case anymore! No user behavior of what so ever will be tracked or catched. +8. The keyspace of `redis.server_info` (db0...) is from now on an object instead of an string. + +NodeRedis also thanks @qdb, @tobek, @cvibhagool, @frewsxcv, @davidbanham, @serv, @vitaliylag, @chrishamant, @GamingCoder and all other contributors that I may have missed for their contributions! + +From now on we'll push new releases more frequently out and fix further long outstanding things and implement new features. + +
        + +## v1.0.0 - Aug 30, 2015 + +* Huge issue and pull-request cleanup. Thanks Blain! (@blainsmith) +* [#658](https://github.com/NodeRedis/node_redis/pull/658) Client now parses URL-format connection strings (e.g., redis://foo:pass@127.0.0.1:8080) (@kuwabarahiroshi) +* [#749](https://github.com/NodeRedis/node_redis/pull/749) Fix reconnection bug when client is in monitoring mode (@danielbprice) +* [#786](https://github.com/NodeRedis/node_redis/pull/786) Refactor createClient. Fixes #651 (@BridgeAR) +* [#793](https://github.com/NodeRedis/node_redis/pull/793) Refactor tests and improve test coverage (@erinspice, @bcoe) +* [#733](https://github.com/NodeRedis/node_redis/pull/733) Fixes detect_buffers functionality in the context of exec. Fixes #732, #263 (@raydog) +* [#785](https://github.com/NodeRedis/node_redis/pull/785) Tiny speedup by using 'use strict' (@BridgeAR) +* Fix extraneous error output due to pubsub tests (Mikael Kohlmyr) + +## v0.12.1 - Aug 10, 2014 +* Fix IPv6/IPv4 family selection in node 0.11+ (Various) + +## v0.12.0 - Aug 9, 2014 +* Fix unix socket support (Jack Tang) +* Improve createClient argument handling (Jack Tang) + +## v0.11.0 - Jul 10, 2014 + +* IPv6 Support. (Yann Stephan) +* Revert error emitting and go back to throwing errors. (Bryce Baril) +* Set socket_keepalive to prevent long-lived client timeouts. (mohit) +* Correctly reset retry timer. (ouotuo) +* Domains protection from bad user exit. (Jake Verbaten) +* Fix reconnection socket logic to prevent misqueued entries. (Iain Proctor) + +## v0.10.3 - May 22, 2014 + +* Update command list to match Redis 2.8.9 (Charles Feng) + +## v0.10.2 - May 18, 2014 + +* Better binary key handling for HGETALL. (Nick Apperson) +* Fix test not resetting `error` handler. (CrypticSwarm) +* Fix SELECT error semantics. (Bryan English) + +## v0.10.1 - February 17, 2014 + +* Skip plucking redis version from the INFO stream if INFO results weren't provided. (Robert Sköld) + +## v0.10.0 - December 21, 2013 + +* Instead of throwing errors asynchronously, emit errors on client. (Bryce Baril) + +## v0.9.2 - December 15, 2013 + +* Regenerate commands for new 2.8.x Redis commands. (Marek Ventur) +* Correctly time reconnect counts when using 'auth'. (William Hockey) + +## v0.9.1 - November 23, 2013 + +* Allow hmset to accept numeric keys. (Alex Stokes) +* Fix TypeError for multiple MULTI/EXEC errors. (Kwangsu Kim) + +## v0.9.0 - October 17, 2013 + +* Domains support. (Forrest L Norvell) + +## v0.8.6 - October 2, 2013 + +* If error is already an Error, don't wrap it in another Error. (Mathieu M-Gosselin) +* Fix retry delay logic (Ian Babrou) +* Return Errors instead of strings where Errors are expected (Ian Babrou) +* Add experimental `.unref()` method to RedisClient (Bryce Baril / Olivier Lalonde) +* Strengthen checking of reply to prevent conflating "message" or "pmessage" fields with pub_sub replies. (Bryce Baril) + +## v0.8.5 - September 26, 2013 + +* Add `auth_pass` option to connect and immediately authenticate (Henrik Peinar) + +## v0.8.4 - June 24, 2013 + +Many contributed features and fixes, including: +* Ignore password set if not needed. (jbergknoff) +* Improved compatibility with 0.10.X for tests and client.end() (Bryce Baril) +* Protect connection retries from application exceptions. (Amos Barreto) +* Better exception handling for Multi/Exec (Thanasis Polychronakis) +* Renamed pubsub mode to subscriber mode (Luke Plaster) +* Treat SREM like SADD when passed an array (Martin Ciparelli) +* Fix empty unsub/punsub TypeError (Jeff Barczewski) +* Only attempt to run a callback if it one was provided (jifeng) + +## v0.8.3 - April 09, 2013 + +Many contributed features and fixes, including: +* Fix some tests for Node.js version 0.9.x+ changes (Roman Ivanilov) +* Fix error when commands submitted after idle event handler (roamm) +* Bypass Redis for no-op SET/SETEX commands (jifeng) +* Fix HMGET + detect_buffers (Joffrey F) +* Fix CLIENT LOAD functionality (Jonas Dohse) +* Add percentage outputs to diff_multi_bench_output.js (Bryce Baril) +* Add retry_max_delay option (Tomasz Durka) +* Fix parser off-by-one errors with nested multi-bulk replies (Bryce Baril) +* Prevent parser from sinking application-side exceptions (Bryce Baril) +* Fix parser incorrect buffer skip when parsing multi-bulk errors (Bryce Baril) +* Reverted previous change with throwing on non-string values with HMSET (David Trejo) +* Fix command queue sync issue when using pubsub (Tom Leach) +* Fix compatibility with two-word Redis commands (Jonas Dohse) +* Add EVAL with array syntax (dmoena) +* Fix tests due to Redis reply order changes in 2.6.5+ (Bryce Baril) +* Added a test for the SLOWLOG command (Nitesh Sinha) +* Fix SMEMBERS order dependency in test broken by Redis changes (Garrett Johnson) +* Update commands for new Redis commands (David Trejo) +* Prevent exception from SELECT on subscriber reconnection (roamm) + + +## v0.8.2 - November 11, 2012 + +Another version bump because 0.8.1 didn't get applied properly for some mysterious reason. +Sorry about that. + +Changed name of "faster" parser to "javascript". + +## v0.8.1 - September 11, 2012 + +Important bug fix for null responses (Jerry Sievert) + +## v0.8.0 - September 10, 2012 + +Many contributed features and fixes, including: + +* Pure JavaScript reply parser that is usually faster than hiredis (Jerry Sievert) +* Remove hiredis as optionalDependency from package.json. It still works if you want it. +* Restore client state on reconnect, including select, subscribe, and monitor. (Ignacio Burgueño) +* Fix idle event (Trae Robrock) +* Many documentation improvements and bug fixes (David Trejo) + +## v0.7.2 - April 29, 2012 + +Many contributed fixes. Thank you, contributors. + +* [GH-190] - pub/sub mode fix (Brian Noguchi) +* [GH-165] - parser selection fix (TEHEK) +* numerous documentation and examples updates +* auth errors emit Errors instead of Strings (David Trejo) + +## v0.7.1 - November 15, 2011 + +Fix regression in reconnect logic. + +Very much need automated tests for reconnection and queue logic. + +## v0.7.0 - November 14, 2011 + +Many contributed fixes. Thanks everybody. + +* [GH-127] - properly re-initialize parser on reconnect +* [GH-136] - handle passing undefined as callback (Ian Babrou) +* [GH-139] - properly handle exceptions thrown in pub/sub event handlers (Felix Geisendörfer) +* [GH-141] - detect closing state on stream error (Felix Geisendörfer) +* [GH-142] - re-select database on reconnection (Jean-Hugues Pinson) +* [GH-146] - add sort example (Maksim Lin) + +Some more goodies: + +* Fix bugs with node 0.6 +* Performance improvements +* New version of `multi_bench.js` that tests more realistic scenarios +* [GH-140] - support optional callback for subscribe commands +* Properly flush and error out command queue when connection fails +* Initial work on reconnection thresholds + +## v0.6.7 - July 30, 2011 + +(accidentally skipped v0.6.6) + +Fix and test for [GH-123] + +Passing an Array as as the last argument should expand as users +expect. The old behavior was to coerce the arguments into Strings, +which did surprising things with Arrays. + +## v0.6.5 - July 6, 2011 + +Contributed changes: + +* Support SlowBuffers (Umair Siddique) +* Add Multi to exports (Louis-Philippe Perron) +* Fix for drain event calculation (Vladimir Dronnikov) + +Thanks! + +## v0.6.4 - June 30, 2011 + +Fix bug with optional callbacks for hmset. + +## v0.6.2 - June 30, 2011 + +Bugs fixed: + +* authentication retry while server is loading db (danmaz74) [GH-101] +* command arguments processing issue with arrays + +New features: + +* Auto update of new commands from redis.io (Dave Hoover) +* Performance improvements and backpressure controls. +* Commands now return the true/false value from the underlying socket write(s). +* Implement command_queue high water and low water for more better control of queueing. + +See `examples/backpressure_drain.js` for more information. + +## v0.6.1 - June 29, 2011 + +Add support and tests for Redis scripting through EXEC command. + +Bug fix for monitor mode. (forddg) + +Auto update of new commands from redis.io (Dave Hoover) + +## v0.6.0 - April 21, 2011 + +Lots of bugs fixed. + +* connection error did not properly trigger reconnection logic [GH-85] +* client.hmget(key, [val1, val2]) was not expanding properly [GH-66] +* client.quit() while in pub/sub mode would throw an error [GH-87] +* client.multi(['hmset', 'key', {foo: 'bar'}]) fails [GH-92] +* unsubscribe before subscribe would make things very confused [GH-88] +* Add BRPOPLPUSH [GH-79] + +## v0.5.11 - April 7, 2011 + +Added DISCARD + +I originally didn't think DISCARD would do anything here because of the clever MULTI interface, but somebody +pointed out to me that DISCARD can be used to flush the WATCH set. + +## v0.5.10 - April 6, 2011 + +Added HVALS + +## v0.5.9 - March 14, 2011 + +Fix bug with empty Array arguments - Andy Ray + +## v0.5.8 - March 14, 2011 + +Add `MONITOR` command and special monitor command reply parsing. + +## v0.5.7 - February 27, 2011 + +Add magical auth command. + +Authentication is now remembered by the client and will be automatically sent to the server +on every connection, including any reconnections. + +## v0.5.6 - February 22, 2011 + +Fix bug in ready check with `return_buffers` set to `true`. + +Thanks to Dean Mao and Austin Chau. + +## v0.5.5 - February 16, 2011 + +Add probe for server readiness. + +When a Redis server starts up, it might take a while to load the dataset into memory. +During this time, the server will accept connections, but will return errors for all non-INFO +commands. Now node_redis will send an INFO command whenever it connects to a server. +If the info command indicates that the server is not ready, the client will keep trying until +the server is ready. Once it is ready, the client will emit a "ready" event as well as the +"connect" event. The client will queue up all commands sent before the server is ready, just +like it did before. When the server is ready, all offline/non-ready commands will be replayed. +This should be backward compatible with previous versions. + +To disable this ready check behavior, set `options.no_ready_check` when creating the client. + +As a side effect of this change, the key/val params from the info command are available as +`client.server_options`. Further, the version string is decomposed into individual elements +in `client.server_options.versions`. + +## v0.5.4 - February 11, 2011 + +Fix excess memory consumption from Queue backing store. + +Thanks to Gustaf Sjöberg. + +## v0.5.3 - February 5, 2011 + +Fix multi/exec error reply callback logic. + +Thanks to Stella Laurenzo. + +## v0.5.2 - January 18, 2011 + +Fix bug where unhandled error replies confuse the parser. + +## v0.5.1 - January 18, 2011 + +Fix bug where subscribe commands would not handle redis-server startup error properly. + +## v0.5.0 - December 29, 2010 + +Some bug fixes: + +* An important bug fix in reconnection logic. Previously, reply callbacks would be invoked twice after + a reconnect. +* Changed error callback argument to be an actual Error object. + +New feature: + +* Add friendly syntax for HMSET using an object. + +## v0.4.1 - December 8, 2010 + +Remove warning about missing hiredis. You probably do want it though. + +## v0.4.0 - December 5, 2010 + +Support for multiple response parsers and hiredis C library from Pieter Noordhuis. +Return Strings instead of Buffers by default. +Empty nested mb reply bug fix. + +## v0.3.9 - November 30, 2010 + +Fix parser bug on failed EXECs. + +## v0.3.8 - November 10, 2010 + +Fix for null MULTI response when WATCH condition fails. + +## v0.3.7 - November 9, 2010 + +Add "drain" and "idle" events. + +## v0.3.6 - November 3, 2010 + +Add all known Redis commands from Redis master, even ones that are coming in 2.2 and beyond. + +Send a friendlier "error" event message on stream errors like connection refused / reset. + +## v0.3.5 - October 21, 2010 + +A few bug fixes. + +* Fixed bug with `nil` multi-bulk reply lengths that showed up with `BLPOP` timeouts. +* Only emit `end` once when connection goes away. +* Fixed bug in `test.js` where driver finished before all tests completed. + +## unversioned wasteland + +See the git history for what happened before. diff --git a/nodejs/node_modules/redis/index.js b/nodejs/node_modules/redis/index.js new file mode 100755 index 0000000..58fcf84 --- /dev/null +++ b/nodejs/node_modules/redis/index.js @@ -0,0 +1,1105 @@ +'use strict'; + +var net = require('net'); +var tls = require('tls'); +var util = require('util'); +var utils = require('./lib/utils'); +var Command = require('./lib/command'); +var Queue = require('double-ended-queue'); +var errorClasses = require('./lib/customErrors'); +var EventEmitter = require('events'); +var Parser = require('redis-parser'); +var commands = require('redis-commands'); +var debug = require('./lib/debug'); +var unifyOptions = require('./lib/createClient'); +var SUBSCRIBE_COMMANDS = { + subscribe: true, + unsubscribe: true, + psubscribe: true, + punsubscribe: true +}; + +// Newer Node.js versions > 0.10 return the EventEmitter right away and using .EventEmitter was deprecated +if (typeof EventEmitter !== 'function') { + EventEmitter = EventEmitter.EventEmitter; +} + +function noop () {} + +function handle_detect_buffers_reply (reply, command, buffer_args) { + if (buffer_args === false || this.message_buffers) { + // If detect_buffers option was specified, then the reply from the parser will be a buffer. + // If this command did not use Buffer arguments, then convert the reply to Strings here. + reply = utils.reply_to_strings(reply); + } + + if (command === 'hgetall') { + reply = utils.reply_to_object(reply); + } + return reply; +} + +exports.debug_mode = /\bredis\b/i.test(process.env.NODE_DEBUG); + +// Attention: The second parameter might be removed at will and is not officially supported. +// Do not rely on this +function RedisClient (options, stream) { + // Copy the options so they are not mutated + options = utils.clone(options); + EventEmitter.call(this); + var cnx_options = {}; + var self = this; + /* istanbul ignore next: travis does not work with stunnel atm. Therefore the tls tests are skipped on travis */ + for (var tls_option in options.tls) { + cnx_options[tls_option] = options.tls[tls_option]; + // Copy the tls options into the general options to make sure the address is set right + if (tls_option === 'port' || tls_option === 'host' || tls_option === 'path' || tls_option === 'family') { + options[tls_option] = options.tls[tls_option]; + } + } + if (stream) { + // The stream from the outside is used so no connection from this side is triggered but from the server this client should talk to + // Reconnect etc won't work with this. This requires monkey patching to work, so it is not officially supported + options.stream = stream; + this.address = '"Private stream"'; + } else if (options.path) { + cnx_options.path = options.path; + this.address = options.path; + } else { + cnx_options.port = +options.port || 6379; + cnx_options.host = options.host || '127.0.0.1'; + cnx_options.family = (!options.family && net.isIP(cnx_options.host)) || (options.family === 'IPv6' ? 6 : 4); + this.address = cnx_options.host + ':' + cnx_options.port; + } + // Warn on misusing deprecated functions + if (typeof options.retry_strategy === 'function') { + if ('max_attempts' in options) { + self.warn('WARNING: You activated the retry_strategy and max_attempts at the same time. This is not possible and max_attempts will be ignored.'); + // Do not print deprecation warnings twice + delete options.max_attempts; + } + if ('retry_max_delay' in options) { + self.warn('WARNING: You activated the retry_strategy and retry_max_delay at the same time. This is not possible and retry_max_delay will be ignored.'); + // Do not print deprecation warnings twice + delete options.retry_max_delay; + } + } + + this.connection_options = cnx_options; + this.connection_id = RedisClient.connection_id++; + this.connected = false; + this.ready = false; + if (options.socket_nodelay === undefined) { + options.socket_nodelay = true; + } else if (!options.socket_nodelay) { // Only warn users with this set to false + self.warn( + 'socket_nodelay is deprecated and will be removed in v.3.0.0.\n' + + 'Setting socket_nodelay to false likely results in a reduced throughput. Please use .batch for pipelining instead.\n' + + 'If you are sure you rely on the NAGLE-algorithm you can activate it by calling client.stream.setNoDelay(false) instead.' + ); + } + if (options.socket_keepalive === undefined) { + options.socket_keepalive = true; + } + for (var command in options.rename_commands) { + options.rename_commands[command.toLowerCase()] = options.rename_commands[command]; + } + options.return_buffers = !!options.return_buffers; + options.detect_buffers = !!options.detect_buffers; + // Override the detect_buffers setting if return_buffers is active and print a warning + if (options.return_buffers && options.detect_buffers) { + self.warn('WARNING: You activated return_buffers and detect_buffers at the same time. The return value is always going to be a buffer.'); + options.detect_buffers = false; + } + if (options.detect_buffers) { + // We only need to look at the arguments if we do not know what we have to return + this.handle_reply = handle_detect_buffers_reply; + } + this.should_buffer = false; + this.max_attempts = options.max_attempts | 0; + if ('max_attempts' in options) { + self.warn( + 'max_attempts is deprecated and will be removed in v.3.0.0.\n' + + 'To reduce the number of options and to improve the reconnection handling please use the new `retry_strategy` option instead.\n' + + 'This replaces the max_attempts and retry_max_delay option.' + ); + } + this.command_queue = new Queue(); // Holds sent commands to de-pipeline them + this.offline_queue = new Queue(); // Holds commands issued but not able to be sent + this.pipeline_queue = new Queue(); // Holds all pipelined commands + // ATTENTION: connect_timeout should change in v.3.0 so it does not count towards ending reconnection attempts after x seconds + // This should be done by the retry_strategy. Instead it should only be the timeout for connecting to redis + this.connect_timeout = +options.connect_timeout || 3600000; // 60 * 60 * 1000 ms + this.enable_offline_queue = options.enable_offline_queue === false ? false : true; + this.retry_max_delay = +options.retry_max_delay || null; + if ('retry_max_delay' in options) { + self.warn( + 'retry_max_delay is deprecated and will be removed in v.3.0.0.\n' + + 'To reduce the amount of options and the improve the reconnection handling please use the new `retry_strategy` option instead.\n' + + 'This replaces the max_attempts and retry_max_delay option.' + ); + } + this.initialize_retry_vars(); + this.pub_sub_mode = 0; + this.subscription_set = {}; + this.monitoring = false; + this.message_buffers = false; + this.closing = false; + this.server_info = {}; + this.auth_pass = options.auth_pass || options.password; + this.selected_db = options.db; // Save the selected db here, used when reconnecting + this.old_state = null; + this.fire_strings = true; // Determine if strings or buffers should be written to the stream + this.pipeline = false; + this.sub_commands_left = 0; + this.times_connected = 0; + this.buffers = options.return_buffers || options.detect_buffers; + this.options = options; + this.reply = 'ON'; // Returning replies is the default + this.create_stream(); + // The listeners will not be attached right away, so let's print the deprecation message while the listener is attached + this.on('newListener', function (event) { + if (event === 'idle') { + this.warn( + 'The idle event listener is deprecated and will likely be removed in v.3.0.0.\n' + + 'If you rely on this feature please open a new ticket in node_redis with your use case' + ); + } else if (event === 'drain') { + this.warn( + 'The drain event listener is deprecated and will be removed in v.3.0.0.\n' + + 'If you want to keep on listening to this event please listen to the stream drain event directly.' + ); + } else if ((event === 'message_buffer' || event === 'pmessage_buffer' || event === 'messageBuffer' || event === 'pmessageBuffer') && !this.buffers && !this.message_buffers) { + if (this.reply_parser.name !== 'javascript') { + return this.warn( + 'You attached the "' + event + '" listener without the returnBuffers option set to true.\n' + + 'Please use the JavaScript parser or set the returnBuffers option to true to return buffers.' + ); + } + this.reply_parser.optionReturnBuffers = true; + this.message_buffers = true; + this.handle_reply = handle_detect_buffers_reply; + } + }); +} +util.inherits(RedisClient, EventEmitter); + +RedisClient.connection_id = 0; + +function create_parser (self) { + return new Parser({ + returnReply: function (data) { + self.return_reply(data); + }, + returnError: function (err) { + // Return a ReplyError to indicate Redis returned an error + self.return_error(err); + }, + returnFatalError: function (err) { + // Error out all fired commands. Otherwise they might rely on faulty data. We have to reconnect to get in a working state again + // Note: the execution order is important. First flush and emit, then create the stream + err.message += '. Please report this.'; + self.ready = false; + self.flush_and_error({ + message: 'Fatal error encountert. Command aborted.', + code: 'NR_FATAL' + }, { + error: err, + queues: ['command_queue'] + }); + self.emit('error', err); + self.create_stream(); + }, + returnBuffers: self.buffers || self.message_buffers, + name: self.options.parser || 'javascript', + stringNumbers: self.options.string_numbers || false + }); +} + +/****************************************************************************** + + All functions in here are internal besides the RedisClient constructor + and the exported functions. Don't rely on them as they will be private + functions in node_redis v.3 + +******************************************************************************/ + +// Attention: the function name "create_stream" should not be changed, as other libraries need this to mock the stream (e.g. fakeredis) +RedisClient.prototype.create_stream = function () { + var self = this; + + // Init parser + this.reply_parser = create_parser(this); + + if (this.options.stream) { + // Only add the listeners once in case of a reconnect try (that won't work) + if (this.stream) { + return; + } + this.stream = this.options.stream; + } else { + // On a reconnect destroy the former stream and retry + if (this.stream) { + this.stream.removeAllListeners(); + this.stream.destroy(); + } + + /* istanbul ignore if: travis does not work with stunnel atm. Therefore the tls tests are skipped on travis */ + if (this.options.tls) { + this.stream = tls.connect(this.connection_options); + } else { + this.stream = net.createConnection(this.connection_options); + } + } + + if (this.options.connect_timeout) { + this.stream.setTimeout(this.connect_timeout, function () { + // Note: This is only tested if a internet connection is established + self.retry_totaltime = self.connect_timeout; + self.connection_gone('timeout'); + }); + } + + /* istanbul ignore next: travis does not work with stunnel atm. Therefore the tls tests are skipped on travis */ + var connect_event = this.options.tls ? 'secureConnect' : 'connect'; + this.stream.once(connect_event, function () { + this.removeAllListeners('timeout'); + self.times_connected++; + self.on_connect(); + }); + + this.stream.on('data', function (buffer_from_socket) { + // The buffer_from_socket.toString() has a significant impact on big chunks and therefore this should only be used if necessary + debug('Net read ' + self.address + ' id ' + self.connection_id); // + ': ' + buffer_from_socket.toString()); + self.reply_parser.execute(buffer_from_socket); + self.emit_idle(); + }); + + this.stream.on('error', function (err) { + self.on_error(err); + }); + + /* istanbul ignore next: difficult to test and not important as long as we keep this listener */ + this.stream.on('clientError', function (err) { + debug('clientError occured'); + self.on_error(err); + }); + + this.stream.once('close', function (hadError) { + self.connection_gone('close'); + }); + + this.stream.once('end', function () { + self.connection_gone('end'); + }); + + this.stream.on('drain', function () { + self.drain(); + }); + + if (this.options.socket_nodelay) { + this.stream.setNoDelay(); + } + + // Fire the command before redis is connected to be sure it's the first fired command + if (this.auth_pass !== undefined) { + this.ready = true; + // Fail silently as we might not be able to connect + this.auth(this.auth_pass, function (err) { + if (err && err.code !== 'UNCERTAIN_STATE') { + self.emit('error', err); + } + }); + this.ready = false; + } +}; + +RedisClient.prototype.handle_reply = function (reply, command) { + if (command === 'hgetall') { + reply = utils.reply_to_object(reply); + } + return reply; +}; + +RedisClient.prototype.cork = noop; +RedisClient.prototype.uncork = noop; + +RedisClient.prototype.initialize_retry_vars = function () { + this.retry_timer = null; + this.retry_totaltime = 0; + this.retry_delay = 200; + this.retry_backoff = 1.7; + this.attempts = 1; +}; + +RedisClient.prototype.warn = function (msg) { + var self = this; + // Warn on the next tick. Otherwise no event listener can be added + // for warnings that are emitted in the redis client constructor + process.nextTick(function () { + if (self.listeners('warning').length !== 0) { + self.emit('warning', msg); + } else { + console.warn('node_redis:', msg); + } + }); +}; + +// Flush provided queues, erroring any items with a callback first +RedisClient.prototype.flush_and_error = function (error_attributes, options) { + options = options || {}; + var aggregated_errors = []; + var queue_names = options.queues || ['command_queue', 'offline_queue']; // Flush the command_queue first to keep the order intakt + for (var i = 0; i < queue_names.length; i++) { + // If the command was fired it might have been processed so far + if (queue_names[i] === 'command_queue') { + error_attributes.message += ' It might have been processed.'; + } else { // As the command_queue is flushed first, remove this for the offline queue + error_attributes.message = error_attributes.message.replace(' It might have been processed.', ''); + } + // Don't flush everything from the queue + for (var command_obj = this[queue_names[i]].shift(); command_obj; command_obj = this[queue_names[i]].shift()) { + var err = new errorClasses.AbortError(error_attributes); + if (command_obj.error) { + err.stack = err.stack + command_obj.error.stack.replace(/^Error.*?\n/, '\n'); + } + err.command = command_obj.command.toUpperCase(); + if (command_obj.args && command_obj.args.length) { + err.args = command_obj.args; + } + if (options.error) { + err.origin = options.error; + } + if (typeof command_obj.callback === 'function') { + command_obj.callback(err); + } else { + aggregated_errors.push(err); + } + } + } + // Currently this would be a breaking change, therefore it's only emitted in debug_mode + if (exports.debug_mode && aggregated_errors.length) { + var error; + if (aggregated_errors.length === 1) { + error = aggregated_errors[0]; + } else { + error_attributes.message = error_attributes.message.replace('It', 'They').replace(/command/i, '$&s'); + error = new errorClasses.AggregateError(error_attributes); + error.errors = aggregated_errors; + } + this.emit('error', error); + } +}; + +RedisClient.prototype.on_error = function (err) { + if (this.closing) { + return; + } + + err.message = 'Redis connection to ' + this.address + ' failed - ' + err.message; + debug(err.message); + this.connected = false; + this.ready = false; + + // Only emit the error if the retry_stategy option is not set + if (!this.options.retry_strategy) { + this.emit('error', err); + } + // 'error' events get turned into exceptions if they aren't listened for. If the user handled this error + // then we should try to reconnect. + this.connection_gone('error', err); +}; + +RedisClient.prototype.on_connect = function () { + debug('Stream connected ' + this.address + ' id ' + this.connection_id); + + this.connected = true; + this.ready = false; + this.emitted_end = false; + this.stream.setKeepAlive(this.options.socket_keepalive); + this.stream.setTimeout(0); + + this.emit('connect'); + this.initialize_retry_vars(); + + if (this.options.no_ready_check) { + this.on_ready(); + } else { + this.ready_check(); + } +}; + +RedisClient.prototype.on_ready = function () { + var self = this; + + debug('on_ready called ' + this.address + ' id ' + this.connection_id); + this.ready = true; + + this.cork = function () { + self.pipeline = true; + if (self.stream.cork) { + self.stream.cork(); + } + }; + this.uncork = function () { + if (self.fire_strings) { + self.write_strings(); + } else { + self.write_buffers(); + } + self.pipeline = false; + self.fire_strings = true; + if (self.stream.uncork) { + // TODO: Consider using next tick here. See https://github.com/NodeRedis/node_redis/issues/1033 + self.stream.uncork(); + } + }; + + // Restore modal commands from previous connection. The order of the commands is important + if (this.selected_db !== undefined) { + this.internal_send_command(new Command('select', [this.selected_db])); + } + if (this.monitoring) { // Monitor has to be fired before pub sub commands + this.internal_send_command(new Command('monitor', [])); + } + var callback_count = Object.keys(this.subscription_set).length; + if (!this.options.disable_resubscribing && callback_count) { + // only emit 'ready' when all subscriptions were made again + // TODO: Remove the countdown for ready here. This is not coherent with all other modes and should therefore not be handled special + // We know we are ready as soon as all commands were fired + var callback = function () { + callback_count--; + if (callback_count === 0) { + self.emit('ready'); + } + }; + debug('Sending pub/sub on_ready commands'); + for (var key in this.subscription_set) { + var command = key.slice(0, key.indexOf('_')); + var args = this.subscription_set[key]; + this[command]([args], callback); + } + this.send_offline_queue(); + return; + } + this.send_offline_queue(); + this.emit('ready'); +}; + +RedisClient.prototype.on_info_cmd = function (err, res) { + if (err) { + if (err.message === "ERR unknown command 'info'") { + this.on_ready(); + return; + } + err.message = 'Ready check failed: ' + err.message; + this.emit('error', err); + return; + } + + /* istanbul ignore if: some servers might not respond with any info data. This is just a safety check that is difficult to test */ + if (!res) { + debug('The info command returned without any data.'); + this.on_ready(); + return; + } + + if (!this.server_info.loading || this.server_info.loading === '0') { + // If the master_link_status exists but the link is not up, try again after 50 ms + if (this.server_info.master_link_status && this.server_info.master_link_status !== 'up') { + this.server_info.loading_eta_seconds = 0.05; + } else { + // Eta loading should change + debug('Redis server ready.'); + this.on_ready(); + return; + } + } + + var retry_time = +this.server_info.loading_eta_seconds * 1000; + if (retry_time > 1000) { + retry_time = 1000; + } + debug('Redis server still loading, trying again in ' + retry_time); + setTimeout(function (self) { + self.ready_check(); + }, retry_time, this); +}; + +RedisClient.prototype.ready_check = function () { + var self = this; + debug('Checking server ready state...'); + // Always fire this info command as first command even if other commands are already queued up + this.ready = true; + this.info(function (err, res) { + self.on_info_cmd(err, res); + }); + this.ready = false; +}; + +RedisClient.prototype.send_offline_queue = function () { + for (var command_obj = this.offline_queue.shift(); command_obj; command_obj = this.offline_queue.shift()) { + debug('Sending offline command: ' + command_obj.command); + this.internal_send_command(command_obj); + } + this.drain(); +}; + +var retry_connection = function (self, error) { + debug('Retrying connection...'); + + var reconnect_params = { + delay: self.retry_delay, + attempt: self.attempts, + error: error + }; + if (self.options.camel_case) { + reconnect_params.totalRetryTime = self.retry_totaltime; + reconnect_params.timesConnected = self.times_connected; + } else { + reconnect_params.total_retry_time = self.retry_totaltime; + reconnect_params.times_connected = self.times_connected; + } + self.emit('reconnecting', reconnect_params); + + self.retry_totaltime += self.retry_delay; + self.attempts += 1; + self.retry_delay = Math.round(self.retry_delay * self.retry_backoff); + self.create_stream(); + self.retry_timer = null; +}; + +RedisClient.prototype.connection_gone = function (why, error) { + // If a retry is already in progress, just let that happen + if (this.retry_timer) { + return; + } + error = error || null; + + debug('Redis connection is gone from ' + why + ' event.'); + this.connected = false; + this.ready = false; + // Deactivate cork to work with the offline queue + this.cork = noop; + this.uncork = noop; + this.pipeline = false; + this.pub_sub_mode = 0; + + // since we are collapsing end and close, users don't expect to be called twice + if (!this.emitted_end) { + this.emit('end'); + this.emitted_end = true; + } + + // If this is a requested shutdown, then don't retry + if (this.closing) { + debug('Connection ended by quit / end command, not retrying.'); + this.flush_and_error({ + message: 'Stream connection ended and command aborted.', + code: 'NR_CLOSED' + }, { + error: error + }); + return; + } + + if (typeof this.options.retry_strategy === 'function') { + var retry_params = { + attempt: this.attempts, + error: error + }; + if (this.options.camel_case) { + retry_params.totalRetryTime = this.retry_totaltime; + retry_params.timesConnected = this.times_connected; + } else { + retry_params.total_retry_time = this.retry_totaltime; + retry_params.times_connected = this.times_connected; + } + this.retry_delay = this.options.retry_strategy(retry_params); + if (typeof this.retry_delay !== 'number') { + // Pass individual error through + if (this.retry_delay instanceof Error) { + error = this.retry_delay; + } + this.flush_and_error({ + message: 'Stream connection ended and command aborted.', + code: 'NR_CLOSED' + }, { + error: error + }); + this.end(false); + return; + } + } + + if (this.max_attempts !== 0 && this.attempts >= this.max_attempts || this.retry_totaltime >= this.connect_timeout) { + var message = 'Redis connection in broken state: '; + if (this.retry_totaltime >= this.connect_timeout) { + message += 'connection timeout exceeded.'; + } else { + message += 'maximum connection attempts exceeded.'; + } + + this.flush_and_error({ + message: message, + code: 'CONNECTION_BROKEN', + }, { + error: error + }); + var err = new Error(message); + err.code = 'CONNECTION_BROKEN'; + if (error) { + err.origin = error; + } + this.emit('error', err); + this.end(false); + return; + } + + // Retry commands after a reconnect instead of throwing an error. Use this with caution + if (this.options.retry_unfulfilled_commands) { + this.offline_queue.unshift.apply(this.offline_queue, this.command_queue.toArray()); + this.command_queue.clear(); + } else if (this.command_queue.length !== 0) { + this.flush_and_error({ + message: 'Redis connection lost and command aborted.', + code: 'UNCERTAIN_STATE' + }, { + error: error, + queues: ['command_queue'] + }); + } + + if (this.retry_max_delay !== null && this.retry_delay > this.retry_max_delay) { + this.retry_delay = this.retry_max_delay; + } else if (this.retry_totaltime + this.retry_delay > this.connect_timeout) { + // Do not exceed the maximum + this.retry_delay = this.connect_timeout - this.retry_totaltime; + } + + debug('Retry connection in ' + this.retry_delay + ' ms'); + + this.retry_timer = setTimeout(retry_connection, this.retry_delay, this, error); +}; + +RedisClient.prototype.return_error = function (err) { + var command_obj = this.command_queue.shift(); + if (command_obj.error) { + err.stack = command_obj.error.stack.replace(/^Error.*?\n/, 'ReplyError: ' + err.message + '\n'); + } + err.command = command_obj.command.toUpperCase(); + if (command_obj.args && command_obj.args.length) { + err.args = command_obj.args; + } + + // Count down pub sub mode if in entering modus + if (this.pub_sub_mode > 1) { + this.pub_sub_mode--; + } + + var match = err.message.match(utils.err_code); + // LUA script could return user errors that don't behave like all other errors! + if (match) { + err.code = match[1]; + } + + utils.callback_or_emit(this, command_obj.callback, err); +}; + +RedisClient.prototype.drain = function () { + this.emit('drain'); + this.should_buffer = false; +}; + +RedisClient.prototype.emit_idle = function () { + if (this.command_queue.length === 0 && this.pub_sub_mode === 0) { + this.emit('idle'); + } +}; + +function normal_reply (self, reply) { + var command_obj = self.command_queue.shift(); + if (typeof command_obj.callback === 'function') { + if (command_obj.command !== 'exec') { + reply = self.handle_reply(reply, command_obj.command, command_obj.buffer_args); + } + command_obj.callback(null, reply); + } else { + debug('No callback for reply'); + } +} + +function subscribe_unsubscribe (self, reply, type) { + // Subscribe commands take an optional callback and also emit an event, but only the _last_ response is included in the callback + // The pub sub commands return each argument in a separate return value and have to be handled that way + var command_obj = self.command_queue.get(0); + var buffer = self.options.return_buffers || self.options.detect_buffers && command_obj.buffer_args; + var channel = (buffer || reply[1] === null) ? reply[1] : reply[1].toString(); + var count = +reply[2]; // Return the channel counter as number no matter if `string_numbers` is activated or not + debug(type, channel); + + // Emit first, then return the callback + if (channel !== null) { // Do not emit or "unsubscribe" something if there was no channel to unsubscribe from + self.emit(type, channel, count); + if (type === 'subscribe' || type === 'psubscribe') { + self.subscription_set[type + '_' + channel] = channel; + } else { + type = type === 'unsubscribe' ? 'subscribe' : 'psubscribe'; // Make types consistent + delete self.subscription_set[type + '_' + channel]; + } + } + + if (command_obj.args.length === 1 || self.sub_commands_left === 1 || command_obj.args.length === 0 && (count === 0 || channel === null)) { + if (count === 0) { // unsubscribed from all channels + var running_command; + var i = 1; + self.pub_sub_mode = 0; // Deactivating pub sub mode + // This should be a rare case and therefore handling it this way should be good performance wise for the general case + while (running_command = self.command_queue.get(i)) { + if (SUBSCRIBE_COMMANDS[running_command.command]) { + self.pub_sub_mode = i; // Entering pub sub mode again + break; + } + i++; + } + } + self.command_queue.shift(); + if (typeof command_obj.callback === 'function') { + // TODO: The current return value is pretty useless. + // Evaluate to change this in v.3 to return all subscribed / unsubscribed channels in an array including the number of channels subscribed too + command_obj.callback(null, channel); + } + self.sub_commands_left = 0; + } else { + if (self.sub_commands_left !== 0) { + self.sub_commands_left--; + } else { + self.sub_commands_left = command_obj.args.length ? command_obj.args.length - 1 : count; + } + } +} + +function return_pub_sub (self, reply) { + var type = reply[0].toString(); + if (type === 'message') { // channel, message + if (!self.options.return_buffers || self.message_buffers) { // backwards compatible. Refactor this in v.3 to always return a string on the normal emitter + self.emit('message', reply[1].toString(), reply[2].toString()); + self.emit('message_buffer', reply[1], reply[2]); + self.emit('messageBuffer', reply[1], reply[2]); + } else { + self.emit('message', reply[1], reply[2]); + } + } else if (type === 'pmessage') { // pattern, channel, message + if (!self.options.return_buffers || self.message_buffers) { // backwards compatible. Refactor this in v.3 to always return a string on the normal emitter + self.emit('pmessage', reply[1].toString(), reply[2].toString(), reply[3].toString()); + self.emit('pmessage_buffer', reply[1], reply[2], reply[3]); + self.emit('pmessageBuffer', reply[1], reply[2], reply[3]); + } else { + self.emit('pmessage', reply[1], reply[2], reply[3]); + } + } else { + subscribe_unsubscribe(self, reply, type); + } +} + +RedisClient.prototype.return_reply = function (reply) { + if (this.monitoring) { + var replyStr; + if (this.buffers && Buffer.isBuffer(reply)) { + replyStr = reply.toString(); + } else { + replyStr = reply; + } + // If in monitor mode, all normal commands are still working and we only want to emit the streamlined commands + if (typeof replyStr === 'string' && utils.monitor_regex.test(replyStr)) { + var timestamp = replyStr.slice(0, replyStr.indexOf(' ')); + var args = replyStr.slice(replyStr.indexOf('"') + 1, -1).split('" "').map(function (elem) { + return elem.replace(/\\"/g, '"'); + }); + this.emit('monitor', timestamp, args, replyStr); + return; + } + } + if (this.pub_sub_mode === 0) { + normal_reply(this, reply); + } else if (this.pub_sub_mode !== 1) { + this.pub_sub_mode--; + normal_reply(this, reply); + } else if (!(reply instanceof Array) || reply.length <= 2) { + // Only PING and QUIT are allowed in this context besides the pub sub commands + // Ping replies with ['pong', null|value] and quit with 'OK' + normal_reply(this, reply); + } else { + return_pub_sub(this, reply); + } +}; + +function handle_offline_command (self, command_obj) { + var command = command_obj.command; + var err, msg; + if (self.closing || !self.enable_offline_queue) { + command = command.toUpperCase(); + if (!self.closing) { + if (self.stream.writable) { + msg = 'The connection is not yet established and the offline queue is deactivated.'; + } else { + msg = 'Stream not writeable.'; + } + } else { + msg = 'The connection is already closed.'; + } + err = new errorClasses.AbortError({ + message: command + " can't be processed. " + msg, + code: 'NR_CLOSED', + command: command + }); + if (command_obj.args.length) { + err.args = command_obj.args; + } + utils.reply_in_order(self, command_obj.callback, err); + } else { + debug('Queueing ' + command + ' for next server connection.'); + self.offline_queue.push(command_obj); + } + self.should_buffer = true; +} + +// Do not call internal_send_command directly, if you are not absolutly certain it handles everything properly +// e.g. monitor / info does not work with internal_send_command only +RedisClient.prototype.internal_send_command = function (command_obj) { + var arg, prefix_keys; + var i = 0; + var command_str = ''; + var args = command_obj.args; + var command = command_obj.command; + var len = args.length; + var big_data = false; + var args_copy = new Array(len); + + if (process.domain && command_obj.callback) { + command_obj.callback = process.domain.bind(command_obj.callback); + } + + if (this.ready === false || this.stream.writable === false) { + // Handle offline commands right away + handle_offline_command(this, command_obj); + return false; // Indicate buffering + } + + for (i = 0; i < len; i += 1) { + if (typeof args[i] === 'string') { + // 30000 seemed to be a good value to switch to buffers after testing and checking the pros and cons + if (args[i].length > 30000) { + big_data = true; + args_copy[i] = new Buffer(args[i], 'utf8'); + } else { + args_copy[i] = args[i]; + } + } else if (typeof args[i] === 'object') { // Checking for object instead of Buffer.isBuffer helps us finding data types that we can't handle properly + if (args[i] instanceof Date) { // Accept dates as valid input + args_copy[i] = args[i].toString(); + } else if (args[i] === null) { + this.warn( + 'Deprecated: The ' + command.toUpperCase() + ' command contains a "null" argument.\n' + + 'This is converted to a "null" string now and will return an error from v.3.0 on.\n' + + 'Please handle this in your code to make sure everything works as you intended it to.' + ); + args_copy[i] = 'null'; // Backwards compatible :/ + } else if (Buffer.isBuffer(args[i])) { + args_copy[i] = args[i]; + command_obj.buffer_args = true; + big_data = true; + } else { + this.warn( + 'Deprecated: The ' + command.toUpperCase() + ' command contains a argument of type ' + args[i].constructor.name + '.\n' + + 'This is converted to "' + args[i].toString() + '" by using .toString() now and will return an error from v.3.0 on.\n' + + 'Please handle this in your code to make sure everything works as you intended it to.' + ); + args_copy[i] = args[i].toString(); // Backwards compatible :/ + } + } else if (typeof args[i] === 'undefined') { + this.warn( + 'Deprecated: The ' + command.toUpperCase() + ' command contains a "undefined" argument.\n' + + 'This is converted to a "undefined" string now and will return an error from v.3.0 on.\n' + + 'Please handle this in your code to make sure everything works as you intended it to.' + ); + args_copy[i] = 'undefined'; // Backwards compatible :/ + } else { + // Seems like numbers are converted fast using string concatenation + args_copy[i] = '' + args[i]; + } + } + + if (this.options.prefix) { + prefix_keys = commands.getKeyIndexes(command, args_copy); + for (i = prefix_keys.pop(); i !== undefined; i = prefix_keys.pop()) { + args_copy[i] = this.options.prefix + args_copy[i]; + } + } + if (this.options.rename_commands && this.options.rename_commands[command]) { + command = this.options.rename_commands[command]; + } + // Always use 'Multi bulk commands', but if passed any Buffer args, then do multiple writes, one for each arg. + // This means that using Buffers in commands is going to be slower, so use Strings if you don't already have a Buffer. + command_str = '*' + (len + 1) + '\r\n$' + command.length + '\r\n' + command + '\r\n'; + + if (big_data === false) { // Build up a string and send entire command in one write + for (i = 0; i < len; i += 1) { + arg = args_copy[i]; + command_str += '$' + Buffer.byteLength(arg) + '\r\n' + arg + '\r\n'; + } + debug('Send ' + this.address + ' id ' + this.connection_id + ': ' + command_str); + this.write(command_str); + } else { + debug('Send command (' + command_str + ') has Buffer arguments'); + this.fire_strings = false; + this.write(command_str); + + for (i = 0; i < len; i += 1) { + arg = args_copy[i]; + if (typeof arg === 'string') { + this.write('$' + Buffer.byteLength(arg) + '\r\n' + arg + '\r\n'); + } else { // buffer + this.write('$' + arg.length + '\r\n'); + this.write(arg); + this.write('\r\n'); + } + debug('send_command: buffer send ' + arg.length + ' bytes'); + } + } + if (command_obj.call_on_write) { + command_obj.call_on_write(); + } + // Handle `CLIENT REPLY ON|OFF|SKIP` + // This has to be checked after call_on_write + /* istanbul ignore else: TODO: Remove this as soon as we test Redis 3.2 on travis */ + if (this.reply === 'ON') { + this.command_queue.push(command_obj); + } else { + // Do not expect a reply + // Does this work in combination with the pub sub mode? + if (command_obj.callback) { + utils.reply_in_order(this, command_obj.callback, null, undefined, this.command_queue); + } + if (this.reply === 'SKIP') { + this.reply = 'SKIP_ONE_MORE'; + } else if (this.reply === 'SKIP_ONE_MORE') { + this.reply = 'ON'; + } + } + return !this.should_buffer; +}; + +RedisClient.prototype.write_strings = function () { + var str = ''; + for (var command = this.pipeline_queue.shift(); command; command = this.pipeline_queue.shift()) { + // Write to stream if the string is bigger than 4mb. The biggest string may be Math.pow(2, 28) - 15 chars long + if (str.length + command.length > 4 * 1024 * 1024) { + this.should_buffer = !this.stream.write(str); + str = ''; + } + str += command; + } + if (str !== '') { + this.should_buffer = !this.stream.write(str); + } +}; + +RedisClient.prototype.write_buffers = function () { + for (var command = this.pipeline_queue.shift(); command; command = this.pipeline_queue.shift()) { + this.should_buffer = !this.stream.write(command); + } +}; + +RedisClient.prototype.write = function (data) { + if (this.pipeline === false) { + this.should_buffer = !this.stream.write(data); + return; + } + this.pipeline_queue.push(data); +}; + +Object.defineProperty(exports, 'debugMode', { + get: function () { + return this.debug_mode; + }, + set: function (val) { + this.debug_mode = val; + } +}); + +// Don't officially expose the command_queue directly but only the length as read only variable +Object.defineProperty(RedisClient.prototype, 'command_queue_length', { + get: function () { + return this.command_queue.length; + } +}); + +Object.defineProperty(RedisClient.prototype, 'offline_queue_length', { + get: function () { + return this.offline_queue.length; + } +}); + +// Add support for camelCase by adding read only properties to the client +// All known exposed snake_case variables are added here +Object.defineProperty(RedisClient.prototype, 'retryDelay', { + get: function () { + return this.retry_delay; + } +}); + +Object.defineProperty(RedisClient.prototype, 'retryBackoff', { + get: function () { + return this.retry_backoff; + } +}); + +Object.defineProperty(RedisClient.prototype, 'commandQueueLength', { + get: function () { + return this.command_queue.length; + } +}); + +Object.defineProperty(RedisClient.prototype, 'offlineQueueLength', { + get: function () { + return this.offline_queue.length; + } +}); + +Object.defineProperty(RedisClient.prototype, 'shouldBuffer', { + get: function () { + return this.should_buffer; + } +}); + +Object.defineProperty(RedisClient.prototype, 'connectionId', { + get: function () { + return this.connection_id; + } +}); + +Object.defineProperty(RedisClient.prototype, 'serverInfo', { + get: function () { + return this.server_info; + } +}); + +exports.createClient = function () { + return new RedisClient(unifyOptions.apply(null, arguments)); +}; +exports.RedisClient = RedisClient; +exports.print = utils.print; +exports.Multi = require('./lib/multi'); +exports.AbortError = errorClasses.AbortError; +exports.RedisError = Parser.RedisError; +exports.ParserError = Parser.ParserError; +exports.ReplyError = Parser.ReplyError; +exports.AggregateError = errorClasses.AggregateError; + +// Add all redis commands / node_redis api to the client +require('./lib/individualCommands'); +require('./lib/extendedApi'); + +//enables adding new commands (for modules and new commands) +exports.addCommand = exports.add_command = require('./lib/commands'); \ No newline at end of file diff --git a/nodejs/node_modules/redis/lib/command.js b/nodejs/node_modules/redis/lib/command.js new file mode 100755 index 0000000..717115c --- /dev/null +++ b/nodejs/node_modules/redis/lib/command.js @@ -0,0 +1,16 @@ +'use strict'; + +var betterStackTraces = /development/i.test(process.env.NODE_ENV) || /\bredis\b/i.test(process.env.NODE_DEBUG); + +function Command (command, args, callback, call_on_write) { + this.command = command; + this.args = args; + this.buffer_args = false; + this.callback = callback; + this.call_on_write = call_on_write; + if (betterStackTraces) { + this.error = new Error(); + } +} + +module.exports = Command; diff --git a/nodejs/node_modules/redis/lib/commands.js b/nodejs/node_modules/redis/lib/commands.js new file mode 100755 index 0000000..6275ec8 --- /dev/null +++ b/nodejs/node_modules/redis/lib/commands.js @@ -0,0 +1,121 @@ +'use strict'; + +var commands = require('redis-commands'); +var Multi = require('./multi'); +var RedisClient = require('../').RedisClient; +var Command = require('./command'); +// Feature detect if a function may change it's name +var changeFunctionName = (function () { + var fn = function abc () {}; + try { + Object.defineProperty(fn, 'name', { + value: 'foobar' + }); + return true; + } catch (e) { + return false; + } +}()); + +var addCommand = function (command) { + // Some rare Redis commands use special characters in their command name + // Convert those to a underscore to prevent using invalid function names + var commandName = command.replace(/(?:^([0-9])|[^a-zA-Z0-9_$])/g, '_$1'); + + // Do not override existing functions + if (!RedisClient.prototype[command]) { + RedisClient.prototype[command.toUpperCase()] = RedisClient.prototype[command] = function () { + var arr; + var len = arguments.length; + var callback; + var i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0]; + if (len === 2) { + callback = arguments[1]; + } + } else if (len > 1 && Array.isArray(arguments[1])) { + if (len === 3) { + callback = arguments[2]; + } + len = arguments[1].length; + arr = new Array(len + 1); + arr[0] = arguments[0]; + for (; i < len; i += 1) { + arr[i + 1] = arguments[1][i]; + } + } else { + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + return this.internal_send_command(new Command(command, arr, callback)); + }; + // Alias special function names (e.g. NR.RUN becomes NR_RUN and nr_run) + if (commandName !== command) { + RedisClient.prototype[commandName.toUpperCase()] = RedisClient.prototype[commandName] = RedisClient.prototype[command]; + } + if (changeFunctionName) { + Object.defineProperty(RedisClient.prototype[command], 'name', { + value: commandName + }); + } + } + + // Do not override existing functions + if (!Multi.prototype[command]) { + Multi.prototype[command.toUpperCase()] = Multi.prototype[command] = function () { + var arr; + var len = arguments.length; + var callback; + var i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0]; + if (len === 2) { + callback = arguments[1]; + } + } else if (len > 1 && Array.isArray(arguments[1])) { + if (len === 3) { + callback = arguments[2]; + } + len = arguments[1].length; + arr = new Array(len + 1); + arr[0] = arguments[0]; + for (; i < len; i += 1) { + arr[i + 1] = arguments[1][i]; + } + } else { + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + this.queue.push(new Command(command, arr, callback)); + return this; + }; + // Alias special function names (e.g. NR.RUN becomes NR_RUN and nr_run) + if (commandName !== command) { + Multi.prototype[commandName.toUpperCase()] = Multi.prototype[commandName] = Multi.prototype[command]; + } + if (changeFunctionName) { + Object.defineProperty(Multi.prototype[command], 'name', { + value: commandName + }); + } + } +}; + +commands.list.forEach(addCommand); + +module.exports = addCommand; diff --git a/nodejs/node_modules/redis/lib/createClient.js b/nodejs/node_modules/redis/lib/createClient.js new file mode 100755 index 0000000..2f3b09f --- /dev/null +++ b/nodejs/node_modules/redis/lib/createClient.js @@ -0,0 +1,80 @@ +'use strict'; + +var utils = require('./utils'); +var URL = require('url'); + +module.exports = function createClient (port_arg, host_arg, options) { + + if (typeof port_arg === 'number' || typeof port_arg === 'string' && /^\d+$/.test(port_arg)) { + + var host; + if (typeof host_arg === 'string') { + host = host_arg; + } else { + if (options && host_arg) { + throw new TypeError('Unknown type of connection in createClient()'); + } + options = options || host_arg; + } + options = utils.clone(options); + options.host = host || options.host; + options.port = port_arg; + + } else if (typeof port_arg === 'string' || port_arg && port_arg.url) { + + options = utils.clone(port_arg.url ? port_arg : host_arg || options); + var url = port_arg.url || port_arg; + var parsed = URL.parse(url, true, true); + + // [redis:]//[[user][:password]@][host][:port][/db-number][?db=db-number[&password=bar[&option=value]]] + if (parsed.slashes) { // We require slashes + if (parsed.auth) { + options.password = parsed.auth.split(':')[1]; + } + if (parsed.protocol && parsed.protocol !== 'redis:') { + console.warn('node_redis: WARNING: You passed "' + parsed.protocol.substring(0, parsed.protocol.length - 1) + '" as protocol instead of the "redis" protocol!'); + } + if (parsed.pathname && parsed.pathname !== '/') { + options.db = parsed.pathname.substr(1); + } + if (parsed.hostname) { + options.host = parsed.hostname; + } + if (parsed.port) { + options.port = parsed.port; + } + if (parsed.search !== '') { + var elem; + for (elem in parsed.query) { + // If options are passed twice, only the parsed options will be used + if (elem in options) { + if (options[elem] === parsed.query[elem]) { + console.warn('node_redis: WARNING: You passed the ' + elem + ' option twice!'); + } else { + throw new RangeError('The ' + elem + ' option is added twice and does not match'); + } + } + options[elem] = parsed.query[elem]; + } + } + } else if (parsed.hostname) { + throw new RangeError('The redis url must begin with slashes "//" or contain slashes after the redis protocol'); + } else { + options.path = url; + } + + } else if (typeof port_arg === 'object' || port_arg === undefined) { + options = utils.clone(port_arg || options); + options.host = options.host || host_arg; + + if (port_arg && arguments.length !== 1) { + throw new TypeError('To many arguments passed to createClient. Please only pass the options object'); + } + } + + if (!options) { + throw new TypeError('Unknown type of connection in createClient()'); + } + + return options; +}; diff --git a/nodejs/node_modules/redis/lib/customErrors.js b/nodejs/node_modules/redis/lib/customErrors.js new file mode 100755 index 0000000..d9b3442 --- /dev/null +++ b/nodejs/node_modules/redis/lib/customErrors.js @@ -0,0 +1,59 @@ +'use strict'; + +var util = require('util'); +var assert = require('assert'); +var RedisError = require('redis-parser').RedisError; +var ADD_STACKTRACE = false; + +function AbortError (obj, stack) { + assert(obj, 'The options argument is required'); + assert.strictEqual(typeof obj, 'object', 'The options argument has to be of type object'); + + RedisError.call(this, obj.message, ADD_STACKTRACE); + Object.defineProperty(this, 'message', { + value: obj.message || '', + configurable: true, + writable: true + }); + if (stack || stack === undefined) { + Error.captureStackTrace(this, AbortError); + } + for (var keys = Object.keys(obj), key = keys.pop(); key; key = keys.pop()) { + this[key] = obj[key]; + } +} + +function AggregateError (obj) { + assert(obj, 'The options argument is required'); + assert.strictEqual(typeof obj, 'object', 'The options argument has to be of type object'); + + AbortError.call(this, obj, ADD_STACKTRACE); + Object.defineProperty(this, 'message', { + value: obj.message || '', + configurable: true, + writable: true + }); + Error.captureStackTrace(this, AggregateError); + for (var keys = Object.keys(obj), key = keys.pop(); key; key = keys.pop()) { + this[key] = obj[key]; + } +} + +util.inherits(AbortError, RedisError); +util.inherits(AggregateError, AbortError); + +Object.defineProperty(AbortError.prototype, 'name', { + value: 'AbortError', + configurable: true, + writable: true +}); +Object.defineProperty(AggregateError.prototype, 'name', { + value: 'AggregateError', + configurable: true, + writable: true +}); + +module.exports = { + AbortError: AbortError, + AggregateError: AggregateError +}; diff --git a/nodejs/node_modules/redis/lib/debug.js b/nodejs/node_modules/redis/lib/debug.js new file mode 100755 index 0000000..0e6333f --- /dev/null +++ b/nodejs/node_modules/redis/lib/debug.js @@ -0,0 +1,11 @@ +'use strict'; + +var index = require('../'); + +function debug () { + if (index.debug_mode) { + console.error.apply(null, arguments); + } +} + +module.exports = debug; diff --git a/nodejs/node_modules/redis/lib/extendedApi.js b/nodejs/node_modules/redis/lib/extendedApi.js new file mode 100755 index 0000000..bac3691 --- /dev/null +++ b/nodejs/node_modules/redis/lib/extendedApi.js @@ -0,0 +1,113 @@ +'use strict'; + +var utils = require('./utils'); +var debug = require('./debug'); +var RedisClient = require('../').RedisClient; +var Command = require('./command'); +var noop = function () {}; + +/********************************************** +All documented and exposed API belongs in here +**********************************************/ + +// Redirect calls to the appropriate function and use to send arbitrary / not supported commands +RedisClient.prototype.send_command = RedisClient.prototype.sendCommand = function (command, args, callback) { + // Throw to fail early instead of relying in order in this case + if (typeof command !== 'string') { + throw new TypeError('Wrong input type "' + (command !== null && command !== undefined ? command.constructor.name : command) + '" for command name'); + } + command = command.toLowerCase(); + if (!Array.isArray(args)) { + if (args === undefined || args === null) { + args = []; + } else if (typeof args === 'function' && callback === undefined) { + callback = args; + args = []; + } else { + throw new TypeError('Wrong input type "' + args.constructor.name + '" for args'); + } + } + if (typeof callback !== 'function' && callback !== undefined) { + throw new TypeError('Wrong input type "' + (callback !== null ? callback.constructor.name : 'null') + '" for callback function'); + } + + // Using the raw multi command is only possible with this function + // If the command is not yet added to the client, the internal function should be called right away + // Otherwise we need to redirect the calls to make sure the internal functions don't get skipped + // The internal functions could actually be used for any non hooked function + // but this might change from time to time and at the moment there's no good way to distinguish them + // from each other, so let's just do it do it this way for the time being + if (command === 'multi' || typeof this[command] !== 'function') { + return this.internal_send_command(new Command(command, args, callback)); + } + if (typeof callback === 'function') { + args = args.concat([callback]); // Prevent manipulating the input array + } + return this[command].apply(this, args); +}; + +RedisClient.prototype.end = function (flush) { + // Flush queue if wanted + if (flush) { + this.flush_and_error({ + message: 'Connection forcefully ended and command aborted.', + code: 'NR_CLOSED' + }); + } else if (arguments.length === 0) { + this.warn( + 'Using .end() without the flush parameter is deprecated and throws from v.3.0.0 on.\n' + + 'Please check the doku (https://github.com/NodeRedis/node_redis) and explictly use flush.' + ); + } + // Clear retry_timer + if (this.retry_timer) { + clearTimeout(this.retry_timer); + this.retry_timer = null; + } + this.stream.removeAllListeners(); + this.stream.on('error', noop); + this.connected = false; + this.ready = false; + this.closing = true; + return this.stream.destroySoon(); +}; + +RedisClient.prototype.unref = function () { + if (this.connected) { + debug("Unref'ing the socket connection"); + this.stream.unref(); + } else { + debug('Not connected yet, will unref later'); + this.once('connect', function () { + this.unref(); + }); + } +}; + +RedisClient.prototype.duplicate = function (options, callback) { + if (typeof options === 'function') { + callback = options; + options = null; + } + var existing_options = utils.clone(this.options); + options = utils.clone(options); + for (var elem in options) { + existing_options[elem] = options[elem]; + } + var client = new RedisClient(existing_options); + client.selected_db = this.selected_db; + if (typeof callback === 'function') { + var ready_listener = function () { + callback(null, client); + client.removeAllListeners(error_listener); + }; + var error_listener = function (err) { + callback(err); + client.end(true); + }; + client.once('ready', ready_listener); + client.once('error', error_listener); + return; + } + return client; +}; diff --git a/nodejs/node_modules/redis/lib/individualCommands.js b/nodejs/node_modules/redis/lib/individualCommands.js new file mode 100755 index 0000000..d366b64 --- /dev/null +++ b/nodejs/node_modules/redis/lib/individualCommands.js @@ -0,0 +1,617 @@ +'use strict'; + +var utils = require('./utils'); +var debug = require('./debug'); +var Multi = require('./multi'); +var Command = require('./command'); +var no_password_is_set = /no password is set/; +var loading = /LOADING/; +var RedisClient = require('../').RedisClient; + +/******************************************************************************************** + Replace built-in redis functions + + The callback may be hooked as needed. The same does not apply to the rest of the function. + State should not be set outside of the callback if not absolutly necessary. + This is important to make sure it works the same as single command or in a multi context. + To make sure everything works with the offline queue use the "call_on_write" function. + This is going to be executed while writing to the stream. + + TODO: Implement individal command generation as soon as possible to prevent divergent code + on single and multi calls! +********************************************************************************************/ + +RedisClient.prototype.multi = RedisClient.prototype.MULTI = function multi (args) { + var multi = new Multi(this, args); + multi.exec = multi.EXEC = multi.exec_transaction; + return multi; +}; + +// ATTENTION: This is not a native function but is still handled as a individual command as it behaves just the same as multi +RedisClient.prototype.batch = RedisClient.prototype.BATCH = function batch (args) { + return new Multi(this, args); +}; + +function select_callback (self, db, callback) { + return function (err, res) { + if (err === null) { + // Store db in this.select_db to restore it on reconnect + self.selected_db = db; + } + utils.callback_or_emit(self, callback, err, res); + }; +} + +RedisClient.prototype.select = RedisClient.prototype.SELECT = function select (db, callback) { + return this.internal_send_command(new Command('select', [db], select_callback(this, db, callback))); +}; + +Multi.prototype.select = Multi.prototype.SELECT = function select (db, callback) { + this.queue.push(new Command('select', [db], select_callback(this._client, db, callback))); + return this; +}; + +RedisClient.prototype.monitor = RedisClient.prototype.MONITOR = function monitor (callback) { + // Use a individual command, as this is a special case that does not has to be checked for any other command + var self = this; + var call_on_write = function () { + // Activating monitor mode has to happen before Redis returned the callback. The monitor result is returned first. + // Therefore we expect the command to be properly processed. If this is not the case, it's not an issue either. + self.monitoring = true; + }; + return this.internal_send_command(new Command('monitor', [], callback, call_on_write)); +}; + +// Only works with batch, not in a transaction +Multi.prototype.monitor = Multi.prototype.MONITOR = function monitor (callback) { + // Use a individual command, as this is a special case that does not has to be checked for any other command + if (this.exec !== this.exec_transaction) { + var self = this; + var call_on_write = function () { + self._client.monitoring = true; + }; + this.queue.push(new Command('monitor', [], callback, call_on_write)); + return this; + } + // Set multi monitoring to indicate the exec that it should abort + // Remove this "hack" as soon as Redis might fix this + this.monitoring = true; + return this; +}; + +function quit_callback (self, callback) { + return function (err, res) { + if (err && err.code === 'NR_CLOSED') { + // Pretent the quit command worked properly in this case. + // Either the quit landed in the offline queue and was flushed at the reconnect + // or the offline queue is deactivated and the command was rejected right away + // or the stream is not writable + // or while sending the quit, the connection ended / closed + err = null; + res = 'OK'; + } + utils.callback_or_emit(self, callback, err, res); + if (self.stream.writable) { + // If the socket is still alive, kill it. This could happen if quit got a NR_CLOSED error code + self.stream.destroy(); + } + }; +} + +RedisClient.prototype.QUIT = RedisClient.prototype.quit = function quit (callback) { + // TODO: Consider this for v.3 + // Allow the quit command to be fired as soon as possible to prevent it landing in the offline queue. + // this.ready = this.offline_queue.length === 0; + var backpressure_indicator = this.internal_send_command(new Command('quit', [], quit_callback(this, callback))); + // Calling quit should always end the connection, no matter if there's a connection or not + this.closing = true; + this.ready = false; + return backpressure_indicator; +}; + +// Only works with batch, not in a transaction +Multi.prototype.QUIT = Multi.prototype.quit = function quit (callback) { + var self = this._client; + var call_on_write = function () { + // If called in a multi context, we expect redis is available + self.closing = true; + self.ready = false; + }; + this.queue.push(new Command('quit', [], quit_callback(self, callback), call_on_write)); + return this; +}; + +function info_callback (self, callback) { + return function (err, res) { + if (res) { + var obj = {}; + var lines = res.toString().split('\r\n'); + var line, parts, sub_parts; + + for (var i = 0; i < lines.length; i++) { + parts = lines[i].split(':'); + if (parts[1]) { + if (parts[0].indexOf('db') === 0) { + sub_parts = parts[1].split(','); + obj[parts[0]] = {}; + while (line = sub_parts.pop()) { + line = line.split('='); + obj[parts[0]][line[0]] = +line[1]; + } + } else { + obj[parts[0]] = parts[1]; + } + } + } + obj.versions = []; + if (obj.redis_version) { + obj.redis_version.split('.').forEach(function (num) { + obj.versions.push(+num); + }); + } + // Expose info key/vals to users + self.server_info = obj; + } else { + self.server_info = {}; + } + utils.callback_or_emit(self, callback, err, res); + }; +} + +// Store info in this.server_info after each call +RedisClient.prototype.info = RedisClient.prototype.INFO = function info (section, callback) { + var args = []; + if (typeof section === 'function') { + callback = section; + } else if (section !== undefined) { + args = Array.isArray(section) ? section : [section]; + } + return this.internal_send_command(new Command('info', args, info_callback(this, callback))); +}; + +Multi.prototype.info = Multi.prototype.INFO = function info (section, callback) { + var args = []; + if (typeof section === 'function') { + callback = section; + } else if (section !== undefined) { + args = Array.isArray(section) ? section : [section]; + } + this.queue.push(new Command('info', args, info_callback(this._client, callback))); + return this; +}; + +function auth_callback (self, pass, callback) { + return function (err, res) { + if (err) { + if (no_password_is_set.test(err.message)) { + self.warn('Warning: Redis server does not require a password, but a password was supplied.'); + err = null; + res = 'OK'; + } else if (loading.test(err.message)) { + // If redis is still loading the db, it will not authenticate and everything else will fail + debug('Redis still loading, trying to authenticate later'); + setTimeout(function () { + self.auth(pass, callback); + }, 100); + return; + } + } + utils.callback_or_emit(self, callback, err, res); + }; +} + +RedisClient.prototype.auth = RedisClient.prototype.AUTH = function auth (pass, callback) { + debug('Sending auth to ' + this.address + ' id ' + this.connection_id); + + // Stash auth for connect and reconnect. + this.auth_pass = pass; + var ready = this.ready; + this.ready = ready || this.offline_queue.length === 0; + var tmp = this.internal_send_command(new Command('auth', [pass], auth_callback(this, pass, callback))); + this.ready = ready; + return tmp; +}; + +// Only works with batch, not in a transaction +Multi.prototype.auth = Multi.prototype.AUTH = function auth (pass, callback) { + debug('Sending auth to ' + this.address + ' id ' + this.connection_id); + + // Stash auth for connect and reconnect. + this.auth_pass = pass; + this.queue.push(new Command('auth', [pass], auth_callback(this._client, callback))); + return this; +}; + +RedisClient.prototype.client = RedisClient.prototype.CLIENT = function client () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0]; + callback = arguments[1]; + } else if (Array.isArray(arguments[1])) { + if (len === 3) { + callback = arguments[2]; + } + len = arguments[1].length; + arr = new Array(len + 1); + arr[0] = arguments[0]; + for (; i < len; i += 1) { + arr[i + 1] = arguments[1][i]; + } + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + var self = this; + var call_on_write = undefined; + // CLIENT REPLY ON|OFF|SKIP + /* istanbul ignore next: TODO: Remove this as soon as Travis runs Redis 3.2 */ + if (arr.length === 2 && arr[0].toString().toUpperCase() === 'REPLY') { + var reply_on_off = arr[1].toString().toUpperCase(); + if (reply_on_off === 'ON' || reply_on_off === 'OFF' || reply_on_off === 'SKIP') { + call_on_write = function () { + self.reply = reply_on_off; + }; + } + } + return this.internal_send_command(new Command('client', arr, callback, call_on_write)); +}; + +Multi.prototype.client = Multi.prototype.CLIENT = function client () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0]; + callback = arguments[1]; + } else if (Array.isArray(arguments[1])) { + if (len === 3) { + callback = arguments[2]; + } + len = arguments[1].length; + arr = new Array(len + 1); + arr[0] = arguments[0]; + for (; i < len; i += 1) { + arr[i + 1] = arguments[1][i]; + } + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + var self = this._client; + var call_on_write = undefined; + // CLIENT REPLY ON|OFF|SKIP + /* istanbul ignore next: TODO: Remove this as soon as Travis runs Redis 3.2 */ + if (arr.length === 2 && arr[0].toString().toUpperCase() === 'REPLY') { + var reply_on_off = arr[1].toString().toUpperCase(); + if (reply_on_off === 'ON' || reply_on_off === 'OFF' || reply_on_off === 'SKIP') { + call_on_write = function () { + self.reply = reply_on_off; + }; + } + } + this.queue.push(new Command('client', arr, callback, call_on_write)); + return this; +}; + +RedisClient.prototype.hmset = RedisClient.prototype.HMSET = function hmset () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0]; + callback = arguments[1]; + } else if (Array.isArray(arguments[1])) { + if (len === 3) { + callback = arguments[2]; + } + len = arguments[1].length; + arr = new Array(len + 1); + arr[0] = arguments[0]; + for (; i < len; i += 1) { + arr[i + 1] = arguments[1][i]; + } + } else if (typeof arguments[1] === 'object' && (arguments.length === 2 || arguments.length === 3 && (typeof arguments[2] === 'function' || typeof arguments[2] === 'undefined'))) { + arr = [arguments[0]]; + for (var field in arguments[1]) { + arr.push(field, arguments[1][field]); + } + callback = arguments[2]; + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + return this.internal_send_command(new Command('hmset', arr, callback)); +}; + +Multi.prototype.hmset = Multi.prototype.HMSET = function hmset () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0]; + callback = arguments[1]; + } else if (Array.isArray(arguments[1])) { + if (len === 3) { + callback = arguments[2]; + } + len = arguments[1].length; + arr = new Array(len + 1); + arr[0] = arguments[0]; + for (; i < len; i += 1) { + arr[i + 1] = arguments[1][i]; + } + } else if (typeof arguments[1] === 'object' && (arguments.length === 2 || arguments.length === 3 && (typeof arguments[2] === 'function' || typeof arguments[2] === 'undefined'))) { + arr = [arguments[0]]; + for (var field in arguments[1]) { + arr.push(field, arguments[1][field]); + } + callback = arguments[2]; + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + this.queue.push(new Command('hmset', arr, callback)); + return this; +}; + +RedisClient.prototype.subscribe = RedisClient.prototype.SUBSCRIBE = function subscribe () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0].slice(0); + callback = arguments[1]; + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + var self = this; + var call_on_write = function () { + self.pub_sub_mode = self.pub_sub_mode || self.command_queue.length + 1; + }; + return this.internal_send_command(new Command('subscribe', arr, callback, call_on_write)); +}; + +Multi.prototype.subscribe = Multi.prototype.SUBSCRIBE = function subscribe () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0].slice(0); + callback = arguments[1]; + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + var self = this._client; + var call_on_write = function () { + self.pub_sub_mode = self.pub_sub_mode || self.command_queue.length + 1; + }; + this.queue.push(new Command('subscribe', arr, callback, call_on_write)); + return this; +}; + +RedisClient.prototype.unsubscribe = RedisClient.prototype.UNSUBSCRIBE = function unsubscribe () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0].slice(0); + callback = arguments[1]; + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + var self = this; + var call_on_write = function () { + // Pub sub has to be activated even if not in pub sub mode, as the return value is manipulated in the callback + self.pub_sub_mode = self.pub_sub_mode || self.command_queue.length + 1; + }; + return this.internal_send_command(new Command('unsubscribe', arr, callback, call_on_write)); +}; + +Multi.prototype.unsubscribe = Multi.prototype.UNSUBSCRIBE = function unsubscribe () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0].slice(0); + callback = arguments[1]; + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + var self = this._client; + var call_on_write = function () { + // Pub sub has to be activated even if not in pub sub mode, as the return value is manipulated in the callback + self.pub_sub_mode = self.pub_sub_mode || self.command_queue.length + 1; + }; + this.queue.push(new Command('unsubscribe', arr, callback, call_on_write)); + return this; +}; + +RedisClient.prototype.psubscribe = RedisClient.prototype.PSUBSCRIBE = function psubscribe () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0].slice(0); + callback = arguments[1]; + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + var self = this; + var call_on_write = function () { + self.pub_sub_mode = self.pub_sub_mode || self.command_queue.length + 1; + }; + return this.internal_send_command(new Command('psubscribe', arr, callback, call_on_write)); +}; + +Multi.prototype.psubscribe = Multi.prototype.PSUBSCRIBE = function psubscribe () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0].slice(0); + callback = arguments[1]; + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + var self = this._client; + var call_on_write = function () { + self.pub_sub_mode = self.pub_sub_mode || self.command_queue.length + 1; + }; + this.queue.push(new Command('psubscribe', arr, callback, call_on_write)); + return this; +}; + +RedisClient.prototype.punsubscribe = RedisClient.prototype.PUNSUBSCRIBE = function punsubscribe () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0].slice(0); + callback = arguments[1]; + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + var self = this; + var call_on_write = function () { + // Pub sub has to be activated even if not in pub sub mode, as the return value is manipulated in the callback + self.pub_sub_mode = self.pub_sub_mode || self.command_queue.length + 1; + }; + return this.internal_send_command(new Command('punsubscribe', arr, callback, call_on_write)); +}; + +Multi.prototype.punsubscribe = Multi.prototype.PUNSUBSCRIBE = function punsubscribe () { + var arr, + len = arguments.length, + callback, + i = 0; + if (Array.isArray(arguments[0])) { + arr = arguments[0].slice(0); + callback = arguments[1]; + } else { + len = arguments.length; + // The later should not be the average use case + if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { + len--; + callback = arguments[len]; + } + arr = new Array(len); + for (; i < len; i += 1) { + arr[i] = arguments[i]; + } + } + var self = this._client; + var call_on_write = function () { + // Pub sub has to be activated even if not in pub sub mode, as the return value is manipulated in the callback + self.pub_sub_mode = self.pub_sub_mode || self.command_queue.length + 1; + }; + this.queue.push(new Command('punsubscribe', arr, callback, call_on_write)); + return this; +}; diff --git a/nodejs/node_modules/redis/lib/multi.js b/nodejs/node_modules/redis/lib/multi.js new file mode 100755 index 0000000..63f5d21 --- /dev/null +++ b/nodejs/node_modules/redis/lib/multi.js @@ -0,0 +1,187 @@ +'use strict'; + +var Queue = require('double-ended-queue'); +var utils = require('./utils'); +var Command = require('./command'); + +function Multi (client, args) { + this._client = client; + this.queue = new Queue(); + var command, tmp_args; + if (args) { // Either undefined or an array. Fail hard if it's not an array + for (var i = 0; i < args.length; i++) { + command = args[i][0]; + tmp_args = args[i].slice(1); + if (Array.isArray(command)) { + this[command[0]].apply(this, command.slice(1).concat(tmp_args)); + } else { + this[command].apply(this, tmp_args); + } + } + } +} + +function pipeline_transaction_command (self, command_obj, index) { + // Queueing is done first, then the commands are executed + var tmp = command_obj.callback; + command_obj.callback = function (err, reply) { + // Ignore the multi command. This is applied by node_redis and the user does not benefit by it + if (err && index !== -1) { + if (tmp) { + tmp(err); + } + err.position = index; + self.errors.push(err); + } + // Keep track of who wants buffer responses: + // By the time the callback is called the command_obj got the buffer_args attribute attached + self.wants_buffers[index] = command_obj.buffer_args; + command_obj.callback = tmp; + }; + self._client.internal_send_command(command_obj); +} + +Multi.prototype.exec_atomic = Multi.prototype.EXEC_ATOMIC = Multi.prototype.execAtomic = function exec_atomic (callback) { + if (this.queue.length < 2) { + return this.exec_batch(callback); + } + return this.exec(callback); +}; + +function multi_callback (self, err, replies) { + var i = 0, command_obj; + + if (err) { + err.errors = self.errors; + if (self.callback) { + self.callback(err); + // Exclude connection errors so that those errors won't be emitted twice + } else if (err.code !== 'CONNECTION_BROKEN') { + self._client.emit('error', err); + } + return; + } + + if (replies) { + while (command_obj = self.queue.shift()) { + if (replies[i] instanceof Error) { + var match = replies[i].message.match(utils.err_code); + // LUA script could return user errors that don't behave like all other errors! + if (match) { + replies[i].code = match[1]; + } + replies[i].command = command_obj.command.toUpperCase(); + if (typeof command_obj.callback === 'function') { + command_obj.callback(replies[i]); + } + } else { + // If we asked for strings, even in detect_buffers mode, then return strings: + replies[i] = self._client.handle_reply(replies[i], command_obj.command, self.wants_buffers[i]); + if (typeof command_obj.callback === 'function') { + command_obj.callback(null, replies[i]); + } + } + i++; + } + } + + if (self.callback) { + self.callback(null, replies); + } +} + +Multi.prototype.exec_transaction = function exec_transaction (callback) { + if (this.monitoring || this._client.monitoring) { + var err = new RangeError( + 'Using transaction with a client that is in monitor mode does not work due to faulty return values of Redis.' + ); + err.command = 'EXEC'; + err.code = 'EXECABORT'; + return utils.reply_in_order(this._client, callback, err); + } + var self = this; + var len = self.queue.length; + self.errors = []; + self.callback = callback; + self._client.cork(); + self.wants_buffers = new Array(len); + pipeline_transaction_command(self, new Command('multi', []), -1); + // Drain queue, callback will catch 'QUEUED' or error + for (var index = 0; index < len; index++) { + // The commands may not be shifted off, since they are needed in the result handler + pipeline_transaction_command(self, self.queue.get(index), index); + } + + self._client.internal_send_command(new Command('exec', [], function (err, replies) { + multi_callback(self, err, replies); + })); + self._client.uncork(); + return !self._client.should_buffer; +}; + +function batch_callback (self, cb, i) { + return function batch_callback (err, res) { + if (err) { + self.results[i] = err; + // Add the position to the error + self.results[i].position = i; + } else { + self.results[i] = res; + } + cb(err, res); + }; +} + +Multi.prototype.exec = Multi.prototype.EXEC = Multi.prototype.exec_batch = function exec_batch (callback) { + var self = this; + var len = self.queue.length; + var index = 0; + var command_obj; + if (len === 0) { + utils.reply_in_order(self._client, callback, null, []); + return !self._client.should_buffer; + } + self._client.cork(); + if (!callback) { + while (command_obj = self.queue.shift()) { + self._client.internal_send_command(command_obj); + } + self._client.uncork(); + return !self._client.should_buffer; + } + var callback_without_own_cb = function (err, res) { + if (err) { + self.results.push(err); + // Add the position to the error + var i = self.results.length - 1; + self.results[i].position = i; + } else { + self.results.push(res); + } + // Do not emit an error here. Otherwise each error would result in one emit. + // The errors will be returned in the result anyway + }; + var last_callback = function (cb) { + return function (err, res) { + cb(err, res); + callback(null, self.results); + }; + }; + self.results = []; + while (command_obj = self.queue.shift()) { + if (typeof command_obj.callback === 'function') { + command_obj.callback = batch_callback(self, command_obj.callback, index); + } else { + command_obj.callback = callback_without_own_cb; + } + if (typeof callback === 'function' && index === len - 1) { + command_obj.callback = last_callback(command_obj.callback); + } + this._client.internal_send_command(command_obj); + index++; + } + self._client.uncork(); + return !self._client.should_buffer; +}; + +module.exports = Multi; diff --git a/nodejs/node_modules/redis/lib/utils.js b/nodejs/node_modules/redis/lib/utils.js new file mode 100755 index 0000000..52e58ec --- /dev/null +++ b/nodejs/node_modules/redis/lib/utils.js @@ -0,0 +1,134 @@ +'use strict'; + +// hgetall converts its replies to an Object. If the reply is empty, null is returned. +// These function are only called with internal data and have therefore always the same instanceof X +function replyToObject (reply) { + // The reply might be a string or a buffer if this is called in a transaction (multi) + if (reply.length === 0 || !(reply instanceof Array)) { + return null; + } + var obj = {}; + for (var i = 0; i < reply.length; i += 2) { + obj[reply[i].toString('binary')] = reply[i + 1]; + } + return obj; +} + +function replyToStrings (reply) { + if (reply instanceof Buffer) { + return reply.toString(); + } + if (reply instanceof Array) { + var res = new Array(reply.length); + for (var i = 0; i < reply.length; i++) { + // Recusivly call the function as slowlog returns deep nested replies + res[i] = replyToStrings(reply[i]); + } + return res; + } + + return reply; +} + +function print (err, reply) { + if (err) { + // A error always begins with Error: + console.log(err.toString()); + } else { + console.log('Reply: ' + reply); + } +} + +var camelCase; +// Deep clone arbitrary objects with arrays. Can't handle cyclic structures (results in a range error) +// Any attribute with a non primitive value besides object and array will be passed by reference (e.g. Buffers, Maps, Functions) +// All capital letters are going to be replaced with a lower case letter and a underscore infront of it +function clone (obj) { + var copy; + if (Array.isArray(obj)) { + copy = new Array(obj.length); + for (var i = 0; i < obj.length; i++) { + copy[i] = clone(obj[i]); + } + return copy; + } + if (Object.prototype.toString.call(obj) === '[object Object]') { + copy = {}; + var elems = Object.keys(obj); + var elem; + while (elem = elems.pop()) { + if (elem === 'tls') { // special handle tls + copy[elem] = obj[elem]; + continue; + } + // Accept camelCase options and convert them to snake_case + var snake_case = elem.replace(/[A-Z][^A-Z]/g, '_$&').toLowerCase(); + // If camelCase is detected, pass it to the client, so all variables are going to be camelCased + // There are no deep nested options objects yet, but let's handle this future proof + if (snake_case !== elem.toLowerCase()) { + camelCase = true; + } + copy[snake_case] = clone(obj[elem]); + } + return copy; + } + return obj; +} + +function convenienceClone (obj) { + camelCase = false; + obj = clone(obj) || {}; + if (camelCase) { + obj.camel_case = true; + } + return obj; +} + +function callbackOrEmit (self, callback, err, res) { + if (callback) { + callback(err, res); + } else if (err) { + self.emit('error', err); + } +} + +function replyInOrder (self, callback, err, res, queue) { + // If the queue is explicitly passed, use that, otherwise fall back to the offline queue first, + // as there might be commands in both queues at the same time + var command_obj; + /* istanbul ignore if: TODO: Remove this as soon as we test Redis 3.2 on travis */ + if (queue) { + command_obj = queue.peekBack(); + } else { + command_obj = self.offline_queue.peekBack() || self.command_queue.peekBack(); + } + if (!command_obj) { + process.nextTick(function () { + callbackOrEmit(self, callback, err, res); + }); + } else { + var tmp = command_obj.callback; + command_obj.callback = tmp ? + function (e, r) { + tmp(e, r); + callbackOrEmit(self, callback, err, res); + } : + function (e, r) { + if (e) { + self.emit('error', e); + } + callbackOrEmit(self, callback, err, res); + }; + } +} + +module.exports = { + reply_to_strings: replyToStrings, + reply_to_object: replyToObject, + print: print, + err_code: /^([A-Z]+)\s+(.+)$/, + monitor_regex: /^[0-9]{10,11}\.[0-9]+ \[[0-9]+ .+\]( ".+?")+$/, + clone: convenienceClone, + callback_or_emit: callbackOrEmit, + reply_in_order: replyInOrder +}; diff --git a/nodejs/node_modules/redis/package.json b/nodejs/node_modules/redis/package.json new file mode 100755 index 0000000..12f9991 --- /dev/null +++ b/nodejs/node_modules/redis/package.json @@ -0,0 +1,90 @@ +{ + "_args": [ + [ + "redis@2.8.0", + "/www/wwwroot/Adminx.cc/nodejs" + ] + ], + "_from": "redis@2.8.0", + "_id": "redis@2.8.0", + "_inBundle": false, + "_integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", + "_location": "/redis", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "redis@2.8.0", + "name": "redis", + "escapedName": "redis", + "rawSpec": "2.8.0", + "saveSpec": null, + "fetchSpec": "2.8.0" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", + "_spec": "2.8.0", + "_where": "/www/wwwroot/Adminx.cc/nodejs", + "author": { + "name": "Matt Ranney", + "email": "mjr@ranney.com" + }, + "bugs": { + "url": "https://github.com/NodeRedis/node_redis/issues" + }, + "dependencies": { + "double-ended-queue": "^2.1.0-0", + "redis-commands": "^1.2.0", + "redis-parser": "^2.6.0" + }, + "description": "Redis client library", + "devDependencies": { + "bluebird": "^3.0.2", + "coveralls": "^2.11.2", + "eslint": "^4.2.0", + "intercept-stdout": "~0.1.2", + "metrics": "^0.1.9", + "mocha": "^3.1.2", + "nyc": "^10.0.0", + "tcp-port-used": "^0.1.2", + "uuid": "^2.0.1", + "win-spawn": "^2.0.0" + }, + "directories": { + "example": "examples", + "test": "test" + }, + "engines": { + "node": ">=0.10.0" + }, + "homepage": "https://github.com/NodeRedis/node_redis", + "keywords": [ + "database", + "redis", + "transaction", + "pipelining", + "performance", + "queue", + "nodejs", + "pubsub", + "backpressure" + ], + "license": "MIT", + "main": "./index.js", + "name": "redis", + "repository": { + "type": "git", + "url": "git://github.com/NodeRedis/node_redis.git" + }, + "scripts": { + "benchmark": "node benchmarks/multi_bench.js", + "compare": "node benchmarks/diff_multi_bench_output.js beforeBench.txt afterBench.txt", + "coverage": "nyc report --reporter=html", + "coveralls": "nyc report --reporter=text-lcov | coveralls", + "lint": "eslint . --fix && npm run coverage", + "test": "nyc --cache mocha ./test/*.js ./test/commands/*.js --timeout=8000" + }, + "version": "2.8.0" +} diff --git a/nodejs/node_modules/sorted-array-functions/.travis.yml b/nodejs/node_modules/sorted-array-functions/.travis.yml new file mode 100755 index 0000000..1fc99b1 --- /dev/null +++ b/nodejs/node_modules/sorted-array-functions/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - '0.10' + - '0.12' + - '4' + - '6' diff --git a/nodejs/node_modules/sorted-array-functions/LICENSE b/nodejs/node_modules/sorted-array-functions/LICENSE new file mode 100755 index 0000000..bae9da7 --- /dev/null +++ b/nodejs/node_modules/sorted-array-functions/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Mathias Buus + +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. diff --git a/nodejs/node_modules/sorted-array-functions/README.md b/nodejs/node_modules/sorted-array-functions/README.md new file mode 100755 index 0000000..4cafc3a --- /dev/null +++ b/nodejs/node_modules/sorted-array-functions/README.md @@ -0,0 +1,71 @@ +# sorted-array-functions + +Maintain and search through a sorted array using some low level functions + +``` +npm install sorted-array-functions +``` + +[![build status](http://img.shields.io/travis/mafintosh/sorted-array-functions.svg?style=flat)](http://travis-ci.org/mafintosh/sorted-array-functions) + +## Usage + +``` js +var sorted = require('sorted-array-functions') +var list = [] + +sorted.add(list, 1) +sorted.add(list, 4) +sorted.add(list, 2) + +console.log(list) // prints out [1, 2, 4] +console.log(sorted.has(list, 2)) // returns true +console.log(sorted.has(list, 3)) // returns false +console.log(sorted.eq(list, 2)) // returns 1 (the index) +console.log(sorted.gt(list, 2)) // returns 2 +console.log(sorted.gt(list, 4)) // returns -1 +``` + +## API + +#### `sorted.add(list, value, [compare])` + +Insert a new value into the list sorted. +Optionally you can use a custom compare function that returns, `compare(a, b)` that returns 1 if `a > b`, 0 if `a === b` and -1 if `a < b`. + +#### `var bool = sorted.remove(list, value, [compare])` + +Remove a value. Returns true if the value was in the list. + +#### `var bool = sorted.has(list, value, [compare])` + +Check if a value is in the list. + +#### `var index = sorted.eq(list, value, [compare])` + +Get the index of a value in the list (uses binary search). +If the value could not be found -1 is returned. + +#### `var index = sorted.gte(list, value, [compare])` + +Get the index of the first value that is `>=`. +If the value could not be found -1 is returned. + +#### `var index = sorted.gt(list, value, [compare])` + +Get the index of the first value that is `>`. +If the value could not be found -1 is returned. + +#### `var index = sorted.lte(list, value, [compare])` + +Get the index of the first value that is `<=`. +If the value could not be found -1 is returned. + +#### `var index = sorted.lt(list, value, [compare])` + +Get the index of the first value that is `<`. +If the value could not be found -1 is returned. + +## License + +MIT diff --git a/nodejs/node_modules/sorted-array-functions/example.js b/nodejs/node_modules/sorted-array-functions/example.js new file mode 100755 index 0000000..c06b733 --- /dev/null +++ b/nodejs/node_modules/sorted-array-functions/example.js @@ -0,0 +1,13 @@ +var sorted = require('./') +var list = [] + +sorted.add(list, 1) +sorted.add(list, 4) +sorted.add(list, 2) + +console.log(list) // prints out [1, 2, 4] +console.log(sorted.has(list, 2)) // returns true +console.log(sorted.has(list, 3)) // returns false +console.log(sorted.eq(list, 2)) // returns 1 (the index) +console.log(sorted.gt(list, 2)) // returns 2 +console.log(sorted.gt(list, 4)) // returns -1 diff --git a/nodejs/node_modules/sorted-array-functions/index.js b/nodejs/node_modules/sorted-array-functions/index.js new file mode 100755 index 0000000..3a0dc06 --- /dev/null +++ b/nodejs/node_modules/sorted-array-functions/index.js @@ -0,0 +1,160 @@ +exports.add = add +exports.remove = remove +exports.has = has +exports.eq = eq +exports.lte = lte +exports.lt = lt +exports.gte = gte +exports.gt = gt +exports.nearest = nearest + +function defaultCmp (a, b) { + if (a === b) return 0 + return a > b ? 1 : -1 +} + +function add (list, value, cmp) { + if (!cmp) cmp = defaultCmp + + var top = list.push(value) - 1 + + while (top) { + if (cmp(list[top - 1], value) < 0) return + list[top] = list[top - 1] + list[top - 1] = value + top-- + } +} + +function lte (list, value, cmp) { + if (!cmp) cmp = defaultCmp + + var i = indexOf(list, value, cmp) + if (i === -1) return -1 + + for (; i >= 0; i--) { + var c = cmp(list[i], value) + if (c <= 0) return i + } + + return -1 +} + +function lt (list, value, cmp) { + if (!cmp) cmp = defaultCmp + + var i = indexOf(list, value, cmp) + if (i === -1) return -1 + + for (; i >= 0; i--) { + var c = cmp(list[i], value) + if (c < 0) return i + } + + return -1 +} + +function gte (list, value, cmp) { + if (!cmp) cmp = defaultCmp + + var i = indexOf(list, value, cmp) + if (i === -1) return -1 + + for (; i < list.length; i++) { + var c = cmp(list[i], value) + if (c >= 0) return i + } + + return -1 +} + +function gt (list, value, cmp) { + if (!cmp) cmp = defaultCmp + + var i = indexOf(list, value, cmp) + if (i === -1) return -1 + + for (; i < list.length; i++) { + var c = cmp(list[i], value) + if (c > 0) return i + } + + return -1 +} + +function eq (list, value, cmp) { + if (!cmp) cmp = defaultCmp + + var i = indexOf(list, value, cmp) + if (i === -1) return -1 + return cmp(list[i], value) === 0 ? i : -1 +} + +function nearest (list, value, cmp) { + if (!cmp) cmp = defaultCmp + + var len = list.length + var top = len - 1 + var btm = 0 + var mid = -1 + var trending = 1 // 0 = down, 2 = up + + while (top >= btm && btm >= 0 && top < len) { + mid = Math.floor((top + btm) / 2) + + var c = cmp(list[mid], value) + if (c === 0) return mid + + if (c >= 0) { + if (trending === 1) trending = 0 + else if (trending === 2) { + if (Math.abs(list[mid] - value) > Math.abs(list[mid - 1] - value)) return mid - 1 + return mid + } + + top = mid - 1 + } else { + if (trending === 1) trending = 2 + else if (trending === 0) return mid + + btm = mid + 1 + } + } + + return mid +} + +function indexOf (list, value, cmp) { + if (!cmp) cmp = defaultCmp + + var len = list.length + var top = len - 1 + var btm = 0 + var mid = -1 + + while (top >= btm && btm >= 0 && top < len) { + mid = Math.floor((top + btm) / 2) + + var c = cmp(list[mid], value) + if (c === 0) return mid + + if (c >= 0) { + top = mid - 1 + } else { + btm = mid + 1 + } + } + + return mid +} + +function has (list, value, cmp) { + return eq(list, value, cmp) > -1 +} + +function remove (list, value, cmp) { + var i = eq(list, value, cmp) + if (i === -1) return false + list.splice(i, 1) + return true +} diff --git a/nodejs/node_modules/sorted-array-functions/package.json b/nodejs/node_modules/sorted-array-functions/package.json new file mode 100755 index 0000000..2276cb4 --- /dev/null +++ b/nodejs/node_modules/sorted-array-functions/package.json @@ -0,0 +1,55 @@ +{ + "_args": [ + [ + "sorted-array-functions@1.2.0", + "/www/wwwroot/Adminx.cc/nodejs" + ] + ], + "_from": "sorted-array-functions@1.2.0", + "_id": "sorted-array-functions@1.2.0", + "_inBundle": false, + "_integrity": "sha512-sWpjPhIZJtqO77GN+LD8dDsDKcWZ9GCOJNqKzi1tvtjGIzwfoyuRH8S0psunmc6Z5P+qfDqztSbwYR5X/e1UTg==", + "_location": "/sorted-array-functions", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "sorted-array-functions@1.2.0", + "name": "sorted-array-functions", + "escapedName": "sorted-array-functions", + "rawSpec": "1.2.0", + "saveSpec": null, + "fetchSpec": "1.2.0" + }, + "_requiredBy": [ + "/node-schedule" + ], + "_resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.2.0.tgz", + "_spec": "1.2.0", + "_where": "/www/wwwroot/Adminx.cc/nodejs", + "author": { + "name": "Mathias Buus", + "url": "@mafintosh" + }, + "bugs": { + "url": "https://github.com/mafintosh/sorted-array-functions/issues" + }, + "dependencies": {}, + "description": "Maintain and search through a sorted array using some low level functions", + "devDependencies": { + "standard": "^8.4.0", + "tape": "^4.6.2" + }, + "homepage": "https://github.com/mafintosh/sorted-array-functions", + "license": "MIT", + "main": "index.js", + "name": "sorted-array-functions", + "repository": { + "type": "git", + "url": "git+https://github.com/mafintosh/sorted-array-functions.git" + }, + "scripts": { + "test": "standard && tape test.js" + }, + "version": "1.2.0" +} diff --git a/nodejs/node_modules/sorted-array-functions/test.js b/nodejs/node_modules/sorted-array-functions/test.js new file mode 100755 index 0000000..0125aa0 --- /dev/null +++ b/nodejs/node_modules/sorted-array-functions/test.js @@ -0,0 +1,366 @@ +var tape = require('tape') +var sorted = require('./') + +tape('add', function (t) { + var list = [] + + sorted.add(list, 3) + sorted.add(list, 4) + sorted.add(list, 3) + sorted.add(list, 9) + sorted.add(list, 0) + sorted.add(list, 5) + sorted.add(list, 8) + + t.same(list, [0, 3, 3, 4, 5, 8, 9]) + t.end() +}) + +tape('remove', function (t) { + var list = [] + + sorted.add(list, 3) + sorted.add(list, 4) + sorted.add(list, 3) + sorted.add(list, 9) + sorted.add(list, 0) + sorted.add(list, 5) + sorted.add(list, 8) + + sorted.remove(list, 3) + sorted.remove(list, 5) + sorted.remove(list, 6) + + t.same(list, [0, 3, 4, 8, 9]) + t.end() +}) + +tape('has', function (t) { + var list = [] + + sorted.add(list, 3) + t.same(sorted.has(list, 3), true) + t.same(sorted.has(list, 2), false) + + sorted.add(list, 5) + t.same(sorted.has(list, 5), true) + t.same(sorted.has(list, 3), true) + t.same(sorted.has(list, 2), false) + + sorted.add(list, 1) + t.same(sorted.has(list, 1), true) + t.same(sorted.has(list, 5), true) + t.same(sorted.has(list, 3), true) + t.same(sorted.has(list, 2), false) + t.same(sorted.has(list, 8), false) + + t.end() +}) + +tape('eq', function (t) { + var list = [] + + sorted.add(list, 3) + t.same(sorted.eq(list, 3), 0) + t.same(sorted.eq(list, 2), -1) + + sorted.add(list, 5) + t.same(sorted.eq(list, 5), 1) + t.same(sorted.eq(list, 3), 0) + t.same(sorted.eq(list, 2), -1) + + sorted.add(list, 1) + t.same(sorted.eq(list, 1), 0) + t.same(sorted.eq(list, 5), 2) + t.same(sorted.eq(list, 3), 1) + t.same(sorted.eq(list, 2), -1) + t.same(sorted.eq(list, 8), -1) + + t.end() +}) + +tape('gte', function (t) { + var list = [] + + sorted.add(list, 3) + t.same(sorted.gte(list, 3), 0) + t.same(sorted.gte(list, 2), 0) + + sorted.add(list, 5) + t.same(sorted.gte(list, 5), 1) + t.same(sorted.gte(list, 3), 0) + t.same(sorted.gte(list, 2), 0) + + sorted.add(list, 1) + t.same(sorted.gte(list, 1), 0) + t.same(sorted.gte(list, 5), 2) + t.same(sorted.gte(list, 3), 1) + t.same(sorted.gte(list, 2), 1) + t.same(sorted.gte(list, 8), -1) + + t.end() +}) + +tape('gt', function (t) { + var list = [] + + sorted.add(list, 3) + t.same(sorted.gt(list, 3), -1) + t.same(sorted.gt(list, 2), 0) + + sorted.add(list, 5) + t.same(sorted.gt(list, 5), -1) + t.same(sorted.gt(list, 3), 1) + t.same(sorted.gt(list, 2), 0) + + sorted.add(list, 1) + t.same(sorted.gt(list, 1), 1) + t.same(sorted.gt(list, 5), -1) + t.same(sorted.gt(list, 3), 2) + t.same(sorted.gt(list, 2), 1) + t.same(sorted.gt(list, 8), -1) + + t.end() +}) + +tape('lte', function (t) { + var list = [] + + sorted.add(list, 3) + t.same(sorted.lte(list, 3), 0) + t.same(sorted.lte(list, 2), -1) + + sorted.add(list, 5) + t.same(sorted.lte(list, 6), 1) + t.same(sorted.lte(list, 5), 1) + t.same(sorted.lte(list, 3), 0) + t.same(sorted.lte(list, 2), -1) + + sorted.add(list, 1) + t.same(sorted.lte(list, 1), 0) + t.same(sorted.lte(list, 5), 2) + t.same(sorted.lte(list, 3), 1) + t.same(sorted.lte(list, 2), 0) + t.same(sorted.lte(list, 8), 2) + + t.end() +}) + +tape('lt', function (t) { + var list = [] + + sorted.add(list, 3) + t.same(sorted.lt(list, 3), -1) + t.same(sorted.lt(list, 2), -1) + t.same(sorted.lt(list, 4), 0) + + sorted.add(list, 5) + t.same(sorted.lt(list, 6), 1) + t.same(sorted.lt(list, 5), 0) + t.same(sorted.lt(list, 3), -1) + t.same(sorted.lt(list, 2), -1) + + sorted.add(list, 1) + t.same(sorted.lt(list, 1), -1) + t.same(sorted.lt(list, 5), 1) + t.same(sorted.lt(list, 3), 0) + t.same(sorted.lt(list, 2), 0) + t.same(sorted.lt(list, 8), 2) + + t.end() +}) + +tape('custom compare add', function (t) { + var list = [] + + sorted.add(list, {foo: 3}, cmp) + sorted.add(list, {foo: 4}, cmp) + sorted.add(list, {foo: 3}, cmp) + sorted.add(list, {foo: 9}, cmp) + sorted.add(list, {foo: 0}, cmp) + sorted.add(list, {foo: 5}, cmp) + sorted.add(list, {foo: 8}, cmp) + + t.same(list, [{foo: 0}, {foo: 3}, {foo: 3}, {foo: 4}, {foo: 5}, {foo: 8}, {foo: 9}]) + t.end() +}) + +tape('custom compare remove', function (t) { + var list = [] + + sorted.add(list, {foo: 3}, cmp) + sorted.add(list, {foo: 4}, cmp) + sorted.add(list, {foo: 3}, cmp) + sorted.add(list, {foo: 9}, cmp) + sorted.add(list, {foo: 0}, cmp) + sorted.add(list, {foo: 5}, cmp) + sorted.add(list, {foo: 8}, cmp) + + sorted.remove(list, {foo: 3}, cmp) + sorted.remove(list, {foo: 5}, cmp) + sorted.remove(list, {foo: 6}, cmp) + + t.same(list, [{foo: 0}, {foo: 3}, {foo: 4}, {foo: 8}, {foo: 9}]) + t.end() +}) + +tape('custom compare has', function (t) { + var list = [] + + sorted.add(list, {foo: 3}, cmp) + t.same(sorted.has(list, {foo: 3}, cmp), true) + t.same(sorted.has(list, {foo: 2}, cmp), false) + + sorted.add(list, {foo: 5}, cmp) + t.same(sorted.has(list, {foo: 5}, cmp), true) + t.same(sorted.has(list, {foo: 3}, cmp), true) + t.same(sorted.has(list, {foo: 2}, cmp), false) + + sorted.add(list, {foo: 1}, cmp) + t.same(sorted.has(list, {foo: 1}, cmp), true) + t.same(sorted.has(list, {foo: 5}, cmp), true) + t.same(sorted.has(list, {foo: 3}, cmp), true) + t.same(sorted.has(list, {foo: 2}, cmp), false) + t.same(sorted.has(list, {foo: 8}, cmp), false) + + t.end() +}) + +tape('custom compare eq', function (t) { + var list = [] + + sorted.add(list, {foo: 3}, cmp) + t.same(sorted.eq(list, {foo: 3}, cmp), 0) + t.same(sorted.eq(list, {foo: 2}, cmp), -1) + + sorted.add(list, {foo: 5}, cmp) + t.same(sorted.eq(list, {foo: 5}, cmp), 1) + t.same(sorted.eq(list, {foo: 3}, cmp), 0) + t.same(sorted.eq(list, {foo: 2}, cmp), -1) + + sorted.add(list, {foo: 1}, cmp) + t.same(sorted.eq(list, {foo: 1}, cmp), 0) + t.same(sorted.eq(list, {foo: 5}, cmp), 2) + t.same(sorted.eq(list, {foo: 3}, cmp), 1) + t.same(sorted.eq(list, {foo: 2}, cmp), -1) + t.same(sorted.eq(list, {foo: 8}, cmp), -1) + + t.end() +}) + +tape('custom compare gte', function (t) { + var list = [] + + sorted.add(list, {foo: 3}, cmp) + t.same(sorted.gte(list, {foo: 3}, cmp), 0) + t.same(sorted.gte(list, {foo: 2}, cmp), 0) + + sorted.add(list, {foo: 5}, cmp) + t.same(sorted.gte(list, {foo: 5}, cmp), 1) + t.same(sorted.gte(list, {foo: 3}, cmp), 0) + t.same(sorted.gte(list, {foo: 2}, cmp), 0) + + sorted.add(list, {foo: 1}, cmp) + t.same(sorted.gte(list, {foo: 1}, cmp), 0) + t.same(sorted.gte(list, {foo: 5}, cmp), 2) + t.same(sorted.gte(list, {foo: 3}, cmp), 1) + t.same(sorted.gte(list, {foo: 2}, cmp), 1) + t.same(sorted.gte(list, {foo: 8}, cmp), -1) + + t.end() +}) + +tape('custom compare gt', function (t) { + var list = [] + + sorted.add(list, {foo: 3}, cmp) + t.same(sorted.gt(list, {foo: 3}, cmp), -1) + t.same(sorted.gt(list, {foo: 2}, cmp), 0) + + sorted.add(list, {foo: 5}, cmp) + t.same(sorted.gt(list, {foo: 5}, cmp), -1) + t.same(sorted.gt(list, {foo: 3}, cmp), 1) + t.same(sorted.gt(list, {foo: 2}, cmp), 0) + + sorted.add(list, {foo: 1}, cmp) + t.same(sorted.gt(list, {foo: 1}, cmp), 1) + t.same(sorted.gt(list, {foo: 5}, cmp), -1) + t.same(sorted.gt(list, {foo: 3}, cmp), 2) + t.same(sorted.gt(list, {foo: 2}, cmp), 1) + t.same(sorted.gt(list, {foo: 8}, cmp), -1) + + t.end() +}) + +tape('custom compare lte', function (t) { + var list = [] + + sorted.add(list, {foo: 3}, cmp) + t.same(sorted.lte(list, {foo: 3}, cmp), 0) + t.same(sorted.lte(list, {foo: 2}, cmp), -1) + + sorted.add(list, {foo: 5}, cmp) + t.same(sorted.lte(list, {foo: 6}, cmp), 1) + t.same(sorted.lte(list, {foo: 5}, cmp), 1) + t.same(sorted.lte(list, {foo: 3}, cmp), 0) + t.same(sorted.lte(list, {foo: 2}, cmp), -1) + + sorted.add(list, {foo: 1}, cmp) + t.same(sorted.lte(list, {foo: 1}, cmp), 0) + t.same(sorted.lte(list, {foo: 5}, cmp), 2) + t.same(sorted.lte(list, {foo: 3}, cmp), 1) + t.same(sorted.lte(list, {foo: 2}, cmp), 0) + t.same(sorted.lte(list, {foo: 8}, cmp), 2) + + t.end() +}) + +tape('custom compare lt', function (t) { + var list = [] + + sorted.add(list, {foo: 3}, cmp) + t.same(sorted.lt(list, {foo: 3}, cmp), -1) + t.same(sorted.lt(list, {foo: 2}, cmp), -1) + t.same(sorted.lt(list, {foo: 4}, cmp), 0) + + sorted.add(list, {foo: 5}, cmp) + t.same(sorted.lt(list, {foo: 6}, cmp), 1) + t.same(sorted.lt(list, {foo: 5}, cmp), 0) + t.same(sorted.lt(list, {foo: 3}, cmp), -1) + t.same(sorted.lt(list, {foo: 2}, cmp), -1) + + sorted.add(list, {foo: 1}, cmp) + t.same(sorted.lt(list, {foo: 1}, cmp), -1) + t.same(sorted.lt(list, {foo: 5}, cmp), 1) + t.same(sorted.lt(list, {foo: 3}, cmp), 0) + t.same(sorted.lt(list, {foo: 2}, cmp), 0) + t.same(sorted.lt(list, {foo: 8}, cmp), 2) + + t.end() +}) + +tape('find nearest value', function (t) { + var list = [] + + sorted.add(list, 0.001) + sorted.add(list, 10) + sorted.add(list, 20) + sorted.add(list, 30) + sorted.add(list, 40) + sorted.add(list, 50) + sorted.add(list, 70) + + t.equal(sorted.nearest(list, 66), 6) + t.equal(sorted.nearest(list, 51), 5) + t.equal(sorted.nearest(list, 1), 0) + t.equal(sorted.nearest(list, 0), 0) + t.equal(sorted.nearest(list, 69.999), 6) + t.equal(sorted.nearest(list, 72), 6) + + t.end() +}) + +function cmp (a, b) { + return a.foo - b.foo +} + diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json new file mode 100755 index 0000000..1e92bd0 --- /dev/null +++ b/nodejs/package-lock.json @@ -0,0 +1,94 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "cron-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.6.0.tgz", + "integrity": "sha512-KGfDDTjBIx85MnVYcdhLccoJH/7jcYW+5Z/t3Wsg2QlJhmmjf+97z+9sQftS71lopOYYapjEKEvmWaCsym5Z4g==", + "requires": { + "is-nan": "^1.2.1", + "moment-timezone": "^0.5.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" + }, + "is-nan": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.2.1.tgz", + "integrity": "sha1-n69ltvttskt/XAYoR16nH5iEAeI=", + "requires": { + "define-properties": "^1.1.1" + } + }, + "long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ=" + }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "moment-timezone": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.23.tgz", + "integrity": "sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "node-schedule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.0.tgz", + "integrity": "sha512-NNwO9SUPjBwFmPh3vXiPVEhJLn4uqYmZYvJV358SRGM06BR4UoIqxJpeJwDDXB6atULsgQA97MfD1zMd5xsu+A==", + "requires": { + "cron-parser": "^2.4.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.0.0" + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" + }, + "redis": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", + "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", + "requires": { + "double-ended-queue": "^2.1.0-0", + "redis-commands": "^1.2.0", + "redis-parser": "^2.6.0" + } + }, + "redis-commands": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.4.0.tgz", + "integrity": "sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw==" + }, + "redis-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" + }, + "sorted-array-functions": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.2.0.tgz", + "integrity": "sha512-sWpjPhIZJtqO77GN+LD8dDsDKcWZ9GCOJNqKzi1tvtjGIzwfoyuRH8S0psunmc6Z5P+qfDqztSbwYR5X/e1UTg==" + } + } +} diff --git a/nodejs/package.json b/nodejs/package.json new file mode 100755 index 0000000..43fa1c6 --- /dev/null +++ b/nodejs/package.json @@ -0,0 +1,87 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "async": { + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "requires": { + "lodash": "^4.17.10" + }, + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "version": "2.6.1" + }, + "bignumber.js": { + "integrity": "sha1-8725mtUmihX8HwvtL7AY4mk/4jY=", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-3.1.2.tgz", + "version": "3.1.2" + }, + "core-util-is": { + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "version": "1.0.2" + }, + "double-ended-queue": { + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "version": "2.1.0-0" + }, + "inherits": { + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "version": "2.0.3" + }, + "isarray": { + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "version": "0.0.1" + }, + "lodash": { + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "version": "4.17.11" + }, + "mysql": { + "integrity": "sha1-mY8fjKRuLj3XFJzpgkE2U5hqrkc=", + "requires": { + "bignumber.js": "3.1.2", + "readable-stream": "1.1.14", + "sqlstring": "2.2.0" + }, + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.13.0.tgz", + "version": "2.13.0" + }, + "node-schedule": "^1.3.0", + "readable-stream": { + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "version": "1.1.14" + }, + "redis": "^2.8.0", + "redis-commands": { + "integrity": "sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw==", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.4.0.tgz", + "version": "1.4.0" + }, + "redis-parser": { + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "version": "2.6.0" + }, + "sqlstring": { + "integrity": "sha1-wxNcTqirzX5+50GklmqJHYak8ZE=", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.2.0.tgz", + "version": "2.2.0" + }, + "string_decoder": { + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "version": "0.10.31" + } + } +} diff --git a/public/.gitignore b/public/.gitignore new file mode 100644 index 0000000..0f076f9 --- /dev/null +++ b/public/.gitignore @@ -0,0 +1,2 @@ +.well-known +.user.ini \ No newline at end of file diff --git a/public/adminer.php b/public/adminer.php new file mode 100644 index 0000000..312dfe2 --- /dev/null +++ b/public/adminer.php @@ -0,0 +1,874 @@ +$W){unset($kf[$z][$od]);if(is_array($W)){$kf[$z][stripslashes($od)]=$W;$kf[]=&$kf[$z][stripslashes($od)];}else$kf[$z][stripslashes($od)]=($wc?$W:stripslashes($W));}}}}function +bracket_escape($v,$_a=false){static$Sg=array(':'=>':1',']'=>':2','['=>':3','"'=>':4');return +strtr($v,($_a?array_flip($Sg):$Sg));}function +min_version($uh,$Id="",$h=null){global$g;if(!$h)$h=$g;$Sf=$h->server_info;if($Id&&preg_match('~([\d.]+)-MariaDB~',$Sf,$C)){$Sf=$C[1];$uh=$Id;}return(version_compare($Sf,$uh)>=0);}function +charset($g){return(min_version("5.5.3",0,$g)?"utf8mb4":"utf8");}function +script($bg,$Rg="\n"){return"$bg$Rg";}function +script_src($kh){return"\n";}function +nonce(){return' nonce="'.get_nonce().'"';}function +target_blank(){return' target="_blank" rel="noreferrer noopener"';}function +h($lg){return +str_replace("\0","�",htmlspecialchars($lg,ENT_QUOTES,'utf-8'));}function +nl_br($lg){return +str_replace("\n","
        ",$lg);}function +checkbox($E,$Y,$Na,$sd="",$te="",$Ra="",$td=""){$K="".($te?script("qsl('input').onclick = function () { $te };",""):"");return($sd!=""||$Ra?"$K".h($sd)."":$K);}function +optionlist($xe,$Nf=null,$oh=false){$K="";foreach($xe +as$od=>$W){$ye=array($od=>$W);if(is_array($W)){$K.='';$ye=$W;}foreach($ye +as$z=>$X)$K.=''.h($X);if(is_array($W))$K.='';}return$K;}function +html_select($E,$xe,$Y="",$se=true,$td=""){if($se)return"".(is_string($se)?script("qsl('select').onchange = function () { $se };",""):"");$K="";foreach($xe +as$z=>$X)$K.="";return$K;}function +select_input($wa,$xe,$Y="",$se="",$Xe=""){$_g=($xe?"select":"input");return"<$_g$wa".($xe?">
        ","$Ad",script("qsl('a').onclick = partial(toggle, 'fieldset-$u');",""),"","
        \n";}function +selectSearchPrint($Z,$e,$x){print_fieldset("search",lang(45),$Z);foreach($x +as$t=>$w){if($w["type"]=="FULLTEXT"){echo"
        (".implode(", ",array_map('h',$w["columns"])).") AGAINST"," ",script("qsl('input').oninput = selectFieldChange;",""),checkbox("boolean[$t]",1,isset($_GET["boolean"][$t]),"BOOL"),"
        \n";}}$Ka="this.parentNode.firstChild.onchange();";foreach(array_merge((array)$_GET["where"],array(array()))as$t=>$X){if(!$X||("$X[col]$X[val]"!=""&&in_array($X["op"],$this->operators))){echo"
        ".select_input(" name='where[$t][col]'",$e,$X["col"],($X?"selectFieldChange":"selectAddRow"),"(".lang(46).")"),html_select("where[$t][op]",$this->operators,$X["op"],$Ka),"",script("mixin(qsl('input'), {oninput: function () { $Ka }, onkeydown: selectSearchKeydown, onsearch: selectSearchSearch});",""),"
        \n";}}echo"\n";}function +selectOrderPrint($ze,$e,$x){print_fieldset("sort",lang(47),$ze);$t=0;foreach((array)$_GET["order"]as$z=>$X){if($X!=""){echo"
        ".select_input(" name='order[$t]'",$e,$X,"selectFieldChange"),checkbox("desc[$t]",1,isset($_GET["desc"][$z]),lang(48))."
        \n";$t++;}}echo"
        ".select_input(" name='order[$t]'",$e,"","selectAddRow"),checkbox("desc[$t]",1,false,lang(48))."
        \n","\n";}function +selectLimitPrint($_){echo"
        ".lang(49)."
        ";echo"",script("qsl('input').oninput = selectFieldChange;",""),"
        \n";}function +selectLengthPrint($Fg){if($Fg!==null){echo"
        ".lang(50)."
        ","","
        \n";}}function +selectActionPrint($x){echo"
        ".lang(51)."
        ",""," ","\n","var indexColumns = ";$e=array();foreach($x +as$w){$rb=reset($w["columns"]);if($w["type"]!="FULLTEXT"&&$rb)$e[$rb]=1;}$e[""]=1;foreach($e +as$z=>$X)json_row($z);echo";\n","selectFieldChange.call(qs('#form')['select']);\n","\n","
        \n";}function +selectCommandPrint(){return!information_schema(DB);}function +selectImportPrint(){return!information_schema(DB);}function +selectEmailPrint($Wb,$e){}function +selectColumnsProcess($e,$x){global$Gc,$Lc;$N=array();$s=array();foreach((array)$_GET["columns"]as$z=>$X){if($X["fun"]=="count"||($X["col"]!=""&&(!$X["fun"]||in_array($X["fun"],$Gc)||in_array($X["fun"],$Lc)))){$N[$z]=apply_sql_function($X["fun"],($X["col"]!=""?idf_escape($X["col"]):"*"));if(!in_array($X["fun"],$Lc))$s[]=$N[$z];}}return +array($N,$s);}function +selectSearchProcess($o,$x){global$g,$l;$K=array();foreach($x +as$t=>$w){if($w["type"]=="FULLTEXT"&&$_GET["fulltext"][$t]!="")$K[]="MATCH (".implode(", ",array_map('idf_escape',$w["columns"])).") AGAINST (".q($_GET["fulltext"][$t]).(isset($_GET["boolean"][$t])?" IN BOOLEAN MODE":"").")";}foreach((array)$_GET["where"]as$z=>$X){if("$X[col]$X[val]"!=""&&in_array($X["op"],$this->operators)){$df="";$db=" $X[op]";if(preg_match('~IN$~',$X["op"])){$ad=process_length($X["val"]);$db.=" ".($ad!=""?$ad:"(NULL)");}elseif($X["op"]=="SQL")$db=" $X[val]";elseif($X["op"]=="LIKE %%")$db=" LIKE ".$this->processInput($o[$X["col"]],"%$X[val]%");elseif($X["op"]=="ILIKE %%")$db=" ILIKE ".$this->processInput($o[$X["col"]],"%$X[val]%");elseif($X["op"]=="FIND_IN_SET"){$df="$X[op](".q($X["val"]).", ";$db=")";}elseif(!preg_match('~NULL$~',$X["op"]))$db.=" ".$this->processInput($o[$X["col"]],$X["val"]);if($X["col"]!="")$K[]=$df.$l->convertSearch(idf_escape($X["col"]),$X,$o[$X["col"]]).$db;else{$Ya=array();foreach($o +as$E=>$n){if((preg_match('~^[-\d.'.(preg_match('~IN$~',$X["op"])?',':'').']+$~',$X["val"])||!preg_match('~'.number_type().'|bit~',$n["type"]))&&(!preg_match("~[\x80-\xFF]~",$X["val"])||preg_match('~char|text|enum|set~',$n["type"]))&&(!preg_match('~date|timestamp~',$n["type"])||preg_match('~^\d+-\d+-\d+~',$X["val"])))$Ya[]=$df.$l->convertSearch(idf_escape($E),$X,$n).$db;}$K[]=($Ya?"(".implode(" OR ",$Ya).")":"1 = 0");}}}return$K;}function +selectOrderProcess($o,$x){$K=array();foreach((array)$_GET["order"]as$z=>$X){if($X!="")$K[]=(preg_match('~^((COUNT\(DISTINCT |[A-Z0-9_]+\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\)|COUNT\(\*\))$~',$X)?$X:idf_escape($X)).(isset($_GET["desc"][$z])?" DESC":"");}return$K;}function +selectLimitProcess(){return(isset($_GET["limit"])?$_GET["limit"]:"50");}function +selectLengthProcess(){return(isset($_GET["text_length"])?$_GET["text_length"]:"100");}function +selectEmailProcess($Z,$Ac){return +false;}function +selectQueryBuild($N,$Z,$s,$ze,$_,$F){return"";}function +messageQuery($I,$Gg,$qc=false){global$y,$l;restart_session();$Tc=&get_session("queries");if(!$Tc[$_GET["db"]])$Tc[$_GET["db"]]=array();if(strlen($I)>1e6)$I=preg_replace('~[\x80-\xFF]+$~','',substr($I,0,1e6))."\n…";$Tc[$_GET["db"]][]=array($I,time(),$Gg);$fg="sql-".count($Tc[$_GET["db"]]);$K="".lang(53)."\n";if(!$qc&&($zh=$l->warnings())){$u="warnings-".count($Tc[$_GET["db"]]);$K="".lang(35).", $K\n";}return" ".@date("H:i:s").""." $K';}function +editRowPrint($Q,$o,$L,$ih){}function +editFunctions($n){global$Rb;$K=($n["null"]?"NULL/":"");$ih=isset($_GET["select"])||where($_GET);foreach($Rb +as$z=>$Gc){if(!$z||(!isset($_GET["call"])&&$ih)){foreach($Gc +as$Ue=>$X){if(!$Ue||preg_match("~$Ue~",$n["type"]))$K.="/$X";}}if($z&&!preg_match('~set|blob|bytea|raw|file|bool~',$n["type"]))$K.="/SQL";}if($n["auto_increment"]&&!$ih)$K=lang(40);return +explode("/",$K);}function +editInput($Q,$n,$wa,$Y){if($n["type"]=="enum")return(isset($_GET["select"])?" ":"").($n["null"]?" ":"").enum_input("radio",$wa,$n,$Y,0);return"";}function +editHint($Q,$n,$Y){return"";}function +processInput($n,$Y,$r=""){if($r=="SQL")return$Y;$E=$n["field"];$K=q($Y);if(preg_match('~^(now|getdate|uuid)$~',$r))$K="$r()";elseif(preg_match('~^current_(date|timestamp)$~',$r))$K=$r;elseif(preg_match('~^([+-]|\|\|)$~',$r))$K=idf_escape($E)." $r $K";elseif(preg_match('~^[+-] interval$~',$r))$K=idf_escape($E)." $r ".(preg_match("~^(\\d+|'[0-9.: -]') [A-Z_]+\$~i",$Y)?$Y:$K);elseif(preg_match('~^(addtime|subtime|concat)$~',$r))$K="$r(".idf_escape($E).", $K)";elseif(preg_match('~^(md5|sha1|password|encrypt)$~',$r))$K="$r($K)";return +unconvert_field($n,$K);}function +dumpOutput(){$K=array('text'=>lang(54),'file'=>lang(55));if(function_exists('gzencode'))$K['gz']='gzip';return$K;}function +dumpFormat(){return +array('sql'=>'SQL','csv'=>'CSV,','csv;'=>'CSV;','tsv'=>'TSV');}function +dumpDatabase($k){}function +dumpTable($Q,$ng,$md=0){if($_POST["format"]!="sql"){echo"\xef\xbb\xbf";if($ng)dump_csv(array_keys(fields($Q)));}else{if($md==2){$o=array();foreach(fields($Q)as$E=>$n)$o[]=idf_escape($E)." $n[full_type]";$i="CREATE TABLE ".table($Q)." (".implode(", ",$o).")";}else$i=create_sql($Q,$_POST["auto_increment"],$ng);set_utf8mb4($i);if($ng&&$i){if($ng=="DROP+CREATE"||$md==1)echo"DROP ".($md==2?"VIEW":"TABLE")." IF EXISTS ".table($Q).";\n";if($md==1)$i=remove_definer($i);echo"$i;\n\n";}}}function +dumpData($Q,$ng,$I){global$g,$y;$Ld=($y=="sqlite"?0:1048576);if($ng){if($_POST["format"]=="sql"){if($ng=="TRUNCATE+INSERT")echo +truncate_sql($Q).";\n";$o=fields($Q);}$J=$g->query($I,1);if($J){$fd="";$Ia="";$pd=array();$pg="";$tc=($Q!=''?'fetch_assoc':'fetch_row');while($L=$J->$tc()){if(!$pd){$rh=array();foreach($L +as$X){$n=$J->fetch_field();$pd[]=$n->name;$z=idf_escape($n->name);$rh[]="$z = VALUES($z)";}$pg=($ng=="INSERT+UPDATE"?"\nON DUPLICATE KEY UPDATE ".implode(", ",$rh):"").";\n";}if($_POST["format"]!="sql"){if($ng=="table"){dump_csv($pd);$ng="INSERT";}dump_csv($L);}else{if(!$fd)$fd="INSERT INTO ".table($Q)." (".implode(", ",array_map('idf_escape',$pd)).") VALUES";foreach($L +as$z=>$X){$n=$o[$z];$L[$z]=($X!==null?unconvert_field($n,preg_match(number_type(),$n["type"])&&!preg_match('~\[~',$n["full_type"])&&is_numeric($X)?$X:q(($X===false?0:$X))):"NULL");}$If=($Ld?"\n":" ")."(".implode(",\t",$L).")";if(!$Ia)$Ia=$fd.$If;elseif(strlen($Ia)+4+strlen($If)+strlen($pg)<$Ld)$Ia.=",$If";else{echo$Ia.$pg;$Ia=$fd.$If;}}}if($Ia)echo$Ia.$pg;}elseif($_POST["format"]=="sql")echo"-- ".str_replace("\n"," ",$g->error)."\n";}}function +dumpFilename($Xc){return +friendly_url($Xc!=""?$Xc:(SERVER!=""?SERVER:"localhost"));}function +dumpHeaders($Xc,$Xd=false){$Ie=$_POST["output"];$nc=(preg_match('~sql~',$_POST["format"])?"sql":($Xd?"tar":"csv"));header("Content-Type: ".($Ie=="gz"?"application/x-gzip":($nc=="tar"?"application/x-tar":($nc=="sql"||$Ie!="file"?"text/plain":"text/csv")."; charset=utf-8")));if($Ie=="gz")ob_start('ob_gzencode',1e6);return$nc;}function +importServerPath(){return"adminer.sql";}function +homepage(){echo'

        +',$this->name(),' ',$fa,' +',(version_compare($fa,$_COOKIE["adminer_version"])<0?h($_COOKIE["adminer_version"]):""),' +

        +';if($Wd=="auth"){$Ie="";foreach((array)$_SESSION["pwds"]as$th=>$Tf){foreach($Tf +as$O=>$ph){foreach($ph +as$V=>$G){if($G!==null){$xb=$_SESSION["db"][$th][$O][$V];foreach(($xb?array_keys($xb):array(""))as$k)$Ie.="
      • ($Kb[$th]) ".h($V.($O!=""?"@".$this->serverName($O):"").($k!=""?" - $k":""))."\n";}}}}if($Ie)echo"
          \n$Ie
        \n".script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");}else{$S=array();if($_GET["ns"]!==""&&!$Wd&&DB!=""){$g->select_db(DB);$S=table_status('',true);}echo +script_src(preg_replace("~\\?.*~","",ME)."?file=jush.js&version=4.8.1");if(support("sql")){echo' +';if($S){$Ed=array();foreach($S +as$Q=>$U)$Ed[]=preg_quote($Q,'/');echo"var jushLinks = { $y: [ '".js_escape(ME).(support("table")?"table=":"select=")."\$&', /\\b(".implode("|",$Ed).")\\b/g ] };\n";foreach(array("bac","bra","sqlite_quo","mssql_bra")as$X)echo"jushLinks.$X = jushLinks.$y;\n";}$Sf=$g->server_info;echo'bodyLoad(\'',(is_object($g)?preg_replace('~^(\d\.?\d).*~s','\1',$Sf):""),'\'',(preg_match('~MariaDB~',$Sf)?", true":""),'); + +';}$this->databasesPrint($Wd);if(DB==""||!$Wd){echo"

        ".lang(9)."\n";else$this->tablesPrint($S);}}}function +databasesPrint($Wd){global$c,$g;$j=$this->databases();if(DB&&$j&&!in_array(DB,$j))array_unshift($j,DB);echo'

        +

        +';hidden_fields_get();$vb=script("mixin(qsl('select'), {onmousedown: dbMouseDown, onchange: dbChange});");echo"".lang(65).": ".($j?"$vb":"\n"),"\n";foreach(array("import","sql","schema","dump","privileges")as$X){if(isset($_GET[$X])){echo"";break;}}echo"

        \n";}function +tablesPrint($S){echo"
          ".script("mixin(qs('#tables'), {onmouseover: menuOver, onmouseout: menuOut});");foreach($S +as$Q=>$ig){$E=$this->tableName($ig);if($E!=""){echo'
        • ".lang(66)." ",(support("table")||support("indexes")?'$E":"$E")."\n";}}echo"
        \n";}}$c=(function_exists('adminer_object')?adminer_object():new +Adminer);$Kb=array("server"=>"MySQL")+$Kb;if(!defined("DRIVER")){define("DRIVER","server");if(extension_loaded("mysqli")){class +Min_DB +extends +MySQLi{var$extension="MySQLi";function +__construct(){parent::init();}function +connect($O="",$V="",$G="",$ub=null,$Ye=null,$ag=null){global$c;mysqli_report(MYSQLI_REPORT_OFF);list($Vc,$Ye)=explode(":",$O,2);$gg=$c->connectSsl();if($gg)$this->ssl_set($gg['key'],$gg['cert'],$gg['ca'],'','');$K=@$this->real_connect(($O!=""?$Vc:ini_get("mysqli.default_host")),($O.$V!=""?$V:ini_get("mysqli.default_user")),($O.$V.$G!=""?$G:ini_get("mysqli.default_pw")),$ub,(is_numeric($Ye)?$Ye:ini_get("mysqli.default_port")),(!is_numeric($Ye)?$Ye:$ag),($gg?64:0));$this->options(MYSQLI_OPT_LOCAL_INFILE,false);return$K;}function +set_charset($La){if(parent::set_charset($La))return +true;parent::set_charset('utf8');return$this->query("SET NAMES $La");}function +result($I,$n=0){$J=$this->query($I);if(!$J)return +false;$L=$J->fetch_array();return$L[$n];}function +quote($lg){return"'".$this->escape_string($lg)."'";}}}elseif(extension_loaded("mysql")&&!((ini_bool("sql.safe_mode")||ini_bool("mysql.allow_local_infile"))&&extension_loaded("pdo_mysql"))){class +Min_DB{var$extension="MySQL",$server_info,$affected_rows,$errno,$error,$_link,$_result;function +connect($O,$V,$G){if(ini_bool("mysql.allow_local_infile")){$this->error=lang(67,"'mysql.allow_local_infile'","MySQLi","PDO_MySQL");return +false;}$this->_link=@mysql_connect(($O!=""?$O:ini_get("mysql.default_host")),("$O$V"!=""?$V:ini_get("mysql.default_user")),("$O$V$G"!=""?$G:ini_get("mysql.default_password")),true,131072);if($this->_link)$this->server_info=mysql_get_server_info($this->_link);else$this->error=mysql_error();return(bool)$this->_link;}function +set_charset($La){if(function_exists('mysql_set_charset')){if(mysql_set_charset($La,$this->_link))return +true;mysql_set_charset('utf8',$this->_link);}return$this->query("SET NAMES $La");}function +quote($lg){return"'".mysql_real_escape_string($lg,$this->_link)."'";}function +select_db($ub){return +mysql_select_db($ub,$this->_link);}function +query($I,$bh=false){$J=@($bh?mysql_unbuffered_query($I,$this->_link):mysql_query($I,$this->_link));$this->error="";if(!$J){$this->errno=mysql_errno($this->_link);$this->error=mysql_error($this->_link);return +false;}if($J===true){$this->affected_rows=mysql_affected_rows($this->_link);$this->info=mysql_info($this->_link);return +true;}return +new +Min_Result($J);}function +multi_query($I){return$this->_result=$this->query($I);}function +store_result(){return$this->_result;}function +next_result(){return +false;}function +result($I,$n=0){$J=$this->query($I);if(!$J||!$J->num_rows)return +false;return +mysql_result($J->_result,0,$n);}}class +Min_Result{var$num_rows,$_result,$_offset=0;function +__construct($J){$this->_result=$J;$this->num_rows=mysql_num_rows($J);}function +fetch_assoc(){return +mysql_fetch_assoc($this->_result);}function +fetch_row(){return +mysql_fetch_row($this->_result);}function +fetch_field(){$K=mysql_fetch_field($this->_result,$this->_offset++);$K->orgtable=$K->table;$K->orgname=$K->name;$K->charsetnr=($K->blob?63:0);return$K;}function +__destruct(){mysql_free_result($this->_result);}}}elseif(extension_loaded("pdo_mysql")){class +Min_DB +extends +Min_PDO{var$extension="PDO_MySQL";function +connect($O,$V,$G){global$c;$xe=array(PDO::MYSQL_ATTR_LOCAL_INFILE=>false);$gg=$c->connectSsl();if($gg){if(!empty($gg['key']))$xe[PDO::MYSQL_ATTR_SSL_KEY]=$gg['key'];if(!empty($gg['cert']))$xe[PDO::MYSQL_ATTR_SSL_CERT]=$gg['cert'];if(!empty($gg['ca']))$xe[PDO::MYSQL_ATTR_SSL_CA]=$gg['ca'];}$this->dsn("mysql:charset=utf8;host=".str_replace(":",";unix_socket=",preg_replace('~:(\d)~',';port=\1',$O)),$V,$G,$xe);return +true;}function +set_charset($La){$this->query("SET NAMES $La");}function +select_db($ub){return$this->query("USE ".idf_escape($ub));}function +query($I,$bh=false){$this->pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,!$bh);return +parent::query($I,$bh);}}}class +Min_Driver +extends +Min_SQL{function +insert($Q,$P){return($P?parent::insert($Q,$P):queries("INSERT INTO ".table($Q)." ()\nVALUES ()"));}function +insertUpdate($Q,$M,$ff){$e=array_keys(reset($M));$df="INSERT INTO ".table($Q)." (".implode(", ",$e).") VALUES\n";$rh=array();foreach($e +as$z)$rh[$z]="$z = VALUES($z)";$pg="\nON DUPLICATE KEY UPDATE ".implode(", ",$rh);$rh=array();$Bd=0;foreach($M +as$P){$Y="(".implode(", ",$P).")";if($rh&&(strlen($df)+$Bd+strlen($Y)+strlen($pg)>1e6)){if(!queries($df.implode(",\n",$rh).$pg))return +false;$rh=array();$Bd=0;}$rh[]=$Y;$Bd+=strlen($Y)+2;}return +queries($df.implode(",\n",$rh).$pg);}function +slowQuery($I,$Hg){if(min_version('5.7.8','10.1.2')){if(preg_match('~MariaDB~',$this->_conn->server_info))return"SET STATEMENT max_statement_time=$Hg FOR $I";elseif(preg_match('~^(SELECT\b)(.+)~is',$I,$C))return"$C[1] /*+ MAX_EXECUTION_TIME(".($Hg*1000).") */ $C[2]";}}function +convertSearch($v,$X,$n){return(preg_match('~char|text|enum|set~',$n["type"])&&!preg_match("~^utf8~",$n["collation"])&&preg_match('~[\x80-\xFF]~',$X['val'])?"CONVERT($v USING ".charset($this->_conn).")":$v);}function +warnings(){$J=$this->_conn->query("SHOW WARNINGS");if($J&&$J->num_rows){ob_start();select($J);return +ob_get_clean();}}function +tableHelp($E){$Hd=preg_match('~MariaDB~',$this->_conn->server_info);if(information_schema(DB))return +strtolower(($Hd?"information-schema-$E-table/":str_replace("_","-",$E)."-table.html"));if(DB=="mysql")return($Hd?"mysql$E-table/":"system-database.html");}}function +idf_escape($v){return"`".str_replace("`","``",$v)."`";}function +table($v){return +idf_escape($v);}function +connect(){global$c,$ah,$mg;$g=new +Min_DB;$nb=$c->credentials();if($g->connect($nb[0],$nb[1],$nb[2])){$g->set_charset(charset($g));$g->query("SET sql_quote_show_create = 1, autocommit = 1");if(min_version('5.7.8',10.2,$g)){$mg[lang(68)][]="json";$ah["json"]=4294967295;}return$g;}$K=$g->error;if(function_exists('iconv')&&!is_utf8($K)&&strlen($If=iconv("windows-1250","utf-8",$K))>strlen($K))$K=$If;return$K;}function +get_databases($yc){$K=get_session("dbs");if($K===null){$I=(min_version(5)?"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA ORDER BY SCHEMA_NAME":"SHOW DATABASES");$K=($yc?slow_query($I):get_vals($I));restart_session();set_session("dbs",$K);stop_session();}return$K;}function +limit($I,$Z,$_,$ke=0,$Rf=" "){return" $I$Z".($_!==null?$Rf."LIMIT $_".($ke?" OFFSET $ke":""):"");}function +limit1($Q,$I,$Z,$Rf="\n"){return +limit($I,$Z,1,0,$Rf);}function +db_collation($k,$Xa){global$g;$K=null;$i=$g->result("SHOW CREATE DATABASE ".idf_escape($k),1);if(preg_match('~ COLLATE ([^ ]+)~',$i,$C))$K=$C[1];elseif(preg_match('~ CHARACTER SET ([^ ]+)~',$i,$C))$K=$Xa[$C[1]][-1];return$K;}function +engines(){$K=array();foreach(get_rows("SHOW ENGINES")as$L){if(preg_match("~YES|DEFAULT~",$L["Support"]))$K[]=$L["Engine"];}return$K;}function +logged_user(){global$g;return$g->result("SELECT USER()");}function +tables_list(){return +get_key_vals(min_version(5)?"SELECT TABLE_NAME, TABLE_TYPE FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() ORDER BY TABLE_NAME":"SHOW TABLES");}function +count_tables($j){$K=array();foreach($j +as$k)$K[$k]=count(get_vals("SHOW TABLES IN ".idf_escape($k)));return$K;}function +table_status($E="",$rc=false){$K=array();foreach(get_rows($rc&&min_version(5)?"SELECT TABLE_NAME AS Name, ENGINE AS Engine, TABLE_COMMENT AS Comment FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() ".($E!=""?"AND TABLE_NAME = ".q($E):"ORDER BY Name"):"SHOW TABLE STATUS".($E!=""?" LIKE ".q(addcslashes($E,"%_\\")):""))as$L){if($L["Engine"]=="InnoDB")$L["Comment"]=preg_replace('~(?:(.+); )?InnoDB free: .*~','\1',$L["Comment"]);if(!isset($L["Engine"]))$L["Comment"]="";if($E!="")return$L;$K[$L["Name"]]=$L;}return$K;}function +is_view($R){return$R["Engine"]===null;}function +fk_support($R){return +preg_match('~InnoDB|IBMDB2I~i',$R["Engine"])||(preg_match('~NDB~i',$R["Engine"])&&min_version(5.6));}function +fields($Q){$K=array();foreach(get_rows("SHOW FULL COLUMNS FROM ".table($Q))as$L){preg_match('~^([^( ]+)(?:\((.+)\))?( unsigned)?( zerofill)?$~',$L["Type"],$C);$K[$L["Field"]]=array("field"=>$L["Field"],"full_type"=>$L["Type"],"type"=>$C[1],"length"=>$C[2],"unsigned"=>ltrim($C[3].$C[4]),"default"=>($L["Default"]!=""||preg_match("~char|set~",$C[1])?(preg_match('~text~',$C[1])?stripslashes(preg_replace("~^'(.*)'\$~",'\1',$L["Default"])):$L["Default"]):null),"null"=>($L["Null"]=="YES"),"auto_increment"=>($L["Extra"]=="auto_increment"),"on_update"=>(preg_match('~^on update (.+)~i',$L["Extra"],$C)?$C[1]:""),"collation"=>$L["Collation"],"privileges"=>array_flip(preg_split('~, *~',$L["Privileges"])),"comment"=>$L["Comment"],"primary"=>($L["Key"]=="PRI"),"generated"=>preg_match('~^(VIRTUAL|PERSISTENT|STORED)~',$L["Extra"]),);}return$K;}function +indexes($Q,$h=null){$K=array();foreach(get_rows("SHOW INDEX FROM ".table($Q),$h)as$L){$E=$L["Key_name"];$K[$E]["type"]=($E=="PRIMARY"?"PRIMARY":($L["Index_type"]=="FULLTEXT"?"FULLTEXT":($L["Non_unique"]?($L["Index_type"]=="SPATIAL"?"SPATIAL":"INDEX"):"UNIQUE")));$K[$E]["columns"][]=$L["Column_name"];$K[$E]["lengths"][]=($L["Index_type"]=="SPATIAL"?null:$L["Sub_part"]);$K[$E]["descs"][]=null;}return$K;}function +foreign_keys($Q){global$g,$re;static$Ue='(?:`(?:[^`]|``)+`|"(?:[^"]|"")+")';$K=array();$lb=$g->result("SHOW CREATE TABLE ".table($Q),1);if($lb){preg_match_all("~CONSTRAINT ($Ue) FOREIGN KEY ?\\(((?:$Ue,? ?)+)\\) REFERENCES ($Ue)(?:\\.($Ue))? \\(((?:$Ue,? ?)+)\\)(?: ON DELETE ($re))?(?: ON UPDATE ($re))?~",$lb,$Jd,PREG_SET_ORDER);foreach($Jd +as$C){preg_match_all("~$Ue~",$C[2],$bg);preg_match_all("~$Ue~",$C[5],$Ag);$K[idf_unescape($C[1])]=array("db"=>idf_unescape($C[4]!=""?$C[3]:$C[4]),"table"=>idf_unescape($C[4]!=""?$C[4]:$C[3]),"source"=>array_map('idf_unescape',$bg[0]),"target"=>array_map('idf_unescape',$Ag[0]),"on_delete"=>($C[6]?$C[6]:"RESTRICT"),"on_update"=>($C[7]?$C[7]:"RESTRICT"),);}}return$K;}function +view($E){global$g;return +array("select"=>preg_replace('~^(?:[^`]|`[^`]*`)*\s+AS\s+~isU','',$g->result("SHOW CREATE VIEW ".table($E),1)));}function +collations(){$K=array();foreach(get_rows("SHOW COLLATION")as$L){if($L["Default"])$K[$L["Charset"]][-1]=$L["Collation"];else$K[$L["Charset"]][]=$L["Collation"];}ksort($K);foreach($K +as$z=>$X)asort($K[$z]);return$K;}function +information_schema($k){return(min_version(5)&&$k=="information_schema")||(min_version(5.5)&&$k=="performance_schema");}function +error(){global$g;return +h(preg_replace('~^You have an error.*syntax to use~U',"Syntax error",$g->error));}function +create_database($k,$Wa){return +queries("CREATE DATABASE ".idf_escape($k).($Wa?" COLLATE ".q($Wa):""));}function +drop_databases($j){$K=apply_queries("DROP DATABASE",$j,'idf_escape');restart_session();set_session("dbs",null);return$K;}function +rename_database($E,$Wa){$K=false;if(create_database($E,$Wa)){$S=array();$wh=array();foreach(tables_list()as$Q=>$U){if($U=='VIEW')$wh[]=$Q;else$S[]=$Q;}$K=(!$S&&!$wh)||move_tables($S,$wh,$E);drop_databases($K?array(DB):array());}return$K;}function +auto_increment(){$za=" PRIMARY KEY";if($_GET["create"]!=""&&$_POST["auto_increment_col"]){foreach(indexes($_GET["create"])as$w){if(in_array($_POST["fields"][$_POST["auto_increment_col"]]["orig"],$w["columns"],true)){$za="";break;}if($w["type"]=="PRIMARY")$za=" UNIQUE";}}return" AUTO_INCREMENT$za";}function +alter_table($Q,$E,$o,$_c,$bb,$Zb,$Wa,$ya,$Qe){$sa=array();foreach($o +as$n)$sa[]=($n[1]?($Q!=""?($n[0]!=""?"CHANGE ".idf_escape($n[0]):"ADD"):" ")." ".implode($n[1]).($Q!=""?$n[2]:""):"DROP ".idf_escape($n[0]));$sa=array_merge($sa,$_c);$ig=($bb!==null?" COMMENT=".q($bb):"").($Zb?" ENGINE=".q($Zb):"").($Wa?" COLLATE ".q($Wa):"").($ya!=""?" AUTO_INCREMENT=$ya":"");if($Q=="")return +queries("CREATE TABLE ".table($E)." (\n".implode(",\n",$sa)."\n)$ig$Qe");if($Q!=$E)$sa[]="RENAME TO ".table($E);if($ig)$sa[]=ltrim($ig);return($sa||$Qe?queries("ALTER TABLE ".table($Q)."\n".implode(",\n",$sa).$Qe):true);}function +alter_indexes($Q,$sa){foreach($sa +as$z=>$X)$sa[$z]=($X[2]=="DROP"?"\nDROP INDEX ".idf_escape($X[1]):"\nADD $X[0] ".($X[0]=="PRIMARY"?"KEY ":"").($X[1]!=""?idf_escape($X[1])." ":"")."(".implode(", ",$X[2]).")");return +queries("ALTER TABLE ".table($Q).implode(",",$sa));}function +truncate_tables($S){return +apply_queries("TRUNCATE TABLE",$S);}function +drop_views($wh){return +queries("DROP VIEW ".implode(", ",array_map('table',$wh)));}function +drop_tables($S){return +queries("DROP TABLE ".implode(", ",array_map('table',$S)));}function +move_tables($S,$wh,$Ag){global$g;$zf=array();foreach($S +as$Q)$zf[]=table($Q)." TO ".idf_escape($Ag).".".table($Q);if(!$zf||queries("RENAME TABLE ".implode(", ",$zf))){$Bb=array();foreach($wh +as$Q)$Bb[table($Q)]=view($Q);$g->select_db($Ag);$k=idf_escape(DB);foreach($Bb +as$E=>$vh){if(!queries("CREATE VIEW $E AS ".str_replace(" $k."," ",$vh["select"]))||!queries("DROP VIEW $k.$E"))return +false;}return +true;}return +false;}function +copy_tables($S,$wh,$Ag){queries("SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'");foreach($S +as$Q){$E=($Ag==DB?table("copy_$Q"):idf_escape($Ag).".".table($Q));if(($_POST["overwrite"]&&!queries("\nDROP TABLE IF EXISTS $E"))||!queries("CREATE TABLE $E LIKE ".table($Q))||!queries("INSERT INTO $E SELECT * FROM ".table($Q)))return +false;foreach(get_rows("SHOW TRIGGERS LIKE ".q(addcslashes($Q,"%_\\")))as$L){$Vg=$L["Trigger"];if(!queries("CREATE TRIGGER ".($Ag==DB?idf_escape("copy_$Vg"):idf_escape($Ag).".".idf_escape($Vg))." $L[Timing] $L[Event] ON $E FOR EACH ROW\n$L[Statement];"))return +false;}}foreach($wh +as$Q){$E=($Ag==DB?table("copy_$Q"):idf_escape($Ag).".".table($Q));$vh=view($Q);if(($_POST["overwrite"]&&!queries("DROP VIEW IF EXISTS $E"))||!queries("CREATE VIEW $E AS $vh[select]"))return +false;}return +true;}function +trigger($E){if($E=="")return +array();$M=get_rows("SHOW TRIGGERS WHERE `Trigger` = ".q($E));return +reset($M);}function +triggers($Q){$K=array();foreach(get_rows("SHOW TRIGGERS LIKE ".q(addcslashes($Q,"%_\\")))as$L)$K[$L["Trigger"]]=array($L["Timing"],$L["Event"]);return$K;}function +trigger_options(){return +array("Timing"=>array("BEFORE","AFTER"),"Event"=>array("INSERT","UPDATE","DELETE"),"Type"=>array("FOR EACH ROW"),);}function +routine($E,$U){global$g,$bc,$dd,$ah;$qa=array("bool","boolean","integer","double precision","real","dec","numeric","fixed","national char","national varchar");$cg="(?:\\s|/\\*[\s\S]*?\\*/|(?:#|-- )[^\n]*\n?|--\r?\n)";$Zg="((".implode("|",array_merge(array_keys($ah),$qa)).")\\b(?:\\s*\\(((?:[^'\")]|$bc)++)\\))?\\s*(zerofill\\s*)?(unsigned(?:\\s+zerofill)?)?)(?:\\s*(?:CHARSET|CHARACTER\\s+SET)\\s*['\"]?([^'\"\\s,]+)['\"]?)?";$Ue="$cg*(".($U=="FUNCTION"?"":$dd).")?\\s*(?:`((?:[^`]|``)*)`\\s*|\\b(\\S+)\\s+)$Zg";$i=$g->result("SHOW CREATE $U ".idf_escape($E),2);preg_match("~\\(((?:$Ue\\s*,?)*)\\)\\s*".($U=="FUNCTION"?"RETURNS\\s+$Zg\\s+":"")."(.*)~is",$i,$C);$o=array();preg_match_all("~$Ue\\s*,?~is",$C[1],$Jd,PREG_SET_ORDER);foreach($Jd +as$Le)$o[]=array("field"=>str_replace("``","`",$Le[2]).$Le[3],"type"=>strtolower($Le[5]),"length"=>preg_replace_callback("~$bc~s",'normalize_enum',$Le[6]),"unsigned"=>strtolower(preg_replace('~\s+~',' ',trim("$Le[8] $Le[7]"))),"null"=>1,"full_type"=>$Le[4],"inout"=>strtoupper($Le[1]),"collation"=>strtolower($Le[9]),);if($U!="FUNCTION")return +array("fields"=>$o,"definition"=>$C[11]);return +array("fields"=>$o,"returns"=>array("type"=>$C[12],"length"=>$C[13],"unsigned"=>$C[15],"collation"=>$C[16]),"definition"=>$C[17],"language"=>"SQL",);}function +routines(){return +get_rows("SELECT ROUTINE_NAME AS SPECIFIC_NAME, ROUTINE_NAME, ROUTINE_TYPE, DTD_IDENTIFIER FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = ".q(DB));}function +routine_languages(){return +array();}function +routine_id($E,$L){return +idf_escape($E);}function +last_id(){global$g;return$g->result("SELECT LAST_INSERT_ID()");}function +explain($g,$I){return$g->query("EXPLAIN ".(min_version(5.1)&&!min_version(5.7)?"PARTITIONS ":"").$I);}function +found_rows($R,$Z){return($Z||$R["Engine"]!="InnoDB"?null:$R["Rows"]);}function +types(){return +array();}function +schemas(){return +array();}function +get_schema(){return"";}function +set_schema($Kf,$h=null){return +true;}function +create_sql($Q,$ya,$ng){global$g;$K=$g->result("SHOW CREATE TABLE ".table($Q),1);if(!$ya)$K=preg_replace('~ AUTO_INCREMENT=\d+~','',$K);return$K;}function +truncate_sql($Q){return"TRUNCATE ".table($Q);}function +use_sql($ub){return"USE ".idf_escape($ub);}function +trigger_sql($Q){$K="";foreach(get_rows("SHOW TRIGGERS LIKE ".q(addcslashes($Q,"%_\\")),null,"-- ")as$L)$K.="\nCREATE TRIGGER ".idf_escape($L["Trigger"])." $L[Timing] $L[Event] ON ".table($L["Table"])." FOR EACH ROW\n$L[Statement];;\n";return$K;}function +show_variables(){return +get_key_vals("SHOW VARIABLES");}function +process_list(){return +get_rows("SHOW FULL PROCESSLIST");}function +show_status(){return +get_key_vals("SHOW STATUS");}function +convert_field($n){if(preg_match("~binary~",$n["type"]))return"HEX(".idf_escape($n["field"]).")";if($n["type"]=="bit")return"BIN(".idf_escape($n["field"])." + 0)";if(preg_match("~geometry|point|linestring|polygon~",$n["type"]))return(min_version(8)?"ST_":"")."AsWKT(".idf_escape($n["field"]).")";}function +unconvert_field($n,$K){if(preg_match("~binary~",$n["type"]))$K="UNHEX($K)";if($n["type"]=="bit")$K="CONV($K, 2, 10) + 0";if(preg_match("~geometry|point|linestring|polygon~",$n["type"]))$K=(min_version(8)?"ST_":"")."GeomFromText($K, SRID($n[field]))";return$K;}function +support($sc){return!preg_match("~scheme|sequence|type|view_trigger|materializedview".(min_version(8)?"":"|descidx".(min_version(5.1)?"":"|event|partitioning".(min_version(5)?"":"|routine|trigger|view")))."~",$sc);}function +kill_process($X){return +queries("KILL ".number($X));}function +connection_id(){return"SELECT CONNECTION_ID()";}function +max_connections(){global$g;return$g->result("SELECT @@max_connections");}function +driver_config(){$ah=array();$mg=array();foreach(array(lang(69)=>array("tinyint"=>3,"smallint"=>5,"mediumint"=>8,"int"=>10,"bigint"=>20,"decimal"=>66,"float"=>12,"double"=>21),lang(70)=>array("date"=>10,"datetime"=>19,"timestamp"=>19,"time"=>10,"year"=>4),lang(68)=>array("char"=>255,"varchar"=>65535,"tinytext"=>255,"text"=>65535,"mediumtext"=>16777215,"longtext"=>4294967295),lang(71)=>array("enum"=>65535,"set"=>64),lang(72)=>array("bit"=>20,"binary"=>255,"varbinary"=>65535,"tinyblob"=>255,"blob"=>65535,"mediumblob"=>16777215,"longblob"=>4294967295),lang(73)=>array("geometry"=>0,"point"=>0,"linestring"=>0,"polygon"=>0,"multipoint"=>0,"multilinestring"=>0,"multipolygon"=>0,"geometrycollection"=>0),)as$z=>$X){$ah+=$X;$mg[$z]=array_keys($X);}return +array('possible_drivers'=>array("MySQLi","MySQL","PDO_MySQL"),'jush'=>"sql",'types'=>$ah,'structured_types'=>$mg,'unsigned'=>array("unsigned","zerofill","unsigned zerofill"),'operators'=>array("=","<",">","<=",">=","!=","LIKE","LIKE %%","REGEXP","IN","FIND_IN_SET","IS NULL","NOT LIKE","NOT REGEXP","NOT IN","IS NOT NULL","SQL"),'functions'=>array("char_length","date","from_unixtime","lower","round","floor","ceil","sec_to_time","time_to_sec","upper"),'grouping'=>array("avg","count","count distinct","group_concat","max","min","sum"),'edit_functions'=>array(array("char"=>"md5/sha1/password/encrypt/uuid","binary"=>"md5/sha1","date|time"=>"now",),array(number_type()=>"+/-","date"=>"+ interval/- interval","time"=>"addtime/subtime","char|text"=>"concat",)),);}}$eb=driver_config();$cf=$eb['possible_drivers'];$y=$eb['jush'];$ah=$eb['types'];$mg=$eb['structured_types'];$hh=$eb['unsigned'];$ve=$eb['operators'];$Gc=$eb['functions'];$Lc=$eb['grouping'];$Rb=$eb['edit_functions'];if($c->operators===null)$c->operators=$ve;define("SERVER",$_GET[DRIVER]);define("DB",$_GET["db"]);define("ME",preg_replace('~\?.*~','',relative_uri()).'?'.(sid()?SID.'&':'').(SERVER!==null?DRIVER."=".urlencode(SERVER).'&':'').(isset($_GET["username"])?"username=".urlencode($_GET["username"]).'&':'').(DB!=""?'db='.urlencode(DB).'&'.(isset($_GET["ns"])?"ns=".urlencode($_GET["ns"])."&":""):''));$fa="4.8.1";function +page_header($Jg,$m="",$Ha=array(),$Kg=""){global$a,$fa,$c,$Kb,$y;page_headers();if(is_ajax()&&$m){page_messages($m);exit;}$Lg=$Jg.($Kg!=""?": $Kg":"");$Mg=strip_tags($Lg.(SERVER!=""&&SERVER!="localhost"?h(" - ".SERVER):"")." - ".$c->name());echo' + + + +',$Mg,' + +',script_src(preg_replace("~\\?.*~","",ME)."?file=functions.js&version=4.8.1");if($c->head()){echo' + +';foreach($c->css()as$pb){echo' +';}}echo' + +';$vc=get_temp_dir()."/adminer.version";if(!$_COOKIE["adminer_version"]&&function_exists('openssl_verify')&&file_exists($vc)&&filemtime($vc)+86400>time()){$uh=unserialize(file_get_contents($vc));$mf="-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwqWOVuF5uw7/+Z70djoK +RlHIZFZPO0uYRezq90+7Amk+FDNd7KkL5eDve+vHRJBLAszF/7XKXe11xwliIsFs +DFWQlsABVZB3oisKCBEuI71J4kPH8dKGEWR9jDHFw3cWmoH3PmqImX6FISWbG3B8 +h7FIx3jEaw5ckVPVTeo5JRm/1DZzJxjyDenXvBQ/6o9DgZKeNDgxwKzH+sw9/YCO +jHnq1cFpOIISzARlrHMa/43YfeNRAm/tsBXjSxembBPo7aQZLAWHmaj5+K19H10B +nCpz9Y++cipkVEiKRGih4ZEvjoFysEOdRLj6WiD/uUNky4xGeA6LaJqh5XpkFkcQ +fQIDAQAB +-----END PUBLIC KEY----- +";if(openssl_verify($uh["version"],base64_decode($uh["signature"]),$mf)==1)$_COOKIE["adminer_version"]=$uh["version"];}echo' +mixin(document.body, {onkeydown: bodyKeydown, onclick: bodyClick',(isset($_COOKIE["adminer_version"])?"":", onload: partial(verifyVersion, '$fa', '".js_escape(ME)."', '".get_token()."')");?>}); +document.body.className = document.body.className.replace(/ nojs/, ' js'); +var offlineMessage = ' + + +',script("mixin(qs('#help'), {onmouseover: function () { helpOpen = 1; }, onmouseout: helpMouseout});"),' +
        +';if($Ha!==null){$A=substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1);echo'

        $Lg

        \n","\n";restart_session();page_messages($m);$j=&get_session("dbs");if(DB!=""&&$j&&!in_array(DB,$j,true))$j=null;stop_session();define("PAGE_HEADER",1);}function +page_headers(){global$c;header("Content-Type: text/html; charset=utf-8");header("Cache-Control: no-cache");header("X-Frame-Options: deny");header("X-XSS-Protection: 0");header("X-Content-Type-Options: nosniff");header("Referrer-Policy: origin-when-cross-origin");foreach($c->csp()as$ob){$Rc=array();foreach($ob +as$z=>$X)$Rc[]="$z $X";header("Content-Security-Policy: ".implode("; ",$Rc));}$c->headers();}function +csp(){return +array(array("script-src"=>"'self' 'unsafe-inline' 'nonce-".get_nonce()."' 'strict-dynamic'","connect-src"=>"'self'","frame-src"=>"https://www.adminer.org","object-src"=>"'none'","base-uri"=>"'none'","form-action"=>"'self'",),);}function +get_nonce(){static$fe;if(!$fe)$fe=base64_encode(rand_string());return$fe;}function +page_messages($m){$jh=preg_replace('~^[^?]*~','',$_SERVER["REQUEST_URI"]);$Ud=$_SESSION["messages"][$jh];if($Ud){echo"
        ".implode("
        \n
        ",$Ud)."
        ".script("messagesPrint();");unset($_SESSION["messages"][$jh]);}if($m)echo"
        $m
        \n";}function +page_footer($Wd=""){global$c,$T;echo'
        + +';switch_lang();if($Wd!="auth"){echo'
        +

        + + +

        +
        +';}echo' +',script("setupSubmitHighlight(document);");}function +int32($Zd){while($Zd>=2147483648)$Zd-=4294967296;while($Zd<=-2147483649)$Zd+=4294967296;return(int)$Zd;}function +long2str($W,$yh){$If='';foreach($W +as$X)$If.=pack('V',$X);if($yh)return +substr($If,0,end($W));return$If;}function +str2long($If,$yh){$W=array_values(unpack('V*',str_pad($If,4*ceil(strlen($If)/4),"\0")));if($yh)$W[]=strlen($If);return$W;}function +xxtea_mx($Eh,$Dh,$qg,$od){return +int32((($Eh>>5&0x7FFFFFF)^$Dh<<2)+(($Dh>>3&0x1FFFFFFF)^$Eh<<4))^int32(($qg^$Dh)+($od^$Eh));}function +encrypt_string($kg,$z){if($kg=="")return"";$z=array_values(unpack("V*",pack("H*",md5($z))));$W=str2long($kg,true);$Zd=count($W)-1;$Eh=$W[$Zd];$Dh=$W[0];$H=floor(6+52/($Zd+1));$qg=0;while($H-->0){$qg=int32($qg+0x9E3779B9);$Qb=$qg>>2&3;for($Je=0;$Je<$Zd;$Je++){$Dh=$W[$Je+1];$Yd=xxtea_mx($Eh,$Dh,$qg,$z[$Je&3^$Qb]);$Eh=int32($W[$Je]+$Yd);$W[$Je]=$Eh;}$Dh=$W[0];$Yd=xxtea_mx($Eh,$Dh,$qg,$z[$Je&3^$Qb]);$Eh=int32($W[$Zd]+$Yd);$W[$Zd]=$Eh;}return +long2str($W,false);}function +decrypt_string($kg,$z){if($kg=="")return"";if(!$z)return +false;$z=array_values(unpack("V*",pack("H*",md5($z))));$W=str2long($kg,false);$Zd=count($W)-1;$Eh=$W[$Zd];$Dh=$W[0];$H=floor(6+52/($Zd+1));$qg=int32($H*0x9E3779B9);while($qg){$Qb=$qg>>2&3;for($Je=$Zd;$Je>0;$Je--){$Eh=$W[$Je-1];$Yd=xxtea_mx($Eh,$Dh,$qg,$z[$Je&3^$Qb]);$Dh=int32($W[$Je]-$Yd);$W[$Je]=$Dh;}$Eh=$W[$Zd];$Yd=xxtea_mx($Eh,$Dh,$qg,$z[$Je&3^$Qb]);$Dh=int32($W[0]-$Yd);$W[0]=$Dh;$qg=int32($qg-0x9E3779B9);}return +long2str($W,true);}$g='';$Qc=$_SESSION["token"];if(!$Qc)$_SESSION["token"]=rand(1,1e6);$T=get_token();$We=array();if($_COOKIE["adminer_permanent"]){foreach(explode(" ",$_COOKIE["adminer_permanent"])as$X){list($z)=explode(":",$X);$We[$z]=$X;}}function +add_invalid_login(){global$c;$q=file_open_lock(get_temp_dir()."/adminer.invalid");if(!$q)return;$id=unserialize(stream_get_contents($q));$Gg=time();if($id){foreach($id +as$jd=>$X){if($X[0]<$Gg)unset($id[$jd]);}}$hd=&$id[$c->bruteForceKey()];if(!$hd)$hd=array($Gg+30*60,0);$hd[1]++;file_write_unlock($q,serialize($id));}function +check_invalid_login(){global$c;$id=unserialize(@file_get_contents(get_temp_dir()."/adminer.invalid"));$hd=($id?$id[$c->bruteForceKey()]:array());$ee=($hd[1]>29?$hd[0]-time():0);if($ee>0)auth_error(lang(77,ceil($ee/60)));}$xa=$_POST["auth"];if($xa){session_regenerate_id();$th=$xa["driver"];$O=$xa["server"];$V=$xa["username"];$G=(string)$xa["password"];$k=$xa["db"];set_password($th,$O,$V,$G);$_SESSION["db"][$th][$O][$V][$k]=true;if($xa["permanent"]){$z=base64_encode($th)."-".base64_encode($O)."-".base64_encode($V)."-".base64_encode($k);$hf=$c->permanentLogin(true);$We[$z]="$z:".base64_encode($hf?encrypt_string($G,$hf):"");cookie("adminer_permanent",implode(" ",$We));}if(count($_POST)==1||DRIVER!=$th||SERVER!=$O||$_GET["username"]!==$V||DB!=$k)redirect(auth_url($th,$O,$V,$k));}elseif($_POST["logout"]&&(!$Qc||verify_token())){foreach(array("pwds","db","dbs","queries")as$z)set_session($z,null);unset_permanent();redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1),lang(78).' '.lang(79));}elseif($We&&!$_SESSION["pwds"]){session_regenerate_id();$hf=$c->permanentLogin();foreach($We +as$z=>$X){list(,$Qa)=explode(":",$X);list($th,$O,$V,$k)=array_map('base64_decode',explode("-",$z));set_password($th,$O,$V,decrypt_string(base64_decode($Qa),$hf));$_SESSION["db"][$th][$O][$V][$k]=true;}}function +unset_permanent(){global$We;foreach($We +as$z=>$X){list($th,$O,$V,$k)=array_map('base64_decode',explode("-",$z));if($th==DRIVER&&$O==SERVER&&$V==$_GET["username"]&&$k==DB)unset($We[$z]);}cookie("adminer_permanent",implode(" ",$We));}function +auth_error($m){global$c,$Qc;$Uf=session_name();if(isset($_GET["username"])){header("HTTP/1.1 403 Forbidden");if(($_COOKIE[$Uf]||$_GET[$Uf])&&!$Qc)$m=lang(80);else{restart_session();add_invalid_login();$G=get_password();if($G!==null){if($G===false)$m.=($m?'
        ':'').lang(81,target_blank(),'permanentLogin()');set_password(DRIVER,SERVER,$_GET["username"],null);}unset_permanent();}}if(!$_COOKIE[$Uf]&&$_GET[$Uf]&&ini_bool("session.use_only_cookies"))$m=lang(82);$Me=session_get_cookie_params();cookie("adminer_key",($_COOKIE["adminer_key"]?$_COOKIE["adminer_key"]:rand_string()),$Me["lifetime"]);page_header(lang(27),$m,null);echo"
        \n","
        ";if(hidden_fields($_POST,array("auth")))echo"

        ".lang(83)."\n";echo"

        \n";$c->loginForm();echo"
        \n";page_footer("auth");exit;}if(isset($_GET["username"])&&!class_exists("Min_DB")){unset($_SESSION["pwds"][DRIVER]);unset_permanent();page_header(lang(84),lang(85,implode(", ",$cf)),false);page_footer("auth");exit;}stop_session(true);if(isset($_GET["username"])&&is_string(get_password())){list($Vc,$Ye)=explode(":",SERVER,2);if(preg_match('~^\s*([-+]?\d+)~',$Ye,$C)&&($C[1]<1024||$C[1]>65535))auth_error(lang(86));check_invalid_login();$g=connect();$l=new +Min_Driver($g);}$Fd=null;if(!is_object($g)||($Fd=$c->login($_GET["username"],get_password()))!==true){$m=(is_string($g)?h($g):(is_string($Fd)?$Fd:lang(87)));auth_error($m.(preg_match('~^ | $~',get_password())?'
        '.lang(88):''));}if($_POST["logout"]&&$Qc&&!verify_token()){page_header(lang(76),lang(89));page_footer("db");exit;}if($xa&&$_POST["token"])$_POST["token"]=$T;$m='';if($_POST){if(!verify_token()){$cd="max_input_vars";$Pd=ini_get($cd);if(extension_loaded("suhosin")){foreach(array("suhosin.request.max_vars","suhosin.post.max_vars")as$z){$X=ini_get($z);if($X&&(!$Pd||$X<$Pd)){$cd=$z;$Pd=$X;}}}$m=(!$_POST["token"]&&$Pd?lang(90,"'$cd'"):lang(89).' '.lang(91));}}elseif($_SERVER["REQUEST_METHOD"]=="POST"){$m=lang(92,"'post_max_size'");if(isset($_GET["sql"]))$m.=' '.lang(93);}function +select($J,$h=null,$Be=array(),$_=0){global$y;$Ed=array();$x=array();$e=array();$Fa=array();$ah=array();$K=array();odd('');for($t=0;(!$_||$t<$_)&&($L=$J->fetch_row());$t++){if(!$t){echo"
        \n","\n","";for($nd=0;$ndfetch_field();$E=$n->name;$Ae=$n->orgtable;$_e=$n->orgname;$K[$n->table]=$Ae;if($Be&&$y=="sql")$Ed[$nd]=($E=="table"?"table=":($E=="possible_keys"?"indexes=":null));elseif($Ae!=""){if(!isset($x[$Ae])){$x[$Ae]=array();foreach(indexes($Ae,$h)as$w){if($w["type"]=="PRIMARY"){$x[$Ae]=array_flip($w["columns"]);break;}}$e[$Ae]=$x[$Ae];}if(isset($e[$Ae][$_e])){unset($e[$Ae][$_e]);$x[$Ae][$_e]=$nd;$Ed[$nd]=$Ae;}}if($n->charsetnr==63)$Fa[$nd]=true;$ah[$nd]=$n->type;echo"name!=$_e?" title='".h(($Ae!=""?"$Ae.":"").$_e)."'":"").">".h($E).($Be?doc_link(array('sql'=>"explain-output.html#explain_".strtolower($E),'mariadb'=>"explain/#the-columns-in-explain-select",)):"");}echo"\n";}echo"";foreach($L +as$z=>$X){$A="";if(isset($Ed[$z])&&!$e[$Ed[$z]]){if($Be&&$y=="sql"){$Q=$L[array_search("table=",$Ed)];$A=ME.$Ed[$z].urlencode($Be[$Q]!=""?$Be[$Q]:$Q);}else{$A=ME."edit=".urlencode($Ed[$z]);foreach($x[$Ed[$z]]as$Ua=>$nd)$A.="&where".urlencode("[".bracket_escape($Ua)."]")."=".urlencode($L[$nd]);}}elseif(is_url($X))$A=$X;if($X===null)$X="NULL";elseif($Fa[$z]&&!is_utf8($X))$X="".lang(36,strlen($X))."";else{$X=h($X);if($ah[$z]==254)$X="$X";}if($A)$X="$X";echo"
        $X";}}echo($t?"
        \n
        ":"

        ".lang(12))."\n";return$K;}function +referencable_primary($Pf){$K=array();foreach(table_status('',true)as$ug=>$Q){if($ug!=$Pf&&fk_support($Q)){foreach(fields($ug)as$n){if($n["primary"]){if($K[$ug]){unset($K[$ug]);break;}$K[$ug]=$n;}}}}return$K;}function +adminer_settings(){parse_str($_COOKIE["adminer_settings"],$Wf);return$Wf;}function +adminer_setting($z){$Wf=adminer_settings();return$Wf[$z];}function +set_adminer_settings($Wf){return +cookie("adminer_settings",http_build_query($Wf+adminer_settings()));}function +textarea($E,$Y,$M=10,$Ya=80){global$y;echo"";}function +edit_type($z,$n,$Xa,$Bc=array(),$pc=array()){global$mg,$ah,$hh,$re;$U=$n["type"];echo'',"',($hh?"':''),(isset($n['on_update'])?"':''),($Bc?" ":" ");}function +process_length($Bd){global$bc;return(preg_match("~^\\s*\\(?\\s*$bc(?:\\s*,\\s*$bc)*+\\s*\\)?\\s*\$~",$Bd)&&preg_match_all("~$bc~",$Bd,$Jd)?"(".implode(",",$Jd[0]).")":preg_replace('~^[0-9].*~','(\0)',preg_replace('~[^-0-9,+()[\]]~','',$Bd)));}function +process_type($n,$Va="COLLATE"){global$hh;return" $n[type]".process_length($n["length"]).(preg_match(number_type(),$n["type"])&&in_array($n["unsigned"],$hh)?" $n[unsigned]":"").(preg_match('~char|text|enum|set~',$n["type"])&&$n["collation"]?" $Va ".q($n["collation"]):"");}function +process_field($n,$Yg){return +array(idf_escape(trim($n["field"])),process_type($Yg),($n["null"]?" NULL":" NOT NULL"),default_value($n),(preg_match('~timestamp|datetime~',$n["type"])&&$n["on_update"]?" ON UPDATE $n[on_update]":""),(support("comment")&&$n["comment"]!=""?" COMMENT ".q($n["comment"]):""),($n["auto_increment"]?auto_increment():null),);}function +default_value($n){$zb=$n["default"];return($zb===null?"":" DEFAULT ".(preg_match('~char|binary|text|enum|set~',$n["type"])||preg_match('~^(?![a-z])~i',$zb)?q($zb):$zb));}function +type_class($U){foreach(array('char'=>'text','date'=>'time|year','binary'=>'blob','enum'=>'set',)as$z=>$X){if(preg_match("~$z|$X~",$U))return" class='$z'";}}function +edit_fields($o,$Xa,$U="TABLE",$Bc=array()){global$dd;$o=array_values($o);$_b=(($_POST?$_POST["defaults"]:adminer_setting("defaults"))?"":" class='hidden'");$cb=(($_POST?$_POST["comments"]:adminer_setting("comments"))?"":" class='hidden'");echo' +';if($U=="PROCEDURE"){echo'';}echo'',($U=="TABLE"?lang(98):lang(99)),'',lang(38),'',script("qs('#enum-edit').onblur = editingLengthBlur;"),'',lang(100),'',lang(101);if($U=="TABLE"){echo'NULL +AI',doc_link(array('sql'=>"example-auto-increment.html",'mariadb'=>"auto_increment/",)),'',lang(41),(support("comment")?"".lang(39):"");}echo'',"".script("row_count = ".count($o).";"),' + +',script("mixin(qsl('tbody'), {onclick: editingClick, onkeydown: editingKeydown, oninput: editingInput});");foreach($o +as$t=>$n){$t++;$Ce=$n[($_POST?"orig":"field")];$Hb=(isset($_POST["add"][$t-1])||(isset($n["field"])&&!$_POST["drop_col"][$t]))&&(support("drop_col")||$Ce=="");echo' +',($U=="PROCEDURE"?"".html_select("fields[$t][inout]",explode("|",$dd),$n["inout"]):""),'';if($Hb){echo'';}echo'';edit_type("fields[$t]",$n,$Xa,$Bc);if($U=="TABLE"){echo'',checkbox("fields[$t][null]",1,$n["null"],"","","block","label-null"),'',checkbox("fields[$t][has_default]",1,$n["has_default"],"","","","label-default"),'',(support("comment")?"":"");}echo"",(support("move_col")?" "." "." ":""),($Ce==""||support("drop_col")?"":"");}}function +process_fields(&$o){$ke=0;if($_POST["up"]){$wd=0;foreach($o +as$z=>$n){if(key($_POST["up"])==$z){unset($o[$z]);array_splice($o,$wd,0,array($n));break;}if(isset($n["field"]))$wd=$ke;$ke++;}}elseif($_POST["down"]){$Dc=false;foreach($o +as$z=>$n){if(isset($n["field"])&&$Dc){unset($o[key($_POST["down"])]);array_splice($o,$ke,0,array($Dc));break;}if(key($_POST["down"])==$z)$Dc=$n;$ke++;}}elseif($_POST["add"]){$o=array_values($o);array_splice($o,key($_POST["add"]),0,array(array()));}elseif(!$_POST["drop_col"])return +false;return +true;}function +normalize_enum($C){return"'".str_replace("'","''",addcslashes(stripcslashes(str_replace($C[0][0].$C[0][0],$C[0][0],substr($C[0],1,-1))),'\\'))."'";}function +grant($Hc,$jf,$e,$qe){if(!$jf)return +true;if($jf==array("ALL PRIVILEGES","GRANT OPTION"))return($Hc=="GRANT"?queries("$Hc ALL PRIVILEGES$qe WITH GRANT OPTION"):queries("$Hc ALL PRIVILEGES$qe")&&queries("$Hc GRANT OPTION$qe"));return +queries("$Hc ".preg_replace('~(GRANT OPTION)\([^)]*\)~','\1',implode("$e, ",$jf).$e).$qe);}function +drop_create($Lb,$i,$Mb,$Dg,$Nb,$B,$Td,$Rd,$Sd,$ne,$ce){if($_POST["drop"])query_redirect($Lb,$B,$Td);elseif($ne=="")query_redirect($i,$B,$Sd);elseif($ne!=$ce){$mb=queries($i);queries_redirect($B,$Rd,$mb&&queries($Lb));if($mb)queries($Mb);}else +queries_redirect($B,$Rd,queries($Dg)&&queries($Nb)&&queries($Lb)&&queries($i));}function +create_trigger($qe,$L){global$y;$Ig=" $L[Timing] $L[Event]".(preg_match('~ OF~',$L["Event"])?" $L[Of]":"");return"CREATE TRIGGER ".idf_escape($L["Trigger"]).($y=="mssql"?$qe.$Ig:$Ig.$qe).rtrim(" $L[Type]\n$L[Statement]",";").";";}function +create_routine($Ff,$L){global$dd,$y;$P=array();$o=(array)$L["fields"];ksort($o);foreach($o +as$n){if($n["field"]!="")$P[]=(preg_match("~^($dd)\$~",$n["inout"])?"$n[inout] ":"").idf_escape($n["field"]).process_type($n,"CHARACTER SET");}$Ab=rtrim("\n$L[definition]",";");return"CREATE $Ff ".idf_escape(trim($L["name"]))." (".implode(", ",$P).")".(isset($_GET["function"])?" RETURNS".process_type($L["returns"],"CHARACTER SET"):"").($L["language"]?" LANGUAGE $L[language]":"").($y=="pgsql"?" AS ".q($Ab):"$Ab;");}function +remove_definer($I){return +preg_replace('~^([A-Z =]+) DEFINER=`'.preg_replace('~@(.*)~','`@`(%|\1)',logged_user()).'`~','\1',$I);}function +format_foreign_key($p){global$re;$k=$p["db"];$ge=$p["ns"];return" FOREIGN KEY (".implode(", ",array_map('idf_escape',$p["source"])).") REFERENCES ".($k!=""&&$k!=$_GET["db"]?idf_escape($k).".":"").($ge!=""&&$ge!=$_GET["ns"]?idf_escape($ge).".":"").table($p["table"])." (".implode(", ",array_map('idf_escape',$p["target"])).")".(preg_match("~^($re)\$~",$p["on_delete"])?" ON DELETE $p[on_delete]":"").(preg_match("~^($re)\$~",$p["on_update"])?" ON UPDATE $p[on_update]":"");}function +tar_file($vc,$Ng){$K=pack("a100a8a8a8a12a12",$vc,644,0,0,decoct($Ng->size),decoct(time()));$Pa=8*32;for($t=0;$tsend();echo +str_repeat("\0",511-($Ng->size+511)%512);}function +ini_bytes($cd){$X=ini_get($cd);switch(strtolower(substr($X,-1))){case'g':$X*=1024;case'm':$X*=1024;case'k':$X*=1024;}return$X;}function +doc_link($Te,$Eg="?"){global$y,$g;$Sf=$g->server_info;$uh=preg_replace('~^(\d\.?\d).*~s','\1',$Sf);$lh=array('sql'=>"https://dev.mysql.com/doc/refman/$uh/en/",'sqlite'=>"https://www.sqlite.org/",'pgsql'=>"https://www.postgresql.org/docs/$uh/",'mssql'=>"https://msdn.microsoft.com/library/",'oracle'=>"https://www.oracle.com/pls/topic/lookup?ctx=db".preg_replace('~^.* (\d+)\.(\d+)\.\d+\.\d+\.\d+.*~s','\1\2',$Sf)."&id=",);if(preg_match('~MariaDB~',$Sf)){$lh['sql']="https://mariadb.com/kb/en/library/";$Te['sql']=(isset($Te['mariadb'])?$Te['mariadb']:str_replace(".html","/",$Te['sql']));}return($Te[$y]?"$Eg":"");}function +ob_gzencode($lg){return +gzencode($lg);}function +db_size($k){global$g;if(!$g->select_db($k))return"?";$K=0;foreach(table_status()as$R)$K+=$R["Data_length"]+$R["Index_length"];return +format_number($K);}function +set_utf8mb4($i){global$g;static$P=false;if(!$P&&preg_match('~\butf8mb4~i',$i)){$P=true;echo"SET NAMES ".charset($g).";\n\n";}}function +connect_error(){global$c,$g,$T,$m,$Kb;if(DB!=""){header("HTTP/1.1 404 Not Found");page_header(lang(26).": ".h(DB),lang(106),true);}else{if($_POST["db"]&&!$m)queries_redirect(substr(ME,0,-1),lang(107),drop_databases($_POST["db"]));page_header(lang(108),$m,false);echo"

        ".lang(113,$Kb[DRIVER],"".h($g->server_info)."","$g->extension")."\n","

        ".lang(114,"".h(logged_user())."")."\n";$j=$c->databases();if($j){$Lf=support("scheme");$Xa=collations();echo"

        \n","\n",script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});"),"".(support("database")?"\n";$j=($_GET["dbsize"]?count_tables($j):array_flip($j));foreach($j +as$k=>$S){$Ef=h(ME)."db=".urlencode($k);$u=h("Db-".$k);echo"".(support("database")?"
        ":"")."".lang(26)." - ".lang(115).""."".lang(116)."".lang(117)."".lang(118)." - ".lang(119)."".script("qsl('a').onclick = partial(ajaxSetHtml, '".js_escape(ME)."script=connect');","")."
        ".checkbox("db[]",$k,in_array($k,(array)$_POST["db"]),"","","",$u):""),"".h($k)."";$Wa=h(db_collation($k,$Xa));echo"".(support("database")?"$Wa":$Wa),"".($_GET["dbsize"]?$S:"?")."","".($_GET["dbsize"]?db_size($k):"?"),"\n";}echo"
        \n",(support("database")?"\n":""),"\n","
        \n",script("tableCheck();");}}page_footer("db");}if(isset($_GET["status"]))$_GET["variables"]=$_GET["status"];if(isset($_GET["import"]))$_GET["sql"]=$_GET["import"];if(!(DB!=""?$g->select_db(DB):isset($_GET["sql"])||isset($_GET["dump"])||isset($_GET["database"])||isset($_GET["processlist"])||isset($_GET["privileges"])||isset($_GET["user"])||isset($_GET["variables"])||$_GET["script"]=="connect"||$_GET["script"]=="kill")){if(DB!=""||$_GET["refresh"]){restart_session();set_session("dbs",null);}connect_error();exit;}$re="RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT";class +TmpFile{var$handler;var$size;function +__construct(){$this->handler=tmpfile();}function +write($hb){$this->size+=strlen($hb);fwrite($this->handler,$hb);}function +send(){fseek($this->handler,0);fpassthru($this->handler);fclose($this->handler);}}$bc="'(?:''|[^'\\\\]|\\\\.)*'";$dd="IN|OUT|INOUT";if(isset($_GET["select"])&&($_POST["edit"]||$_POST["clone"])&&!$_POST["save"])$_GET["edit"]=$_GET["select"];if(isset($_GET["callf"]))$_GET["call"]=$_GET["callf"];if(isset($_GET["function"]))$_GET["procedure"]=$_GET["function"];if(isset($_GET["download"])){$b=$_GET["download"];$o=fields($b);header("Content-Type: application/octet-stream");header("Content-Disposition: attachment; filename=".friendly_url("$b-".implode("_",$_GET["where"])).".".friendly_url($_GET["field"]));$N=array(idf_escape($_GET["field"]));$J=$l->select($b,$N,array(where($_GET,$o)),$N);$L=($J?$J->fetch_row():array());echo$l->value($L[0],$o[$_GET["field"]]);exit;}elseif(isset($_GET["table"])){$b=$_GET["table"];$o=fields($b);if(!$o)$m=error();$R=table_status1($b,true);$E=$c->tableName($R);page_header(($o&&is_view($R)?$R['Engine']=='materialized view'?lang(122):lang(123):lang(124)).": ".($E!=""?$E:h($b)),$m);$c->selectLinks($R);$bb=$R["Comment"];if($bb!="")echo"

        ".lang(39).": ".h($bb)."\n";if($o)$c->tableStructurePrint($o);if(!is_view($R)){if(support("indexes")){echo"

        ".lang(125)."

        \n";$x=indexes($b);if($x)$c->tableIndexesPrint($x);echo'

        ".lang(94)."

        \n";$Bc=foreign_keys($b);if($Bc){echo"\n","\n";foreach($Bc +as$E=>$p){echo"","
        ".lang(127)."".lang(128)."".lang(97)."".lang(96)."
        ".implode(", ",array_map('h',$p["source"]))."","".($p["db"]!=""?"".h($p["db"]).".":"").($p["ns"]!=""?"".h($p["ns"]).".":"").h($p["table"])."","(".implode(", ",array_map('h',$p["target"])).")","".h($p["on_delete"])."\n","".h($p["on_update"])."\n",''.lang(129).'';}echo"
        \n";}echo'

        ".lang(131)."

        \n";$Xg=triggers($b);if($Xg){echo"\n";foreach($Xg +as$z=>$X)echo"
        ".h($X[0])."".h($X[1])."".h($z)."".lang(129)."\n";echo"
        \n";}echo'
        + +qs(\'#schema\').onselectstart = function () { return false; }; +var tablePos = {',implode(",",$wg)."\n",'}; +var em = qs(\'#schema\').offsetHeight / ',$Pg,'; +document.onmousemove = schemaMousemove; +document.onmouseup = partialArg(schemaMouseup, \'',js_escape(DB),'\'); + +';foreach($Kf +as$E=>$Q){echo"
        ",''.h($E)."",script("qsl('div').onmousedown = schemaMousedown;");foreach($Q["fields"]as$n){$X=''.h($n["field"]).'';echo"
        ".($n["primary"]?"$X":$X);}foreach((array)$Q["references"]as$Bg=>$xf){foreach($xf +as$yd=>$tf){$zd=$yd-$vg[$E][1];$t=0;foreach($tf[0]as$bg)echo"\n
        ";}}foreach((array)$wf[$E]as$Bg=>$xf){foreach($xf +as$yd=>$e){$zd=$yd-$vg[$E][1];$t=0;foreach($e +as$Ag)echo"\n
        ";}}echo"\n
        \n";}foreach($Kf +as$E=>$Q){foreach((array)$Q["references"]as$Bg=>$xf){foreach($xf +as$yd=>$tf){$Vd=$Pg;$Nd=-10;foreach($tf[0]as$z=>$bg){$af=$Q["pos"][0]+$Q["fields"][$bg]["pos"];$bf=$Kf[$Bg]["pos"][0]+$Kf[$Bg]["fields"][$tf[1][$z]]["pos"];$Vd=min($Vd,$af,$bf);$Nd=max($Nd,$af,$bf);}echo"
        \n";}}}echo'
        +
        + +';$wb=array('','USE','DROP+CREATE','CREATE');$xg=array('','DROP+CREATE','CREATE');$tb=array('','TRUNCATE+INSERT','INSERT');if($y=="sql")$tb[]='INSERT+UPDATE';parse_str($_COOKIE["adminer_export"],$L);if(!$L)$L=array("output"=>"text","format"=>"sql","db_style"=>(DB!=""?"":"CREATE"),"table_style"=>"DROP+CREATE","data_style"=>"INSERT");if(!isset($L["events"])){$L["routines"]=$L["events"]=($_GET["dump"]=="");$L["triggers"]=$L["table_style"];}echo"
        ".lang(134)."".html_select("output",$c->dumpOutput(),$L["output"],0)."\n";echo"
        ".lang(135)."".html_select("format",$c->dumpFormat(),$L["format"],0)."\n";echo($y=="sqlite"?"":"
        ".lang(26)."".html_select('db_style',$wb,$L["db_style"]).(support("routine")?checkbox("routines",1,$L["routines"],lang(136)):"").(support("event")?checkbox("events",1,$L["events"],lang(137)):"")),"
        ".lang(117)."".html_select('table_style',$xg,$L["table_style"]).checkbox("auto_increment",1,$L["auto_increment"],lang(40)).(support("trigger")?checkbox("triggers",1,$L["triggers"],lang(131)):""),"
        ".lang(138)."".html_select('data_style',$tb,$L["data_style"]),'
        +

        + + + +',script("qsl('table').onclick = dumpClick;");$ef=array();if(DB!=""){$Na=($b!=""?"":" checked");echo"","\n";$wh="";$yg=tables_list();foreach($yg +as$E=>$U){$df=preg_replace('~_.*~','',$E);$Na=($b==""||$b==(substr($b,-1)=="%"?"$df%":$E));$gf="\n";$j=$c->databases();if($j){foreach($j +as$k){if(!information_schema($k)){$df=preg_replace('~_.*~','',$k);echo"
        ".script("qs('#check-tables').onclick = partial(formCheck, /^tables\\[/);",""),"".script("qs('#check-data').onclick = partial(formCheck, /^data\\[/);",""),"
        ".checkbox("tables[]",$E,$Na,$E,"","block");if($U!==null&&!preg_match('~table~i',$U))$wh.="$gf\n";else +echo"$gf\n";$ef[$df]++;}echo$wh;if($yg)echo +script("ajaxSetHtml('".js_escape(ME)."script=db');");}else{echo"
        ","",script("qs('#check-databases').onclick = partial(formCheck, /^databases\\[/);",""),"
        ".checkbox("databases[]",$k,$b==""||$b=="$df%",$k,"","block")."\n";$ef[$df]++;}}}else +echo"
        ";}echo'
        +

        +';$xc=true;foreach($ef +as$z=>$X){if($z!=""&&$X>1){echo($xc?"

        ":" ")."".h($z)."";$xc=false;}}}elseif(isset($_GET["privileges"])){page_header(lang(60));echo'

        \n";hidden_fields_get();echo"\n",($Hc?"":"\n"),"\n","\n";while($L=$J->fetch_assoc())echo'
        ".lang(24)."".lang(23)."
        '.h($L["User"])."".h($L["Host"]).''.lang(10)."\n";if(!$Hc||DB!="")echo"\n";echo"
        \n","

        \n";}elseif(isset($_GET["sql"])){if(!$m&&$_POST["export"]){dump_headers("sql");$c->dumpTable("","");$c->dumpData("","table",$_POST["query"]);exit;}restart_session();$Uc=&get_session("queries");$Tc=&$Uc[DB];if(!$m&&$_POST["clear"]){$Tc=array();redirect(remove_from_uri("history"));}page_header((isset($_GET["import"])?lang(61):lang(53)),$m);if(!$m&&$_POST){$q=false;if(!isset($_GET["import"]))$I=$_POST["query"];elseif($_POST["webfile"]){$eg=$c->importServerPath();$q=@fopen((file_exists($eg)?$eg:"compress.zlib://$eg.gz"),"rb");$I=($q?fread($q,1e6):false);}else$I=get_file("sql_file",true);if(is_string($I)){if(function_exists('memory_get_usage'))@ini_set("memory_limit",max(ini_bytes("memory_limit"),2*strlen($I)+memory_get_usage()+8e6));if($I!=""&&strlen($I)<1e6){$H=$I.(preg_match("~;[ \t\r\n]*\$~",$I)?"":";");if(!$Tc||reset(end($Tc))!=$H){restart_session();$Tc[]=array($H,time());set_session("queries",$Uc);stop_session();}}$cg="(?:\\s|/\\*[\s\S]*?\\*/|(?:#|-- )[^\n]*\n?|--\r?\n)";$Cb=";";$ke=0;$Yb=true;$h=connect();if(is_object($h)&&DB!=""){$h->select_db(DB);if($_GET["ns"]!="")set_schema($_GET["ns"],$h);}$ab=0;$dc=array();$Ne='[\'"'.($y=="sql"?'`#':($y=="sqlite"?'`[':($y=="mssql"?'[':''))).']|/\*|-- |$'.($y=="pgsql"?'|\$[^$]*\$':'');$Qg=microtime(true);parse_str($_COOKIE["adminer_export"],$la);$Pb=$c->dumpFormat();unset($Pb["sql"]);while($I!=""){if(!$ke&&preg_match("~^$cg*+DELIMITER\\s+(\\S+)~i",$I,$C)){$Cb=$C[1];$I=substr($I,strlen($C[0]));}else{preg_match('('.preg_quote($Cb)."\\s*|$Ne)",$I,$C,PREG_OFFSET_CAPTURE,$ke);list($Dc,$Ze)=$C[0];if(!$Dc&&$q&&!feof($q))$I.=fread($q,1e5);else{if(!$Dc&&rtrim($I)=="")break;$ke=$Ze+strlen($Dc);if($Dc&&rtrim($Dc)!=$Cb){while(preg_match('('.($Dc=='/*'?'\*/':($Dc=='['?']':(preg_match('~^-- |^#~',$Dc)?"\n":preg_quote($Dc)."|\\\\."))).'|$)s',$I,$C,PREG_OFFSET_CAPTURE,$ke)){$If=$C[0][0];if(!$If&&$q&&!feof($q))$I.=fread($q,1e5);else{$ke=$C[0][1]+strlen($If);if($If[0]!="\\")break;}}}else{$Yb=false;$H=substr($I,0,$Ze);$ab++;$gf="
        ".$c->sqlCommandQuery($H)."
        \n";if($y=="sqlite"&&preg_match("~^$cg*+ATTACH\\b~i",$H,$C)){echo$gf,"

        ".lang(140)."\n";$dc[]=" $ab";if($_POST["error_stops"])break;}else{if(!$_POST["only_errors"]){echo$gf;ob_flush();flush();}$hg=microtime(true);if($g->multi_query($H)&&is_object($h)&&preg_match("~^$cg*+USE\\b~i",$H))$h->query($H);do{$J=$g->store_result();if($g->error){echo($_POST["only_errors"]?$gf:""),"

        ".lang(141).($g->errno?" ($g->errno)":"").": ".error()."\n";$dc[]=" $ab";if($_POST["error_stops"])break +2;}else{$Gg=" (".format_time($hg).")".(strlen($H)<1000?" ".lang(10)."":"");$na=$g->affected_rows;$zh=($_POST["only_errors"]?"":$l->warnings());$_h="warnings-$ab";if($zh)$Gg.=", ".lang(35)."".script("qsl('a').onclick = partial(toggle, '$_h');","");$lc=null;$mc="explain-$ab";if(is_object($J)){$_=$_POST["limit"];$Be=select($J,$h,array(),$_);if(!$_POST["only_errors"]){echo"

        \n";$he=$J->num_rows;echo"

        ".($he?($_&&$he>$_?lang(142,$_):"").lang(143,$he):""),$Gg;if($h&&preg_match("~^($cg|\\()*+SELECT\\b~i",$H)&&($lc=explain($h,$H)))echo", Explain".script("qsl('a').onclick = partial(toggle, '$mc');","");$u="export-$ab";echo", ".lang(62)."".script("qsl('a').onclick = partial(toggle, '$u');","")."\n"."

        \n";}}else{if(preg_match("~^$cg*+(CREATE|DROP|ALTER)$cg++(DATABASE|SCHEMA)\\b~i",$H)){restart_session();set_session("dbs",null);stop_session();}if(!$_POST["only_errors"])echo"

        ".lang(144,$na)."$Gg\n";}echo($zh?"

        \n":"");if($lc){echo"\n";}}$hg=microtime(true);}while($g->next_result());}$I=substr($I,$ke);$ke=0;}}}}if($Yb)echo"

        ".lang(145)."\n";elseif($_POST["only_errors"]){echo"

        ".lang(146,$ab-count($dc))," (".format_time($Qg).")\n";}elseif($dc&&$ab>1)echo"

        ".lang(141).": ".implode("",$dc)."\n";}else +echo"

        ".upload_error($I)."\n";}echo' +

        +';$jc="";if(!isset($_GET["import"])){$H=$_GET["sql"];if($_POST)$H=$_POST["query"];elseif($_GET["history"]=="all")$H=$Tc;elseif($_GET["history"]!="")$H=$Tc[$_GET["history"]][0];echo"

        ";textarea("query",$H,20);echo +script(($_POST?"":"qs('textarea').focus();\n")."qs('#form').onsubmit = partial(sqlSubmit, qs('#form'), '".js_escape(remove_from_uri("sql|limit|error_stops|only_errors|history"))."');"),"

        $jc\n",lang(148).": \n";}else{echo"

        ".lang(149)."
        ";$Mc=(extension_loaded("zlib")?"[.gz]":"");echo(ini_bool("file_uploads")?"SQL$Mc (< ".ini_get("upload_max_filesize")."B): \n$jc":lang(150)),"
        \n";$Zc=$c->importServerPath();if($Zc){echo"
        ".lang(151)."
        ",lang(152,"".h($Zc)."$Mc"),' ',"
        \n";}echo"

        ";}echo +checkbox("error_stops",1,($_POST?$_POST["error_stops"]:isset($_GET["import"])||$_GET["error_stops"]),lang(154))."\n",checkbox("only_errors",1,($_POST?$_POST["only_errors"]:isset($_GET["import"])||$_GET["only_errors"]),lang(155))."\n","\n";if(!isset($_GET["import"])&&$Tc){print_fieldset("history",lang(156),$_GET["history"]!="");for($X=end($Tc);$X;$X=prev($Tc)){$z=key($Tc);list($H,$Gg,$Tb)=$X;echo''.lang(10).""." ".@date("H:i:s",$Gg).""." ".shorten_utf8(ltrim(str_replace("\n"," ",str_replace("\r","",preg_replace('~^(#|-- ).*~m','',$H)))),80,"").($Tb?" ($Tb)":"")."
        \n";}echo"\n","".lang(158)."\n","\n";}echo'

        +';}elseif(isset($_GET["edit"])){$b=$_GET["edit"];$o=fields($b);$Z=(isset($_GET["select"])?($_POST["check"]&&count($_POST["check"])==1?where_check($_POST["check"][0],$o):""):where($_GET,$o));$ih=(isset($_GET["select"])?$_POST["edit"]:$Z);foreach($o +as$E=>$n){if(!isset($n["privileges"][$ih?"update":"insert"])||$c->fieldName($n)==""||$n["generated"])unset($o[$E]);}if($_POST&&!$m&&!isset($_GET["select"])){$B=$_POST["referer"];if($_POST["insert"])$B=($ih?null:$_SERVER["REQUEST_URI"]);elseif(!preg_match('~^.+&select=.+$~',$B))$B=ME."select=".urlencode($b);$x=indexes($b);$dh=unique_array($_GET["where"],$x);$pf="\nWHERE $Z";if(isset($_POST["delete"]))queries_redirect($B,lang(159),$l->delete($b,$pf,!$dh));else{$P=array();foreach($o +as$E=>$n){$X=process_input($n);if($X!==false&&$X!==null)$P[idf_escape($E)]=$X;}if($ih){if(!$P)redirect($B);queries_redirect($B,lang(160),$l->update($b,$P,$pf,!$dh));if(is_ajax()){page_headers();page_messages($m);exit;}}else{$J=$l->insert($b,$P);$xd=($J?last_id():0);queries_redirect($B,lang(161,($xd?" $xd":"")),$J);}}}$L=null;if($_POST["save"])$L=(array)$_POST["fields"];elseif($Z){$N=array();foreach($o +as$E=>$n){if(isset($n["privileges"]["select"])){$ua=convert_field($n);if($_POST["clone"]&&$n["auto_increment"])$ua="''";if($y=="sql"&&preg_match("~enum|set~",$n["type"]))$ua="1*".idf_escape($E);$N[]=($ua?"$ua AS ":"").idf_escape($E);}}$L=array();if(!support("table"))$N=array("*");if($N){$J=$l->select($b,$N,array($Z),$N,array(),(isset($_GET["select"])?2:1));if(!$J)$m=error();else{$L=$J->fetch_assoc();if(!$L)$L=false;}if(isset($_GET["select"])&&(!$L||$J->fetch_assoc()))$L=null;}}if(!support("table")&&!$o){if(!$Z){$J=$l->select($b,array("*"),$Z,array("*"));$L=($J?$J->fetch_assoc():false);if(!$L)$L=array($l->primary=>"");}if($L){foreach($L +as$z=>$X){if(!$Z)$L[$z]=null;$o[$z]=array("field"=>$z,"null"=>($z!=$l->primary),"auto_increment"=>($z==$l->primary));}}}edit_form($b,$o,$L,$ih);}elseif(isset($_GET["create"])){$b=$_GET["create"];$Oe=array();foreach(array('HASH','LINEAR HASH','KEY','LINEAR KEY','RANGE','LIST')as$z)$Oe[$z]=$z;$vf=referencable_primary($b);$Bc=array();foreach($vf +as$ug=>$n)$Bc[str_replace("`","``",$ug)."`".str_replace("`","``",$n["field"])]=$ug;$Ee=array();$R=array();if($b!=""){$Ee=fields($b);$R=table_status($b);if(!$R)$m=lang(9);}$L=$_POST;$L["fields"]=(array)$L["fields"];if($L["auto_increment_col"])$L["fields"][$L["auto_increment_col"]]["auto_increment"]=true;if($_POST)set_adminer_settings(array("comments"=>$_POST["comments"],"defaults"=>$_POST["defaults"]));if($_POST&&!process_fields($L["fields"])&&!$m){if($_POST["drop"])queries_redirect(substr(ME,0,-1),lang(162),drop_tables(array($b)));else{$o=array();$ra=array();$mh=false;$_c=array();$De=reset($Ee);$pa=" FIRST";foreach($L["fields"]as$z=>$n){$p=$Bc[$n["type"]];$Yg=($p!==null?$vf[$p]:$n);if($n["field"]!=""){if(!$n["has_default"])$n["default"]=null;if($z==$L["auto_increment_col"])$n["auto_increment"]=true;$lf=process_field($n,$Yg);$ra[]=array($n["orig"],$lf,$pa);if(!$De||$lf!=process_field($De,$De)){$o[]=array($n["orig"],$lf,$pa);if($n["orig"]!=""||$pa)$mh=true;}if($p!==null)$_c[idf_escape($n["field"])]=($b!=""&&$y!="sqlite"?"ADD":" ").format_foreign_key(array('table'=>$Bc[$n["type"]],'source'=>array($n["field"]),'target'=>array($Yg["field"]),'on_delete'=>$n["on_delete"],));$pa=" AFTER ".idf_escape($n["field"]);}elseif($n["orig"]!=""){$mh=true;$o[]=array($n["orig"]);}if($n["orig"]!=""){$De=next($Ee);if(!$De)$pa="";}}$Qe="";if($Oe[$L["partition_by"]]){$Re=array();if($L["partition_by"]=='RANGE'||$L["partition_by"]=='LIST'){foreach(array_filter($L["partition_names"])as$z=>$X){$Y=$L["partition_values"][$z];$Re[]="\n PARTITION ".idf_escape($X)." VALUES ".($L["partition_by"]=='RANGE'?"LESS THAN":"IN").($Y!=""?" ($Y)":" MAXVALUE");}}$Qe.="\nPARTITION BY $L[partition_by]($L[partition])".($Re?" (".implode(",",$Re)."\n)":($L["partitions"]?" PARTITIONS ".(+$L["partitions"]):""));}elseif(support("partitioning")&&preg_match("~partitioned~",$R["Create_options"]))$Qe.="\nREMOVE PARTITIONING";$D=lang(163);if($b==""){cookie("adminer_engine",$L["Engine"]);$D=lang(164);}$E=trim($L["name"]);queries_redirect(ME.(support("table")?"table=":"select=").urlencode($E),$D,alter_table($b,$E,($y=="sqlite"&&($mh||$_c)?$ra:$o),$_c,($L["Comment"]!=$R["Comment"]?$L["Comment"]:null),($L["Engine"]&&$L["Engine"]!=$R["Engine"]?$L["Engine"]:""),($L["Collation"]&&$L["Collation"]!=$R["Collation"]?$L["Collation"]:""),($L["Auto_increment"]!=""?number($L["Auto_increment"]):""),$Qe));}}page_header(($b!=""?lang(33):lang(63)),$m,array("table"=>$b),h($b));if(!$_POST){$L=array("Engine"=>$_COOKIE["adminer_engine"],"fields"=>array(array("field"=>"","type"=>(isset($ah["int"])?"int":(isset($ah["integer"])?"integer":"")),"on_update"=>"")),"partition_names"=>array(""),);if($b!=""){$L=$R;$L["name"]=$b;$L["fields"]=array();if(!$_GET["auto_increment"])$L["Auto_increment"]="";foreach($Ee +as$n){$n["has_default"]=isset($n["default"]);$L["fields"][]=$n;}if(support("partitioning")){$Fc="FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = ".q(DB)." AND TABLE_NAME = ".q($b);$J=$g->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $Fc ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");list($L["partition_by"],$L["partitions"],$L["partition"])=$J->fetch_row();$Re=get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $Fc AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");$Re[""]="";$L["partition_names"]=array_keys($Re);$L["partition_values"]=array_values($Re);}}}$Xa=collations();$ac=engines();foreach($ac +as$Zb){if(!strcasecmp($Zb,$L["Engine"])){$L["Engine"]=$Zb;break;}}echo' +
        +

        +';if(support("columns")||$b==""){echo +lang(165),': +';if($b==""&&!$_POST)echo +script("focus(qs('#form')['name']);");echo($ac?"".on_help("getTarget(event).value",1).script("qsl('select').onchange = helpClose;"):""),' ',($Xa&&!preg_match("~sqlite|mssql~",$y)?html_select("Collation",array(""=>"(".lang(95).")")+$Xa,$L["Collation"]):""),' +';}echo' +';if(support("columns")){echo'

        + +';edit_fields($L["fields"],$Xa,"TABLE",$Bc);echo'
        +',script("editFields();"),'
        +

        +',lang(40),': +',checkbox("defaults",1,($_POST?$_POST["defaults"]:adminer_setting("defaults")),lang(167),"columnShow(this.checked, 5)","jsonly"),(support("comment")?checkbox("comments",1,($_POST?$_POST["comments"]:adminer_setting("comments")),lang(39),"editingCommentsClick(this, true);","jsonly").' ':''),'

        + +';}echo' +';if($b!=""){echo'',confirm(lang(168,$b));}if(support("partitioning")){$Pe=preg_match('~RANGE|LIST~',$L["partition_by"]);print_fieldset("partition",lang(169),$L["partition_by"]);echo'

        +',"".on_help("getTarget(event).value.replace(/./, 'PARTITION BY \$&')",1).script("qsl('select').onchange = partitionByChange;"),'() +',lang(170),': + + +';foreach($L["partition_names"]as$z=>$X){echo'',' + +';}echo' +

        +';}elseif(isset($_GET["indexes"])){$b=$_GET["indexes"];$bd=array("PRIMARY","UNIQUE","INDEX");$R=table_status($b,true);if(preg_match('~MyISAM|M?aria'.(min_version(5.6,'10.0.5')?'|InnoDB':'').'~i',$R["Engine"]))$bd[]="FULLTEXT";if(preg_match('~MyISAM|M?aria'.(min_version(5.7,'10.2.2')?'|InnoDB':'').'~i',$R["Engine"]))$bd[]="SPATIAL";$x=indexes($b);$ff=array();if($y=="mongo"){$ff=$x["_id_"];unset($bd[0]);unset($x["_id_"]);}$L=$_POST;if($_POST&&!$m&&!$_POST["add"]&&!$_POST["drop_col"]){$sa=array();foreach($L["indexes"]as$w){$E=$w["name"];if(in_array($w["type"],$bd)){$e=array();$Cd=array();$Eb=array();$P=array();ksort($w["columns"]);foreach($w["columns"]as$z=>$d){if($d!=""){$Bd=$w["lengths"][$z];$Db=$w["descs"][$z];$P[]=idf_escape($d).($Bd?"(".(+$Bd).")":"").($Db?" DESC":"");$e[]=$d;$Cd[]=($Bd?$Bd:null);$Eb[]=$Db;}}if($e){$kc=$x[$E];if($kc){ksort($kc["columns"]);ksort($kc["lengths"]);ksort($kc["descs"]);if($w["type"]==$kc["type"]&&array_values($kc["columns"])===$e&&(!$kc["lengths"]||array_values($kc["lengths"])===$Cd)&&array_values($kc["descs"])===$Eb){unset($x[$E]);continue;}}$sa[]=array($w["type"],$E,$P);}}}foreach($x +as$E=>$kc)$sa[]=array($kc["type"],$E,"DROP");if(!$sa)redirect(ME."table=".urlencode($b));queries_redirect(ME."table=".urlencode($b),lang(173),alter_indexes($b,$sa));}page_header(lang(125),$m,array("table"=>$b),h($b));$o=array_keys(fields($b));if($_POST["add"]){foreach($L["indexes"]as$z=>$w){if($w["columns"][count($w["columns"])]!="")$L["indexes"][$z]["columns"][]="";}$w=end($L["indexes"]);if($w["type"]||array_filter($w["columns"],'strlen'))$L["indexes"][]=array("columns"=>array(1=>""));}if(!$L){foreach($x +as$z=>$w){$x[$z]["name"]=$z;$x[$z]["columns"][]="";}$x[]=array("columns"=>array(1=>""));$L["indexes"]=$x;}echo' +
        +
        + + + +';if($ff){echo"
        ',lang(174),'',lang(175),'',lang(176),' +
        PRIMARY";foreach($ff["columns"]as$z=>$d){echo +select_input(" disabled",$o,$d)," ";}echo"\n";}$nd=1;foreach($L["indexes"]as$w){if(!$_POST["drop_col"]||$nd!=key($_POST["drop_col"])){echo"
        ".html_select("indexes[$nd][type]",array(-1=>"")+$bd,$w["type"],($nd==count($L["indexes"])?"indexesAddRow.call(this);":1),"label-type"),"";ksort($w["columns"]);$t=1;foreach($w["columns"]as$z=>$d){echo"".select_input(" name='indexes[$nd][columns][$t]' title='".lang(37)."'",($o?array_combine($o,$o):$o),$d,"partial(".($t==count($w["columns"])?"indexesAddColumn":"indexesChangeColumn").", '".js_escape($y=="sql"?"":$_GET["indexes"]."_")."')"),($y=="sql"||$y=="mssql"?"":""),(support("descidx")?checkbox("indexes[$nd][descs][$t]",1,$w["descs"][$z],lang(48)):"")," ";$t++;}echo"\n","".script("qsl('input').onclick = partial(editingRemoveRow, 'indexes\$1[type]');");}$nd++;}echo'
        +
        +

        + + +

        +';}elseif(isset($_GET["database"])){$L=$_POST;if($_POST&&!$m&&!isset($_POST["add_x"])){$E=trim($L["name"]);if($_POST["drop"]){$_GET["db"]="";queries_redirect(remove_from_uri("db|database"),lang(177),drop_databases(array(DB)));}elseif(DB!==$E){if(DB!=""){$_GET["db"]=$E;queries_redirect(preg_replace('~\bdb=[^&]*&~','',ME)."db=".urlencode($E),lang(178),rename_database($E,$L["collation"]));}else{$j=explode("\n",str_replace("\r","",$E));$og=true;$wd="";foreach($j +as$k){if(count($j)==1||$k!=""){if(!create_database($k,$L["collation"]))$og=false;$wd=$k;}}restart_session();set_session("dbs",null);queries_redirect(ME."db=".urlencode($wd),lang(179),$og);}}else{if(!$L["collation"])redirect(substr(ME,0,-1));query_redirect("ALTER DATABASE ".idf_escape($E).(preg_match('~^[a-z0-9_]+$~i',$L["collation"])?" COLLATE $L[collation]":""),substr(ME,0,-1),lang(180));}}page_header(DB!=""?lang(56):lang(109),$m,array(),h(DB));$Xa=collations();$E=DB;if($_POST)$E=$L["name"];elseif(DB!="")$L["collation"]=db_collation(DB,$Xa);elseif($y=="sql"){foreach(get_vals("SHOW GRANTS")as$Hc){if(preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\.\*)?~',$Hc,$C)&&$C[1]){$E=stripcslashes(idf_unescape("`$C[2]`"));break;}}}echo' +
        +

        +',($_POST["add_x"]||strpos($E,"\n")?'
        ':'')."\n".($Xa?html_select("collation",array(""=>"(".lang(95).")")+$Xa,$L["collation"]).doc_link(array('sql'=>"charset-charsets.html",'mariadb'=>"supported-character-sets-and-collations/",)):""),script("focus(qs('#name'));"),' +';if(DB!="")echo"".confirm(lang(168,DB))."\n";elseif(!$_POST["add_x"]&&$_GET["db"]=="")echo"\n";echo' +

        +';}elseif(isset($_GET["call"])){$ca=($_GET["name"]?$_GET["name"]:$_GET["call"]);page_header(lang(181).": ".h($ca),$m);$Ff=routine($_GET["call"],(isset($_GET["callf"])?"FUNCTION":"PROCEDURE"));$ad=array();$He=array();foreach($Ff["fields"]as$t=>$n){if(substr($n["inout"],-3)=="OUT")$He[$t]="@".idf_escape($n["field"])." AS ".idf_escape($n["field"]);if(!$n["inout"]||substr($n["inout"],0,2)=="IN")$ad[]=$t;}if(!$m&&$_POST){$Ja=array();foreach($Ff["fields"]as$z=>$n){if(in_array($z,$ad)){$X=process_input($n);if($X===false)$X="''";if(isset($He[$z]))$g->query("SET @".idf_escape($n["field"])." = $X");}$Ja[]=(isset($He[$z])?"@".idf_escape($n["field"]):$X);}$I=(isset($_GET["callf"])?"SELECT":"CALL")." ".table($ca)."(".implode(", ",$Ja).")";$hg=microtime(true);$J=$g->multi_query($I);$na=$g->affected_rows;echo$c->selectQuery($I,$hg,!$J);if(!$J)echo"

        ".error()."\n";else{$h=connect();if(is_object($h))$h->select_db(DB);do{$J=$g->store_result();if(is_object($J))select($J,$h);else +echo"

        ".lang(182,$na)." ".@date("H:i:s")."\n";}while($g->next_result());if($He)select($g->query("SELECT ".implode(", ",$He)));}}echo' +

        +';if($ad){echo"\n";foreach($ad +as$z){$n=$Ff["fields"][$z];$E=$n["field"];echo"
        ".$c->fieldName($n);$Y=$_POST["fields"][$E];if($Y!=""){if($n["type"]=="enum")$Y=+$Y;if($n["type"]=="set")$Y=array_sum($Y);}input($n,$Y,(string)$_POST["function"][$E]);echo"\n";}echo"
        \n";}echo'

        + + +

        +';}elseif(isset($_GET["foreign"])){$b=$_GET["foreign"];$E=$_GET["name"];$L=$_POST;if($_POST&&!$m&&!$_POST["add"]&&!$_POST["change"]&&!$_POST["change-js"]){$D=($_POST["drop"]?lang(183):($E!=""?lang(184):lang(185)));$B=ME."table=".urlencode($b);if(!$_POST["drop"]){$L["source"]=array_filter($L["source"],'strlen');ksort($L["source"]);$Ag=array();foreach($L["source"]as$z=>$X)$Ag[$z]=$L["target"][$z];$L["target"]=$Ag;}if($y=="sqlite")queries_redirect($B,$D,recreate_table($b,$b,array(),array(),array(" $E"=>($_POST["drop"]?"":" ".format_foreign_key($L)))));else{$sa="ALTER TABLE ".table($b);$Lb="\nDROP ".($y=="sql"?"FOREIGN KEY ":"CONSTRAINT ").idf_escape($E);if($_POST["drop"])query_redirect($sa.$Lb,$B,$D);else{query_redirect($sa.($E!=""?"$Lb,":"")."\nADD".format_foreign_key($L),$B,$D);$m=lang(186)."
        $m";}}}page_header(lang(187),$m,array("table"=>$b),h($b));if($_POST){ksort($L["source"]);if($_POST["add"])$L["source"][]="";elseif($_POST["change"]||$_POST["change-js"])$L["target"]=array();}elseif($E!=""){$Bc=foreign_keys($b);$L=$Bc[$E];$L["source"][]="";}else{$L["table"]=$b;$L["source"]=array("");}echo' +
        +';$bg=array_keys(fields($b));if($L["db"]!="")$g->select_db($L["db"]);if($L["ns"]!="")set_schema($L["ns"]);$uf=array_keys(array_filter(table_status('',true),'fk_support'));$Ag=array_keys(fields(in_array($L["table"],$uf)?$L["table"]:reset($uf)));$se="this.form['change-js'].value = '1'; this.form.submit();";echo"

        ".lang(188).": ".html_select("table",$uf,$L["table"],$se)."\n";if($y=="pgsql")echo +lang(189).": ".html_select("ns",$c->schemas(),$L["ns"]!=""?$L["ns"]:$_GET["ns"],$se);elseif($y!="sqlite"){$xb=array();foreach($c->databases()as$k){if(!information_schema($k))$xb[]=$k;}echo +lang(65).": ".html_select("db",$xb,$L["db"]!=""?$L["db"]:$_GET["db"],$se);}echo' +

        + + +';$nd=0;foreach($L["source"]as$z=>$X){echo"","
        ',lang(127),'',lang(128),'
        ".html_select("source[".(+$z)."]",array(-1=>"")+$bg,$X,($nd==count($L["source"])-1?"foreignAddRow.call(this);":1),"label-source"),"".html_select("target[".(+$z)."]",$Ag,$L["target"][$z],1,"label-target");$nd++;}echo'
        +

        +',lang(97),': ',html_select("on_delete",array(-1=>"")+explode("|",$re),$L["on_delete"]),' ',lang(96),': ',html_select("on_update",array(-1=>"")+explode("|",$re),$L["on_update"]),doc_link(array('sql'=>"innodb-foreign-key-constraints.html",'mariadb'=>"foreign-keys/",)),'

        + +

        +';if($E!=""){echo'',confirm(lang(168,$E));}echo' +

        +';}elseif(isset($_GET["view"])){$b=$_GET["view"];$L=$_POST;$Fe="VIEW";if($y=="pgsql"&&$b!=""){$ig=table_status($b);$Fe=strtoupper($ig["Engine"]);}if($_POST&&!$m){$E=trim($L["name"]);$ua=" AS\n$L[select]";$B=ME."table=".urlencode($E);$D=lang(192);$U=($_POST["materialized"]?"MATERIALIZED VIEW":"VIEW");if(!$_POST["drop"]&&$b==$E&&$y!="sqlite"&&$U=="VIEW"&&$Fe=="VIEW")query_redirect(($y=="mssql"?"ALTER":"CREATE OR REPLACE")." VIEW ".table($E).$ua,$B,$D);else{$Cg=$E."_adminer_".uniqid();drop_create("DROP $Fe ".table($b),"CREATE $U ".table($E).$ua,"DROP $U ".table($E),"CREATE $U ".table($Cg).$ua,"DROP $U ".table($Cg),($_POST["drop"]?substr(ME,0,-1):$B),lang(193),$D,lang(194),$b,$E);}}if(!$_POST&&$b!=""){$L=view($b);$L["name"]=$b;$L["materialized"]=($Fe!="VIEW");if(!$m)$m=error();}page_header(($b!=""?lang(32):lang(195)),$m,array("table"=>$b),h($b));echo' +
        +

        ',lang(176),': +',(support("materializedview")?" ".checkbox("materialized",1,$L["materialized"],lang(122)):""),'

        ';textarea("select",$L["select"]);echo'

        + +';if($b!=""){echo'',confirm(lang(168,$b));}echo' +

        +';}elseif(isset($_GET["event"])){$aa=$_GET["event"];$gd=array("YEAR","QUARTER","MONTH","DAY","HOUR","MINUTE","WEEK","SECOND","YEAR_MONTH","DAY_HOUR","DAY_MINUTE","DAY_SECOND","HOUR_MINUTE","HOUR_SECOND","MINUTE_SECOND");$jg=array("ENABLED"=>"ENABLE","DISABLED"=>"DISABLE","SLAVESIDE_DISABLED"=>"DISABLE ON SLAVE");$L=$_POST;if($_POST&&!$m){if($_POST["drop"])query_redirect("DROP EVENT ".idf_escape($aa),substr(ME,0,-1),lang(196));elseif(in_array($L["INTERVAL_FIELD"],$gd)&&isset($jg[$L["STATUS"]])){$Jf="\nON SCHEDULE ".($L["INTERVAL_VALUE"]?"EVERY ".q($L["INTERVAL_VALUE"])." $L[INTERVAL_FIELD]".($L["STARTS"]?" STARTS ".q($L["STARTS"]):"").($L["ENDS"]?" ENDS ".q($L["ENDS"]):""):"AT ".q($L["STARTS"]))." ON COMPLETION".($L["ON_COMPLETION"]?"":" NOT")." PRESERVE";queries_redirect(substr(ME,0,-1),($aa!=""?lang(197):lang(198)),queries(($aa!=""?"ALTER EVENT ".idf_escape($aa).$Jf.($aa!=$L["EVENT_NAME"]?"\nRENAME TO ".idf_escape($L["EVENT_NAME"]):""):"CREATE EVENT ".idf_escape($L["EVENT_NAME"]).$Jf)."\n".$jg[$L["STATUS"]]." COMMENT ".q($L["EVENT_COMMENT"]).rtrim(" DO\n$L[EVENT_DEFINITION]",";").";"));}}page_header(($aa!=""?lang(199).": ".h($aa):lang(200)),$m);if(!$L&&$aa!=""){$M=get_rows("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = ".q(DB)." AND EVENT_NAME = ".q($aa));$L=reset($M);}echo' +
        + +
        ',lang(176),' +
        ',lang(201),' +
        ',lang(202),' +
        ',lang(203),' ',html_select("INTERVAL_FIELD",$gd,$L["INTERVAL_FIELD"]),'
        ',lang(112),'',html_select("STATUS",$jg,$L["STATUS"]),'
        ',lang(39),' +
        ',checkbox("ON_COMPLETION","PRESERVE",$L["ON_COMPLETION"]=="PRESERVE",lang(204)),'
        +

        ';textarea("EVENT_DEFINITION",$L["EVENT_DEFINITION"]);echo'

        + +';if($aa!=""){echo'',confirm(lang(168,$aa));}echo' +

        +';}elseif(isset($_GET["procedure"])){$ca=($_GET["name"]?$_GET["name"]:$_GET["procedure"]);$Ff=(isset($_GET["function"])?"FUNCTION":"PROCEDURE");$L=$_POST;$L["fields"]=(array)$L["fields"];if($_POST&&!process_fields($L["fields"])&&!$m){$Ce=routine($_GET["procedure"],$Ff);$Cg="$L[name]_adminer_".uniqid();drop_create("DROP $Ff ".routine_id($ca,$Ce),create_routine($Ff,$L),"DROP $Ff ".routine_id($L["name"],$L),create_routine($Ff,array("name"=>$Cg)+$L),"DROP $Ff ".routine_id($Cg,$L),substr(ME,0,-1),lang(205),lang(206),lang(207),$ca,$L["name"]);}page_header(($ca!=""?(isset($_GET["function"])?lang(208):lang(209)).": ".h($ca):(isset($_GET["function"])?lang(210):lang(211))),$m);if(!$_POST&&$ca!=""){$L=routine($_GET["procedure"],$Ff);$L["name"]=$ca;}$Xa=get_vals("SHOW CHARACTER SET");sort($Xa);$Gf=routine_languages();echo' +
        +

        ',lang(176),': +',($Gf?lang(19).": ".html_select("language",$Gf,$L["language"])."\n":""),' +

        + +';edit_fields($L["fields"],$Xa,$Ff);if(isset($_GET["function"])){echo"
        ".lang(212);edit_type("returns",$L["returns"],$Xa,array(),($y=="pgsql"?array("void","trigger"):array()));}echo'
        +',script("editFields();"),'
        +

        ';textarea("definition",$L["definition"]);echo'

        + +';if($ca!=""){echo'',confirm(lang(168,$ca));}echo' +

        +';}elseif(isset($_GET["trigger"])){$b=$_GET["trigger"];$E=$_GET["name"];$Wg=trigger_options();$L=(array)trigger($E,$b)+array("Trigger"=>$b."_bi");if($_POST){if(!$m&&in_array($_POST["Timing"],$Wg["Timing"])&&in_array($_POST["Event"],$Wg["Event"])&&in_array($_POST["Type"],$Wg["Type"])){$qe=" ON ".table($b);$Lb="DROP TRIGGER ".idf_escape($E).($y=="pgsql"?$qe:"");$B=ME."table=".urlencode($b);if($_POST["drop"])query_redirect($Lb,$B,lang(213));else{if($E!="")queries($Lb);queries_redirect($B,($E!=""?lang(214):lang(215)),queries(create_trigger($qe,$_POST)));if($E!="")queries(create_trigger($qe,$L+array("Type"=>reset($Wg["Type"]))));}}$L=$_POST;}page_header(($E!=""?lang(216).": ".h($E):lang(217)),$m,array("table"=>$b));echo' +
        + +
        ',lang(218),'',html_select("Timing",$Wg["Timing"],$L["Timing"],"triggerChange(/^".preg_quote($b,"/")."_[ba][iud]$/, '".js_escape($b)."', this.form);"),'
        ',lang(219),'',html_select("Event",$Wg["Event"],$L["Event"],"this.form['Timing'].onchange();"),(in_array("UPDATE OF",$Wg["Event"])?" ":""),'
        ',lang(38),'',html_select("Type",$Wg["Type"],$L["Type"]),'
        +

        ',lang(176),': +',script("qs('#form')['Timing'].onchange();"),'

        ';textarea("Statement",$L["Statement"]);echo'

        + +';if($E!=""){echo'',confirm(lang(168,$E));}echo' +

        +';}elseif(isset($_GET["user"])){$ea=$_GET["user"];$jf=array(""=>array("All privileges"=>""));foreach(get_rows("SHOW PRIVILEGES")as$L){foreach(explode(",",($L["Privilege"]=="Grant option"?"":$L["Context"]))as$ib)$jf[$ib][$L["Privilege"]]=$L["Comment"];}$jf["Server Admin"]+=$jf["File access on server"];$jf["Databases"]["Create routine"]=$jf["Procedures"]["Create routine"];unset($jf["Procedures"]["Create routine"]);$jf["Columns"]=array();foreach(array("Select","Insert","Update","References")as$X)$jf["Columns"][$X]=$jf["Tables"][$X];unset($jf["Server Admin"]["Usage"]);foreach($jf["Tables"]as$z=>$X)unset($jf["Databases"][$z]);$be=array();if($_POST){foreach($_POST["objects"]as$z=>$X)$be[$X]=(array)$be[$X]+(array)$_POST["grants"][$z];}$Ic=array();$oe="";if(isset($_GET["host"])&&($J=$g->query("SHOW GRANTS FOR ".q($ea)."@".q($_GET["host"])))){while($L=$J->fetch_row()){if(preg_match('~GRANT (.*) ON (.*) TO ~',$L[0],$C)&&preg_match_all('~ *([^(,]*[^ ,(])( *\([^)]+\))?~',$C[1],$Jd,PREG_SET_ORDER)){foreach($Jd +as$X){if($X[1]!="USAGE")$Ic["$C[2]$X[2]"][$X[1]]=true;if(preg_match('~ WITH GRANT OPTION~',$L[0]))$Ic["$C[2]$X[2]"]["GRANT OPTION"]=true;}}if(preg_match("~ IDENTIFIED BY PASSWORD '([^']+)~",$L[0],$C))$oe=$C[1];}}if($_POST&&!$m){$pe=(isset($_GET["host"])?q($ea)."@".q($_GET["host"]):"''");if($_POST["drop"])query_redirect("DROP USER $pe",ME."privileges=",lang(220));else{$de=q($_POST["user"])."@".q($_POST["host"]);$Se=$_POST["pass"];if($Se!=''&&!$_POST["hashed"]&&!min_version(8)){$Se=$g->result("SELECT PASSWORD(".q($Se).")");$m=!$Se;}$mb=false;if(!$m){if($pe!=$de){$mb=queries((min_version(5)?"CREATE USER":"GRANT USAGE ON *.* TO")." $de IDENTIFIED BY ".(min_version(8)?"":"PASSWORD ").q($Se));$m=!$mb;}elseif($Se!=$oe)queries("SET PASSWORD FOR $de = ".q($Se));}if(!$m){$Cf=array();foreach($be +as$je=>$Hc){if(isset($_GET["grant"]))$Hc=array_filter($Hc);$Hc=array_keys($Hc);if(isset($_GET["grant"]))$Cf=array_diff(array_keys(array_filter($be[$je],'strlen')),$Hc);elseif($pe==$de){$me=array_keys((array)$Ic[$je]);$Cf=array_diff($me,$Hc);$Hc=array_diff($Hc,$me);unset($Ic[$je]);}if(preg_match('~^(.+)\s*(\(.*\))?$~U',$je,$C)&&(!grant("REVOKE",$Cf,$C[2]," ON $C[1] FROM $de")||!grant("GRANT",$Hc,$C[2]," ON $C[1] TO $de"))){$m=true;break;}}}if(!$m&&isset($_GET["host"])){if($pe!=$de)queries("DROP USER $pe");elseif(!isset($_GET["grant"])){foreach($Ic +as$je=>$Cf){if(preg_match('~^(.+)(\(.*\))?$~U',$je,$C))grant("REVOKE",array_keys($Cf),$C[2]," ON $C[1] FROM $de");}}}queries_redirect(ME."privileges=",(isset($_GET["host"])?lang(221):lang(222)),!$m);if($mb)$g->query("DROP USER $de");}}page_header((isset($_GET["host"])?lang(24).": ".h("$ea@$_GET[host]"):lang(139)),$m,array("privileges"=>array('',lang(60))));if($_POST){$L=$_POST;$Ic=$be;}else{$L=$_GET+array("host"=>$g->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', -1)"));$L["pass"]=$oe;if($oe!="")$L["hashed"]=true;$Ic[(DB==""||$Ic?"":idf_escape(addcslashes(DB,"%_\\"))).".*"]=array();}echo'
        + +
        ',lang(23),' +
        ',lang(24),' +
        ',lang(25),' +';if(!$L["hashed"])echo +script("typePassword(qs('#pass'));");echo(min_version(8)?"":checkbox("hashed",1,$L["hashed"],lang(223),"typePassword(this.form['pass'], this.checked);")),'
        + +';echo"\n","\n";foreach(array(""=>"","Server Admin"=>lang(23),"Databases"=>lang(26),"Tables"=>lang(124),"Columns"=>lang(37),"Procedures"=>lang(224),)as$ib=>$Db){foreach((array)$jf[$ib]as$if=>$bb){echo"$Db'.h($if);$t=0;foreach($Ic +as$je=>$Hc){$E="'grants[$t][".h(strtoupper($if))."]'";$Y=$Hc[strtoupper($if)];if($ib=="Server Admin"&&$je!=(isset($Ic["*.*"])?"*.*":".*"))echo"
        ".lang(60).doc_link(array('sql'=>"grant.html#priv_level"));$t=0;foreach($Ic +as$je=>$Hc){echo''.($je!="*.*"?"":"*.*");$t++;}echo"
        ";elseif(isset($_GET["grant"]))echo"";else{echo"";}$t++;}}}echo"
        \n",'

        + +';if(isset($_GET["host"])){echo'',confirm(lang(168,"$ea@$_GET[host]"));}echo' +

        +';}elseif(isset($_GET["processlist"])){if(support("kill")){if($_POST&&!$m){$rd=0;foreach((array)$_POST["kill"]as$X){if(kill_process($X))$rd++;}queries_redirect(ME."processlist=",lang(227,$rd),$rd||!$_POST["kill"]);}}page_header(lang(110),$m);echo' +
        +
        + +',script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");$t=-1;foreach(process_list()as$t=>$L){if(!$t){echo"".(support("kill")?"\n";}echo"".(support("kill")?"
        ":"");foreach($L +as$z=>$X)echo"$z".doc_link(array('sql'=>"show-processlist.html#processlist_".strtolower($z),));echo"
        ".checkbox("kill[]",$L[$y=="sql"?"Id":"pid"],0):"");foreach($L +as$z=>$X)echo"".(($y=="sql"&&$z=="Info"&&preg_match("~Query|Killed~",$L["Command"])&&$X!="")||($y=="pgsql"&&$z=="current_query"&&$X!="")||($y=="oracle"&&$z=="sql_text"&&$X!="")?"".shorten_utf8($X,100,"").' '.lang(228).'':h($X));echo"\n";}echo'
        +
        +

        +';if(support("kill")){echo($t+1)."/".lang(229,max_connections()),"

        \n";}echo' +

        +',script("tableCheck();");}elseif(isset($_GET["select"])){$b=$_GET["select"];$R=table_status1($b);$x=indexes($b);$o=fields($b);$Bc=column_foreign_keys($b);$le=$R["Oid"];parse_str($_COOKIE["adminer_import"],$ma);$Df=array();$e=array();$Fg=null;foreach($o +as$z=>$n){$E=$c->fieldName($n);if(isset($n["privileges"]["select"])&&$E!=""){$e[$z]=html_entity_decode(strip_tags($E),ENT_QUOTES);if(is_shortable($n))$Fg=$c->selectLengthProcess();}$Df+=$n["privileges"];}list($N,$s)=$c->selectColumnsProcess($e,$x);$kd=count($s)selectSearchProcess($o,$x);$ze=$c->selectOrderProcess($o,$x);$_=$c->selectLimitProcess();if($_GET["val"]&&is_ajax()){header("Content-Type: text/plain; charset=utf-8");foreach($_GET["val"]as$eh=>$L){$ua=convert_field($o[key($L)]);$N=array($ua?$ua:idf_escape(key($L)));$Z[]=where_check($eh,$o);$K=$l->select($b,$N,$Z,$N);if($K)echo +reset($K->fetch_row());}exit;}$ff=$gh=null;foreach($x +as$w){if($w["type"]=="PRIMARY"){$ff=array_flip($w["columns"]);$gh=($N?$ff:array());foreach($gh +as$z=>$X){if(in_array(idf_escape($z),$N))unset($gh[$z]);}break;}}if($le&&!$ff){$ff=$gh=array($le=>0);$x[]=array("type"=>"PRIMARY","columns"=>array($le));}if($_POST&&!$m){$Bh=$Z;if(!$_POST["all"]&&is_array($_POST["check"])){$Oa=array();foreach($_POST["check"]as$Ma)$Oa[]=where_check($Ma,$o);$Bh[]="((".implode(") OR (",$Oa)."))";}$Bh=($Bh?"\nWHERE ".implode(" AND ",$Bh):"");if($_POST["export"]){cookie("adminer_import","output=".urlencode($_POST["output"])."&format=".urlencode($_POST["format"]));dump_headers($b);$c->dumpTable($b,"");$Fc=($N?implode(", ",$N):"*").convert_fields($e,$o,$N)."\nFROM ".table($b);$Kc=($s&&$kd?"\nGROUP BY ".implode(", ",$s):"").($ze?"\nORDER BY ".implode(", ",$ze):"");if(!is_array($_POST["check"])||$ff)$I="SELECT $Fc$Bh$Kc";else{$ch=array();foreach($_POST["check"]as$X)$ch[]="(SELECT".limit($Fc,"\nWHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($X,$o).$Kc,1).")";$I=implode(" UNION ALL ",$ch);}$c->dumpData($b,"table",$I);exit;}if(!$c->selectEmailProcess($Z,$Bc)){if($_POST["save"]||$_POST["delete"]){$J=true;$na=0;$P=array();if(!$_POST["delete"]){foreach($e +as$E=>$X){$X=process_input($o[$E]);if($X!==null&&($_POST["clone"]||$X!==false))$P[idf_escape($E)]=($X!==false?$X:idf_escape($E));}}if($_POST["delete"]||$P){if($_POST["clone"])$I="INTO ".table($b)." (".implode(", ",array_keys($P)).")\nSELECT ".implode(", ",$P)."\nFROM ".table($b);if($_POST["all"]||($ff&&is_array($_POST["check"]))||$kd){$J=($_POST["delete"]?$l->delete($b,$Bh):($_POST["clone"]?queries("INSERT $I$Bh"):$l->update($b,$P,$Bh)));$na=$g->affected_rows;}else{foreach((array)$_POST["check"]as$X){$Ah="\nWHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($X,$o);$J=($_POST["delete"]?$l->delete($b,$Ah,1):($_POST["clone"]?queries("INSERT".limit1($b,$I,$Ah)):$l->update($b,$P,$Ah,1)));if(!$J)break;$na+=$g->affected_rows;}}}$D=lang(231,$na);if($_POST["clone"]&&$J&&$na==1){$xd=last_id();if($xd)$D=lang(161," $xd");}queries_redirect(remove_from_uri($_POST["all"]&&$_POST["delete"]?"page":""),$D,$J);if(!$_POST["delete"]){edit_form($b,$o,(array)$_POST["fields"],!$_POST["clone"]);page_footer();exit;}}elseif(!$_POST["import"]){if(!$_POST["val"])$m=lang(232);else{$J=true;$na=0;foreach($_POST["val"]as$eh=>$L){$P=array();foreach($L +as$z=>$X){$z=bracket_escape($z,1);$P[idf_escape($z)]=(preg_match('~char|text~',$o[$z]["type"])||$X!=""?$c->processInput($o[$z],$X):"NULL");}$J=$l->update($b,$P," WHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($eh,$o),!$kd&&!$ff," ");if(!$J)break;$na+=$g->affected_rows;}queries_redirect(remove_from_uri(),lang(231,$na),$J);}}elseif(!is_string($uc=get_file("csv_file",true)))$m=upload_error($uc);elseif(!preg_match('~~u',$uc))$m=lang(233);else{cookie("adminer_import","output=".urlencode($ma["output"])."&format=".urlencode($_POST["separator"]));$J=true;$Ya=array_keys($o);preg_match_all('~(?>"[^"]*"|[^"\r\n]+)+~',$uc,$Jd);$na=count($Jd[0]);$l->begin();$Rf=($_POST["separator"]=="csv"?",":($_POST["separator"]=="tsv"?"\t":";"));$M=array();foreach($Jd[0]as$z=>$X){preg_match_all("~((?>\"[^\"]*\")+|[^$Rf]*)$Rf~",$X.$Rf,$Kd);if(!$z&&!array_diff($Kd[1],$Ya)){$Ya=$Kd[1];$na--;}else{$P=array();foreach($Kd[1]as$t=>$Ua)$P[idf_escape($Ya[$t])]=($Ua==""&&$o[$Ya[$t]]["null"]?"NULL":q(str_replace('""','"',preg_replace('~^"|"$~','',$Ua))));$M[]=$P;}}$J=(!$M||$l->insertUpdate($b,$M,$ff));if($J)$J=$l->commit();queries_redirect(remove_from_uri("page"),lang(234,$na),$J);$l->rollback();}}}$ug=$c->tableName($R);if(is_ajax()){page_headers();ob_start();}else +page_header(lang(42).": $ug",$m);$P=null;if(isset($Df["insert"])||!support("table")){$P="";foreach((array)$_GET["where"]as$X){if($Bc[$X["col"]]&&count($Bc[$X["col"]])==1&&($X["op"]=="="||(!$X["op"]&&!preg_match('~[_%]~',$X["val"]))))$P.="&set".urlencode("[".bracket_escape($X["col"])."]")."=".urlencode($X["val"]);}}$c->selectLinks($R,$P);if(!$e&&support("table"))echo"

        ".lang(235).($o?".":": ".error())."\n";else{echo"

        \n","
        ";hidden_fields_get();echo(DB!=""?''.(isset($_GET["ns"])?'':""):"");echo'',"
        \n";$c->selectColumnsPrint($N,$e);$c->selectSearchPrint($Z,$e,$x);$c->selectOrderPrint($ze,$e,$x);$c->selectLimitPrint($_);$c->selectLengthPrint($Fg);$c->selectActionPrint($x);echo"
        \n";$F=$_GET["page"];if($F=="last"){$Ec=$g->result(count_rows($b,$Z,$kd,$s));$F=floor(max(0,$Ec-1)/$_);}$Mf=$N;$Jc=$s;if(!$Mf){$Mf[]="*";$jb=convert_fields($e,$o,$N);if($jb)$Mf[]=substr($jb,2);}foreach($N +as$z=>$X){$n=$o[idf_unescape($X)];if($n&&($ua=convert_field($n)))$Mf[$z]="$ua AS $X";}if(!$kd&&$gh){foreach($gh +as$z=>$X){$Mf[]=idf_escape($z);if($Jc)$Jc[]=idf_escape($z);}}$J=$l->select($b,$Mf,$Z,$Jc,$ze,$_,$F,true);if(!$J)echo"

        ".error()."\n";else{if($y=="mssql"&&$F)$J->seek($_*$F);$Xb=array();echo"

        \n";$M=array();while($L=$J->fetch_assoc()){if($F&&$y=="oracle")unset($L["RNUM"]);$M[]=$L;}if($_GET["page"]!="last"&&$_!=""&&$s&&$kd&&$y=="sql")$Ec=$g->result(" SELECT FOUND_ROWS()");if(!$M)echo"

        ".lang(12)."\n";else{$Ba=$c->backwardKeys($b,$ug);echo"

        ","",script("mixin(qs('#table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true), onkeydown: editingKeydown});"),"".(!$s&&$N?"":"\n";if(is_ajax()){if($_%2==1&&$F%2==1)odd();ob_end_clean();}foreach($c->rowDescriptions($M,$Bc)as$Zd=>$L){$dh=unique_array($M[$Zd],$x);if(!$dh){$dh=array();foreach($M[$Zd]as$z=>$X){if(!preg_match('~^(COUNT\((\*|(DISTINCT )?`(?:[^`]|``)+`)\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\(`(?:[^`]|``)+`\))$~',$z))$dh[$z]=$X;}}$eh="";foreach($dh +as$z=>$X){if(($y=="sql"||$y=="pgsql")&&preg_match('~char|text|enum|set~',$o[$z]["type"])&&strlen($X)>64){$z=(strpos($z,'(')?$z:idf_escape($z));$z="MD5(".($y!='sql'||preg_match("~^utf8~",$o[$z]["collation"])?$z:"CONVERT($z USING ".charset($g).")").")";$X=md5($X);}$eh.="&".($X!==null?urlencode("where[".bracket_escape($z)."]")."=".urlencode($X):"null%5B%5D=".urlencode($z));}echo"".(!$s&&$N?"":"";}}}if($Ba)echo"\n";}if(is_ajax())exit;echo"
        ".script("qs('#all-page').onclick = partial(formCheck, /check/);","")." ".lang(236)."");$ae=array();$Gc=array();reset($N);$rf=1;foreach($M[0]as$z=>$X){if(!isset($gh[$z])){$X=$_GET["columns"][key($N)];$n=$o[$N?($X?$X["col"]:current($N)):$z];$E=($n?$c->fieldName($n,$rf):($X["fun"]?"*":$z));if($E!=""){$rf++;$ae[$z]=$E;$d=idf_escape($z);$Wc=remove_from_uri('(order|desc)[^=]*|page').'&order%5B0%5D='.urlencode($z);$Db="&desc%5B0%5D=1";echo"".script("mixin(qsl('th'), {onmouseover: partial(columnMouse), onmouseout: partial(columnMouse, ' hidden')});",""),'';echo +apply_sql_function($X["fun"],$E)."";echo"";}$Gc[$z]=$X["fun"];next($N);}}$Cd=array();if($_GET["modify"]){foreach($M +as$L){foreach($L +as$z=>$X)$Cd[$z]=max($Cd[$z],min(40,strlen(utf8_decode($X))));}}echo($Ba?"".lang(237):"")."
        ".checkbox("check[]",substr($eh,1),in_array(substr($eh,1),(array)$_POST["check"])).($kd||information_schema(DB)?"":" ".lang(238).""));foreach($L +as$z=>$X){if(isset($ae[$z])){$n=$o[$z];$X=$l->value($X,$n);if($X!=""&&(!isset($Xb[$z])||$Xb[$z]!=""))$Xb[$z]=(is_mail($X)?$ae[$z]:"");$A="";if(preg_match('~blob|bytea|raw|file~',$n["type"])&&$X!="")$A=ME.'download='.urlencode($b).'&field='.urlencode($z).$eh;if(!$A&&$X!==null){foreach((array)$Bc[$z]as$p){if(count($Bc[$z])==1||end($p["source"])==$z){$A="";foreach($p["source"]as$t=>$bg)$A.=where_link($t,$p["target"][$t],$M[$Zd][$bg]);$A=($p["db"]!=""?preg_replace('~([?&]db=)[^&]+~','\1'.urlencode($p["db"]),ME):ME).'select='.urlencode($p["table"]).$A;if($p["ns"])$A=preg_replace('~([?&]ns=)[^&]+~','\1'.urlencode($p["ns"]),$A);if(count($p["source"])==1)break;}}}if($z=="COUNT(*)"){$A=ME."select=".urlencode($b);$t=0;foreach((array)$_GET["where"]as$W){if(!array_key_exists($W["col"],$dh))$A.=where_link($t++,$W["col"],$W["val"],$W["op"]);}foreach($dh +as$od=>$W)$A.=where_link($t++,$od,$W);}$X=select_value($X,$A,$n,$Fg);$u=h("val[$eh][".bracket_escape($z)."]");$Y=$_POST["val"][$eh][bracket_escape($z)];$Sb=!is_array($L[$z])&&is_utf8($X)&&$M[$Zd][$z]==$L[$z]&&!$Gc[$z];$Eg=preg_match('~text|lob~',$n["type"]);echo"".($Eg?"":"");}else{$Gd=strpos($X,"");echo" data-text='".($Gd?2:($Eg?1:0))."'".($Sb?"":" data-warning='".h(lang(239))."'").">$X";$c->backwardKeysPrint($Ba,$M[$Zd]);echo"
        \n","
        \n";}if(!is_ajax()){if($M||$F){$ic=true;if($_GET["page"]!="last"){if($_==""||(count($M)<$_&&($M||!$F)))$Ec=($F?$F*$_:0)+count($M);elseif($y!="sql"||!$kd){$Ec=($kd?false:found_rows($R,$Z));if($Ec$_||$F));if($Ke){echo(($Ec===false?count($M)+1:$Ec-$F*$_)>$_?'

        '.lang(240).''.script("qsl('a').onclick = partial(selectLoadMore, ".(+$_).", '".lang(241)."…');",""):''),"\n";}}echo"

        \n";if($c->selectImportPrint()){echo"
        ","".lang(61)."",script("qsl('a').onclick = partial(toggle, 'import');",""),"","
        ";}echo"\n","\n",(!$s&&$N?"":script("tableCheck();"));}}}if(is_ajax()){ob_end_clean();exit;}}elseif(isset($_GET["variables"])){$ig=isset($_GET["status"]);page_header($ig?lang(112):lang(111));$sh=($ig?show_status():show_variables());if(!$sh)echo"

        ".lang(12)."\n";else{echo"\n";foreach($sh +as$z=>$X){echo"","
        ".h($z)."","".h($X);}echo"
        \n";}}elseif(isset($_GET["script"])){header("Content-Type: text/javascript; charset=utf-8");if($_GET["script"]=="db"){$rg=array("Data_length"=>0,"Index_length"=>0,"Data_free"=>0);foreach(table_status()as$E=>$R){json_row("Comment-$E",h($R["Comment"]));if(!is_view($R)){foreach(array("Engine","Collation")as$z)json_row("$z-$E",h($R[$z]));foreach($rg+array("Auto_increment"=>0,"Rows"=>0)as$z=>$X){if($R[$z]!=""){$X=format_number($R[$z]);json_row("$z-$E",($z=="Rows"&&$X&&$R["Engine"]==($dg=="pgsql"?"table":"InnoDB")?"~ $X":$X));if(isset($rg[$z]))$rg[$z]+=($R["Engine"]!="InnoDB"||$z!="Data_free"?$R[$z]:0);}elseif(array_key_exists($z,$R))json_row("$z-$E");}}}foreach($rg +as$z=>$X)json_row("sum-$z",format_number($X));json_row("");}elseif($_GET["script"]=="kill")$g->query("KILL ".number($_POST["kill"]));else{foreach(count_tables($c->databases())as$k=>$X){json_row("tables-$k",$X);json_row("size-$k",db_size($k));}json_row("");}exit;}else{$zg=array_merge((array)$_POST["tables"],(array)$_POST["views"]);if($zg&&!$m&&!$_POST["search"]){$J=true;$D="";if($y=="sql"&&$_POST["tables"]&&count($_POST["tables"])>1&&($_POST["drop"]||$_POST["truncate"]||$_POST["copy"]))queries("SET foreign_key_checks = 0");if($_POST["truncate"]){if($_POST["tables"])$J=truncate_tables($_POST["tables"]);$D=lang(245);}elseif($_POST["move"]){$J=move_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$D=lang(246);}elseif($_POST["copy"]){$J=copy_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$D=lang(247);}elseif($_POST["drop"]){if($_POST["views"])$J=drop_views($_POST["views"]);if($J&&$_POST["tables"])$J=drop_tables($_POST["tables"]);$D=lang(248);}elseif($y!="sql"){$J=($y=="sqlite"?queries("VACUUM"):apply_queries("VACUUM".($_POST["optimize"]?"":" ANALYZE"),$_POST["tables"]));$D=lang(249);}elseif(!$_POST["tables"])$D=lang(9);elseif($J=queries(($_POST["optimize"]?"OPTIMIZE":($_POST["check"]?"CHECK":($_POST["repair"]?"REPAIR":"ANALYZE")))." TABLE ".implode(", ",array_map('idf_escape',$_POST["tables"])))){while($L=$J->fetch_assoc())$D.="".h($L["Table"]).": ".h($L["Msg_text"])."
        ";}queries_redirect(substr(ME,0,-1),$D,$J);}page_header(($_GET["ns"]==""?lang(26).": ".h(DB):lang(189).": ".h($_GET["ns"])),$m,true);if($c->homepage()){if($_GET["ns"]!==""){echo"

        ".lang(250)."

        \n";$yg=tables_list();if(!$yg)echo"

        ".lang(9)."\n";else{echo"

        \n";if(support("table")){echo"
        ".lang(251)."
        ","",script("qsl('input').onkeydown = partialArg(bodyKeydown, 'search');","")," \n","
        \n";if($_POST["search"]&&$_POST["query"]!=""){$_GET["where"][0]["op"]="LIKE %%";search_tables();}}echo"
        \n","\n",script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});"),'','\n";$S=0;foreach($yg +as$E=>$U){$vh=($U!==null&&!preg_match('~table|sequence~i',$U));$u=h("Table-".$E);echo'
        '.script("qs('#check-all').onclick = partial(formCheck, /^(tables|views)\[/);",""),''.lang(124),''.lang(252).doc_link(array('sql'=>'storage-engines.html')),''.lang(116).doc_link(array('sql'=>'charset-charsets.html','mariadb'=>'supported-character-sets-and-collations/')),''.lang(253).doc_link(array('sql'=>'show-table-status.html',)),''.lang(254).doc_link(array('sql'=>'show-table-status.html',)),''.lang(255).doc_link(array('sql'=>'show-table-status.html')),''.lang(40).doc_link(array('sql'=>'example-auto-increment.html','mariadb'=>'auto_increment/')),''.lang(256).doc_link(array('sql'=>'show-table-status.html',)),(support("comment")?''.lang(39).doc_link(array('sql'=>'show-table-status.html',)):''),"
        '.checkbox(($vh?"views[]":"tables[]"),$E,in_array($E,$zg,true),"","","",$u),''.(support("table")||support("indexes")?"".h($E).'':h($E));if($vh){echo''.(preg_match('~materialized~i',$U)?lang(122):lang(123)).'','?';}else{foreach(array("Engine"=>array(),"Collation"=>array(),"Data_length"=>array("create",lang(33)),"Index_length"=>array("indexes",lang(126)),"Data_free"=>array("edit",lang(34)),"Auto_increment"=>array("auto_increment=1&create",lang(33)),"Rows"=>array("select",lang(30)),)as$z=>$A){$u=" id='$z-".h($E)."'";echo($A?"".(support("table")||$z=="Rows"||(support("indexes")&&$z!="Data_length")?"?":"?"):"");}$S++;}echo(support("comment")?"":"");}echo"
        ".lang(229,count($yg)),"".h($y=="sql"?$g->result("SELECT @@default_storage_engine"):""),"".h(db_collation(DB,collations()));foreach(array("Data_length","Index_length","Data_free")as$z)echo"";echo"
        \n","
        \n";if(!information_schema(DB)){echo"\n";}echo"
        \n",script("tableCheck();");}echo'

        ".lang(136)."

        \n";$Hf=routines();if($Hf){echo"\n",'\n";odd('');foreach($Hf +as$L){$E=($L["SPECIFIC_NAME"]==$L["ROUTINE_NAME"]?"":"&name=".urlencode($L["ROUTINE_NAME"]));echo'','
        '.lang(176).''.lang(38).''.lang(212)."
        '.h($L["ROUTINE_NAME"]).'',''.h($L["ROUTINE_TYPE"]),''.h($L["DTD_IDENTIFIER"]),''.lang(129)."";}echo"
        \n";}echo'

        ".lang(137)."

        \n";$M=get_rows("SHOW EVENTS");if($M){echo"\n","\n";foreach($M +as$L){echo"","
        ".lang(176)."".lang(267)."".lang(201)."".lang(202)."
        ".h($L["Name"]),"".($L["Execute at"]?lang(268)."".$L["Execute at"]:lang(203)." ".$L["Interval value"]." ".$L["Interval field"]."$L[Starts]"),"$L[Ends]",''.lang(129).'';}echo"
        \n";$gc=$g->result("SELECT @@event_scheduler");if($gc&&$gc!="ON")echo"

        event_scheduler: ".h($gc)."\n";}echo'

        '; + var $tpl = $(tpl).attr('data-tips-image', urls[i]).css('backgroundImage', 'url(' + urls[i] + ')').on('click', 'a', function (e) { + e.stopPropagation(); + var $cur = $(this).parent(); + switch ($(this).index()) { + case 1:// remove + return $.msg.confirm('确定要移除这张图片吗?', function (index) { + $cur.remove(), input.setImageData(), $.msg.close(index); + }); + case 0: // right + var lenght = $cur.siblings('div.uploadimagemtl').length; + if ($cur.index() !== lenght) $cur.next().after($cur); + return input.setImageData(); + case 2: // left + if ($cur.index() !== 0) $cur.prev().before($cur); + return input.setImageData(); + } + }); + $(this).before($tpl); + } + }).trigger('change'); + }; + + /*! 注册 data-load 事件行为 */ + $body.on('click', '[data-load]', function () { + var url = $(this).attr('data-load'), tips = $(this).attr('data-tips'), time = $(this).attr('data-time'); + if ($(this).attr('data-confirm')) return $.msg.confirm($(this).attr('data-confirm'), function () { + $.form.load(url, {}, 'get', null, true, tips, time); + }); + $.form.load(url, {}, 'get', null, true, tips, time); + }); + + /*! 注册 data-serach 表单搜索行为 */ + $body.on('submit', 'form.form-search', function () { + var url = $(this).attr('action').replace(/&?page=\d+/g, ''), split = url.indexOf('?') === -1 ? '?' : '&'; + if ((this.method || 'get').toLowerCase() === 'get') { + return window.location.href = '#' + $.menu.parseUri(url + split + $(this).serialize()); + } + $.form.load(url, this, 'post'); + }); + + /*! 注册 data-modal 事件行为 */ + $body.on('click', '[data-modal]', function () { + return $.form.modal($(this).attr('data-modal'), 'open_type=modal', $(this).attr('data-title') || $(this).text() || '编辑'); + }); + + /*! 注册 data-open 事件行为 */ + $body.on('click', '[data-open]', function () { + $.form.href($(this).attr('data-open'), this); + }); + + /*! 注册 data-dbclick 事件行为 */ + $body.on('dblclick', '[data-dbclick]', function () { + $(this).find(this.getAttribute('data-dbclick') || '[data-dbclick]').trigger('click'); + }); + + /*! 注册 data-reload 事件行为 */ + $body.on('click', '[data-reload]', function () { + $.form.reload(); + }); + + /*! 注册 data-check 事件行为 */ + $body.on('click', '[data-check-target]', function () { + var checked = !!this.checked; + $($(this).attr('data-check-target')).map(function () { + this.checked = checked; + $(this).trigger('change'); + }); + }); + + /*! 注册 data-action 事件行为 */ + $body.on('click', '[data-action]', function () { + var $this = $(this), data = {}, time = $this.attr('data-time'), action = $this.attr('data-action'); + var loading = $this.attr('data-loading'), method = $this.attr('data-method') || 'post'; + var rule = $this.attr('data-value') || (function (rule, ids) { + $($this.attr('data-target') || 'input[type=checkbox].list-check-box').map(function () { + (this.checked) && ids.push(this.value); + }); + return ids.length > 0 ? rule.replace('{key}', ids.join(',')) : ''; + }).call(this, $this.attr('data-rule') || '', []) || ''; + if (rule.length < 1) return $.msg.tips('请选择需要更改的数据!'); + var rules = rule.split(';'); + for (var i in rules) { + if (rules[i].length < 2) return $.msg.tips('异常的数据操作规则,请修改规则!'); + data[rules[i].split('#')[0]] = rules[i].split('#')[1]; + } + data['_csrf_'] = $this.attr('data-token') || $this.attr('data-csrf') || '--'; + var load = loading !== 'false', tips = typeof loading === 'string' ? loading : undefined; + if (!$this.attr('data-confirm')) $.form.load(action, data, method, false, load, tips, time); + else $.msg.confirm($this.attr('data-confirm'), function () { + $.form.load(action, data, method, false, load, tips, time); + }); + }); + + /*! 输入框失焦提交 */ + $body.on('blur', '[data-action-blur]', function () { + var data = {}, that = this, $this = $(this), action = $this.attr('data-action-blur'); + var time = $this.attr('data-time'), loading = $this.attr('data-loading') || false; + var load = loading !== 'false', tips = typeof loading === 'string' ? loading : undefined; + var method = $this.attr('data-method') || 'post', confirm = $this.attr('data-confirm'); + var attrs = $this.attr('data-value').replace('{value}', $this.val()).split(';'); + for (var i in attrs) { + if (attrs[i].length < 2) return $.msg.tips('异常的数据操作规则,请修改规则!'); + data[attrs[i].split('#')[0]] = attrs[i].split('#')[1]; + } + that.callback = function (ret) { + $this.css('border', (ret && ret.code) ? '1px solid #e6e6e6' : '1px solid red'); + return false; + }; + data['_csrf_'] = $this.attr('data-token') || $this.attr('data-csrf') || '--'; + if (!confirm) return $.form.load(action, data, method, that.callback, load, tips, time); + $.msg.confirm(confirm, function () { + $.form.load(action, data, method, that.callback, load, tips, time); + }); + }); + + /*! 注册 data-href 事件行为 */ + $body.on('click', '[data-href]', function (href) { + href = $(this).attr('data-href'); + if (href && href.indexOf('#') !== 0) window.location.href = href; + }); + + /*! 注册 data-iframe 事件行为 */ + $body.on('click', '[data-iframe]', function (index) { + index = $.form.iframe($(this).attr('data-iframe'), $(this).attr('data-title') || '窗口'); + $(this).attr('data-index', index); + }); + + /*! 注册 data-icon 事件行为 */ + $body.on('click', '[data-icon]', function (field, location) { + field = $(this).attr('data-icon') || $(this).attr('data-field') || 'icon'; + location = window.ROOT_URL + '?s=' + window.ADMIN_MODULE + '/api.plugs/icon.html&field=' + field; + $.form.iframe(location, '图标选择'); + }); + + /*! 注册 data-copy 事件行为 */ + $body.on('click', '[data-copy]', function () { + $.copyToClipboard(this.getAttribute('data-copy')); + }); + $.copyToClipboard = function (content, input) { + input = document.createElement('textarea'); + input.style.position = 'absolute', input.style.left = '-100000px'; + input.style.width = '1px', input.style.height = '1px', input.innerText = content; + document.body.appendChild(input), input.select(), setTimeout(function () { + document.execCommand('Copy') ? $.msg.tips('复制成功') : $.msg.tips('复制失败,请使用鼠标操作复制!'); + document.body.removeChild(input); + }, 100); + }; + + /*! 注册 data-tips-text 事件行为 */ + $body.on('mouseenter', '[data-tips-text]', function () { + $(this).attr('index', layer.tips($(this).attr('data-tips-text'), this, {tips: [$(this).attr('data-tips-type') || 3, '#78BA32']})); + }).on('mouseleave', '[data-tips-text]', function () { + layer.close($(this).attr('index')); + }); + + /*! 注册 data-tips-image 事件行为 */ + $body.on('click', '[data-tips-image]', function () { + $.previewImage(this.getAttribute('data-tips-image') || this.src, this.getAttribute('data-width')); + }); + $.previewImage = function (src, area) { + var img = new Image(), index = $.msg.loading(); + img.style.background = '#fff', img.style.display = 'none'; + img.style.height = 'auto', img.style.width = area || '480px'; + document.body.appendChild(img), img.onerror = function () { + $.msg.close(index); + }, img.onload = function () { + layer.open({ + type: 1, shadeClose: true, success: img.onerror, content: $(img), title: false, + area: area || '480px', closeBtn: 1, skin: 'layui-layer-nobg', end: function () { + document.body.removeChild(img); + } + }); + }; + img.src = src; + }; + + /*! 注册 data-phone-view 事件行为 */ + $body.on('click', '[data-phone-view]', function () { + $.previewPhonePage(this.getAttribute('data-phone-view') || this.href); + }); + $.previewPhonePage = function (href, title) { + var tpl = '
        _TITLE_
        '; + layer.style(layer.open({ + type: true, + scrollbar: false, + area: ['320px', '600px'], + title: false, + closeBtn: true, + shadeClose: false, + skin: 'layui-layer-nobg', + content: $(tpl.replace('_TITLE_', title || '公众号').replace('_URL_', href)).html(), + }), {boxShadow: 'none'}); + }; + + /*! 表单编辑返回操作 */ + $body.on('click', '[data-history-back]', function (title) { + title = this.getAttribute('data-history-back') || '确定要返回上一页吗?'; + $.msg.confirm(title, function (index) { + history.back(); + $.msg.close(index); + }) + }); + + /*! 表单元素失去焦点处理 */ + $body.on('blur', '[data-blur-number]', function (fiexd) { + fiexd = this.getAttribute('data-blur-number') || 0; + this.value = (parseFloat(this.value) || 0).toFixed(fiexd); + }); + + /*! 图片加载异常处理 */ + document.addEventListener('error', function (e, elem) { + elem = e.target; + if (elem.tagName.toLowerCase() === 'img') { + elem.src = baseRoot + 'theme/img/404_icon.png'; + } + }, true); + + /*! 初始化事件 */ + $.menu.listen(); + $.vali.listen(); +}); diff --git a/public/static/index.a5c69d49.css b/public/static/index.a5c69d49.css new file mode 100644 index 0000000..e510699 --- /dev/null +++ b/public/static/index.a5c69d49.css @@ -0,0 +1 @@ +uni-tabbar{display:block;box-sizing:border-box;width:100%;z-index:998}uni-tabbar .uni-tabbar{display:-webkit-box;display:-webkit-flex;display:flex;z-index:998;box-sizing:border-box}uni-tabbar.uni-tabbar-bottom,uni-tabbar.uni-tabbar-bottom .uni-tabbar,uni-tabbar.uni-tabbar-top,uni-tabbar.uni-tabbar-top .uni-tabbar{position:fixed;left:var(--window-left);right:var(--window-right)}.uni-app--showlayout+uni-tabbar.uni-tabbar-bottom,.uni-app--showlayout+uni-tabbar.uni-tabbar-bottom .uni-tabbar,.uni-app--showlayout+uni-tabbar.uni-tabbar-top,.uni-app--showlayout+uni-tabbar.uni-tabbar-top .uni-tabbar{left:var(--window-margin);right:var(--window-margin)}uni-tabbar.uni-tabbar-bottom .uni-tabbar{bottom:0;padding-bottom:0;padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom)}uni-tabbar .uni-tabbar~.uni-placeholder{width:100%;margin-bottom:0;margin-bottom:constant(safe-area-inset-bottom);margin-bottom:env(safe-area-inset-bottom)}uni-tabbar .uni-tabbar *{box-sizing:border-box}uni-tabbar .uni-tabbar__item{-webkit-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:1;flex:1;font-size:0;text-align:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}uni-tabbar .uni-tabbar__bd,uni-tabbar .uni-tabbar__item{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal}uni-tabbar .uni-tabbar__bd{position:relative;-webkit-flex-direction:column;flex-direction:column;cursor:pointer}uni-tabbar .uni-tabbar__icon{position:relative;display:inline-block;margin-top:5px}uni-tabbar .uni-tabbar__icon.uni-tabbar__icon__diff{margin-top:0;width:34px;height:34px}uni-tabbar .uni-tabbar__icon img{width:100%;height:100%}uni-tabbar .uni-tabbar__label{position:relative;text-align:center;font-size:10px}uni-tabbar .uni-tabbar-border{position:absolute;left:0;top:0;width:100%;height:1px;-webkit-transform:scaleY(.5);transform:scaleY(.5)}uni-tabbar .uni-tabbar__reddot{position:absolute;top:0;right:0;width:12px;height:12px;border-radius:50%;background-color:#f43530;color:#fff;-webkit-transform:translate(40%,-20%);transform:translate(40%,-20%)}uni-tabbar .uni-tabbar__badge{width:auto;height:16px;line-height:16px;border-radius:16px;min-width:16px;padding:0 2px;font-size:12px;text-align:center;white-space:nowrap}uni-tabbar .uni-tabbar__mid{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;position:absolute;bottom:0;background-size:100% 100%}uni-content,uni-tabbar .uni-tabbar__mid{display:-webkit-box;display:-webkit-flex;display:flex}uni-content{-webkit-box-flex:1;-webkit-flex:1 0 auto;flex:1 0 auto;height:100%}uni-main{-webkit-box-flex:1;-webkit-flex:1;flex:1;width:100%}uni-top-window+uni-content{height:calc(100vh - var(--top-window-height))}uni-left-window{width:var(--window-left);-webkit-box-ordinal-group:0;-webkit-order:-1;order:-1}uni-left-window,uni-right-window{position:relative;overflow-x:hidden}uni-right-window{width:var(--window-right)}uni-left-window[data-show],uni-right-window[data-show]{position:absolute}uni-right-window[data-show]{right:0}.uni-left-window,.uni-right-window,uni-content .uni-mask{z-index:997}.uni-mask+.uni-left-window,.uni-mask+.uni-right-window{position:fixed}.uni-top-window{position:fixed;left:var(--window-margin);right:var(--window-margin);top:0;z-index:998;overflow:hidden}uni-toast{position:fixed;top:0;right:0;bottom:0;left:0;z-index:999;display:block;box-sizing:border-box;pointer-events:none;font-size:16px}uni-toast .uni-sample-toast{position:fixed;z-index:999;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;max-width:80%}uni-toast .uni-simple-toast__text{display:inline-block;vertical-align:middle;color:#fff;background-color:rgba(17,17,17,.7);padding:10px 20px;border-radius:5px;font-size:13px;text-align:center;max-width:100%;word-break:break-all;white-space:normal}uni-toast .uni-mask{pointer-events:auto}uni-toast .uni-toast{position:fixed;z-index:999;width:8em;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:rgba(17,17,17,.7);text-align:center;border-radius:5px;color:#fff}uni-toast .uni-toast *{box-sizing:border-box}uni-toast .uni-toast__icon{margin:20px 0 0;width:38px;height:38px;vertical-align:baseline}uni-toast .uni-icon_toast{margin:15px 0 0}uni-toast .uni-icon_toast.uni-icon-success-no-circle:before{color:#fff;font-size:55px}uni-toast .uni-icon_toast.uni-icon-error:before{color:#fff;font-size:50px}uni-toast .uni-icon_toast.uni-loading{margin:20px 0 0;width:38px;height:38px;vertical-align:baseline}uni-toast .uni-toast__content{margin:0 0 15px}uni-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:999;display:block;box-sizing:border-box}uni-modal .uni-modal{position:fixed;z-index:999;width:80%;max-width:300px;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:#fff;text-align:center;border-radius:3px;overflow:hidden}uni-modal .uni-modal *{box-sizing:border-box}uni-modal .uni-modal__hd{padding:1em 1.6em .3em}uni-modal .uni-modal__title{font-weight:400;font-size:18px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}uni-modal .uni-modal__bd,uni-modal .uni-modal__title{word-wrap:break-word;word-break:break-all;white-space:pre-wrap}uni-modal .uni-modal__bd{padding:1.3em 1.6em 1.3em;min-height:40px;font-size:15px;line-height:1.4;color:#999;max-height:400px;overflow-x:hidden;overflow-y:auto}uni-modal .uni-modal__textarea{resize:none;border:0;margin:0;width:90%;padding:10px;font-size:20px;outline:none;border:none;background-color:#eee;text-decoration:inherit}uni-modal .uni-modal__ft{position:relative;line-height:48px;font-size:18px;display:-webkit-box;display:-webkit-flex;display:flex}uni-modal .uni-modal__ft:after{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}uni-modal .uni-modal__btn{display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;color:#3cc51f;text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0);position:relative;cursor:pointer}uni-modal .uni-modal__btn:active{background-color:#eee}uni-modal .uni-modal__btn:after{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}uni-modal .uni-modal__btn:first-child:after{display:none}uni-modal .uni-modal__btn_default{color:#353535}uni-modal .uni-modal__btn_primary{color:#007aff}uni-actionsheet{display:block;box-sizing:border-box}uni-actionsheet .uni-actionsheet{position:fixed;left:6px;right:6px;bottom:6px;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:999;visibility:hidden;-webkit-transition:visibility .3s,-webkit-transform .3s;transition:visibility .3s,-webkit-transform .3s;transition:transform .3s,visibility .3s;transition:transform .3s,visibility .3s,-webkit-transform .3s}uni-actionsheet .uni-actionsheet.uni-actionsheet_toggle{visibility:visible;-webkit-transform:translate(0);transform:translate(0)}uni-actionsheet .uni-actionsheet *{box-sizing:border-box}uni-actionsheet .uni-actionsheet__action,uni-actionsheet .uni-actionsheet__menu{border-radius:5px;background-color:#fcfcfd}uni-actionsheet .uni-actionsheet__action{margin-top:6px}uni-actionsheet .uni-actionsheet__cell,uni-actionsheet .uni-actionsheet__title{position:relative;padding:10px 6px;text-align:center;font-size:18px;text-overflow:ellipsis;overflow:hidden;cursor:pointer}uni-actionsheet .uni-actionsheet__title{position:absolute;top:0;right:0;left:0;z-index:1;background-color:#fff;border-radius:5px 5px 0 0;border-bottom:1px solid #e5e5e5}uni-actionsheet .uni-actionsheet__cell:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}uni-actionsheet .uni-actionsheet__cell:active{background-color:#ececec}uni-actionsheet .uni-actionsheet__cell:first-child:before{display:none}@media screen and (min-width:500px) and (min-height:500px){.uni-mask.uni-actionsheet__mask{background:none}uni-actionsheet .uni-actionsheet{width:300px;left:50%;right:auto;top:50%;bottom:auto;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;-webkit-transition:opacity .3s,visibility .3s;transition:opacity .3s,visibility .3s}uni-actionsheet .uni-actionsheet.uni-actionsheet_toggle{opacity:1;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}uni-actionsheet .uni-actionsheet__menu{box-shadow:0 0 20px 5px rgba(0,0,0,.3)}uni-actionsheet .uni-actionsheet__action{display:none}}*{margin:0;-webkit-tap-highlight-color:transparent}@font-face{font-weight:400;font-style:normal;font-family:uni;src:url("data:application/octet-stream;base64,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") format("truetype")}@font-face{font-weight:400;font-style:normal;font-family:unibtn;src:url("data:application/octet-stream;base64,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") format("truetype")}body,html{-webkit-user-select:none;user-select:none;width:100%;height:100%}body{overflow-x:hidden}[class*=" uni-icon-"],[class^=uni-icon-]{display:inline-block;vertical-align:middle;font:normal normal normal 14px/1 uni;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}[class*=" uni-btn-icon"],[class^=uni-btn-icon]{display:inline-block;font:normal normal normal 14px/1 unibtn;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}[class*=" uni-btn-icon"]:before,[class^=uni-btn-icon]:before{margin:0;box-sizing:border-box}.uni-icon-success-no-circle:before{content:"\EA08"}.uni-icon-error:before{content:"\EA0B"}.uni-loading,uni-button[loading]:before{background:rgba(0,0,0,0) url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=") no-repeat}.uni-loading{width:20px;height:20px;display:inline-block;vertical-align:middle;-webkit-animation:uni-loading 1s steps(12) infinite;animation:uni-loading 1s steps(12) infinite;background-size:100%}@-webkit-keyframes uni-loading{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes uni-loading{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.uni-mask{position:fixed;z-index:999;top:0;right:0;left:0;bottom:0;background:rgba(0,0,0,.5)}.uni-fade-enter-active,.uni-fade-leave-active{-webkit-transition-duration:.25s;transition-duration:.25s;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:ease;transition-timing-function:ease}.uni-fade-enter,.uni-fade-leave-active{opacity:0}[nvue] uni-label,[nvue] uni-scroll-view,[nvue] uni-swiper-item,[nvue] uni-view{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-shrink:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0;-webkit-flex-basis:auto;flex-basis:auto;-webkit-box-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start}[nvue] uni-button{margin:0}[nvue-dir-row] uni-label,[nvue-dir-row] uni-swiper-item,[nvue-dir-row] uni-view{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row}[nvue-dir-column] uni-label,[nvue-dir-column] uni-swiper-item,[nvue-dir-column] uni-view{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}[nvue-dir-row-reverse] uni-label,[nvue-dir-row-reverse] uni-swiper-item,[nvue-dir-row-reverse] uni-view{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse}[nvue-dir-column-reverse] uni-label,[nvue-dir-column-reverse] uni-swiper-item,[nvue-dir-column-reverse] uni-view{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;flex-direction:column-reverse}[nvue] uni-image,[nvue] uni-input,[nvue] uni-scroll-view,[nvue] uni-swiper,[nvue] uni-swiper-item,[nvue] uni-text,[nvue] uni-textarea,[nvue] uni-video,[nvue] uni-view{position:relative;border:0 solid #000;box-sizing:border-box}[nvue] uni-swiper-item{position:absolute}uni-app{width:100%;height:100%}uni-app,uni-page-head{display:block;box-sizing:border-box}uni-page-head .uni-page-head{position:fixed;left:var(--window-left);right:var(--window-right);height:44px;height:calc(44px + constant(safe-area-inset-top));height:calc(44px + env(safe-area-inset-top));padding:7px 3px;padding-top:calc(7px + constant(safe-area-inset-top));padding-top:calc(7px + env(safe-area-inset-top));display:-webkit-box;display:-webkit-flex;display:flex;overflow:hidden;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;box-sizing:border-box;z-index:998;color:#fff;background-color:#000;-webkit-transition-property:all;transition-property:all}uni-page-head .uni-page-head-titlePenetrate,uni-page-head .uni-page-head-titlePenetrate .uni-page-head-bd,uni-page-head .uni-page-head-titlePenetrate .uni-page-head-bd *{pointer-events:none}uni-page-head .uni-page-head-titlePenetrate *{pointer-events:auto}uni-page-head .uni-page-head.uni-page-head-transparent .uni-page-head-ft>div{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}uni-page-head .uni-page-head~.uni-placeholder{width:100%;height:44px;height:calc(44px + constant(safe-area-inset-top));height:calc(44px + env(safe-area-inset-top))}uni-page-head .uni-placeholder-titlePenetrate{pointer-events:none}uni-page-head .uni-page-head *{box-sizing:border-box}uni-page-head .uni-page-head-hd{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;font-size:16px}uni-page-head .uni-page-head-bd{position:absolute;left:70px;right:70px;min-width:0}.uni-page-head-btn{position:relative;width:auto;margin:0 2px;word-break:keep-all;white-space:pre;cursor:pointer}.uni-page-head-transparent .uni-page-head-btn{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;width:32px;height:32px;border-radius:50%;background-color:rgba(0,0,0,.5)}uni-page-head .uni-btn-icon{overflow:hidden;min-width:1em}.uni-page-head-btn-red-dot:after{content:attr(badge-text);position:absolute;right:0;top:0;background-color:red;color:#fff;width:18px;height:18px;line-height:18px;border-radius:18px;overflow:hidden;-webkit-transform:scale(.5) translate(40%,-40%);transform:scale(.5) translate(40%,-40%);-webkit-transform-origin:100% 0;transform-origin:100% 0}.uni-page-head-btn-red-dot[badge-text]:after{font-size:12px;width:auto;min-width:18px;max-width:42px;text-align:center;padding:0 3px;-webkit-transform:scale(.7) translate(40%,-40%);transform:scale(.7) translate(40%,-40%)}.uni-page-head-btn-select>.uni-btn-icon:after{display:inline-block;font-family:unibtn;content:"\e601";margin-left:2px;-webkit-transform:rotate(-90deg) scale(.8);transform:rotate(-90deg) scale(.8)}.uni-page-head-search{position:relative;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex:1;flex:1;margin:0 2px;line-height:30px;font-size:15px}.uni-page-head-search-input{width:100%;height:100%;padding-left:34px;text-align:left}.uni-page-head-search-placeholder{position:absolute;max-width:100%;height:100%;padding-left:34px;overflow:hidden;word-break:keep-all;white-space:pre}.uni-page-head-search-placeholder-right{right:0}.uni-page-head-search-placeholder-center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.uni-page-head-search-placeholder:before{position:absolute;top:0;left:2px;width:30px;content:"\ea0e";display:block;font-size:20px;font-family:uni;text-align:center}uni-page-head .uni-page-head-ft{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse;font-size:13px}uni-page-head .uni-page-head__title{font-weight:700;font-size:16px;line-height:30px;text-align:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}uni-page-head .uni-page-head__title .uni-loading{width:16px;height:16px;margin-top:-3px}uni-page-head .uni-page-head__title .uni-page-head__title_image{width:auto;height:26px;vertical-align:middle}uni-page-head .uni-page-head-shadow{overflow:visible}uni-page-head .uni-page-head-shadow:after{content:"";position:absolute;left:0;right:0;top:100%;height:5px;background-size:100% 100%}uni-page-head .uni-page-head-shadow-grey:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}uni-page-head .uni-page-head-shadow-blue:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-blue.png)}uni-page-head .uni-page-head-shadow-green:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-green.png)}uni-page-head .uni-page-head-shadow-orange:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-orange.png)}uni-page-head .uni-page-head-shadow-red:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-red.png)}uni-page-head .uni-page-head-shadow-yellow:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-yellow.png)}uni-page-head .uni-icon-clear{-webkit-align-self:center;align-self:center;padding-right:5px}uni-page-wrapper{display:block;height:100%;position:relative}uni-page-head[uni-page-head-type=default]~uni-page-wrapper{height:calc(100% - 44px);height:calc(100% - 44px - constant(safe-area-inset-top));height:calc(100% - 44px - env(safe-area-inset-top))}uni-page-body,uni-page-refresh{display:block;box-sizing:border-box;width:100%}uni-page-refresh{position:absolute;top:0;height:40px}uni-page-refresh .uni-page-refresh{position:absolute;top:-45px;left:50%;-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0);background:#fff;box-shadow:0 1px 6px rgba(0,0,0,.117647),0 1px 4px rgba(0,0,0,.117647);display:none;z-index:997}uni-page-refresh .uni-page-refresh,uni-page-refresh .uni-page-refresh-inner{width:40px;height:40px;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;border-radius:50%}uni-page-refresh .uni-page-refresh-inner{line-height:0}uni-page-refresh.uni-page-refresh--aborting .uni-page-refresh,uni-page-refresh.uni-page-refresh--pulling .uni-page-refresh,uni-page-refresh.uni-page-refresh--reached .uni-page-refresh,uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh,uni-page-refresh.uni-page-refresh--restoring .uni-page-refresh,uni-page-refresh .uni-page-refresh-inner{display:-webkit-box;display:-webkit-flex;display:flex}uni-page-refresh.uni-page-refresh--aborting .uni-page-refresh__spinner,uni-page-refresh.uni-page-refresh--pulling .uni-page-refresh__spinner,uni-page-refresh.uni-page-refresh--reached .uni-page-refresh__spinner,uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh__icon,uni-page-refresh.uni-page-refresh--restoring .uni-page-refresh__icon{display:none}uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh__spinner{-webkit-transform-origin:center center;transform-origin:center center;-webkit-animation:uni-page-refresh-rotate 2s linear infinite;animation:uni-page-refresh-rotate 2s linear infinite}uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh__path{stroke-dasharray:1,200;stroke-dashoffset:0;stroke-linecap:round;-webkit-animation:uni-page-refresh-dash 1.5s ease-in-out infinite,uni-page-refresh-colorful 6s ease-in-out infinite;animation:uni-page-refresh-dash 1.5s ease-in-out infinite,uni-page-refresh-colorful 6s ease-in-out infinite}@-webkit-keyframes uni-page-refresh-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes uni-page-refresh-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes uni-page-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes uni-page-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}uni-page{display:block;width:100%;height:100%}.uni-async-error{position:absolute;left:0;right:0;top:0;bottom:0;color:#999;padding:100px 10px;text-align:center}.uni-async-loading{box-sizing:border-box;width:100%;padding:50px;text-align:center}.uni-async-loading .uni-loading{width:30px;height:30px}@font-face{font-weight:400;font-style:normal;font-family:unimapbtn;src:url("data:application/octet-stream;base64,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") format("truetype")}.uni-system-choose-location{display:block;position:absolute;left:0;top:0;width:100%;height:100%;background:#f8f8f8}.uni-system-choose-location .map{position:absolute;top:0;left:0;width:100%;height:300px}.uni-system-choose-location .map-location{position:absolute;left:50%;bottom:50%;width:32px;height:52px;margin-left:-16px;cursor:pointer;background-size:100%}.uni-system-choose-location .map-move{position:absolute;bottom:50px;right:10px;width:40px;height:40px;box-sizing:border-box;line-height:40px;background-color:#fff;border-radius:50%;pointer-events:auto;cursor:pointer;box-shadow:0 0 5px 1px rgba(0,0,0,.3)}.uni-system-choose-location .map-move>i{display:block;width:100%;height:100%;font:normal normal normal 14px/1 unimapbtn;line-height:inherit;text-align:center;font-size:24px;text-rendering:auto;-webkit-font-smoothing:antialiased}.uni-system-choose-location .nav{position:absolute;top:0;left:0;width:100%;height:44px;background-color:rgba(0,0,0,0);background-image:-webkit-linear-gradient(top,rgba(0,0,0,.3),rgba(0,0,0,0));background-image:linear-gradient(180deg,rgba(0,0,0,.3),rgba(0,0,0,0))}.uni-system-choose-location .nav-btn{position:absolute;box-sizing:border-box;top:0;left:0;width:60px;height:44px;padding:6px;line-height:32px;font-size:26px;color:#fff;text-align:center;cursor:pointer}.uni-system-choose-location .nav-btn.confirm{left:auto;right:0}.uni-system-choose-location .nav-btn.disable{opacity:.4}.uni-system-choose-location .nav-btn>.uni-btn-icon{display:block;width:100%;height:100%;line-height:inherit;border-radius:2px}.uni-system-choose-location .nav-btn.confirm>.uni-btn-icon{background-color:#007aff}.uni-system-choose-location .menu{position:absolute;top:300px;left:0;width:100%;bottom:0;background-color:#fff}.uni-system-choose-location .search{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row;height:50px;padding:8px;line-height:34px;box-sizing:border-box;background-color:#fff}.uni-system-choose-location .search-input{-webkit-box-flex:1;-webkit-flex:1;flex:1;height:100%;border-radius:5px;padding:0 5px;background:#ebebeb}.uni-system-choose-location .search-btn{margin-left:5px;color:#007aff;font-size:17px;text-align:center}.uni-system-choose-location .list{position:absolute;top:50px;left:0;width:100%;bottom:0;padding-bottom:10px}.uni-system-choose-location .list-loading{display:-webkit-box;display:-webkit-flex;display:flex;height:50px;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.uni-system-choose-location .list-item{position:relative;padding:10px;padding-right:40px;cursor:pointer}.uni-system-choose-location .list-item.selected:before{position:absolute;top:50%;right:10px;width:30px;height:30px;margin-top:-15px;text-align:center;content:"\e651";font:normal normal normal 14px/1 unibtn;font-size:24px;line-height:30px;color:#007aff;text-rendering:auto;-webkit-font-smoothing:antialiased}.uni-system-choose-location .list-item:not(:last-child):after{position:absolute;content:"";height:1px;left:10px;bottom:0;width:100%;background-color:#d3d3d3}.uni-system-choose-location .list-item-title{font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.uni-system-choose-location .list-item-detail{font-size:12px;color:grey;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media screen and (min-width:800px){.uni-system-choose-location .map{top:0;height:100%}.uni-system-choose-location .map-move{bottom:10px;right:320px}.uni-system-choose-location .menu{top:54px;left:auto;right:10px;width:300px;bottom:10px;max-height:600px;box-shadow:0 0 20px 5px rgba(0,0,0,.3)}}.uni-system-open-location{display:block;position:absolute;left:0;top:0;width:100%;height:100%;background:#f8f8f8;z-index:999}.uni-system-open-location .map{position:absolute;top:0;left:0;width:100%;bottom:80px;height:auto}.uni-system-open-location .info{position:absolute;bottom:0;left:0;width:100%;height:80px;background-color:#fff;padding:15px;box-sizing:border-box;line-height:1.5}.uni-system-open-location .info>.name{font-size:17px;color:#111}.uni-system-open-location .info>.address{font-size:14px;color:#666}.uni-system-open-location .info>.nav{position:absolute;top:50%;right:15px;width:50px;height:50px;border-radius:50%;margin-top:-25px;background-color:#007aff}.uni-system-open-location .info>.nav>svg{display:block;width:100%;height:100%;padding:10px;box-sizing:border-box}.uni-system-open-location .map-move{position:absolute;bottom:50px;right:10px;width:40px;height:40px;box-sizing:border-box;line-height:40px;background-color:#fff;border-radius:50%;pointer-events:auto;cursor:pointer;box-shadow:0 0 5px 1px rgba(0,0,0,.3)}.uni-system-open-location .map-move>i{display:block;width:100%;height:100%;font:normal normal normal 14px/1 unimapbtn;line-height:inherit;text-align:center;font-size:24px;text-rendering:auto;-webkit-font-smoothing:antialiased}.uni-system-open-location .nav-btn-back{position:absolute;box-sizing:border-box;top:0;left:0;width:44px;height:44px;padding:6px;line-height:32px;font-size:26px;color:#fff;text-align:center;cursor:pointer}.uni-system-open-location .nav-btn-back>.uni-btn-icon{display:block;width:100%;height:100%;line-height:inherit;border-radius:50%;background-color:rgba(0,0,0,.5)}.uni-system-open-location .map-content{position:absolute;left:0;top:0;width:100%;bottom:0;overflow:hidden}.uni-system-open-location .map-content.fix-position{top:-74px;bottom:-44px}.uni-system-open-location .map-content>iframe{width:100%;height:100%;border:none}.uni-system-open-location .actTonav{position:absolute;right:16px;bottom:56px;width:60px;height:60px;border-radius:60px}.image-view-area,.image-view-view{position:absolute;left:0;top:0;width:100%;height:100%}.image-view-img{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-height:100%;max-width:100%}.uni-system-preview-image{display:block;position:fixed;left:0;top:0;width:100%;height:100%;z-index:999;background:rgba(0,0,0,.8)}.uni-system-preview-image-swiper{position:absolute;left:0;top:0;width:100%;height:100%}uni-audio{display:none}uni-audio[controls]{display:inline-block}uni-audio[hidden]{display:none}.uni-audio-default{max-width:100%;min-width:302px;height:65px;background:#fcfcfc;border:1px solid #e0e0e0;border-radius:2.5px;display:inline-block;overflow:hidden}.uni-audio-left{width:65px;height:65px;float:left;background-color:#e6e6e6;background-size:100% 100%;background-position:50% 50%}.uni-audio-button{width:24px;height:24px;margin:20.5px;background-size:cover}.uni-audio-button.play{background-image:url(data:image/png;base64,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)}.uni-audio-button.pause{background-image:url(data:image/png;base64,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)}.uni-audio-right{box-sizing:border-box;height:65px;margin-left:65px;padding:11px 16.5px 13.5px 15px;overflow:hidden}.uni-audio-time{margin-top:3.5px;height:16.5px;font-size:12px;color:#888;float:right}.uni-audio-info{margin-right:70px;overflow:hidden}.uni-audio-name{height:22.5px;line-height:22.5px;margin-bottom:3.5px;font-size:14px;color:#353535}.uni-audio-author,.uni-audio-name{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.uni-audio-author{height:14.5px;line-height:14.5px;font-size:12px;color:#888}uni-button{position:relative;display:block;margin-left:auto;margin-right:auto;padding-left:14px;padding-right:14px;box-sizing:border-box;font-size:18px;text-align:center;text-decoration:none;line-height:2.55555556;border-radius:5px;-webkit-tap-highlight-color:transparent;overflow:hidden;color:#000;background-color:#f8f8f8;cursor:pointer}uni-button[hidden]{display:none!important}uni-button:after{content:" ";width:200%;height:200%;position:absolute;top:0;left:0;border:1px solid rgba(0,0,0,.2);-webkit-transform:scale(.5);transform:scale(.5);-webkit-transform-origin:0 0;transform-origin:0 0;box-sizing:border-box;border-radius:10px}uni-button[native]{padding-left:0;padding-right:0}uni-button[native] .uni-button-cover-view-wrapper{border:inherit;border-color:inherit;border-radius:inherit;background-color:inherit}uni-button[native] .uni-button-cover-view-inner{padding-left:14px;padding-right:14px}uni-button uni-cover-view{line-height:inherit;white-space:inherit}uni-button[type=default]{color:#000;background-color:#f8f8f8}uni-button[type=primary]{color:#fff;background-color:#007aff}uni-button[type=warn]{color:#fff;background-color:#e64340}uni-button[disabled]{color:hsla(0,0%,100%,.6);cursor:not-allowed}uni-button[disabled]:not([type]),uni-button[disabled][type=default]{color:rgba(0,0,0,.3);background-color:#f7f7f7}uni-button[disabled][type=primary]{background-color:rgba(0,122,255,.6)}uni-button[disabled][type=warn]{background-color:#ec8b89}uni-button[type=primary][plain]{color:#007aff;border:1px solid #007aff;background-color:rgba(0,0,0,0)}uni-button[type=primary][plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[type=primary][plain]:after{border-width:0}uni-button[type=default][plain]{color:#353535;border:1px solid #353535;background-color:rgba(0,0,0,0)}uni-button[type=default][plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[type=default][plain]:after{border-width:0}uni-button[plain]{color:#353535;border:1px solid #353535;background-color:rgba(0,0,0,0)}uni-button[plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[plain]:after{border-width:0}uni-button[plain][native] .uni-button-cover-view-inner{padding:0}uni-button[type=warn][plain]{color:#e64340;border:1px solid #e64340;background-color:rgba(0,0,0,0)}uni-button[type=warn][plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[type=warn][plain]:after{border-width:0}uni-button[size=mini]{display:inline-block;line-height:2.3;font-size:13px;padding:0 1.34em}uni-button[size=mini][native]{padding:0}uni-button[size=mini][native] .uni-button-cover-view-inner{padding:0 1.34em}uni-button[loading]:not([disabled]){cursor:progress}uni-button[loading]:before{content:" ";display:inline-block;width:18px;height:18px;vertical-align:middle;-webkit-animation:uni-loading 1s steps(12) infinite;animation:uni-loading 1s steps(12) infinite;background-size:100%}uni-button[loading][type=primary]{color:hsla(0,0%,100%,.6);background-color:#0062cc}uni-button[loading][type=primary][plain]{color:#007aff;background-color:rgba(0,0,0,0)}uni-button[loading][type=default]{color:rgba(0,0,0,.6);background-color:#dedede}uni-button[loading][type=default][plain]{color:#353535;background-color:rgba(0,0,0,0)}uni-button[loading][type=warn]{color:hsla(0,0%,100%,.6);background-color:#ce3c39}uni-button[loading][type=warn][plain]{color:#e64340;background-color:rgba(0,0,0,0)}uni-button[loading][native]:before{content:none}.button-hover{color:rgba(0,0,0,.6);background-color:#dedede}.button-hover[plain]{color:rgba(53,53,53,.6);border-color:rgba(53,53,53,.6);background-color:rgba(0,0,0,0)}.button-hover[type=primary]{color:hsla(0,0%,100%,.6);background-color:#0062cc}.button-hover[type=primary][plain]{color:rgba(26,173,25,.6);border-color:rgba(26,173,25,.6);background-color:rgba(0,0,0,0)}.button-hover[type=default]{color:rgba(0,0,0,.6);background-color:#dedede}.button-hover[type=default][plain]{color:rgba(53,53,53,.6);border-color:rgba(53,53,53,.6);background-color:rgba(0,0,0,0)}.button-hover[type=warn]{color:hsla(0,0%,100%,.6);background-color:#ce3c39}.button-hover[type=warn][plain]{color:rgba(230,67,64,.6);border-color:rgba(230,67,64,.6);background-color:rgba(0,0,0,0)}uni-canvas{width:300px;height:150px;display:block;position:relative}uni-canvas>canvas{position:absolute;top:0;left:0;width:100%;height:100%}uni-checkbox-group[hidden]{display:none}uni-checkbox{-webkit-tap-highlight-color:transparent;display:inline-block;cursor:pointer}uni-checkbox[hidden]{display:none}uni-checkbox[disabled]{cursor:not-allowed}uni-checkbox .uni-checkbox-wrapper{display:-webkit-inline-flex;display:-webkit-inline-box;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;vertical-align:middle}uni-checkbox .uni-checkbox-input{margin-right:5px;-webkit-appearance:none;appearance:none;outline:0;border:1px solid #d1d1d1;background-color:#fff;border-radius:3px;width:22px;height:22px;position:relative}uni-checkbox:not([disabled]) .uni-checkbox-input:hover{border-color:#007aff}uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked{color:#007aff}uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked:before{font:normal normal normal 14px/1 uni;content:"\EA08";font-size:22px;position:absolute;top:50%;left:50%;transform:translate(-50%,-48%) scale(.73);-webkit-transform:translate(-50%,-48%) scale(.73)}uni-checkbox .uni-checkbox-input.uni-checkbox-input-disabled{background-color:#e1e1e1}uni-checkbox .uni-checkbox-input.uni-checkbox-input-disabled:before{color:#adadad}uni-checkbox-group{display:block}.ql-container{display:block;position:relative;box-sizing:border-box;-webkit-user-select:text;user-select:text;outline:none;overflow:hidden;width:100%;height:200px;min-height:200px}.ql-container[hidden]{display:none}.ql-container .ql-editor{position:relative;font-size:inherit;line-height:inherit;font-family:inherit;min-height:inherit;width:100%;height:100%;padding:0;overflow-x:hidden;overflow-y:auto;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-overflow-scrolling:touch}.ql-container .ql-editor::-webkit-scrollbar{width:0!important}.ql-container .ql-editor.scroll-disabled{overflow:hidden}.ql-container .ql-image-overlay{display:-webkit-box;display:-webkit-flex;display:flex;position:absolute;box-sizing:border-box;border:1px dashed #ccc;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-user-select:none;user-select:none}.ql-container .ql-image-overlay .ql-image-size{position:absolute;padding:4px 8px;text-align:center;background-color:#fff;color:#888;border:1px solid #ccc;box-sizing:border-box;opacity:.8;right:4px;top:4px;font-size:12px;display:inline-block;width:auto}.ql-container .ql-image-overlay .ql-image-toolbar{position:relative;text-align:center;box-sizing:border-box;background:#000;border-radius:5px;color:#fff;font-size:0;min-height:24px;z-index:100}.ql-container .ql-image-overlay .ql-image-toolbar span{display:inline-block;cursor:pointer;padding:5px;font-size:12px;border-right:1px solid #fff}.ql-container .ql-image-overlay .ql-image-toolbar span:last-child{border-right:0}.ql-container .ql-image-overlay .ql-image-toolbar span.triangle-up{padding:0;position:absolute;top:-12px;left:50%;-webkit-transform:translatex(-50%);transform:translatex(-50%);width:0;height:0;border-width:6px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.ql-container .ql-image-overlay .ql-image-handle{position:absolute;height:12px;width:12px;border-radius:50%;border:1px solid #ccc;box-sizing:border-box;background:#fff}.ql-container img{display:inline-block;max-width:100%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;height:100%;outline:none;overflow-y:auto;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6,.ql-editor ol,.ql-editor p,.ql-editor pre,.ql-editor ul{margin:0;padding:0;counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol>li,.ql-editor ul>li{list-style-type:none}.ql-editor ul>li:before{content:"\2022"}.ql-editor ul[data-checked=false],.ql-editor ul[data-checked=true]{pointer-events:none}.ql-editor ul[data-checked=false]>li *,.ql-editor ul[data-checked=true]>li *{pointer-events:all}.ql-editor ul[data-checked=false]>li:before,.ql-editor ul[data-checked=true]>li:before{color:#777;cursor:pointer;pointer-events:all}.ql-editor ul[data-checked=true]>li:before{content:"\2611"}.ql-editor ul[data-checked=false]>li:before{content:"\2610"}.ql-editor li:before{display:inline-block;white-space:nowrap;width:2em}.ql-editor ol li{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;counter-increment:list-0}.ql-editor ol li:before{content:counter(list-0,decimal) ". "}.ql-editor ol li.ql-indent-1{counter-increment:list-1}.ql-editor ol li.ql-indent-1:before{content:counter(list-1,lower-alpha) ". "}.ql-editor ol li.ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-2{counter-increment:list-2}.ql-editor ol li.ql-indent-2:before{content:counter(list-2,lower-roman) ". "}.ql-editor ol li.ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-3{counter-increment:list-3}.ql-editor ol li.ql-indent-3:before{content:counter(list-3,decimal) ". "}.ql-editor ol li.ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-4{counter-increment:list-4}.ql-editor ol li.ql-indent-4:before{content:counter(list-4,lower-alpha) ". "}.ql-editor ol li.ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-5{counter-increment:list-5}.ql-editor ol li.ql-indent-5:before{content:counter(list-5,lower-roman) ". "}.ql-editor ol li.ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-6{counter-increment:list-6}.ql-editor ol li.ql-indent-6:before{content:counter(list-6,decimal) ". "}.ql-editor ol li.ql-indent-6{counter-reset:list-7 list-8 list-9}.ql-editor ol li.ql-indent-7{counter-increment:list-7}.ql-editor ol li.ql-indent-7:before{content:counter(list-7,lower-alpha) ". "}.ql-editor ol li.ql-indent-7{counter-reset:list-8 list-9}.ql-editor ol li.ql-indent-8{counter-increment:list-8}.ql-editor ol li.ql-indent-8:before{content:counter(list-8,lower-roman) ". "}.ql-editor ol li.ql-indent-8{counter-reset:list-9}.ql-editor ol li.ql-indent-9{counter-increment:list-9}.ql-editor ol li.ql-indent-9:before{content:counter(list-9,decimal) ". "}.ql-editor .ql-indent-1:not(.ql-direction-rtl),.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:2em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:2em}.ql-editor .ql-indent-2:not(.ql-direction-rtl),.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:4em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:4em}.ql-editor .ql-indent-3:not(.ql-direction-rtl),.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:6em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor .ql-indent-4:not(.ql-direction-rtl),.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:8em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:8em}.ql-editor .ql-indent-5:not(.ql-direction-rtl),.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:10em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:10em}.ql-editor .ql-indent-6:not(.ql-direction-rtl),.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:12em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor .ql-indent-7:not(.ql-direction-rtl),.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:14em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:14em}.ql-editor .ql-indent-8:not(.ql-direction-rtl),.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:16em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:16em}.ql-editor .ql-indent-9:not(.ql-direction-rtl),.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:18em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor.ql-blank:before{color:rgba(0,0,0,.6);content:attr(data-placeholder);font-style:italic;pointer-events:none;position:absolute}.ql-container.ql-disabled .ql-editor ul[data-checked]>li:before{pointer-events:none}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}uni-icon{display:inline-block;font-size:0;box-sizing:border-box}uni-icon[hidden]{display:none}uni-icon>i{font:normal normal normal 14px/1 weui}uni-icon>i:before{margin:0;box-sizing:border-box}@font-face{font-weight:400;font-style:normal;font-family:weui;src:url("data:application/octet-stream;base64,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") format("truetype")}.uni-icon-success:before{content:"\EA06"}.uni-icon-success_circle:before{content:"\EA07"}.uni-icon-success_no_circle:before{content:"\EA08"}.uni-icon-safe_success:before{content:"\EA04"}.uni-icon-safe_warn:before{content:"\EA05"}.uni-icon-info:before{content:"\EA03"}.uni-icon-info_circle:before{content:"\EA0C"}.uni-icon-warn:before{content:"\EA0B"}.uni-icon-waiting:before{content:"\EA09"}.uni-icon-waiting_circle:before{content:"\EA0A"}.uni-icon-circle:before{content:"\EA01"}.uni-icon-cancel:before{content:"\EA0D"}.uni-icon-download:before{content:"\EA02"}.uni-icon-search:before{content:"\EA0E"}.uni-icon-clear:before{content:"\EA0F"}.uni-icon-safe_success,.uni-icon-success,.uni-icon-success_circle,.uni-icon-success_no_circle{color:#007aff}.uni-icon-safe_warn{color:#ffbe00}.uni-icon-info{color:#10aeff}.uni-icon-info_circle{color:#007aff}.uni-icon-warn{color:#f76260}.uni-icon-waiting,.uni-icon-waiting_circle{color:#10aeff}.uni-icon-circle{color:#c9c9c9}.uni-icon-cancel{color:#f43530}.uni-icon-download{color:#007aff}.uni-icon-clear,.uni-icon-search{color:#b2b2b2}uni-image{width:320px;height:240px;display:inline-block;overflow:hidden;position:relative}uni-image[hidden]{display:none}uni-image>div,uni-image>img{width:100%;height:100%}uni-image>img{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;display:block;position:absolute;top:0;left:0;opacity:0}uni-image>.uni-image-will-change{will-change:transform}uni-input{display:block;font-size:16px;line-height:1.4em;height:1.4em;min-height:1.4em;overflow:hidden}uni-input[hidden]{display:none}.uni-input-form,.uni-input-input,.uni-input-placeholder,.uni-input-wrapper{outline:none;border:none;padding:0;margin:0;text-decoration:inherit}.uni-input-form,.uni-input-wrapper{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;width:100%;height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.uni-input-input,.uni-input-placeholder{width:100%}.uni-input-placeholder{position:absolute;top:auto!important;left:0;color:grey;overflow:hidden;text-overflow:clip;white-space:pre;word-break:keep-all;pointer-events:none;line-height:inherit}.uni-input-input{position:relative;display:block;height:100%;background:none;color:inherit;opacity:1;font:inherit;line-height:inherit;letter-spacing:inherit;text-align:inherit;text-indent:inherit;text-transform:inherit;text-shadow:inherit}.uni-input-input[type=search]::-webkit-search-cancel-button,.uni-input-input[type=search]::-webkit-search-decoration{display:none}.uni-input-input::-webkit-inner-spin-button,.uni-input-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.uni-input-input[type=number]{-moz-appearance:textfield}.uni-input-input:disabled{-webkit-text-fill-color:currentcolor}.uni-label-pointer{cursor:pointer}uni-movable-area{display:block;position:relative;width:10px;height:10px}uni-movable-area[hidden]{display:none}uni-movable-view{display:inline-block;width:10px;height:10px;top:0;left:0;position:absolute;cursor:grab}uni-movable-view[hidden]{display:none}uni-navigator{height:auto;width:auto;display:block;cursor:pointer}uni-navigator[hidden]{display:none}.navigator-hover{background-color:rgba(0,0,0,.1);opacity:.7}uni-picker-view-column{-webkit-flex:1;-webkit-box-flex:1;flex:1;position:relative;height:100%;overflow:hidden}uni-picker-view-column[hidden]{display:none}.uni-picker-view-group{height:100%;overflow:hidden}.uni-picker-view-mask{transform:translateZ(0);-webkit-transform:translateZ(0)}.uni-picker-view-indicator,.uni-picker-view-mask{position:absolute;left:0;width:100%;z-index:3;pointer-events:none}.uni-picker-view-mask{top:0;height:100%;margin:0 auto;background:-webkit-linear-gradient(top,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),-webkit-linear-gradient(bottom,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background:linear-gradient(180deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),linear-gradient(0deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background-position:top,bottom;background-size:100% 102px;background-repeat:no-repeat}.uni-picker-view-indicator{height:34px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.uni-picker-view-content{position:absolute;top:0;left:0;width:100%;will-change:transform;padding:102px 0;cursor:pointer}.uni-picker-view-content>*{height:34px;overflow:hidden}.uni-picker-view-indicator:before{top:0;border-top:1px solid #e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.uni-picker-view-indicator:after{bottom:0;border-bottom:1px solid #e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.uni-picker-view-indicator:after,.uni-picker-view-indicator:before{content:" ";position:absolute;left:0;right:0;height:1px;color:#e5e5e5}uni-picker-view{display:block}uni-picker-view .uni-picker-view-wrapper{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;overflow:hidden;height:100%}uni-picker-view[hidden]{display:none}uni-progress{display:-webkit-flex;display:-webkit-box;display:flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center}uni-progress[hidden]{display:none}.uni-progress-bar{-webkit-flex:1;-webkit-box-flex:1;flex:1}.uni-progress-inner-bar{width:0;height:100%}.uni-progress-info{margin-top:0;margin-bottom:0;min-width:2em;margin-left:15px;font-size:16px}uni-radio-group[hidden]{display:none}uni-radio{-webkit-tap-highlight-color:transparent;display:inline-block;cursor:pointer}uni-radio[hidden]{display:none}uni-radio[disabled]{cursor:not-allowed}uni-radio .uni-radio-wrapper{display:-webkit-inline-flex;display:-webkit-inline-box;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;vertical-align:middle}uni-radio .uni-radio-input{-webkit-appearance:none;appearance:none;margin-right:5px;outline:0;border:1px solid #d1d1d1;background-color:#fff;border-radius:50%;width:22px;height:22px;position:relative}uni-radio:not([disabled]) .uni-radio-input:hover{border-color:#007aff}uni-radio .uni-radio-input.uni-radio-input-checked:before{font:normal normal normal 14px/1 uni;content:"\EA08";color:#fff;font-size:18px;position:absolute;top:50%;left:50%;transform:translate(-50%,-48%) scale(.73);-webkit-transform:translate(-50%,-48%) scale(.73)}uni-radio .uni-radio-input.uni-radio-input-disabled{background-color:#e1e1e1;border-color:#d1d1d1}uni-radio .uni-radio-input.uni-radio-input-disabled:before{color:#adadad}uni-radio-group{display:block}@-webkit-keyframes once-show{0%{top:0}}@keyframes once-show{0%{top:0}}uni-resize-sensor,uni-resize-sensor>div{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden}uni-resize-sensor{display:block;z-index:-1;visibility:hidden;-webkit-animation:once-show 1ms;animation:once-show 1ms}uni-resize-sensor>div>div{position:absolute;left:0;top:0}uni-resize-sensor>div:first-child>div{width:100000px;height:100000px}uni-resize-sensor>div:last-child>div{width:200%;height:200%}uni-scroll-view{display:block;width:100%}uni-scroll-view[hidden]{display:none}.uni-scroll-view{position:relative;-webkit-overflow-scrolling:touch;max-height:inherit}.uni-scroll-view,.uni-scroll-view-content{width:100%;height:100%}.uni-scroll-view-refresher{position:relative;overflow:hidden}.uni-scroll-view-refresh{position:absolute;top:0;left:0;right:0;bottom:0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row}.uni-scroll-view-refresh,.uni-scroll-view-refresh-inner{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.uni-scroll-view-refresh-inner{line-height:0;width:40px;height:40px;border-radius:50%;background-color:#fff;box-shadow:0 1px 6px rgba(0,0,0,.117647),0 1px 4px rgba(0,0,0,.117647)}.uni-scroll-view-refresh__spinner{-webkit-transform-origin:center center;transform-origin:center center;-webkit-animation:uni-scroll-view-refresh-rotate 2s linear infinite;animation:uni-scroll-view-refresh-rotate 2s linear infinite}.uni-scroll-view-refresh__spinner>circle{stroke:currentColor;stroke-linecap:round;-webkit-animation:uni-scroll-view-refresh-dash 2s linear infinite;animation:uni-scroll-view-refresh-dash 2s linear infinite}@-webkit-keyframes uni-scroll-view-refresh-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes uni-scroll-view-refresh-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes uni-scroll-view-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes uni-scroll-view-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}uni-slider{margin:10px 18px;padding:0;display:block}uni-slider[hidden]{display:none}uni-slider .uni-slider-wrapper{display:-webkit-flex;display:-webkit-box;display:flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;min-height:16px}uni-slider .uni-slider-tap-area{-webkit-flex:1;-webkit-box-flex:1;flex:1;padding:8px 0}uni-slider .uni-slider-handle-wrapper{position:relative;height:2px;border-radius:5px;background-color:#e9e9e9;cursor:pointer;-webkit-tap-highlight-color:transparent}uni-slider .uni-slider-handle-wrapper,uni-slider .uni-slider-track{-webkit-transition:background-color .3s ease;transition:background-color .3s ease}uni-slider .uni-slider-track{height:100%;border-radius:6px;background-color:#007aff}uni-slider .uni-slider-handle,uni-slider .uni-slider-thumb{position:absolute;left:50%;top:50%;cursor:pointer;border-radius:50%;-webkit-transition:border-color .3s ease;transition:border-color .3s ease}uni-slider .uni-slider-handle{width:28px;height:28px;margin-top:-14px;margin-left:-14px;background-color:rgba(0,0,0,0);z-index:3;cursor:grab}uni-slider .uni-slider-thumb{z-index:2;box-shadow:0 0 4px rgba(0,0,0,.2)}uni-slider .uni-slider-step{position:absolute;width:100%;height:2px;background:rgba(0,0,0,0);z-index:1}uni-slider .uni-slider-value{width:3ch;color:#888;font-size:14px;margin-left:1em}uni-slider .uni-slider-disabled .uni-slider-track{background-color:#ccc}uni-slider .uni-slider-disabled .uni-slider-thumb{background-color:#fff;border-color:#ccc}uni-swiper-item{display:block;overflow:hidden;will-change:transform;position:absolute;width:100%;height:100%;cursor:grab}uni-swiper-item[hidden]{display:none}uni-swiper{display:block;height:150px}uni-swiper[hidden]{display:none}uni-swiper .uni-swiper-wrapper{overflow:hidden;position:relative;width:100%;height:100%;-webkit-transform:translateZ(0);transform:translateZ(0)}uni-swiper .uni-swiper-slides{position:absolute;left:0;top:0;right:0;bottom:0}uni-swiper .uni-swiper-slide-frame{position:absolute;left:0;top:0;width:100%;height:100%;will-change:transform}uni-swiper .uni-swiper-dots{position:absolute;font-size:0}uni-swiper .uni-swiper-dots-horizontal{left:50%;bottom:10px;text-align:center;white-space:nowrap;-webkit-transform:translate(-50%);transform:translate(-50%)}uni-swiper .uni-swiper-dots-horizontal .uni-swiper-dot{margin-right:8px}uni-swiper .uni-swiper-dots-horizontal .uni-swiper-dot:last-child{margin-right:0}uni-swiper .uni-swiper-dots-vertical{right:10px;top:50%;text-align:right;-webkit-transform:translateY(-50%);transform:translateY(-50%)}uni-swiper .uni-swiper-dots-vertical .uni-swiper-dot{display:block;margin-bottom:9px}uni-swiper .uni-swiper-dots-vertical .uni-swiper-dot:last-child{margin-bottom:0}uni-swiper .uni-swiper-dot{display:inline-block;width:8px;height:8px;cursor:pointer;-webkit-transition-property:background-color;transition-property:background-color;-webkit-transition-timing-function:ease;transition-timing-function:ease;background:rgba(0,0,0,.3);border-radius:50%}uni-swiper .uni-swiper-dot-active{background-color:#000}uni-switch{-webkit-tap-highlight-color:transparent;display:inline-block;cursor:pointer}uni-switch[hidden]{display:none}uni-switch[disabled]{cursor:not-allowed}uni-switch .uni-switch-wrapper{display:-webkit-inline-flex;display:-webkit-inline-box;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;vertical-align:middle}uni-switch .uni-switch-input{-webkit-appearance:none;appearance:none;position:relative;width:52px;height:32px;margin-right:5px;border:1px solid #dfdfdf;outline:0;border-radius:16px;box-sizing:border-box;background-color:#dfdfdf;-webkit-transition:background-color .1s,border .1s;transition:background-color .1s,border .1s}uni-switch[disabled] .uni-switch-input{opacity:.7}uni-switch .uni-switch-input:before{width:50px;background-color:#fdfdfd}uni-switch .uni-switch-input:after,uni-switch .uni-switch-input:before{content:" ";position:absolute;top:0;left:0;height:30px;border-radius:15px;transition:-webkit-transform .3s;-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}uni-switch .uni-switch-input:after{width:30px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4)}uni-switch .uni-switch-input.uni-switch-input-checked{border-color:#007aff;background-color:#007aff}uni-switch .uni-switch-input.uni-switch-input-checked:before{-webkit-transform:scale(0);transform:scale(0)}uni-switch .uni-switch-input.uni-switch-input-checked:after{-webkit-transform:translateX(20px);transform:translateX(20px)}uni-switch .uni-checkbox-input{margin-right:5px;-webkit-appearance:none;appearance:none;outline:0;border:1px solid #d1d1d1;background-color:#fff;border-radius:3px;width:22px;height:22px;position:relative;color:#007aff}uni-switch:not([disabled]) .uni-checkbox-input:hover{border-color:#007aff}uni-switch .uni-checkbox-input.uni-checkbox-input-checked:before{font:normal normal normal 14px/1 uni;content:"\EA08";color:inherit;font-size:22px;position:absolute;top:50%;left:50%;transform:translate(-50%,-48%) scale(.73);-webkit-transform:translate(-50%,-48%) scale(.73)}uni-switch .uni-checkbox-input.uni-checkbox-input-disabled{background-color:#e1e1e1}uni-switch .uni-checkbox-input.uni-checkbox-input-disabled:before{color:#adadad}uni-text[selectable]{cursor:auto;user-select:text;-webkit-user-select:text}uni-textarea{width:300px;height:150px;display:block;position:relative;font-size:16px;line-height:normal;white-space:pre-wrap;word-break:break-all}uni-textarea[hidden]{display:none}.uni-textarea-compute,.uni-textarea-line,.uni-textarea-placeholder,.uni-textarea-textarea,.uni-textarea-wrapper{outline:none;border:none;padding:0;margin:0;text-decoration:inherit}.uni-textarea-wrapper{display:block;position:relative;width:100%;height:100%;min-height:inherit}.uni-textarea-compute,.uni-textarea-line,.uni-textarea-placeholder,.uni-textarea-textarea{position:absolute;width:100%;height:100%;left:0;top:0;white-space:inherit;word-break:inherit}.uni-textarea-placeholder{color:grey;overflow:hidden}.uni-textarea-compute,.uni-textarea-line{visibility:hidden;height:auto}.uni-textarea-line{width:1em}.uni-textarea-textarea{resize:none;background:none;color:inherit;opacity:1;font:inherit;line-height:inherit;letter-spacing:inherit;text-align:inherit;text-indent:inherit;text-transform:inherit;text-shadow:inherit}.uni-textarea-textarea-fix-margin{width:auto;right:0;margin:0 -3px}.uni-textarea-textarea:disabled{-webkit-text-fill-color:currentcolor}uni-view{display:block}uni-view[hidden]{display:none}uni-ad{display:block;overflow:hidden}uni-ad[hidden]{display:none}uni-cover-image{display:block;line-height:1.2;overflow:hidden;pointer-events:auto}uni-cover-image,uni-cover-image img{height:100%;width:100%}uni-cover-image[hidden]{display:none}uni-cover-image .uni-cover-image{width:100%;height:100%;text-overflow:inherit;overflow:inherit;white-space:nowrap;-webkit-align-items:inherit;-webkit-box-align:inherit;align-items:inherit;-webkit-justify-content:inherit;-webkit-box-pack:inherit;justify-content:inherit;-webkit-flex-direction:inherit;-webkit-box-orient:inherit;-webkit-box-direction:inherit;flex-direction:inherit;font-size:0;display:inherit}uni-cover-view{display:block;line-height:1.2;overflow:hidden;white-space:nowrap;pointer-events:auto}uni-cover-view[hidden]{display:none}uni-cover-view .uni-cover-view{width:100%;height:100%;text-overflow:inherit;overflow:hidden;white-space:inherit;-webkit-align-items:inherit;-webkit-box-align:inherit;align-items:inherit;-webkit-justify-content:inherit;-webkit-box-pack:inherit;justify-content:inherit;-webkit-flex-direction:inherit;-webkit-box-orient:inherit;-webkit-box-direction:inherit;flex-direction:inherit;-webkit-flex-wrap:inherit;flex-wrap:inherit;display:inherit;overflow:inherit}uni-map{position:relative;width:300px;height:150px;display:block}uni-map[hidden]{display:none}uni-picker{position:relative;display:block;cursor:pointer}uni-picker[hidden]{display:none}uni-picker[disabled]{cursor:not-allowed}.uni-picker-container{display:none;position:fixed;left:0;right:0;top:0;bottom:0;box-sizing:border-box;z-index:999;font-size:16px}.uni-picker-container .uni-picker-custom *{box-sizing:border-box}.uni-picker-container .uni-picker-custom{position:fixed;left:0;bottom:0;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:999;width:100%;background-color:#efeff4;visibility:hidden;-webkit-transition:visibility .3s,-webkit-transform .3s;transition:visibility .3s,-webkit-transform .3s;transition:transform .3s,visibility .3s;transition:transform .3s,visibility .3s,-webkit-transform .3s}.uni-picker-container .uni-picker-custom.uni-picker-toggle{visibility:visible;-webkit-transform:translate(0);transform:translate(0)}.uni-picker-container .uni-picker-content{position:relative;display:block;width:100%;height:238px;background-color:#fff}.uni-picker-container .uni-picker-item{padding:0;height:34px;line-height:34px;text-align:center;color:#000;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer}.uni-picker-container .uni-picker-header{display:block;position:relative;text-align:center;width:100%;height:45px;background-color:#fff}.uni-picker-container .uni-picker-header:after{content:"";position:absolute;left:0;bottom:0;right:0;height:1px;clear:both;border-bottom:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.uni-picker-container .uni-picker-action{display:block;max-width:50%;top:0;height:100%;box-sizing:border-box;padding:0 14px;font-size:17px;line-height:45px;overflow:hidden;cursor:pointer}.uni-picker-container .uni-picker-action.uni-picker-action-cancel{float:left;color:#888}.uni-picker-container .uni-picker-action.uni-picker-action-confirm{float:right;color:#007aff}.uni-picker-container .uni-picker-select{display:none}.uni-picker-system{position:absolute;display:none;display:block;top:0;left:0;width:100%;height:100%;overflow:hidden}.uni-picker-system>input{position:absolute;border:none;height:100%;opacity:0;cursor:pointer}.uni-picker-system>input.firefox{top:0;left:0;width:100%}.uni-picker-system>input.chrome{top:0;left:0;width:2em;font-size:32px;height:32px}@media screen and (min-width:500px) and (min-height:500px){.uni-mask.uni-picker-mask{background:none}.uni-picker-container .uni-picker-custom{width:300px;left:50%;right:auto;top:50%;bottom:auto;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;border-radius:5px;-webkit-transition:opacity .3s,visibility .3s;transition:opacity .3s,visibility .3s;box-shadow:0 0 20px 5px rgba(0,0,0,.3)}.uni-picker-container .uni-picker-header{border-radius:5px 5px 0 0}.uni-picker-container .uni-picker-content{-webkit-transform:translate(0);transform:translate(0);overflow:hidden;border-radius:0 0 5px 5px}.uni-picker-container .uni-picker-custom.uni-picker-toggle{opacity:1;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.uni-selector-select .uni-picker-content,.uni-selector-select .uni-picker-header{display:none}.uni-selector-select .uni-picker-select{display:block;max-height:300px;overflow:auto;background-color:#fff;border-radius:5px;padding:6px 0}.uni-selector-select .uni-picker-item{padding:0 10px;color:#555}.uni-selector-select .uni-picker-item:hover{background-color:#f6f6f6}.uni-selector-select .uni-picker-item.selected{color:#007aff}}uni-video{width:300px;height:225px;display:inline-block;line-height:0;overflow:hidden;position:relative}uni-video[hidden]{display:none}.uni-video-container{width:100%;height:100%;background-color:#000;display:inline-block;position:absolute;top:0;left:0;overflow:hidden;object-position:inherit}.uni-video-container.uni-video-type-fullscreen{position:fixed;z-index:999}.uni-video-video{width:100%;height:100%;object-position:inherit}.uni-video-cover{bottom:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;background-color:rgba(1,1,1,.5);z-index:1}.uni-video-cover,.uni-video-slots{position:absolute;top:0;left:0;width:100%}.uni-video-slots{height:100%;overflow:hidden;pointer-events:none}.uni-video-cover-play-button{width:40px;height:40px;background-size:50%;background-repeat:no-repeat;background-position:50% 50%;cursor:pointer}.uni-video-cover-duration{color:#fff;font-size:16px;line-height:1;margin-top:10px}.uni-video-bar{height:44px;background-color:rgba(0,0,0,.5);overflow:hidden;position:absolute;bottom:0;right:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;padding:0 10px;z-index:0;-webkit-transform:translateZ(0);transform:translateZ(0)}.uni-video-bar.uni-video-bar-full{left:0}.uni-video-controls{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;margin:0 8.5px}.uni-video-control-button{width:13px;height:15px;padding:14.5px 12.5px 14.5px 12.5px;margin-left:-8.5px;box-sizing:content-box;cursor:pointer}.uni-video-control-button:after{content:"";display:block;width:100%;height:100%;background-size:100%;background-position:50% 50%;background-repeat:no-repeat}.uni-video-control-button.uni-video-control-button-play:after,.uni-video-cover-play-button{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAeCAYAAAAy2w7YAAAAAXNSR0IArs4c6QAAAWhJREFUSA1j+P///0cgBoHjQGzCQCsAtgJB/AMy5wCxGNXtQ9iBwvoA5BUCMQvVLEQxHpNzDSjkRhXLMM3GKrIeKKpEkYVYjcUu+AMo3ALE3GRZiN1MvKKPgbIRJFuG10j8koeA0gZEW4jfLIKyf4EqpgOxMEELCRpFnIJ3QGU5QMyM00LizCFa1SWgSkeslhFtBGkKVwGVy6FYSJp+klR/A6quB2JOkIWMIK0oNlOf8xBoZDE9LAI7nYn6HsBq4l96WHQEaLUpAyiOaASeAM2NgvuPBpaACt82IEYtfKls0UagecpwXyAzqGTRdaA57sjmYrAptAjUsCkGYlYMg9EFyLQI1IiZB8Ti6Obh5JNh0QmgHlOcBuKSIMGi50C18UDMiMssvOJEWPQLqKYbiHnxGkRIkoBF24DyaoTMIEoeh0W3geI+RBlArCI0iz4D+RVAzEasfqLVAQ19AcSg5LoYiKWI1kiiQgCMBLnEEcfDSgAAAABJRU5ErkJggg==")}.uni-video-control-button.uni-video-control-button-pause:after{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAgCAYAAAAffCjxAAAAAXNSR0IArs4c6QAAAFlJREFUSA3tksEKACAIQ7X//5zq98wOgQayum8QaGweHhMzG/6OujzKAymn+0LMqivu1XznWmX8/echTIyMyAgTwA72iIwwAexgj8gIE8CO3aMRbDPMaEy5BRGaKcZv8YxRAAAAAElFTkSuQmCC")}.uni-video-current-time,.uni-video-duration{height:14.5px;line-height:14.5px;margin-top:15px;margin-bottom:14.5px;font-size:12px;color:#cbcbcb}.uni-video-progress-container{-webkit-box-flex:2;-webkit-flex-grow:2;flex-grow:2;position:relative}.uni-video-progress{height:2px;margin:21px 12px;background-color:hsla(0,0%,100%,.4);position:relative;cursor:pointer}.uni-video-progress-buffered{position:absolute;left:0;top:0;width:0;height:100%;-webkit-transition:width .1s;transition:width .1s;background-color:hsla(0,0%,100%,.8)}.uni-video-ball{width:16px;height:16px;padding:14px;position:absolute;top:-21px;box-sizing:content-box;left:0;margin-left:-22px}.uni-video-inner{width:100%;height:100%;background-color:#fff;border-radius:50%}.uni-video-danmu-button{white-space:nowrap;line-height:1;padding:2px 10px;border:1px solid #fff;border-radius:5px;font-size:13px;color:#fff;margin:0 8.5px;cursor:pointer}.uni-video-danmu-button.uni-video-danmu-button-active{border-color:#48c23d;color:#48c23d}.uni-video-fullscreen{width:17px;height:17px;padding:8.5px;box-sizing:content-box;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAAAXNSR0IArs4c6QAAAQRJREFUWAnt1d0NwiAQB/CmS7hHX5zFxLF0Ah2hE/lg7BT4PyMJUj6Oyt299BIioZT7ARYG59wLpTXmoXOMGO/QecxtwyWW4o42AupGALkFdX1MkHxE3Q7jIbQPqNthQogpJoZkMLRlsn/gFMQEk4OoY0oQVUwNoobhQFQwgMxUKFkt0C8+Zy61d8SeR5iHWCLOwF/MCb8Tp//ex3QFsE1HlCfKFUX2OijNFMnPKD7k76YcBoL402Zh8B77+MjlXrVvwfglXA32b0MrRgxCE2nBiEJaMOIQLkYFwsGoQWoYVUgJow4pYD4Weq4ayBqfwDYQmnUK0301kITujuawu65/l2B5A4z3Qe+Ut7EBAAAAAElFTkSuQmCC");background-size:50%;background-position:50% 50%;background-repeat:no-repeat;cursor:pointer}.uni-video-fullscreen.uni-video-type-fullscreen{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAABBElEQVRYhcXWwQ3CMAwF0O+qOzAKQzAAl0pMxQQwQhmGKwcERxbgc4lEVdHUbm3zJR8qJemTo6YByS3JO8kjyQbGkHQpkOz4zcmK8YQ0BWDCkOxL+UDKombMYKwfZAkmDGLFhEIsmHCIFpMC0WDSIHOYVEgNkw6pYPIhE5j/QCoYF0g7eEkPYGej+cX82x/l6aIAIOb9CcrajrjFE/IAQGP1IgIRcYVsVs32+vx+nC9nWq6dAZDhOaPHBEDGh54O4w0pa9oxEZBFmCjIBGb6Qh4JMWGiIWpMBkSFyYLMYjIhNUw7N9GQi2aQiLxJHspjV+rl1hFrRp25uV2MRGQRBsAewPUD/HhJVOOuCzwAAAAASUVORK5CYII=")}.uni-video-danmu{position:absolute;top:0;left:0;bottom:0;width:100%;margin-top:14px;margin-bottom:44px;font-size:14px;line-height:14px;overflow:visible}.uni-video-danmu-item{line-height:1;position:absolute;color:#fff;white-space:nowrap;left:100%;-webkit-transform:translatex(0);transform:translatex(0);-webkit-transition-property:left,-webkit-transform;transition-property:left,-webkit-transform;transition-property:left,transform;transition-property:left,transform,-webkit-transform;-webkit-transition-duration:3s;transition-duration:3s;-webkit-transition-timing-function:linear;transition-timing-function:linear}.uni-video-toast{pointer-events:none;position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-radius:5px;background-color:hsla(0,0%,100%,.8);color:#000;display:none}.uni-video-toast.uni-video-toast-volume{width:100px;height:100px;display:block}.uni-video-toast-volume .uni-video-toast-title{width:100%;font-size:12px;line-height:16px;text-align:center;margin-top:10px;display:block}.uni-video-toast-volume .uni-video-toast-icon{fill:#000;width:50%;height:50%;margin-left:25%;display:block}.uni-video-toast-volume .uni-video-toast-value{width:80px;height:5px;margin-top:5px;margin-left:10px}.uni-video-toast-volume .uni-video-toast-value>.uni-video-toast-value-content{overflow:hidden}.uni-video-toast-volume-grids{width:80px;height:5px}.uni-video-toast-volume-grids-item{float:left;width:7.1px;height:5px;background-color:#000}.uni-video-toast-volume-grids-item:not(:first-child){margin-left:1px}.uni-video-toast.uni-video-toast-progress{display:block;background-color:rgba(0,0,0,.8);color:#fff;font-size:14px;line-height:18px;padding:6px}uni-web-view{position:absolute;left:0;right:0;top:0;bottom:0}body::after{position:fixed;content:'';left:-1000px;top:-1000px;-webkit-animation:shadow-preload .1s;-webkit-animation-delay:3s;animation:shadow-preload .1s;animation-delay:3s}@-webkit-keyframes shadow-preload{0%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}100%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}}@keyframes shadow-preload{0%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}100%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}} \ No newline at end of file diff --git a/public/static/login.js b/public/static/login.js new file mode 100644 index 0000000..4cee8a6 --- /dev/null +++ b/public/static/login.js @@ -0,0 +1,62 @@ +// +---------------------------------------------------------------------- +// | ThinkAdmin +// +---------------------------------------------------------------------- +// | 版权所有 2014~2019 广州楚才信息科技有限公司 [ http://www.cuci.cc ] +// +---------------------------------------------------------------------- +// | 官方网站: http://demo.thinkadmin.top +// +---------------------------------------------------------------------- +// | 开源协议 ( https://mit-license.org ) +// +---------------------------------------------------------------------- +// | gitee 代码仓库:https://gitee.com/zoujingli/ThinkAdmin +// | github 代码仓库:https://github.com/zoujingli/ThinkAdmin +// +---------------------------------------------------------------------- + +$(function () { + + window.$body = $('body'); + + /*! 后台加密登录处理 */ + $body.find('[data-login-form]').map(function (that) { + that = this; + require(["md5"], function (md5) { + $("form").vali(function (data) { + data['password'] = md5.hash(md5.hash(data['password']) + data['uniqid']); + $.form.load(location.href, data, "post", function (ret) { + if (parseInt(ret.code) !== 1) { + $(that).find('.verify.layui-hide').removeClass('layui-hide'); + $(that).find('[data-captcha]').trigger('click'); + } + }, null, null, 'false'); + }); + }); + }); + + /*! 登录图形验证码刷新 */ + $body.on('click', '[data-captcha]', function () { + var type, token, verify, uniqid, action, $that = $(this); + action = this.getAttribute('data-captcha') || location.href; + if (action.length < 5) return $.msg.tips('请设置验证码请求地址'); + type = this.getAttribute('data-captcha-type') || 'captcha-type'; + token = this.getAttribute('data-captcha-token') || 'captcha-token'; + uniqid = this.getAttribute('data-field-uniqid') || 'uniqid'; + verify = this.getAttribute('data-field-verify') || 'verify'; + $.form.load(action, {type: type, token: token}, 'post', function (ret) { + if (ret.code) { + $that.html(''); + $that.append($('img').attr('src', ret.data.image)); + $that.append($('').attr('name', uniqid).val(ret.data.uniqid)); + if (ret.data.code) { + $that.parents('form').find('[name=' + verify + ']').attr('value', ret.data.code); + } else { + $that.parents('form').find('[name=' + verify + ']').attr('value', ''); + } + return false; + } + }, false); + }); + + $('[data-captcha]').map(function () { + $(this).trigger('click') + }); + +}); \ No newline at end of file diff --git a/public/static/mp3/cz.mp3 b/public/static/mp3/cz.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..30347400a50a4ef5819039f5a6dbb3baa09173be GIT binary patch literal 8928 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

        *n4-E$wzZVY_&Ntv+-Gs0geu=3J<~ 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 N9=8AT&i|jC{{g_o)x`h+ literal 0 HcmV?d00001 diff --git a/public/static/mp3/order.mp3 b/public/static/mp3/order.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1065d58ce4a9b50579e73f79ae9021b2ac77ec8d GIT binary patch literal 246652 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≫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≶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 literal 0 HcmV?d00001 diff --git a/public/static/mp3/tx.mp3 b/public/static/mp3/tx.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a1b2806d542046e87dbf712d7666f7a929e6ba88 GIT binary patch literal 8496 zcmd7XXHZj7v?$<&-g_rPh;$IC3aChL(jgdn?@|?zB0)Nc5PI)LI?_7?=|y@`sv<=| zib#=q9`U`I`|G~B_s4zn_Mgn;oSgM#?R~P>IsyJD_kx(jceJpLltI$slsu#S@{k8O zFj0;IM@KPBD`Ghbo}R?lVz9j21Z+Yuem#4;OfNEcCKrTb9w?oQ^D}@4*LrU!1S^bR zi zLj;ATdub^?9={!fvZTdp;MT(g`#x3y&P)Xf@+K2frAA{hP_Yr^GW5tnU$9X^Ko4}d zIle(W)RcN&1kv}Q9CaxW?WkE=!m{^KA;tkr1ci?VCJyuLmE&NWSM3VpP;*at_B9a^ zzf$~H263+rymM!C3ukj2wq$lo=G0p1__xG84u?qTZ>nd-qXI!#a}~8TlX-Q6M@?8N zOqm!DCA6)q`)q+51Otys%x(3iX?q5}otO&90GOIe`yS_VQ>f|AND68lq$wy&PFeBL ztdDNUsBMbWOoZnvS2qF3n>LNd;ksWT(m`uG7N4-SL;A)PVJ#9*PozE!`Pjl$%3}En zzVZ*SQ6*v6S8RKo6DJPnKJX%S3QojrJ`5w`WIx;id;~0z7ul z((UO}l6|Q`E2f7ey>yM@*l* z_2);BHy-Dwrdu12Cq~--gzF1o5ea%zlH#hQ>Q2W{#=9ObxPzby<#=5E^$i2RSP=aD z;-ZMuNb6O@(J&kb_8%JJ?+MA8L~2aiF&+vicGa5cr(Q1&Tp8338-iQtx>kj=TP0&Y zU{?|gU9!uycrK4)q2>X%A%Y?pBdV+<;2onjBqS8w=$Z8F zcjD~CvIWmZWHBCUw#)uu)2ZI2_4j0XAJQzAfHXTn7m&5@W+%UoC|P#3lY@Mel1kIf za&h4l%pDl9Nr7Kxaj6k&G730c>OA1cC`MkZHfn`FcPY|Wx3>{VXdu#ug-|He=?{BP z`+ig`Z;5Vgah)kG&Jiw~Ei&r@u8G{v>~dwr zUuy8#<4Q@_sUF4=#*1(xKh~z9rZ26bC@d(9#?Ti**_dK7(4X*#Z&vo-?&poP)mE547 zPV}fbX@+4B*$d4+`vX5AJ5w7OclK%<_w7UBR4u2cqdGN7(ThJf-6Y+& zljP8S(PHTN%&FAX>DBFfw?qEGW4q?7V&td_KUP6mJp5#MMuvi{;Hbw z{va$|R56yMdF@bEed6p=Eap|IuDLVyIc_xEhVK{v+Az^CYK$3GWwg+#H@p!#qw&u; zY8Rawzd*q_X@>OQ%4BBjjqgr8eD&Qr5!7rXL5bAV$t$W8XP9_UOaP_sFL?Z1xgO(r z$cJs)(v=p0Z9+ZyXS!54Jra)}rE{S;w>*y>x@_G`*tJNuba=gNLKk zWmg@y>{k$XnqCz5GShqFXcx@}Y?x?@C~s<7woZa>OBCT$&~N zxFGx4Tl9&oa*7%`MIkQC25Sc=g@Bz;!6O*&VHmnQPx`hgnukC{bEgH)L>vhjK3 zoa4hXWGVkXL6=$l9rhriqlvN(#sM8^uwEv34ev`Xbzkk#96l`#-dx;TuLkO5Ui)AL z3B^V#QzmcU&?L;{ZA+b{9cBQMzvov6k5;NX_V}*9K21Mota+proM_C-&FBsNpx>wa z<;g==bx-YDy?Dh4U{aP8vi$WSEyhF6?8G@|)Wd+4tJL`@l#uZvXmCyO$J|j)ju;-Y zjaE(qIFGxy+I-bf{V1jCBH3Ea#|0|L_osDBUEN)SU5xJg+4kaL#Rfk$Dvv9U(I+Kt zO3cOwQS#Fg@j(?Lf~MqNQfKte)5tn5D>7!L>%(Yj*1kJ4CO-)(YY zq#JF!qehA!g_A&nehChi1L2C`rQMB2VasUMSwjZ=LrZ64~NULH)``U0-Ga71@7DAFu^u}hDf#~h1pf%B3 z$cxi-RNnN-C3$w`If67jcA0@eoBxD|ZYnKH_fg%|rB+NSa0x7)$j-(Dn_LS-tOpEO z^n6_pr)<~<9Gd+f_!op;{+iW|H`ajq*-fB9)}6MZR9 z+vf7&0@;A^K-rGzhB_k*9$($Awjtz|e;|I$gWTQGmlWW*X329J@-nk)5F;8*e$tlM zdiJM!_dvY1*zRC^b>h3_aMy>M4&O_Kx?(R62jMPU$itF!WQa_6DCp{n<@v)pFNu;G3)@_?HrlhZ)*SH+oEI zFqk)>%koY+RIx5k+Ll_f$xkQShg9;B8FJUvC(4qzE;DiMY~Qh|uH%=0#Z4<0m4y6w zzxgp$OnAul<51tToI>ZlqvSAw<$h+1M+b#qeu5ym!pQ}}U#86q8bd{v@Zmx+JlADa zghBeEjn^(EO1-{Yss5D26n~BZFa2=~OeqCl=%43~+}MusVDA{IrEIQq_e{YnP!M)V zbTj&G*fDHQ>>UyOPps#TkoLjP9i613YqgWE@_Y6(!iC>T8b!>U>z!#TK1J!#jI9FK zi~^+@)c~M$!lS+6iv)ms(VMwtIgvT>`s{?1Ry&01{k_FAE+c55Gm_=5yshQKkL9b^ zrytq64{dE5mKT3nv|&6v%n7w?0mHcDLYkL5X`pWCxx2OlZ=Z&NQI=x3Rm#b>L6I;<9Pz< zj#+N+8P0aossl=#m1R~;XUQHag8Sa$_Uu`uN9T+|`8{hnadWPmPzq2Z&`fL9G5<;K$|bSnj&DAM`Wu`{TdY>gouC!sMks zmu)!Qql02$*YJKpcSb?bL$v1gE^kFq&mHAR5d?y7L zD*>_VEWArz0rMF8HS>Q8@y51C$T4`5#?sIT5y_j6w6)E9M}%HLL7;c@Zh<)aF1|2M zeomI|T2(7WCtVCBEFoco10x8Ir4lz}?&i;{YNQb!`lcAWoBR8c*{dOp4*iXs0qQz%P$dCxn8{5JyHQuSrJAiqZfi z;t@;BcmEonZ34*aON=M)4&l+T>2z;93T*fk`9VThsM@66kjv)zeCT>sUcBe`c< zG*$d$N$rRPE5m3dM7h!|Bv5jGCapqd13jMn&@&bEX4>CSpS5s^4POdVFx}Vk%|z(V6;u{nQO}DnPB}&;C@+okpeAy z_?fobYvy>8OCCo};C?DJ_|C)1uTDCN>9fGa(h_=N;_+=!X^SnZ2ofCVIP9rxtb3C( zqPv6fkVE5whLTcWg8-X~_B=v?kmf8AYv=otgYX%Oi4z1<$?nSQSjNrHzV3S~>Jb#D z-wiDNuMW_2T>}ls>ZapgWV{b)*{AkANh4EekHhUrlIk^}B#-5Zv4z7Wqo^b{K%nOw zxq}acAm^hu`6Pd}yGoZf@B3a;6VcP?@WzEi@*<*Im-yNLS~0%)*AJ4jCNwUXe6h#I z!BQ(vZd?8#r`Aaw#nO=65cV#YS+3h#U9#tUnQsPX%=Zv)(>mydAW*}unssAsKJJ&r z%ad~48e8X8sZtEs@Llp3F6y0XJQpJFPC=?l8%D1E1TO z6w%&ea4p$c2eZi2%LNs`U+m$LS0{-S^ZA9z4>jA5+K%*L+;?`XS1!W&Hb(>Pl}q;W zvK_70PDXue`uzNVSmz&Hd>}^xcQ!aIg`Wg;9Zh>^l-fT1^Fy_W7Bc8&xcH9$rG*4FkQ27;6&Zz6plSSTM6afRVK3TYG^vZ3g!JO@( zMN(*Ex@eyyncpVK7F_}>yI}M}mf!Bcj*Dqbh;D23*9#F?@7r9MJs!C5+KG4R1blYH zcqpN=r$?sf1eX0o()SsN-FpWRq=D;6${(|k#K}7v0kT@z!y#llAvPXJ;L_+a>sYt8 z19@$)>@}XS1C{u>v3a; z802HGfx6uueY?t7G(q&_q|k8KH%_V$*jX6~+F8+NDol1Q{+lo6{Iw}Viq9cuie~#= z03emE)0$~{^mN1Ds&sWpv^g#eeP{0s*a`r)dTHO?CT-Dcyiac}1gedoQciT> zwbHB6QUo`VovB9~f3F9V3X5wFFEzp}!0&AO;+woHlfBRIl|ry%d@0(^bpU#pD-RS2#jUZ7>ttCYHm)eUFlSUL5z<-% zX$sCx_x1_ytGF*IwVb5;ajh{>30am*cQcAg5y@IGw52SnsRa6@Z+ZA)JX*}%bOS7_ z2!^SZoMZos&mqVSvhLiSA!J7uB$Wj&PHe4_j%&%bUpN1ddHJ!bQSOY`~9(o5Vn5p92v|0NrFNj!d;oQ=T*oOhNGoj zccD!H09+!y9zG7yMa}O$cUsxg-rKlM6@F4ygY#BX|Cd5DlxH51+@bao zGhbnMRB!v!0HULi_{TQ2yoB#ScM}S3h8J4<++P^3z_Y?BlfqAMvm1?g!zj?T@7y61 z`g{_Ub|gh?Q|k7DDHh)13r#@VS?T+*_EL(EEmKvH@x4oXrr*UHvDLCSu@@JPd`MtU z6AJl{UH|{uFDF32ENiAdZZ7}nS^w`2VDbZktf@}1^x(9jXbkllc%b4@&bIYSl&wF* z3>jl~y}yTp@$u(LXvx4f*Ejr>H*e>QYcit+0yZFA0hYWjUnq2F_jJtN>?Csa%jWY+VhEJJlM9&-kW> zi^POSMKv@Sce%Se2ZXZLkXA_Ypqw$O4BTFt;Re zXlfjJA>jI}8rWgc6E%t`fhkwogTxvqy~Zs*GQ7Zpp?o0up8U+C=GMs~R`p9559DsV zZL3)v0(8N{)Kj&0#=6(BTM~SKr{p|8q-Uo=;yPhDzL!WYKM#v)=p{+H6;4XWydvNdAmbn=7Zu#9 zVZCZTyet%e##;q4Es+tTO#K0Bis19||_Bo1vs`X)w>v7s}pVkdaM$ zQ7=)g-z2XCW}c`*3KKm5i@`4u48&GDEgr=DLiJ!mUDVo2hmqh zB1`|%0aa56_et{Z=l)Tt8P^b#uGNGX7wpn zCf-!K2$ZZ`>cfrKcCCviZjQ+hDO9&}oW@c9>yB2~oxCee^ggZSuB~;3MB7Vkc#`d} zrb~mXX~p`Hs4txC&uz{1u!0_=Y=}kQCp`H11Ww97%5U>rrb3CgPEVa;c+kwtCp|1H zC_AwnUOJLk?|c6zFe0SZSzB4<;Ck@f=_zpD;Hc}!n1!ot3?FX0a;2^KzyS}_(p?2U z*UtYj#(2meJn8c+!+0M+#yU95w>bOTZH!ar|FpR`P$_u~1k3g;#S5Dyvvcr*nS{2CPllMY&S?am zm9DE?EFU_;o~R0}@SY%dY10akC3UND%J6&N3 z@wMfCTlO-i@aUo2M|cKPi=!|jBCSAK``w?SS7Egulqv;NB=oI>r2L3}J7qmL=yi-3 zYl~)C)4vli81dR^2cU6?Tq#F9`!jPN0OmU=_X?_Xuz0M!hK5{x(=6~>!X~I2btoeu zX6Tp2sIy{6cyOTnk76`C(?#Fn*vh(#+Cx+IFdiYum!rynVYOjGD(k(?FlsJW+LYGx zOaT+D4Nd$n6a=MoBrToipDVb(fzfjCAzbW08Np0Wg0h0Ki&FsLF?W0HZ`=w4Xjpba zPSC_1je%MWKBmZ%A9o|&mp|Kl*};+}XxIaXW9i*_x-*`gkBB}+INrZgx%Uu98qbLD zfd_l+8tCWiS|{dT{QuUoG$d|eC;Z|lC^ob51&!D4c^P+<^Y>v|#pGjB+00 z4tQ1gn=`$Y&#m(b7GPI@riHW|rVqm{gJahJEInhVeYt}FE0=XoE&IU5YJ>;{MQW{>AF zS)R^PmcezGCn>VQnHr^So(%iTi-fW>hi-jYq~kR}J=46w4D)x~Mz}uSL~XQm;aq zpFhR&G5JA497l0f!!$nu#J)Fhf2d*F!?EhERwZ!A-J)8S+W9CanYw|Rd>O!At4*P zd20wk9HB3dpCaA1(x`%LpOu>+fA2rb$YR+LSyc_cF}t5g=kkQ{UDN|^$_eQtPS)6B zo_r#Eoycd=Jlzq>)P(DAU-1R~vbR?gl`<9+0p>QjfQy-T0&m|)q-Es0xC~|F?gpgj z*HZ`!q{SaJT~x(kJoQ2$bk<^-_Mj-;!4`LX=}BCA3Kbk`@dB}I0;-d9^6%|TdBWmx z>>GNY@@xt=JX(xTn;UYZ{QuIrMKIyXXw5L;%4j|3B?`)|G%w*Lw$#!)veZH_;pGHN zPl)=GVoOhcHMeJcB~OaifDJ9->&-3U_2R&lG39s!M7+)2C&gB3z&8GxuEW x-+{Wk5E~}|-Ck|ywubvJlyU!K1scZV4+3E;gKo$FiSqxO=YQc)return"...";var d=b.$$hashKey,g;if(I(a)){g=0;for(var f=a.length;g").append(a).html();try{return a[0].nodeType===Oa?L(b):b.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(a,b){return"<"+L(b)})}catch(d){return L(b)}}function Tc(a){try{return decodeURIComponent(a)}catch(b){}}function ec(a){var b={};r((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g, +"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=Tc(e),u(e)&&(f=u(f)?Tc(f):!0,ra.call(b,e)?I(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function fc(a){var b=[];r(a,function(a,c){I(a)?r(a,function(a){b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))}):b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))});return b.length?b.join("&"):""}function fb(a){return ja(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ja(a,b){return encodeURIComponent(a).replace(/%40/gi, +"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function ve(a,b){var d,c,e=Ha.length;for(c=0;c protocol indicates an extension, document.location.href does not match."))}function Uc(a,b,d){B(d)||(d={});d=O({strictDi:!1},d);var c=function(){a=z(a);if(a.injector()){var c=a[0]===w.document?"document":za(a);throw qa("btstrpd",c.replace(//,">"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]); +b.unshift("ng");c=gb(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;w&&e.test(w.name)&&(d.debugInfoEnabled=!0,w.name=w.name.replace(e,""));if(w&&!f.test(w.name))return c();w.name=w.name.replace(f,"");$.resumeBootstrap=function(a){r(a,function(a){b.push(a)});return c()};C($.resumeDeferredBootstrap)&&$.resumeDeferredBootstrap()}function ye(){w.name= +"NG_ENABLE_DEBUG_INFO!"+w.name;w.location.reload()}function ze(a){a=$.element(a).injector();if(!a)throw qa("test");return a.get("$$testability")}function Vc(a,b){b=b||"_";return a.replace(Ae,function(a,c){return(c?b:"")+a.toLowerCase()})}function Be(){var a;if(!Wc){var b=rb();(ma=x(b)?w.jQuery:b?w[b]:void 0)&&ma.fn.on?(z=ma,O(ma.fn,{scope:Sa.scope,isolateScope:Sa.isolateScope,controller:Sa.controller,injector:Sa.injector,inheritedData:Sa.inheritedData}),a=ma.cleanData,ma.cleanData=function(b){for(var c, +e=0,f;null!=(f=b[e]);e++)(c=ma._data(f,"events"))&&c.$destroy&&ma(f).triggerHandler("$destroy");a(b)}):z=V;$.element=z;Wc=!0}}function hb(a,b,d){if(!a)throw qa("areq",b||"?",d||"required");return a}function sb(a,b,d){d&&I(a)&&(a=a[a.length-1]);hb(C(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ia(a,b){if("hasOwnProperty"===a)throw qa("badname",b);}function Xc(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g")+c[2];for(c=c[0];c--;)d=d.lastChild;f=db(f,d.childNodes);d=e.firstChild;d.textContent=""}else f.push(b.createTextNode(a));e.textContent="";e.innerHTML="";r(f,function(a){e.appendChild(a)});return e}function V(a){if(a instanceof V)return a;var b;E(a)&&(a=Q(a),b=!0);if(!(this instanceof V)){if(b&&"<"!==a.charAt(0))throw lc("nosel");return new V(a)}if(b){b=w.document;var d;a=(d=fg.exec(a))?[b.createElement(d[1])]:(d=fd(a,b))?d.childNodes: +[];mc(this,a)}else C(a)?gd(a):mc(this,a)}function nc(a){return a.cloneNode(!0)}function yb(a,b){!b&&jc(a)&&z.cleanData([a]);a.querySelectorAll&&z.cleanData(a.querySelectorAll("*"))}function hd(a,b,d,c){if(u(c))throw lc("offargs");var e=(c=zb(a))&&c.events,f=c&&c.handle;if(f)if(b){var g=function(b){var c=e[b];u(d)&&cb(c||[],d);u(d)&&c&&0l&&this.remove(n.key);return b}},get:function(a){if(l";b=Ba.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function na(a,b){try{a.addClass(b)}catch(c){}}function da(a,b,c,d,e){a instanceof z||(a=z(a));var g=Ua(a,b,a,c,d,e);da.$$addScopeClass(a); +var f=null;return function(b,c,d){if(!a)throw ca("multilink");hb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var h=d.parentBoundTranscludeFn,k=d.transcludeControllers;d=d.futureParentElement;h&&h.$$boundTransclude&&(h=h.$$boundTransclude);f||(f=(d=d&&d[0])?"foreignobject"!==ya(d)&&ia.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==f?z(ka(f,z("

        ").append(a).html())):c?Sa.clone.call(a):a;if(k)for(var l in k)d.data("$"+l+"Controller",k[l].instance);da.$$addScopeInfo(d,b);c&& +c(d,b);g&&g(b,d,d,h);c||(a=g=null);return d}}function Ua(a,b,c,d,e,g){function f(a,c,d,e){var g,k,l,m,p,n,G;if(t)for(G=Array(c.length),m=0;ms.priority)break;if(w=s.scope)s.templateUrl||(B(w)?(aa("new/isolated scope",J||t,s,v),J=s):aa("new/isolated scope",J,s,v)),t=t||s;R=s.name;if(!u&&(s.replace&&(s.templateUrl||s.template)||s.transclude&&!s.$$tlb)){for(w=Da+1;u=a[w++];)if(u.transclude&&!u.$$tlb||u.replace&&(u.templateUrl||u.template)){Ib=!0;break}u=!0}!s.templateUrl&&s.controller&&(H=H||S(),aa("'"+R+"' controller",H[R],s,v),H[R]=s);if(w=s.transclude)if(ba=!0, +s.$$tlb||(aa("transclusion",y,s,v),y=s),"element"===w)T=!0,n=s.priority,P=v,v=d.$$element=z(da.$$createComment(R,d[R])),b=v[0],ma(g,xa.call(P,0),b),P[0].$$parentNode=P[0].parentNode,q=W(Ib,P,e,n,f&&f.name,{nonTlbTranscludeDirective:y});else{var na=S();if(B(w)){P=[];var Ua=S(),Ma=S();r(w,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Ua[a]=b;na[b]=null;Ma[b]=c});r(v.contents(),function(a){var b=Ua[Ea(ya(a))];b?(Ma[b]=!0,na[b]=na[b]||[],na[b].push(a)):P.push(a)});r(Ma,function(a,b){if(!a)throw ca("reqslot", +b);});for(var L in na)na[L]&&(na[L]=W(Ib,na[L],e))}else P=z(nc(b)).contents();v.empty();q=W(Ib,P,e,void 0,void 0,{needsNewScope:s.$$isolateScope||s.$$newScope});q.$$slots=na}if(s.template)if(M=!0,aa("template",A,s,v),A=s,w=C(s.template)?s.template(v,d):s.template,w=Ia(w),s.replace){f=s;P=kc.test(w)?qd(ka(s.templateNamespace,Q(w))):[];b=P[0];if(1!==P.length||1!==b.nodeType)throw ca("tplrt",R,"");ma(g,v,b);D={$attr:{}};w=K(b,[],D);var rc=a.splice(Da+1,a.length-(Da+1));(J||t)&&Z(w,J,t);a=a.concat(w).concat(rc); +fa(d,D);D=a.length}else v.html(w);if(s.templateUrl)M=!0,aa("template",A,s,v),A=s,s.replace&&(f=s),p=ja(a.splice(Da,a.length-Da),v,d,g,ba&&q,h,k,{controllerDirectives:H,newScopeDirective:t!==s&&t,newIsolateScopeDirective:J,templateDirective:A,nonTlbTranscludeDirective:y}),D=a.length;else if(s.compile)try{N=s.compile(v,d,q);var U=s.$$originalDirective||s;C(N)?m(null,Ra(U,N),Ta,E):N&&m(Ra(U,N.pre),Ra(U,N.post),Ta,E)}catch($){c($,za(v))}s.terminal&&(p.terminal=!0,n=Math.max(n,s.priority))}p.scope=t&& +!0===t.scope;p.transcludeOnThisElement=ba;p.templateOnThisElement=M;p.transclude=q;l.hasElementTranscludeDirective=T;return p}function X(a,b,c,d){var e;if(E(b)){var g=b.match(l);b=b.substring(g[0].length);var f=g[1]||g[3],g="?"===g[2];"^^"===f?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e=f?c.inheritedData(h):c.data(h)}if(!e&&!g)throw ca("ctreq",b,a);}else if(I(b))for(e=[],f=0,g=b.length;fc.priority)&&-1!==c.restrict.indexOf(e)){k&&(c=$b(c,{$$start:k,$$end:l}));if(!c.$$bindings){var t=m=c,G=c.name,H={isolateScope:null,bindToController:null};B(t.scope)&&(!0===t.bindToController?(H.bindToController=d(t.scope,G,!0),H.isolateScope={}):H.isolateScope=d(t.scope,G,!1));B(t.bindToController)&&(H.bindToController=d(t.bindToController,G,!0));if(H.bindToController&&!t.controller)throw ca("noctrl",G);m=m.$$bindings=H;B(m.isolateScope)&&(c.$$isolateBindings=m.isolateScope)}b.push(c); +m=c}}return m}function $(b){if(f.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,e=c.length;d"+b+"";return c.childNodes[0].childNodes;default:return b}}function ua(a,b){if("srcdoc"===b)return T.HTML;var c=ya(a);if("src"===b||"ngSrc"===b){if(-1===["img","video","audio","source","track"].indexOf(c))return T.RESOURCE_URL}else if("xlinkHref"===b||"form"===c&&"action"===b||"link"===c&&"href"===b)return T.RESOURCE_URL}function wa(a,c,d,e,g){var f=ua(a,e),h=k[e]||g,l=b(d,!g,f,h);if(l){if("multiple"===e&&"select"===ya(a))throw ca("selmulti", +za(a));if(m.test(e))throw ca("nodomevents");c.push({priority:100,compile:function(){return{pre:function(a,c,g){c=g.$$observers||(g.$$observers=S());var k=g[e];k!==d&&(l=k&&b(k,!0,f,h),d=k);l&&(g[e]=l(a),(c[e]||(c[e]=[])).$$inter=!0,(g.$$observers&&g.$$observers[e].$$scope||a).$watch(l,function(a,b){"class"===e&&a!==b?g.$updateClass(a,b):g.$set(e,a)}))}}}})}}function ma(a,b,c){var d=b[0],e=b.length,g=d.parentNode,f,h;if(a)for(f=0,h=a.length;f=b)return a;for(;b--;){var d=a[b];(8===d.nodeType||d.nodeType===Oa&&""===d.nodeValue.trim())&&ug.call(a,b,1)}return a}function sg(a,b){if(b&&E(b))return b;if(E(a)){var d=td.exec(a);if(d)return d[3]}}function yf(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b, +c){Ia(b,"controller");B(b)?O(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!B(a.$scope))throw K("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,h,k){var l,m,p;h=!0===h;k&&E(k)&&(p=k);if(E(f)){k=f.match(td);if(!k)throw ud("ctrlfmt",f);m=k[1];p=p||k[3];f=a.hasOwnProperty(m)?a[m]:Xc(g.$scope,m,!0)||(b?Xc(c,m,!0):void 0);if(!f)throw ud("ctrlreg",m);sb(f,m,!0)}if(h)return h=(I(f)?f[f.length-1]:f).prototype,l=Object.create(h|| +null),p&&e(g,p,l,m||f.name),O(function(){var a=d.invoke(f,l,g,m);a!==l&&(B(a)||C(a))&&(l=a,p&&e(g,p,l,m||f.name));return l},{instance:l,identifier:p});l=d.instantiate(f,g,m);p&&e(g,p,l,m||f.name);return l}}]}function zf(){this.$get=["$window",function(a){return z(a.document)}]}function Af(){this.$get=["$document","$rootScope",function(a,b){function d(){e=c.hidden}var c=a[0],e=c&&c.hidden;a.on("visibilitychange",d);b.$on("$destroy",function(){a.off("visibilitychange",d)});return function(){return e}}]} +function Bf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function tc(a){return B(a)?fa(a)?a.toISOString():eb(a):a}function Gf(){this.$get=function(){return function(a){if(!a)return"";var b=[];Oc(a,function(a,c){null===a||x(a)||C(a)||(I(a)?r(a,function(a){b.push(ja(c)+"="+ja(tc(a)))}):b.push(ja(c)+"="+ja(tc(a))))});return b.join("&")}}}function Hf(){this.$get=function(){return function(a){function b(a,e,f){null===a||x(a)||(I(a)?r(a,function(a,c){b(a,e+"["+(B(a)? +c:"")+"]")}):B(a)&&!fa(a)?Oc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ja(e)+"="+ja(tc(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function uc(a,b){if(E(a)){var d=a.replace(vg,"").trim();if(d){var c=b("Content-Type"),c=c&&0===c.indexOf(vd),e;(e=c)||(e=(e=d.match(wg))&&xg[e[0]].test(d));if(e)try{a=Rc(d)}catch(f){if(!c)return a;throw Kb("baddata",a,f);}}}return a}function wd(a){var b=S(),d;E(a)?r(a.split("\n"),function(a){d=a.indexOf(":");var e=L(Q(a.substr(0,d)));a= +Q(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):B(a)&&r(a,function(a,d){var f=L(d),g=Q(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function xd(a){var b;return function(d){b||(b=wd(a));return d?(d=b[L(d)],void 0===d&&(d=null),d):b}}function yd(a,b,d,c){if(C(c))return c(a,b,d);r(c,function(c){a=c(a,b,d)});return a}function Ff(){var a=this.defaults={transformResponse:[uc],transformRequest:[function(a){return B(a)&&"[object File]"!==ia.call(a)&&"[object Blob]"!==ia.call(a)&&"[object FormData]"!==ia.call(a)? +eb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ka(vc),put:ka(vc),patch:ka(vc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer",jsonpCallbackParam:"callback"},b=!1;this.useApplyAsync=function(a){return u(a)?(b=!!a,this):b};var d=this.interceptors=[];this.$get=["$browser","$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector","$sce",function(c,e,f,g,h,k,l,m){function p(b){function d(a,b){for(var c=0, +e=b.length;ca?b:k.reject(b)}if(!B(b))throw K("$http")("badreq",b);if(!E(m.valueOf(b.url)))throw K("$http")("badreq",b.url);var f=O({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer, +jsonpCallbackParam:a.jsonpCallbackParam},b);f.headers=function(b){var c=a.headers,d=O({},b.headers),g,f,h,c=O({},c.common,c[L(b.method)]);a:for(g in c){f=L(g);for(h in d)if(L(h)===f)continue a;d[g]=c[g]}return e(d,ka(b))}(b);f.method=ub(f.method);f.paramSerializer=E(f.paramSerializer)?l.get(f.paramSerializer):f.paramSerializer;c.$$incOutstandingRequestCount();var h=[],p=[];b=k.resolve(f);r(y,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&& +p.push(a.response,a.responseError)});b=d(b,h);b=b.then(function(b){var c=b.headers,d=yd(b.data,xd(c),void 0,b.transformRequest);x(d)&&r(c,function(a,b){"content-type"===L(b)&&delete c[b]});x(b.withCredentials)&&!x(a.withCredentials)&&(b.withCredentials=a.withCredentials);return n(b,d).then(g,g)});b=d(b,p);return b=b.finally(function(){c.$$completeOutstandingRequest(D)})}function n(c,d){function g(a){if(a){var c={};r(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d(): +h.$apply(d)}});return c}}function l(a,c,d,e,g){function f(){n(c,a,d,e,g)}M&&(200<=a&&300>a?M.put(N,[a,c,wd(d),e,g]):M.remove(N));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function n(a,b,d,e,g){b=-1<=b?b:0;(200<=b&&300>b?J.resolve:J.reject)({data:a,status:b,headers:xd(d),config:c,statusText:e,xhrStatus:g})}function G(a){n(a.data,a.status,ka(a.headers()),a.statusText,a.xhrStatus)}function y(){var a=p.pendingRequests.indexOf(c);-1!==a&&p.pendingRequests.splice(a,1)}var J=k.defer(),R=J.promise,M, +T,P=c.headers,q="jsonp"===L(c.method),N=c.url;q?N=m.getTrustedResourceUrl(N):E(N)||(N=m.valueOf(N));N=F(N,c.paramSerializer(c.params));q&&(N=s(N,c.jsonpCallbackParam));p.pendingRequests.push(c);R.then(y,y);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(M=B(c.cache)?c.cache:B(a.cache)?a.cache:v);M&&(T=M.get(N),u(T)?T&&C(T.then)?T.then(G,G):I(T)?n(T[1],T[0],ka(T[2]),T[3],T[4]):n(T,200,{},"OK","complete"):M.put(N,R));x(T)&&((T=zd(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]: +void 0)&&(P[c.xsrfHeaderName||a.xsrfHeaderName]=T),e(c.method,N,d,l,P,c.timeout,c.withCredentials,c.responseType,g(c.eventHandlers),g(c.uploadEventHandlers)));return R}function F(a,b){0=l&&(r.resolve(y),v(q.$$intervalId),delete g[q.$$intervalId]);t||a.$apply()},k);g[q.$$intervalId]=r;return q} +var g={};f.cancel=function(a){return a&&a.$$intervalId in g?(g[a.$$intervalId].promise.$$state.pur=!0,g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0):!1};return f}]}function wc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=fb(a[b].replace(/%2F/g,"/"));return a.join("/")}function Ad(a,b){var d=ta(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=Z(d.port)||zg[d.protocol]||null}function Bd(a,b,d){if(Ag.test(a))throw kb("badpath",a);var c="/"!== +a.charAt(0);c&&(a="/"+a);a=ta(a);for(var c=(c&&"/"===a.pathname.charAt(0)?a.pathname.substring(1):a.pathname).split("/"),e=c.length;e--;)c[e]=decodeURIComponent(c[e]),d&&(c[e]=c[e].replace(/\//g,"%2F"));d=c.join("/");b.$$path=d;b.$$search=ec(a.search);b.$$hash=decodeURIComponent(a.hash);b.$$path&&"/"!==b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function xc(a,b){return a.slice(0,b.length)===b}function ua(a,b){if(xc(b,a))return b.substr(a.length)}function La(a){var b=a.indexOf("#");return-1===b?a: +a.substr(0,b)}function lb(a){return a.replace(/(#.+)|#$/,"$1")}function yc(a,b,d){this.$$html5=!0;d=d||"";Ad(a,this);this.$$parse=function(a){var d=ua(b,a);if(!E(d))throw kb("ipthprfx",a,b);Bd(d,this,!0);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=fc(this.$$search),d=this.$$hash?"#"+fb(this.$$hash):"";this.$$url=wc(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1);this.$$urlUpdatedByLocation=!0};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)), +!0;var f,g;u(f=ua(a,c))?(g=f,g=d&&u(f=ua(d,f))?b+(ua("/",f)||f):a+g):u(f=ua(b,c))?g=b+f:b===c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function zc(a,b,d){Ad(a,this);this.$$parse=function(c){var e=ua(a,c)||ua(b,c),f;x(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",x(e)&&(a=c,this.replace())):(f=ua(d,e),x(f)&&(f=e));Bd(f,this,!1);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;xc(f,e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b=fc(this.$$search), +e=this.$$hash?"#"+fb(this.$$hash):"";this.$$url=wc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+(this.$$url?d+this.$$url:"");this.$$urlUpdatedByLocation=!0};this.$$parseLinkUrl=function(b,d){return La(a)===La(b)?(this.$$parse(b),!0):!1}}function Cd(a,b,d){this.$$html5=!0;zc.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a===La(c)?f=c:(g=ua(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$compose=function(){var b=fc(this.$$search), +e=this.$$hash?"#"+fb(this.$$hash):"";this.$$url=wc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+d+this.$$url;this.$$urlUpdatedByLocation=!0}}function Lb(a){return function(){return this[a]}}function Dd(a,b){return function(d){if(x(d))return this[a];this[a]=b(d);this.$$compose();return this}}function Lf(){var a="!",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return u(b)?(a=b,this):a};this.html5Mode=function(a){if(Na(a))return b.enabled=a,this;if(B(a)){Na(a.enabled)&&(b.enabled= +a.enabled);Na(a.requireBase)&&(b.requireBase=a.requireBase);if(Na(a.rewriteLinks)||E(a.rewriteLinks))b.rewriteLinks=a.rewriteLinks;return this}return b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,e,f,g){function h(a,b,d){var e=l.url(),g=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(f){throw l.url(e),l.$$state=g,f;}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();var p=c.url(),n;if(b.enabled){if(!m&& +b.requireBase)throw kb("nobase");n=p.substring(0,p.indexOf("/",p.indexOf("//")+2))+(m||"/");m=e.history?yc:Cd}else n=La(p),m=zc;var F=n.substr(0,La(n).lastIndexOf("/")+1);l=new m(n,F,"#"+a);l.$$parseLinkUrl(p,p);l.$$state=c.state();var s=/^\s*(javascript|mailto):/i;f.on("click",function(a){var e=b.rewriteLinks;if(e&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!==a.which&&2!==a.button){for(var h=z(a.target);"a"!==ya(h[0]);)if(h[0]===f[0]||!(h=h.parent())[0])return;if(!E(e)||!x(h.attr(e))){var e=h.prop("href"), +k=h.attr("href")||h.attr("xlink:href");B(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=ta(e.animVal).href);s.test(e)||!e||h.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(e,k)||(a.preventDefault(),l.absUrl()!==c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=!0))}}});lb(l.absUrl())!==lb(p)&&c.url(l.absUrl(),!0);var v=!0;c.onUrlChange(function(a,b){xc(a,F)?(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,g;a=lb(a);l.$$parse(a);l.$$state=b;g=d.$broadcast("$locationChangeStart", +a,c,b,e).defaultPrevented;l.absUrl()===a&&(g?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(v=!1,k(c,e)))}),d.$$phase||d.$digest()):g.location.href=a});d.$watch(function(){if(v||l.$$urlUpdatedByLocation){l.$$urlUpdatedByLocation=!1;var a=lb(c.url()),b=lb(l.absUrl()),g=c.state(),f=l.$$replace,m=a!==b||l.$$html5&&e.history&&g!==l.$$state;if(v||m)v=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,g).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=g): +(m&&h(b,f,g===l.$$state?null:l.$$state),k(a,g)))})}l.$$replace=!1});return l}]}function Mf(){var a=!0,b=this;this.debugEnabled=function(b){return u(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){bc(a)&&(a.stack&&f?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||D;return function(){var a=[];r(arguments,function(b){a.push(c(b))});return Function.prototype.apply.call(e, +b,a)}}var f=Ca||/\bEdge\//.test(d.navigator&&d.navigator.userAgent);return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Bg(a){return a+""}function Cg(a,b){return"undefined"!==typeof a?a:b}function Ed(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function Dg(a,b){switch(a.type){case q.MemberExpression:if(a.computed)return!1;break;case q.UnaryExpression:return 1;case q.BinaryExpression:return"+"!== +a.operator?1:!1;case q.CallExpression:return!1}return void 0===b?Fd:b}function W(a,b,d){var c,e,f=a.isPure=Dg(a,d);switch(a.type){case q.Program:c=!0;r(a.body,function(a){W(a.expression,b,f);c=c&&a.expression.constant});a.constant=c;break;case q.Literal:a.constant=!0;a.toWatch=[];break;case q.UnaryExpression:W(a.argument,b,f);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;break;case q.BinaryExpression:W(a.left,b,f);W(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch= +a.left.toWatch.concat(a.right.toWatch);break;case q.LogicalExpression:W(a.left,b,f);W(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case q.ConditionalExpression:W(a.test,b,f);W(a.alternate,b,f);W(a.consequent,b,f);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case q.Identifier:a.constant=!1;a.toWatch=[a];break;case q.MemberExpression:W(a.object,b,f);a.computed&&W(a.property,b,f);a.constant=a.object.constant&& +(!a.computed||a.property.constant);a.toWatch=a.constant?[]:[a];break;case q.CallExpression:c=d=a.filter?!b(a.callee.name).$stateful:!1;e=[];r(a.arguments,function(a){W(a,b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c;a.toWatch=d?e:[a];break;case q.AssignmentExpression:W(a.left,b,f);W(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];break;case q.ArrayExpression:c=!0;e=[];r(a.elements,function(a){W(a,b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c; +a.toWatch=e;break;case q.ObjectExpression:c=!0;e=[];r(a.properties,function(a){W(a.value,b,f);c=c&&a.value.constant;e.push.apply(e,a.value.toWatch);a.computed&&(W(a.key,b,!1),c=c&&a.key.constant,e.push.apply(e,a.key.toWatch))});a.constant=c;a.toWatch=e;break;case q.ThisExpression:a.constant=!1;a.toWatch=[];break;case q.LocalsExpression:a.constant=!1,a.toWatch=[]}}function Gd(a){if(1===a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function Hd(a){return a.type=== +q.Identifier||a.type===q.MemberExpression}function Id(a){if(1===a.body.length&&Hd(a.body[0].expression))return{type:q.AssignmentExpression,left:a.body[0].expression,right:{type:q.NGValueParameter},operator:"="}}function Jd(a){this.$filter=a}function Kd(a){this.$filter=a}function Mb(a,b,d){this.ast=new q(a,d);this.astCompiler=d.csp?new Kd(b):new Jd(b)}function Ac(a){return C(a.valueOf)?a.valueOf():Eg.call(a)}function Nf(){var a=S(),b={"true":!0,"false":!1,"null":null,undefined:void 0},d,c;this.addLiteral= +function(a,c){b[a]=c};this.setIdentifierFns=function(a,b){d=a;c=b;return this};this.$get=["$filter",function(e){function f(b,c){var d,g;switch(typeof b){case "string":return g=b=b.trim(),d=a[g],d||(d=new Nb(n),d=(new Mb(d,e,n)).parse(b),d.constant?d.$$watchDelegate=m:d.oneTime?d.$$watchDelegate=d.literal?l:k:d.inputs&&(d.$$watchDelegate=h),a[g]=d),p(d,c);case "function":return p(b,c);default:return p(D,c)}}function g(a,b,c){return null==a||null==b?a===b:"object"!==typeof a||(a=Ac(a),"object"!==typeof a|| +c)?a===b||a!==a&&b!==b:!1}function h(a,b,c,d,e){var f=d.inputs,h;if(1===f.length){var k=g,f=f[0];return a.$watch(function(a){var b=f(a);g(b,k,f.isPure)||(h=d(a,void 0,void 0,[b]),k=b&&Ac(b));return h},b,c,e)}for(var l=[],m=[],p=0,n=f.length;p=c.$$state.status&&e&&e.length&&a(function(){for(var a,c,g=0,f=e.length;ga)for(b in l++,f)ra.call(e,b)||(t--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1F&&(y=4-F,A[y]||(A[y]=[]),A[y].push({msg:C(a.exp)?"fn: "+(a.exp.name||a.exp.toString()): +a.exp,newVal:g,oldVal:k}));else if(a===c){r=!1;break a}}catch(D){f(D)}if(!(n=q.$$watchersCount&&q.$$childHead||q!==this&&q.$$nextSibling))for(;q!==this&&!(n=q.$$nextSibling);)q=q.$parent}while(q=n);if((r||u.length)&&!F--)throw t.$$phase=null,d("infdig",b,A);}while(r||u.length);for(t.$$phase=null;HCa)throw va("iequirks");var c=ka(oa);c.isEnabled=function(){return a};c.trustAs= +d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=ab);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;r(oa,function(a,b){var d=L(b);c[("parse_as_"+d).replace(Bc,wb)]=function(b){return e(a,b)};c[("get_trusted_"+d).replace(Bc,wb)]=function(b){return f(a,b)};c[("trust_as_"+d).replace(Bc,wb)]=function(b){return g(a,b)}});return c}]} +function Tf(){this.$get=["$window","$document",function(a,b){var d={},c=!((!a.nw||!a.nw.process)&&a.chrome&&(a.chrome.app&&a.chrome.app.runtime||!a.chrome.app&&a.chrome.runtime&&a.chrome.runtime.id))&&a.history&&a.history.pushState,e=Z((/android (\d+)/.exec(L((a.navigator||{}).userAgent))||[])[1]),f=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},h=g.body&&g.body.style,k=!1,l=!1;h&&(k=!!("transition"in h||"webkitTransition"in h),l=!!("animation"in h||"webkitAnimation"in h));return{history:!(!c|| +4>e||f),hasEvent:function(a){if("input"===a&&Ca)return!1;if(x(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ja(),transitions:k,animations:l,android:e}}]}function Vf(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$exceptionHandler","$templateCache","$http","$q","$sce",function(b,d,c,e,f){function g(h,k){g.totalPendingRequests++;if(!E(h)||x(d.get(h)))h=f.getTrustedResourceUrl(h);var l=c.defaults&&c.defaults.transformResponse;I(l)?l=l.filter(function(a){return a!== +uc}):l===uc&&(l=null);return c.get(h,O({cache:d,transformResponse:l},a)).finally(function(){g.totalPendingRequests--}).then(function(a){d.put(h,a.data);return a.data},function(a){k||(a=Gg("tpload",h,a.status,a.statusText),b(a));return e.reject(a)})}g.totalPendingRequests=0;return g}]}function Wf(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];r(a,function(a){var c=$.element(a).data("$binding");c&& +r(c,function(c){d?(new RegExp("(^|\\s)"+Md(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!==c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],h=0;hc&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)===Dc;e++);if(e===(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)===Dc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Wd&&(d=d.splice(0,Wd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function Og(a,b,d,c){var e=a.d,f=e.length-a.i;b=x(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0d-1){for(c=0;c>d;c--)e.unshift(0),a.i++;e.unshift(1);a.i++}else e[d-1]++;for(;fh;)k.unshift(0),h++;0=b.lgSize&&h.unshift(k.splice(-b.lgSize,k.length).join(""));k.length>b.gSize;)h.unshift(k.splice(-b.gSize,k.length).join(""));k.length&&h.unshift(k.join(""));k=h.join(d);f.length&&(k+=c+f.join(""));e&&(k+="e+"+e)}return 0>a&&!g?b.negPre+k+b.negSuf:b.posPre+k+b.posSuf}function Ob(a,b,d,c){var e="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,e="-");for(a=""+a;a.length< +b;)a=Dc+a;d&&(a=a.substr(a.length-b));return e+a}function ea(a,b,d,c,e){d=d||0;return function(f){f=f["get"+a]();if(0-d)f+=d;0===f&&-12===d&&(f=12);return Ob(f,b,c,e)}}function mb(a,b,d){return function(c,e){var f=c["get"+a](),g=ub((d?"STANDALONE":"")+(b?"SHORT":"")+a);return e[g][f]}}function Xd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Yd(a){return function(b){var d=Xd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))- ++d;b=1+Math.round(b/6048E5);return Ob(b,a)}}function Ec(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function Rd(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=Z(b[9]+b[10]),g=Z(b[9]+b[11]));h.call(a,Z(b[1]),Z(b[2])-1,Z(b[3]));f=Z(b[4]||0)-f;g=Z(b[5]||0)-g;h=Z(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));k.call(a,f,g,h,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; +return function(c,d,f){var g="",h=[],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;E(c)&&(c=Pg.test(c)?Z(c):b(c));Y(c)&&(c=new Date(c));if(!fa(c)||!isFinite(c.getTime()))return c;for(;d;)(l=Qg.exec(d))?(h=db(h,l,1),d=h.pop()):(h.push(d),d=null);var m=c.getTimezoneOffset();f&&(m=Sc(f,m),c=dc(c,f,!0));r(h,function(b){k=Rg[b];g+=k?k(c,a.DATETIME_FORMATS,m):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function Ig(){return function(a,b){x(b)&&(b=2);return eb(a,b)}}function Jg(){return function(a, +b,d){b=Infinity===Math.abs(Number(b))?Number(b):Z(b);if(U(b))return a;Y(a)&&(a=a.toString());if(!wa(a))return a;d=!d||isNaN(d)?0:Z(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?Fc(a,d,d+b):0===d?Fc(a,b,a.length):Fc(a,Math.max(0,d+b),d)}}function Fc(a,b,d){return E(a)?a.slice(b,d):xa.call(a,b,d)}function Td(a){function b(b){return b.map(function(b){var c=1,d=ab;if(C(b))d=b;else if(E(b)){if("+"===b.charAt(0)||"-"===b.charAt(0))c="-"===b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(d=a(b),d.constant))var e= +d(),d=function(a){return a[e]}}return{get:d,descending:c}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}function c(a,b){var c=0,d=a.type,k=b.type;if(d===k){var k=a.value,l=b.value;"string"===d?(k=k.toLowerCase(),l=l.toLowerCase()):"object"===d&&(B(k)&&(k=a.index),B(l)&&(l=b.index));k!==l&&(c=kb||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut",m)}b.on("change",l);if(ce[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!k){var b=this.validity,c=b.badInput,d=b.typeMismatch;k=f.defer(function(){k=null;b.badInput===c&&b.typeMismatch=== +d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Rb(a,b){return function(d,c){var e,f;if(fa(d))return d;if(E(d)){'"'===d.charAt(0)&&'"'===d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(Sg.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0, +ss:0,sss:0},r(e,function(a,c){c=q};g.$observe("min",function(a){q=n(a);h.$validate()})}if(u(g.max)||g.ngMax){var y;h.$validators.max=function(a){return!p(a)||x(y)||d(a)<=y};g.$observe("max",function(a){y=n(a);h.$validate()})}}}function Hc(a,b,d,c){(c.$$hasNativeValidators=B(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{}; +return c.badInput||c.typeMismatch?void 0:a})}function de(a){a.$$parserName="number";a.$parsers.push(function(b){if(a.$isEmpty(b))return null;if(Tg.test(b))return parseFloat(b)});a.$formatters.push(function(b){if(!a.$isEmpty(b)){if(!Y(b))throw pb("numfmt",b);b=b.toString()}return b})}function Wa(a){u(a)&&!Y(a)&&(a=parseFloat(a));return U(a)?void 0:a}function Ic(a){var b=a.toString(),d=b.indexOf(".");return-1===d?-1a&&(a=/e-(\d+)$/.exec(b))?Number(a[1]):0:b.length-d-1}function ee(a,b,d){a=Number(a); +var c=(a|0)!==a,e=(b|0)!==b,f=(d|0)!==d;if(c||e||f){var g=c?Ic(a):0,h=e?Ic(b):0,k=f?Ic(d):0,g=Math.max(g,h,k),g=Math.pow(10,g);a*=g;b*=g;d*=g;c&&(a=Math.round(a));e&&(b=Math.round(b));f&&(d=Math.round(d))}return 0===(a-b)%d}function fe(a,b,d,c,e){if(u(c)){a=a(c);if(!a.constant)throw pb("constexpr",d,c);return a(b)}return e}function Jc(a,b){function d(a,b){if(!a||!a.length)return[];if(!b||!b.length)return a;var c=[],d=0;a:for(;d(?:<\/\1>|)$/,kc=/<|&#?\w+;/,dg=/<([\w:-]+)/,eg=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,aa={option:[1,'"],thead:[1,"","
        "],col:[2,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],_default:[0,"",""]};aa.optgroup=aa.option;aa.tbody=aa.tfoot=aa.colgroup=aa.caption=aa.thead;aa.th=aa.td;var lg=w.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Sa=V.prototype={ready:gd,toString:function(){var a=[];r(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"}, +eq:function(a){return 0<=a?z(this[a]):z(this[this.length+a])},length:0,push:Wg,sort:[].sort,splice:[].splice},Gb={};r("multiple selected checked disabled readOnly required open".split(" "),function(a){Gb[L(a)]=a});var ld={};r("input select option textarea button form details".split(" "),function(a){ld[a]=!0});var sd={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern",ngStep:"step"};r({data:pc,removeData:oc,hasData:function(a){for(var b in ib[a.ng339])return!0; +return!1},cleanData:function(a){for(var b=0,d=a.length;b/,og=/^[^(]*\(\s*([^)]*)\)/m, +Zg=/,/,$g=/^\s*(_?)(\S+?)\1\s*$/,mg=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ba=K("$injector");gb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw E(d)&&d||(d=a.name||pg(a)),Ba("strictdi",d);b=nd(a);r(b[1].split(Zg),function(a){a.replace($g,function(a,b,d){c.push(d)})})}a.$inject=c}}else I(a)?(b=a.length-1,sb(a[b],"fn"),c=a.slice(0,b)):sb(a,"fn",!0);return c};var he=K("$animate"),sf=function(){this.$get=D},tf=function(){var a=new Hb,b=[];this.$get= +["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=E(b)?b.split(" "):I(b)?b:[],r(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){r(b,function(b){var c=a.get(b);if(c){var d=qg(b.attr("class")),e="",f="";r(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});r(b,function(a){e&&Db(a,e);f&&Cb(a,f)});a.delete(b)}});b.length=0}return{enabled:D,on:D,off:D,pin:D,push:function(g,h,k,l){l&&l();k=k||{};k.from&&g.css(k.from);k.to&&g.css(k.to);if(k.addClass|| +k.removeClass)if(h=k.addClass,l=k.removeClass,k=a.get(g)||{},h=e(k,h,!0),l=e(k,l,!1),h||l)a.set(g,k),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},qf=["$provide",function(a){var b=this,d=null,c=null;this.$$registeredAnimations=Object.create(null);this.register=function(c,d){if(c&&"."!==c.charAt(0))throw he("notcsel",c);var g=c+"-animation";b.$$registeredAnimations[c.substr(1)]=g;a.factory(g,d)};this.customFilter=function(a){1===arguments.length&&(c=C(a)?a:null);return c}; +this.classNameFilter=function(a){if(1===arguments.length&&(d=a instanceof RegExp?a:null)&&/[(\s|\/)]ng-animate[(\s|\/)]/.test(d.toString()))throw d=null,he("nongcls","ng-animate");return d};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var e;a:{for(e=0;e <= >= && || ! = |".split(" "),function(a){Ub[a]=!0});var ch={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Nb=function(a){this.options=a};Nb.prototype={constructor:Nb,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue? +this.options.isIdentifierContinue(a,this.codePointAt(a)):this.isValidIdentifierContinue(a)},isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a,b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d=a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"=== +a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=u(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw Xa("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index","<=",">=");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a}, +unary:function(){var a;return(a=this.expect("+","-","!"))?{type:q.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=pa(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:q.Literal,value:this.options.literals[this.consume().text]}: +this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:q.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:q.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:q.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE"); +return a},filter:function(a){a=[a];for(var b={type:q.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression());return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.filterChain());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:q.Identifier,name:a.text}},constant:function(){return{type:q.Literal,value:this.consume().value}}, +arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");return{type:q.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:q.Property,kind:"init"};this.peek().constant?(b.key=this.constant(),b.computed=!1,this.consume(":"),b.value=this.expression()):this.peek().identifier?(b.key=this.identifier(),b.computed=!1,this.peek(":")? +(this.consume(":"),b.value=this.expression()):b.value=b.key):this.peek("[")?(this.consume("["),b.key=this.expression(),this.consume("]"),b.computed=!0,this.consume(":"),b.value=this.expression()):this.throwError("invalid key",this.peek());a.push(b)}while(this.expect(","))}this.consume("}");return{type:q.ObjectExpression,properties:a}},throwError:function(a,b){throw Xa("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw Xa("ueoe", +this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw Xa("ueoe",this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},selfReferential:{"this":{type:q.ThisExpression}, +$locals:{type:q.LocalsExpression}}};var Fd=2;Jd.prototype={compile:function(a){var b=this;this.state={nextId:0,filters:{},fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};W(a,b.$filter);var d="",c;this.stage="assign";if(c=Id(a))this.state.computing="assign",d=this.nextId(),this.recurse(c,d),this.return_(d),d="fn.assign="+this.generateFunction("assign","s,v,l");c=Gd(a.body);b.stage="inputs";r(c,function(a,c){var d="fn"+c;b.state[d]={vars:[],body:[],own:{}};b.state.computing=d; +var h=b.nextId();b.recurse(a,h);b.return_(h);b.state.inputs.push({name:d,isPure:a.isPure});a.watchId=c});this.state.computing="fn";this.stage="main";this.recurse(a);a='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+d+this.watchFns()+"return fn;";a=(new Function("$filter","getStringValue","ifDefined","plus",a))(this.$filter,Bg,Cg,Ed);this.state=this.stage=void 0;return a},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs, +d=this;r(b,function(b){a.push("var "+b.name+"="+d.generateFunction(b.name,"s"));b.isPure&&a.push(b.name,".isPure="+JSON.stringify(b.isPure)+";")});b.length&&a.push("fn.inputs=["+b.map(function(a){return a.name}).join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;r(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length? +"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,d,c,e,f){var g,h,k=this,l,m,p;c=c||D;if(!f&&u(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case q.Program:r(a.body,function(b,c){k.recurse(b.expression,void 0,void 0,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case q.Literal:m=this.escape(a.value); +this.assign(b,m);c(b||m);break;case q.UnaryExpression:this.recurse(a.argument,void 0,void 0,function(a){h=a});m=a.operator+"("+this.ifDefined(h,0)+")";this.assign(b,m);c(m);break;case q.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){h=a});m="+"===a.operator?this.plus(g,h):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(h,0):"("+g+")"+a.operator+"("+h+")";this.assign(b,m);c(m);break;case q.LogicalExpression:b=b||this.nextId(); +k.recurse(a.left,b);k.if_("&&"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case q.ConditionalExpression:b=b||this.nextId();k.recurse(a.test,b);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case q.Identifier:b=b||this.nextId();d&&(d.context="inputs"===k.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"=== +k.stage||"s",function(){e&&1!==e&&k.if_(k.isNull(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(b,k.nonComputedMember("s",a.name))})},b&&k.lazyAssign(b,k.nonComputedMember("l",a.name)));c(b);break;case q.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();k.recurse(a.object,g,void 0,function(){k.if_(k.notNull(g),function(){a.computed?(h=k.nextId(),k.recurse(a.property,h),k.getStringValue(h),e&&1!==e&&k.if_(k.not(k.computedMember(g, +h)),k.lazyAssign(k.computedMember(g,h),"{}")),m=k.computedMember(g,h),k.assign(b,m),d&&(d.computed=!0,d.name=h)):(e&&1!==e&&k.if_(k.isNull(k.nonComputedMember(g,a.property.name)),k.lazyAssign(k.nonComputedMember(g,a.property.name),"{}")),m=k.nonComputedMember(g,a.property.name),k.assign(b,m),d&&(d.computed=!1,d.name=a.property.name))},function(){k.assign(b,"undefined")});c(b)},!!e);break;case q.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],r(a.arguments,function(a){var b= +k.nextId();k.recurse(a,b);l.push(b)}),m=h+"("+l.join(",")+")",k.assign(b,m),c(b)):(h=k.nextId(),g={},l=[],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){r(a.arguments,function(b){k.recurse(b,a.constant?void 0:k.nextId(),void 0,function(a){l.push(a)})});m=g.name?k.member(g.context,g.name,g.computed)+"("+l.join(",")+")":h+"("+l.join(",")+")";k.assign(b,m)},function(){k.assign(b,"undefined")});c(b)}));break;case q.AssignmentExpression:h=this.nextId();g={};this.recurse(a.left,void 0, +g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);m=k.member(g.context,g.name,g.computed)+a.operator+h;k.assign(b,m);c(b||m)})},1);break;case q.ArrayExpression:l=[];r(a.elements,function(b){k.recurse(b,a.constant?void 0:k.nextId(),void 0,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(b||m);break;case q.ObjectExpression:l=[];p=!1;r(a.properties,function(a){a.computed&&(p=!0)});p?(b=b||this.nextId(),this.assign(b,"{}"),r(a.properties,function(a){a.computed? +(g=k.nextId(),k.recurse(a.key,g)):g=a.key.type===q.Identifier?a.key.name:""+a.key.value;h=k.nextId();k.recurse(a.value,h);k.assign(k.member(b,g,a.computed),h)})):(r(a.properties,function(b){k.recurse(b.value,a.constant?void 0:k.nextId(),void 0,function(a){l.push(k.escape(b.key.type===q.Identifier?b.key.name:""+b.key.value)+":"+a)})}),m="{"+l.join(",")+"}",this.assign(b,m));c(b||m);break;case q.ThisExpression:this.assign(b,"s");c(b||"s");break;case q.LocalsExpression:this.assign(b,"l");c(b||"l");break; +case q.NGValueParameter:this.assign(b,"v"),c(b||"v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a, +b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},isNull:function(a){return a+"==null"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a, +b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},lazyRecurse:function(a,b,d,c,e,f){var g=this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(E(a))return"'"+a.replace(this.stringEscapeRegex, +this.stringEscapeFn)+"'";if(Y(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw Xa("esc");},nextId:function(a,b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};Kd.prototype={compile:function(a){var b=this;W(a,b.$filter);var d,c;if(d=Id(a))c=this.recurse(d);d=Gd(a.body);var e;d&&(e=[],r(d,function(a,c){var d= +b.recurse(a);d.isPure=a.isPure;a.input=d;e.push(d);a.watchId=c}));var f=[];r(a.body,function(a){f.push(b.recurse(a.expression))});a=0===a.body.length?D:1===a.body.length?f[0]:function(a,b){var c;r(f,function(d){c=d(a,b)});return c};c&&(a.assign=function(a,b,d){return c(a,d,b)});e&&(a.inputs=e);return a},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case q.Literal:return this.value(a.value,b);case q.UnaryExpression:return e=this.recurse(a.argument), +this["unary"+a.operator](e,b);case q.BinaryExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case q.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case q.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case q.Identifier:return f.identifier(a.name,b,d);case q.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed|| +(e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,e,b,d):this.nonComputedMember(c,e,b,d);case q.CallExpression:return g=[],r(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var p=[],n=0;n":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f, +g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,h){e=a(e,f,g,h)?b(e,f,g,h):d(e,f,g,h);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:void 0, +name:void 0,value:a}:a}},identifier:function(a,b,d){return function(c,e,f,g){c=e&&a in e?e:c;d&&1!==d&&c&&null==c[a]&&(c[a]={});e=c?c[a]:void 0;return b?{context:c,name:a,value:e}:e}},computedMember:function(a,b,d,c){return function(e,f,g,h){var k=a(e,f,g,h),l,m;null!=k&&(l=b(e,f,g,h),l+="",c&&1!==c&&k&&!k[l]&&(k[l]={}),m=k[l]);return d?{context:k,name:l,value:m}:m}},nonComputedMember:function(a,b,d,c){return function(e,f,g,h){e=a(e,f,g,h);c&&1!==c&&e&&null==e[b]&&(e[b]={});f=null!=e?e[b]:void 0; +return d?{context:e,name:b,value:f}:f}},inputs:function(a,b){return function(d,c,e,f){return f?f[b]:a(d,c,e)}}};Mb.prototype={constructor:Mb,parse:function(a){a=this.getAst(a);var b=this.astCompiler.compile(a.ast),d=a.ast;b.literal=0===d.body.length||1===d.body.length&&(d.body[0].expression.type===q.Literal||d.body[0].expression.type===q.ArrayExpression||d.body[0].expression.type===q.ObjectExpression);b.constant=a.ast.constant;b.oneTime=a.oneTime;return b},getAst:function(a){var b=!1;a=a.trim();":"=== +a.charAt(0)&&":"===a.charAt(1)&&(b=!0,a=a.substring(2));return{ast:this.ast.ast(a),oneTime:b}}};var va=K("$sce"),oa={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},Bc=/_([a-z])/g,Gg=K("$compile"),X=w.document.createElement("a"),Od=ta(w.location.href);Pd.$inject=["$document"];ed.$inject=["$provide"];var Wd=22,Vd=".",Dc="0";Qd.$inject=["$locale"];Sd.$inject=["$locale"];var Rg={yyyy:ea("FullYear",4,0,!1,!0),yy:ea("FullYear",2,0,!0,!0),y:ea("FullYear",1,0,!1,!0),MMMM:mb("Month"), +MMM:mb("Month",!0),MM:ea("Month",2,1),M:ea("Month",1,1),LLLL:mb("Month",!1,!0),dd:ea("Date",2),d:ea("Date",1),HH:ea("Hours",2),H:ea("Hours",1),hh:ea("Hours",2,-12),h:ea("Hours",1,-12),mm:ea("Minutes",2),m:ea("Minutes",1),ss:ea("Seconds",2),s:ea("Seconds",1),sss:ea("Milliseconds",3),EEEE:mb("Day"),EEE:mb("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Ob(Math[0=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},Qg=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\s\S]*)/,Pg=/^-?\d+$/;Rd.$inject=["$locale"];var Kg=la(L),Lg=la(ub);Td.$inject=["$parse"];var He=la({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===ia.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(e)|| +a.preventDefault()})}}}}),vb={};r(Gb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!==a){var c=Ea("ng-"+b),e=d;"checked"===a&&(e=function(a,b,e){e.ngModel!==e[c]&&d(a,b,e)});vb[c]=function(){return{restrict:"A",priority:100,link:e}}}});r(sd,function(a,b){vb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"===e.ngPattern.charAt(0)&&(c=e.ngPattern.match(Vg))){e.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(e[b],function(a){e.$set(b, +a)})}}}});r(["src","srcset","href"],function(a){var b=Ea("ng-"+a);vb[b]=function(){return{priority:99,link:function(d,c,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===ia.call(c.prop("href"))&&(g="xlinkHref",e.$attr[g]="xlink:href",f=null);e.$observe(b,function(b){b?(e.$set(g,b),Ca&&f&&c.prop(f,e[g])):"href"===a&&e.$set(g,null)})}}}});var Qb={$addControl:D,$$renameControl:function(a,b){a.$name=b},$removeControl:D,$setValidity:D,$setDirty:D,$setPristine:D,$setSubmitted:D};Pb.$inject=["$element", +"$attrs","$scope","$animate","$interpolate"];Pb.prototype={$rollbackViewValue:function(){r(this.$$controls,function(a){a.$rollbackViewValue()})},$commitViewValue:function(){r(this.$$controls,function(a){a.$commitViewValue()})},$addControl:function(a){Ia(a.$name,"input");this.$$controls.push(a);a.$name&&(this[a.$name]=a);a.$$parentForm=this},$$renameControl:function(a,b){var d=a.$name;this[d]===a&&delete this[d];this[b]=a;a.$name=b},$removeControl:function(a){a.$name&&this[a.$name]===a&&delete this[a.$name]; +r(this.$pending,function(b,d){this.$setValidity(d,null,a)},this);r(this.$error,function(b,d){this.$setValidity(d,null,a)},this);r(this.$$success,function(b,d){this.$setValidity(d,null,a)},this);cb(this.$$controls,a);a.$$parentForm=Qb},$setDirty:function(){this.$$animate.removeClass(this.$$element,Ya);this.$$animate.addClass(this.$$element,Vb);this.$dirty=!0;this.$pristine=!1;this.$$parentForm.$setDirty()},$setPristine:function(){this.$$animate.setClass(this.$$element,Ya,Vb+" ng-submitted");this.$dirty= +!1;this.$pristine=!0;this.$submitted=!1;r(this.$$controls,function(a){a.$setPristine()})},$setUntouched:function(){r(this.$$controls,function(a){a.$setUntouched()})},$setSubmitted:function(){this.$$animate.addClass(this.$$element,"ng-submitted");this.$submitted=!0;this.$$parentForm.$setSubmitted()}};ae({clazz:Pb,set:function(a,b,d){var c=a[b];c?-1===c.indexOf(d)&&c.push(d):a[b]=[d]},unset:function(a,b,d){var c=a[b];c&&(cb(c,d),0===c.length&&delete a[b])}});var ie=function(a){return["$timeout","$parse", +function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||D}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Pb,compile:function(d,f){d.addClass(Ya).addClass(nb);var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var p=f[0];if(!("action"in e)){var n=function(b){a.$apply(function(){p.$commitViewValue();p.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",n);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit", +n)},0,!1)})}(f[1]||p.$$parentForm).$addControl(p);var r=g?c(p.$name):D;g&&(r(a,p),e.$observe(g,function(b){p.$name!==b&&(r(a,void 0),p.$$parentForm.$$renameControl(p,b),r=c(p.$name),r(a,p))}));d.on("$destroy",function(){p.$$parentForm.$removeControl(p);r(a,void 0);O(p,Qb)})}}}}}]},Ie=ie(),Ue=ie(!0),Sg=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,dh=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i, +eh=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Tg=/^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,je=/^(\d{4,})-(\d{2})-(\d{2})$/,ke=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Lc=/^(\d{4,})-W(\d\d)$/,le=/^(\d{4,})-(\d\d)$/,me=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,ce=S();r(["date","datetime-local","month","time","week"],function(a){ce[a]= +!0});var ne={text:function(a,b,d,c,e,f){Va(a,b,d,c,e,f);Gc(c)},date:ob("date",je,Rb(je,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":ob("datetimelocal",ke,Rb(ke,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:ob("time",me,Rb(me,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:ob("week",Lc,function(a,b){if(fa(a))return a;if(E(a)){Lc.lastIndex=0;var d=Lc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,h=0,k=Xd(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds()); +return new Date(c,0,k.getDate()+e,d,f,g,h)}}return NaN},"yyyy-Www"),month:ob("month",le,Rb(le,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f){Hc(a,b,d,c);de(c);Va(a,b,d,c,e,f);var g,h;if(u(d.min)||d.ngMin)c.$validators.min=function(a){return c.$isEmpty(a)||x(g)||a>=g},d.$observe("min",function(a){g=Wa(a);c.$validate()});if(u(d.max)||d.ngMax)c.$validators.max=function(a){return c.$isEmpty(a)||x(h)||a<=h},d.$observe("max",function(a){h=Wa(a);c.$validate()});if(u(d.step)||d.ngStep){var k;c.$validators.step= +function(a,b){return c.$isEmpty(b)||x(k)||ee(b,g||0,k)};d.$observe("step",function(a){k=Wa(a);c.$validate()})}},url:function(a,b,d,c,e,f){Va(a,b,d,c,e,f);Gc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||dh.test(d)}},email:function(a,b,d,c,e,f){Va(a,b,d,c,e,f);Gc(c);c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||eh.test(d)}},radio:function(a,b,d,c){var e=!d.ngTrim||"false"!==Q(d.ngTrim);x(d.name)&&b.attr("name",++qb); +b.on("click",function(a){var g;b[0].checked&&(g=d.value,e&&(g=Q(g)),c.$setViewValue(g,a&&a.type))});c.$render=function(){var a=d.value;e&&(a=Q(a));b[0].checked=a===c.$viewValue};d.$observe("value",c.$render)},range:function(a,b,d,c,e,f){function g(a,c){b.attr(a,d[a]);d.$observe(a,c)}function h(a){p=Wa(a);U(c.$modelValue)||(m?(a=b.val(),p>a&&(a=p,b.val(a)),c.$setViewValue(a)):c.$validate())}function k(a){n=Wa(a);U(c.$modelValue)||(m?(a=b.val(),n=p},g("min",h));e&& +(c.$validators.max=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||x(n)||b<=n},g("max",k));f&&(c.$validators.step=m?function(){return!q.stepMismatch}:function(a,b){return c.$isEmpty(b)||x(r)||ee(b,p||0,r)},g("step",l))},checkbox:function(a,b,d,c,e,f,g,h){var k=fe(h,a,"ngTrueValue",d.ngTrueValue,!0),l=fe(h,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=function(a){return!1=== +a};c.$formatters.push(function(a){return sa(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:D,button:D,submit:D,reset:D,file:D},Zc=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,h){h[0]&&(ne[L(g.type)]||ne.text)(e,f,g,h[0],b,a,d,c)}}}}],fh=/^(true|false|\d+)$/,mf=function(){function a(a,d,c){var e=u(c)?c:9===Ca?"":null;a.prop("value",e);d.$set("value",c)}return{restrict:"A",priority:100,compile:function(b,d){return fh.test(d.ngValue)? +function(b,d,f){b=b.$eval(f.ngValue);a(d,f,b)}:function(b,d,f){b.$watch(f.ngValue,function(b){a(d,f,b)})}}}},Me=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=gc(a)})}}}}],Oe=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions); +d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=x(a)?"":a})}}}}],Ne=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=b(e.ngBindHtml,function(b){return a.valueOf(b)});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){var d=f(b);c.html(a.getTrustedHtml(d)||"")})}}}}],lf=la({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}), +Pe=Jc("",!0),Re=Jc("Odd",0),Qe=Jc("Even",1),Se=Qa({compile:function(a,b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),Te=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],dd={},gh={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=Ea("ng-"+a);dd[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(e,f){var g= +d(f[b]);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};gh[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var We=["$animate","$compile",function(a,b){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,e,f,g){var h,k,l;d.$watch(e.ngIf,function(d){d?k||g(function(d,f){k=f;d[d.length++]=b.$$createComment("end ngIf",e.ngIf);h={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l= +tb(h.clone),a.leave(l).done(function(a){!1!==a&&(l=null)}),h=null))})}}}],Xe=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:$.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",h=e.autoscroll;return function(c,e,m,p,n){var r=0,q,v,y,t=function(){v&&(v.remove(),v=null);q&&(q.$destroy(),q=null);y&&(d.leave(y).done(function(a){!1!==a&&(v=null)}),v=y,y=null)};c.$watch(f,function(f){var m=function(a){!1=== +a||!u(h)||h&&!c.$eval(h)||b()},v=++r;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&v===r){var b=c.$new();p.template=a;a=n(b,function(a){t();d.enter(a,null,e).done(m)});q=b;y=a;q.$emit("$includeContentLoaded",f);c.$eval(g)}},function(){c.$$destroyed||v!==r||(t(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(t(),p.template=null)})}}}}],of=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){ia.call(d[0]).match(/SVG/)? +(d.empty(),a(fd(e.template,w.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],Ye=Qa({priority:450,compile:function(){return{pre:function(a,b,d){a.$eval(d.ngInit)}}}}),kf=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=d.ngList||", ",f="false"!==d.ngTrim,g=f?Q(e):e;c.$parsers.push(function(a){if(!x(a)){var b=[];a&&r(a.split(g),function(a){a&&b.push(f?Q(a):a)});return b}});c.$formatters.push(function(a){if(I(a))return a.join(e)}); +c.$isEmpty=function(a){return!a||!a.length}}}},nb="ng-valid",$d="ng-invalid",Ya="ng-pristine",Vb="ng-dirty",pb=K("ngModel");Sb.$inject="$scope $exceptionHandler $attrs $element $parse $animate $timeout $q $interpolate".split(" ");Sb.prototype={$$initGetterSetters:function(){if(this.$options.getOption("getterSetter")){var a=this.$$parse(this.$$attr.ngModel+"()"),b=this.$$parse(this.$$attr.ngModel+"($$$p)");this.$$ngModelGet=function(b){var c=this.$$parsedNgModel(b);C(c)&&(c=a(b));return c};this.$$ngModelSet= +function(a,c){C(this.$$parsedNgModel(a))?b(a,{$$$p:c}):this.$$parsedNgModelAssign(a,c)}}else if(!this.$$parsedNgModel.assign)throw pb("nonassign",this.$$attr.ngModel,za(this.$$element));},$render:D,$isEmpty:function(a){return x(a)||""===a||null===a||a!==a},$$updateEmptyClasses:function(a){this.$isEmpty(a)?(this.$$animate.removeClass(this.$$element,"ng-not-empty"),this.$$animate.addClass(this.$$element,"ng-empty")):(this.$$animate.removeClass(this.$$element,"ng-empty"),this.$$animate.addClass(this.$$element, +"ng-not-empty"))},$setPristine:function(){this.$dirty=!1;this.$pristine=!0;this.$$animate.removeClass(this.$$element,Vb);this.$$animate.addClass(this.$$element,Ya)},$setDirty:function(){this.$dirty=!0;this.$pristine=!1;this.$$animate.removeClass(this.$$element,Ya);this.$$animate.addClass(this.$$element,Vb);this.$$parentForm.$setDirty()},$setUntouched:function(){this.$touched=!1;this.$untouched=!0;this.$$animate.setClass(this.$$element,"ng-untouched","ng-touched")},$setTouched:function(){this.$touched= +!0;this.$untouched=!1;this.$$animate.setClass(this.$$element,"ng-touched","ng-untouched")},$rollbackViewValue:function(){this.$$timeout.cancel(this.$$pendingDebounce);this.$viewValue=this.$$lastCommittedViewValue;this.$render()},$validate:function(){if(!U(this.$modelValue)){var a=this.$$lastCommittedViewValue,b=this.$$rawModelValue,d=this.$valid,c=this.$modelValue,e=this.$options.getOption("allowInvalid"),f=this;this.$$runValidators(b,a,function(a){e||d===a||(f.$modelValue=a?b:void 0,f.$modelValue!== +c&&f.$$writeModelToScope())})}},$$runValidators:function(a,b,d){function c(){var c=!0;r(k.$validators,function(d,e){var g=Boolean(d(a,b));c=c&&g;f(e,g)});return c?!0:(r(k.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;r(k.$asyncValidators,function(e,g){var k=e(a,b);if(!k||!C(k.then))throw pb("nopromise",k);f(g,void 0);c.push(k.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?k.$$q.all(c).then(function(){g(d)},D):g(!0)}function f(a,b){h===k.$$currentValidationRunId&& +k.$setValidity(a,b)}function g(a){h===k.$$currentValidationRunId&&d(a)}this.$$currentValidationRunId++;var h=this.$$currentValidationRunId,k=this;(function(){var a=k.$$parserName||"parse";if(x(k.$$parserValid))f(a,null);else return k.$$parserValid||(r(k.$validators,function(a,b){f(b,null)}),r(k.$asyncValidators,function(a,b){f(b,null)})),f(a,k.$$parserValid),k.$$parserValid;return!0})()?c()?e():g(!1):g(!1)},$commitViewValue:function(){var a=this.$viewValue;this.$$timeout.cancel(this.$$pendingDebounce); +if(this.$$lastCommittedViewValue!==a||""===a&&this.$$hasNativeValidators)this.$$updateEmptyClasses(a),this.$$lastCommittedViewValue=a,this.$pristine&&this.$setDirty(),this.$$parseAndValidate()},$$parseAndValidate:function(){var a=this.$$lastCommittedViewValue,b=this;if(this.$$parserValid=x(a)?void 0:!0)for(var d=0;de||c.$isEmpty(b)||b.length<=e}}}}},bd=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=0;d.$observe("minlength",function(a){e=Z(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=e}}}}};w.angular.bootstrap?w.console&&console.log("WARNING: Tried to load angular more than once."): +(Be(),Ee($),$.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), +STANDALONEMONTH:"January February March April May June July August September October November December".split(" "),WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2, +minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a,c){var e=a|0,f=c;void 0===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),z(function(){we(w.document,Uc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(''); +//# sourceMappingURL=angular.min.js.map diff --git a/public/static/plugs/awesome/fonts.css b/public/static/plugs/awesome/fonts.css new file mode 100644 index 0000000..44929b9 --- /dev/null +++ b/public/static/plugs/awesome/fonts.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('fonts/webfont.eot?v=4.7.0');src:url('fonts/webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('fonts/webfont.woff2?v=4.7.0') format('woff2'),url('fonts/webfont.woff?v=4.7.0') format('woff'),url('fonts/webfont.ttf?v=4.7.0') format('truetype'),url('fonts/webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/public/static/plugs/awesome/fonts/FontAwesome.otf b/public/static/plugs/awesome/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..401ec0f36e4f73b8efa40bd6f604fe80d286db70 GIT binary patch literal 134808 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 literal 0 HcmV?d00001 diff --git a/public/static/plugs/awesome/fonts/webfont.eot b/public/static/plugs/awesome/fonts/webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..e9f60ca953f93e35eab4108bd414bc02ddcf3928 GIT binary patch literal 165742 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 G*yFsbY~cLNXLP73aA74Mq6M9f^&YV`isWW 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

        5q!RY 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 + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/plugs/awesome/fonts/webfont.ttf b/public/static/plugs/awesome/fonts/webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 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 z zq1_(l4SX+ekaM;bY|YgEqv2RAEE}e-Im8<@oEZ?Z81Y?3(z-@nRbq?!xD9Hyn|7Gx z-NUw`yOor_DJLC1aqkf2(!i=2$ULNfg|s8bV^xB!_rY+bHA;KsWR@aB=!7n&LJq(} z!pqD3Wkvo-Goy zx1edGgnc}u5V8cw&nvWyWU+wXqwinB#x7(uc>H44lXZQkk*w_q#i2O!s_A?a*?`Rx zoZW6Qtj)L1T^4kDeD7;%G5dS816OPqAqPx~(_-jZ`bo-MR_kd&sJv{A^ zs@18qv!kD;U z5Evv$C*bD~m z+x@>Oo>;7%QCxfp-rOkNgx4j-(o*e5`6lW^X^{qpQo~SMWD`Gxyv6)+k)c@o6j`Yd z8c&XSiYbcmoCKe+82}>^CPM+?p@o&i(J*j0zsk}!P?!W%T5`ppk%)?&GxA`%4>0VX zKu?YB6Z)hFtj@u-icb&t5A1}BX!;~SqG5ARpVB>FEWPLW+C+QOf~G-Jj0r`0D6|0w zQUs5sE6PYc)!HWi))NeRvSZB3kWIW|R^A%RfamB2jCbVX(Fn>y%#b1W%}W%qc)XVrwuvM!>Qur!Ooy2`n@?qMe3$`F2vx z9<=L}wP7@diWhCYTD?x)LZ>F6F?z8naL18P%1T9&P_d4p;u=(XW1LO3-< z`{|5@&Y=}7sx3t1Zs zr9ZBmp}YpHLq7lwu?CXL8$Q65$Q29AlDCBJSxu5;p0({^4skD z+4se#9)xg8qnEh|WnPdgQ&+te7@`9WlzAwMit$Julp+d80n+VM1JxwqS5H6*MPKA` zlJ*Z77B;K~;4JkO5eq(@D}tezez*w6g3ZSn?J1d9Z~&MKbf=b6F9;8H22TxRl%y1r z<-6(lJiLAw>r^-=F-AIEd1y|Aq2MggNo&>7Ln)S~iAF1;-4`A*9KlL*vleLO3vhEd(@RsIWp~O@>N4p91SI zb~+*jP?8B~MwmI0W$>ksF8DC*2y8K0o#te?D$z8nrfK{|B1L^TR5hlugr|o=-;>Yn zmL6Yt=NZ2%cAsysPA)D^gkz2Vvh|Z9RJdoH$L$+6a^|>UO=3fBBH0UidA&_JQz9K~ zuo1Z_(cB7CiQ}4loOL3DsdC<+wYysw@&UMl21+LY-(z=6j8fu5%ZQg-z6Bor^M}LX z9hxH}aVC%rodtoGcTh)zEd=yDfCu5mE)qIjw~K+zwn&5c!L-N+E=kwxVEewN#vvx2WGCf^;C9^mmTlYc*kz$NUdQ=gDzLmf z!LXG7{N$Mi3n}?5L&f9TlCzzrgGR*6>MhWBR=lS)qP$&OMAQ2 z`$23{zM%a@9EPdjV|Y1zVVGf?mINO)i-q6;_Ev|n_JQ^Zy&BnUgV>NbY9xba1DlY@ zrg$_Kn?+^_+4V4^xS94tX2oLKAEiuU0<2S#v$WSDt0P^A+d-+M?XlR**u_Xdre&aY zNi~zJk9aLQUqaFZxCNRmu*wnxB_u*M6V0xVCtBhtpGUK)#Dob6DWm-n^~Vy)m~?Yg zO0^+v~`x6Vqtjl4I5;=^o2jyOb~m+ER;lNwO$iN ziH4vk>E`OTRx~v#B|ifef|ceH)%hgqOy|#f=Q|VlN6i{!0CRndN~x8wS6Ppqq7NSH zO5hX{k5T{4ib@&8t)u=V9nY+2RC^75jU%TRix}FDTB%>t;5jpNRv;(KB|%{AI7Jc= zd%t9-AjNUAs?8m40SLOhrjbC_yZoznU$(rnT2);Rr`2e6$k!zwlz!d|sZ3%x@$Nw? zVn?i%t!J+9SF@^ zO&TGun2&?VIygfH5ePk|!e&G3Zm-GUP(imiWzZu$9JU)Wot`}*RHV<-)vUhc6J6{w&PQIaSZ_N<(d>`C$yo#Ly&0Sr5gCkDY(4f@fY5!fLe57sH54#FF4 zg&hda`KjtJ8cTzz;DwFa#{$!}j~g$9zqFBC@To^}i#`b~xhU;p{x{^f1krbEFNqV^ zEq5c!C5XT0o_q{%p&0F@!I;9ejbs#P4q?R!i$?vl3~|GSyq4@q#3=wgsz+zkrIB<< z=HMWEBz?z??GvvT54YsDSnRLcEf!n>^0eKf4(CIT{qs4y$7_4e=JoIkq%~H9$z-r* zZ?`xgwL+DNAJE`VB;S+w#NvBT{3;}{CD&@Ig*Ka2Acx)2Qx zL)V#$n@%vf1Zzms4Th~fS|(DKDT`?BKfX3tkCBvKZLg^hUh|_Gz8?%#d(ANnY`5U1 zo;qjq=5tn!OQ*-JqA&iG-Tg#6Ka|O64eceRrSgggD%%QBX$t=6?hPEK2|lL1{?|>I^Toc>rQU7a_`RSM^EPVl{_&OG-P;|z0?v{3o#pkl zC6Y;&J7;#5N#+H2J-4RqiSK^rj<_Z6t%?`N$A_FUESt{TcayIew5oWi=jxT*aPIP6 z?MG`?k5p%-x>D73irru{R?lu7<54DCT9Q}%=4%@wZij4+M=fzzz`SJ3I%*#AikLUh zn>k=5%IKUP4TrvZ!A{&Oh;BR}6r3t3cpzS(&|cEe&e{MQby|1#X`?17e9?|=i`sPG zL|OOsh`j@PD4sc6&Y3rT`r?-EH0QPR*IobE@_fkB8*(886ZkjkcO{K8Sz$H`^D-8P zjKG9G9A`O!>|!ivAeteRVIcyIGa#O<6I$^O7}9&*8mHd@Gw!WDU*@;*L;SYvlV#p( zzFSsPw&^UdyxO}%i)W8$@f}|84*mz&i2q@SlzMOd%B!BHOJ<(FYUTR(Ui$DuX>?85 zcdzl5m3hzFr2S@c_20C2x&N)|$<=RhzxI!}NN+yS16X^(_mtqY)g*Q%Fux5}bP3q$ zxQD|TB{+4C1gL>zI>g~-ajKMb{2s_cFhN2(I(q^X!$H(GFxpc6oCV9#maj|OhFZaI z;umX6E*fQVTQ@lyZauuv>%E)5z-?zQZne18V5A}}JEQmCz>7^h0r)!zhinBG6 zMQghGt!Do5h%HmAQl~%m+!pr-&wlrcwW;qw)S$6*f}ZvXd;cHw=xm|y~mHbT3yX>?hoYKfy--h+6w9%@_4ukf0Et^zr-DbPwFdyj0VJHi}4bqRetSNR`DoWd( z(%n5>8MQl+>3SeL-DB@IaM{NDwd{{v_HMIO)PKO}v{{##c@ihB0w$aaPTSP4^>n3Z zC8Il%(3dCLLX$-|SwWx1u7KVztXpzNhrOZQ78c$jd{B9lqsNHLr*9h;N9$i+vsrM1 zKzLB_gVdMCfxceejpIZat!MbR)GNZ%^n|fEQo?Xtq#Qa_gEWKTFxSL4b{g}kJNd{QcoQ}HUP-A)Rq;U(***IA*V_0B5mr}Xp$q{YSYs-b2q~DHh z?+muRGn~std!VXuT>P9TL_8Km9G{doqRb-W0B&%d> z^3@hs6y5jaEq%P}dmr(8=f}x~^ z*{I{tkBgYk@Td|Z{csd23pziZlPYt2RJW7D_C#&)OONEWyN`I19_cM;`Aa=y_)ldH z^co(O-xWIN0{y|@?wx@Y!MeVg3Ln%4ORu5~Dl6$h>AGSXrK3!pH%cpM?D|6#*6+A# zlsj;J0_~^?DHIceRC~0iMq)SJ&?R&if{fsdIb>y;H@M4AE`z8~dvz)(e}BqUWK^U~ zFy`PX+z*Bmv9VxAN;%CvMk(#kGBEMP;a-GgGZf~r$(ei(%yGqHa2dS3hxdTT!r>La zUrW2dCTZ!SjD_D(?9$SK02e_#ZOxdAhO%hgVhq54U=2$Hm+1^O^nH<>wS|&<)2TtD zN_MN@O>?A@_&l;U)*GY*5F_a~cgQb_3p`#77ax1iRxIx!r0HkDnA2G*{l|*}g_yI% zZdHt2`Hx^MA#VH7@BEN68Y_;sAcCNgCY7S&dcQsp*$+uW7Dm@$Vl7!YA^51bi} z*Vy8uTj{neIhIL|PhditfC1Jeub(uy}w|wV5 zsQz)04y;BY2$7U4$~P{k)b`hZb>gv1RkD)L#g~$*N^1N1GfNMS)4r|pT*V<&KE1M9 zTh}rzSW#Kcci_#(^qf0gTW3&QN&zsW%VAQ+AZ%-3?E)kMdgL)kY~@mC>l?RH28u;Y zt-@_u^5(W>mDdtqoe){#t;3NA7c@{WoY9bYFNoq+sj&ru;Z`x>4ddY0y*`HRtHFEN% z@mFkp=x0C6zDGgA0s|mP^WNEwE4O}S?%DOtce3At%?ThxRp@`zCH6MyzM)dA9C7IP zI}t;YUV(Jcnw$4LoD4H(EM#!{L-Z|&fhNYnBlKcQ$UScR#HH>scYBTf2u|7Fd8q$R zy5Cbt=Pvf^e}m4?VVL@#Pi3z*q-Q0MG8pGTcbS|eeW%R5bRzKsHSH#G(#$9hj9}0O7lXsC zbZ7#UjJM^FcvdKK3MOEl+Pb-93Px}F$ID&jcvZdJ{d(D)x|*`=vi%1hdg(dd-1E>& zoB4U&a${9!xyxoT%$7gFp{M<_q z9oVnk*Dcp$k#jA#7-pZbXd=L8nDhe<*t_*%gj^Vx>(~KyEY~i&(?@R~L_e^txnUyh z64-dU=Lc;eQ}vPX;g{GitTVZben7||wttapene^dB|oSGB~tmAGqE^`1Jxt$4uXUL zz5?7GEqvmLa{#mgN6la^gYO#}`eXyUJ)lFyTO8*iL~P z$A`A_X^V#!SJyU8Dl%J*6&s9;Jl54CiyfA`ExxmjrZ1P8E%rJ7hFCFo6%{5mRa|LY zk^x76W8M0tQBa1Q(&L`|!e zrczv>+#&b2bt zuD1Bfoe>oW0&!ju$-LI)$URptI!inJ^Dz|<@S1hk+!(n2PWfi-AMb5*F03&_^29MB zgJP7yn#Fw4n&Rod*>LlF+qPx5ZT$80;+m*0X5ffa3d-;F72#5un;L$}RfmR5&xbOf(KNeD|gT1x6bw5t;~j}(oMHcSzkCgcpbd>5UN z7e8CV*di9kpyJAo1YyE9XtfV1Q8^?ViwrKgtK$H60 z%~xgAifVV#>j>4SN10>bP9OV9m`EA-H{bzMimEQ_3@VZH%@KZzjDu` zRCG*Ax6B^%%dyLs2Cw{bePFWM9750@SIoZoff4mJvyxIeIjeZ{tYpbmTk4_{wy!_uygk4J;wwSiK&OpZWguG$O082g z^a3rw)F1Q!*)rNy!Sqz9bk0u-kftk^q{FPl4N+eS@0p1= zhaBFdyShSMz97B%x3GE|Sst~8Le6+?q@g6HwE1hJ#X)o^?{1!x-m`LlQ+4%?^IPIo zHATgqrm-s`+6SW3LjHB>=Pp{i<6FE#j+sX(Vl-kJt6sug<4UG9SH_|( zOb(+Vn|4R4lc8pHa-japR|c0ZAN$KOvzss6bKW^uPM$I$8eTr{EMN2N%{Yrl{Z`Y^ zaQ`-S_6omm((Fih26~Bjf^W$wm1J`8N+(=0ET@KFDy;S%{mF@!2&1UMxk>jTk49;@ z*g#0?*iga;P7abx1bh^d3MoAy*XQp{Hl*t(buU@DamDmvcc;5}`ihM!mvm36|GqRu zn*3}UmnOSUai6mM*y&f#XmqyBo>b=dmra`8;%uC8_33-RpM6;x`Rrc0RM~y9>y~ry zVnGanZLDD_lC%6!F%Jzk##j%?nW>JEaJ#U89t`?mGJS_kO5+5U1Gh;Lb3`{w<-DW; z;USPAm%*aQJ)UeYnLVb2V3MJ2vrxAZ@&#?W$vW)7$+L7~7HSzuF&0V95FC4H6Dy<( z!#o7mJKLMHTNn5)Lyn5l4oh2$s~VI~tlIjn09jE~8C#Ooei=J?K;D+-<8Cb>8RPx8 z-~O0ST{mOeXg+qjG~?}E8@JAo-j?OJjgF3nb^K5v>$yq#-Ybd8lM^jdru2WE-*V6W z>sL(7?%-Qu?&?wZNmmqdn?$FXlE!>2BAa^bWfD69lP0?L3kopYkc4>{m#H6t2dLIEE47|jcI$tEuWzwjmRgqBPkzk zM+(?6)=);W6q<2z95fHMDFKxbhPD-r0IjdX_3EH*BFL|t3))c7d~8v;{wU5p8nHUz9I?>l zVfn$bENo_I3JOh1^^ z+un~MSwCyixbj%C?y{G@G7mSZg_cf~&@djVX_vn8;IF&q?ESd=*AJHOJ(!-hbKPlb zYi-r+me!ezr_eCiQ&SetY;BocRokkbwr=ONGzW2U@X=AUvS^E9eM^w~aztd4h$Q&kF;6EJ1O*M7tJfFi}R1 z6X@asDjL5w+#QEKQE5V48#ASm?H7u5j%nDqi)iO@a1@F z*^R+bGpEOs#pRx9CBZQ}#uQa|dCH5EW%a3Xv1;ye-}5|Yh4g~YH5gI1(b#B|6_ZI; zMkxwTjmkKoZIp~AqhXp+k&SSQ)9C=jCWTKCM?(&MUHex;c3Knl(A%3UgJT_BEixIE zQh!;Q(J<0)C`q0-^|UdaGYzFqr^{vZR~Tk?jyY}gf@H+0RHkZ{OID|x;6>6+g)|BK zs6zLY0U>bcbRd6kU;cgkomCZdBSC8$a1H`pcu;XqH=5 z+$oO3i&T_WpcYnVu*lchi>wxt#iE!!bG#kzjIFqb)`s?|OclRAnzUyW5*Py!P@srDXI}&s2lVYf2ZCG`F`H-9;60 zb<=6weckNk=DC&Q6QxU*uJ9FkaT>}qb##eRS8n%qG`G9WrS>Xm+w)!AXSASfd%5fg z#fqxk(5L9@fM};~Gk^Sgb;7|krF-an$kIROPt4HLqq6+EL+62d@~4Hsy9nIU?=Ue4 zJ69;q+5+73nU|TQu}$>#v(M&Vx1RD=6Lu`d?>zHN?P7J&XWwsvwJt|rr?CZu+l>m4 zTi^VLh6Uu2s392u(5DLaM%)Dr$%h3hRB>V7a9XG`B{ZsWgh4IyTO9R~TAR^h^~>ko z(k|Hy#@bP}7OyN92TKE%qNZfyWL32p-BJf1{jj0QU0V`yj=tRospvSewxGxoC=C|N zve$zAMuSaiyY)QTk9!VmwUK&<#b2fxMl_DX|5x$dKH3>6sdYCQ9@c)^A-Rn9vG?s)0)lCR76kgoR>S;B=kl(v zzM}o+G41dh)%9=ezv$7*a9Mrb+S@13nK-B6D!%vy(}5dzbg$`-UUZJKa`_Z{*$rCu zga2G}o3dTHW|>+P_>c8UOm4Vk-ojaTeAg0-+<4#u-{>pGTYz(%ojZ`0e*nHo=)XZS zpp=$zi4|RBMGJDX{Db?>>fq71rX3t$122E;cJ(9elj+kBXs>3?(tq=s*PeL^<(M$8 zUl;u9e6|EP5Us-A>Lzvr+ln|?*}wt;+gUmd>%?@Wl@m%Qm{>Q0JqTcxtB`ROhd6TB z$VY<7t$^N6IC(s*Z@x2?Gi%eB8%(hYaC zKfY5M-9MeR-@5h zZ?V`qr%%FlPQlW5v_Bp^Q?^)S*%Y#Z$|{!Lpju=$s702T z(P}foXu(uuHN!cJRK*W-8=F*QlYB*zT#WI-SmQ_VYEgKw+>wHhm`ECQS`r3VKw`wi zxlcnn26L*U;F-BC9u{Csy#e%+2uD$He5?mc55)ot>1w`?lr$J zsrI^qGB@!5dglADaHlvWto@|S>kF5>#i#hCNXbp*ZkO$*%P-Sjf3Vc+tuFaJ-^|Ou zW8=}1TOlafUitnrTA2D0<3}&zZz^%y5+t2`Tk`vBI93FqU`W!zY;M%AUoN1V1-I2I zPTVFqaw3Pr-`5HcEFWuD?!8Ybw)Y>g7c0tt=soTHiEBxlY;RlQ`iYY-qdd94zWjyD zFcskM^S{_!E?f3mEh9waR7tb6G&yl%GW%e&Sc5i;y@N)U5ZFLcAsma^K?Cg^%d{PO z=SHQq4a|l`AakzEY;A{n6Rn1u`7v~#ufV*6GZ$`Ef)d2%6apsU6^>QJl0@U& zq|wIBlBAgf0j!YaozAgmhAy0uy;AjRA2%(!`#&e>`V` zg`MfSf5gWvJY#?8%&|`Aj0<@aZ;-q#tCx=-zkGE|_C4)TqKjr-SE6po?cX?Z^B%62 zdA!75;$my<*q)n@eB<^dfFGwRaWB25UL#~PNEV>F^c+e2Be*Df(-rIVBJo2o*an$1*1 zD$bsUC-BvObdmkKlhW<59G9{d=@bAu8a05VWCO=@_~oP=G3SmO91AK_F`#5 zwXLRVay<~JYok|rdQM-~C?dcq?Yfz_*)fIte zkE_g4CeLj1oza=9zH!s!4k%H@-n{6aB&Z;Cs8MK?#Jxl`?wD>^{fTL&eQHAQFtJ_% zNEfs|gGYh+39S{-@#MrPA!XpgWD;NLlne0-Vey1n0?=ww18{L)7G|$1kjI(sjs z@|alUMcx*04*>=BWHv_W-t=rCAy0q6&*;kW&ImkwWTe$lzHJRZJ{-{ zl-mK6+j}V`wobm^^B&2Tl?1r=yWbz;v-F<#y!(CT?-4K(($wWtmD631MN9?trDG zMI7;9U7|UsC;urLP%eH1h%U`LJxT3oM4=gpi%X@lpVR9N6Q(uhJ00RWXeL-Z*V(O8 zsIyyVUvf=RXLBKX`!peifjIMvMs1YT0n$0*B;K^yZf&HN8$N%e=EgOejqihLPBT|< zs)z`nNU}BOdT7wYLy}R10eXUksn9o)jG)&=qteGc|XNI~h5R6UBfaPeIHbA32@*>orZsCB4`Q79}A=z@najfekt-_eTg7a}Mcas^D1ELlN6(y28c{ur|tmueFvIDOQxXs1)_lKrA`L2-^^VNC#miFvO%l6w5uK2bFyu?hyNLCjTCNRRVW^i+GX``giwc&TpV~OHu(yN&o)r2$K$1kjh@>iP z^&`?sCk#?xdFX+ilAb(;I7<$BQ#6j*jKsu%LEhQKe=>ki^ZICepr3#_2#pE`32i4Z zu%eXsgL)3x3Q-^OPPRhm<^!TEPoek6?O^j+qLQ*~#TBw4Aq~M2>U{>{jfojVPADAi zurKpW{7Ii5yqy6_1iXw3$aa!GLn|$~cnvQnv7{LMIFn!&d6K=3kH8+e90Zq5K%6YfdLv}ZdQmTk7SZ7}>rJ9TW)6>NY{uEZ zY^9PI1UqUFm|h0Vqe60Ny=wCFBtKb zXtqOa3M?2OEN=zDX7z}2$Y{2@WJjr?N`auMDVG9kSH~FjfJRNfsR@yJQp4cQ8zaFkT4>5XQqSVt5c}`-A#Z=3-_mGZ^)Hqayei zhJ}wgZ5UDln%)!;Wz@u=m(6C_P@r9*IMPe7Db`CSqad3ky-5-EcG=*v8J&{RtLJ(E zw2h-ghGYcDtqj4Z^nU7ChgEXO0kox=oGaY;0EPqeW89T6htbZg4z!uU1hi;omVj+3 z0B%$+k$`oH5*SeoG`Ay&BAA%nAUjQxsMlNdq8%;SbEAPVC#qm!r7j75W=A)&a6)3% zdQq$fCN;@RqI!KPfl9l=vmBFSFpD1cAxb@~K-$ZIlIL3W}?#3+|2p{|vZVq`YA zMbx|Xl57kJVwoetAo+opiewCkCIO=uBLEaG+!0U$MRdReNsx>+PIJWN6dW)pfeZ(u zQ8ei-Ht69)ZV`qv=vmorhOkF)Squ;)8AUfh<7A_xI8FGHMRW>~%o`1Wt3|8IMrM%& z8)|@=#ssro9=f9HtN0F#O085{Bf6PJnurfzS_yg?qqszmnQIYDP{N=xqPfvl;VNsK^qpoy2&App~Fe(MB7KCI)$p1!&YEB&%$9gTk zmvlt?t7!>_paNt_fYJvw^~LCqX{4opLy!n)md7}<_s?`gytfSAdoScQWTy&Tbr&~( zg9myGVv)l|4-umFBL0)Y(d}Rvt11)(O4ij#zeao~K$vh~JDn0_@3RjP2M0|79T&9+ z?>Vx&M30Sb15&<{RtpeYUf|n7n5GHyc+-FtA=7H$p6Mh=&M0O!so)tze7#WT>pp|x zfWae>0++DfscU2%>|@oiCQj+6O827)1}KsN^a>NSI*4?#ylfG-{q?3MMXX$dUH^S6Ni=Ve1d0(janpz@WqGJ?cG&sewpq294Qa zL{huwuoARdt5F4Dbh#?<2ruzSS{VeDAOtY+52t^xJW=!(0f3P&G3Cs^%~Q~~Wq{YA z!QrEk#>oXK{sc&Z7VB1_>fA1^#YyU1Ff<^9G(!V0!JW`n@EDdj$$2SVK6*7$!BvXP zmAC;h-W75(Nnzpro3CE9eV=~Lp7yS(vXnk@$g3{R`!(UG013==W*Hj{-*F!ujl+np%IX?E0*I&-K^u zY1z1I!`iOu+Ll`UtL|F6Vb?~vk=x9w6}eE^*<)O?pZQ#8YKE#b($x>w$3E*F0Kfk zfnyCo#zOpX1(P2yeHG@fP7}}~GB|&S27%6=@G^V=rmeTB$(w9rC6J@uQmcAMq zQ=Ce?Z0RkF_gu30<;5#jEW32il2?}$-6PZ?au16Y)?kUFy3L?ia1A@%S3G-M`{qn8 ze+|6jh0vqfkhdSb0MvIr!;;*AL}QX^gkc+q0RJ4i9IyOo+qAyHblI+$VuZ3UT7&iIG7640a)fe&>NOVU@xZ*YE`oy!JGMY%j}bGq!= z`R5xY(8TK&AH4b6WoKCo>lPh6vbfu1yYy02g^t9bDbexN!A`*$M5`u&}WqF?+*m?ZoW85&MFmXqQ1J{i;_Oz>3*#0?lWa zf?{tv`_JzP7D3x2gX&ICRn(aR$#>;ciH#pO?<*}!<}cYh_r{hb6*kkXSteV>l9n6i zwx63=u%!9MdE>@2X)3$YXh=DuRh~mN2bQFEH&_nHWfU{q+4=t07pt+Jfj90Or;6JX{BCQrE8bZe&wi3fwEXHRp zz8{VAmxsWU)3nT;;77X7@GCm7_fL1p_xKEG&6G~luO;Bc3ZIa?2b(*uH7qJ!es71c z{Buj4(;Jds$o78u<3df_2~DLq`e9*$SGmrR9p2OoVB5Q(KL3M{1>eq+;+lHK9N?xvyBPHni<#j$sZK{QrKEcdR9+eQD0V? zGPaq!#<-c#a>t4bt+R#Hu_|}dlIGeve@SR!d((u)Ga45+BuhHfA88G0cPrw>>(`ID zZ;aIyn|qmhuDXBthoW{J(WN+`Yud=y(wvd0rm&1*4>6?#8&)Fz z&@V=a0w4)F{^!&W_l6<5xg|-0F!~>aCALbeVsZTd*)M*^tr*!)O8w)mzKThWyQW@X zw%BFs5_@CIic5EPcTJu8=CmynV;``)3}gJ`Vl#VY_3Yib@P-KvBk_%!9OVu#8tG|Nc4I~A>8ch-~X%M@!>yk~ERI|QEcwzgI66IaaY>gx0~lm<@f z5-k^OY#SGC80Yr-tDRP(-FEJ{@_4LHsGJ=)PKZ@`eW75-r0ylN%0Q>&*M;@uZLdJ$ z)rw7Dt5ajr;P;~1P>jID!><(7R;w|Yf}qI&8klT?1dTfc@us5mKEe;qw;YKR(cp-D z6NmUMP8x7cM%~ytE@l*Mp^oN*mCF`gRNhw3gpO1PVi_^JzCJo>#mX(q+iJ(Ts$5=! z13b45gILEULS!=)SmZ{qsC1)$8-4eADGR?v z>~4k_SvdvPHAC}=4(!I^OLgQ@9EMDE7d$PvJbi+K%-HTh`P0#Ea|Jm6zj> z?R)(YWtZoIRx>AqzlG1UjT@6ba>yE z{Wf<5moh^-hu;ptAtPG}`h$4PWcOn>vy`#bH#Ss>OoAEE1gIbQwH#eG8+RHG0~TJ$ z>`C`c7KyM^gqsVNDXxT|1s;nTR&cCg6kd<-msrdE5Ofk=1BGDMlP2!93%0c@rg~4` zq)UFVW%s|`xb>;aR@L^*D>nkSLGNmM?cv)WzHZy3*>+*xAJSX;>))*XRT0r9<#zIpug(}{rSC9T$42@gb zy8eb6)~}wl<=or)2L}4T{vum>-g)QaKjtnp5fyd^;|BxHtx~2W^YbKq1HfB7@>Hw@U5)?b^H=uNOpli?w6O#~V`eG;`irLcC(&Uxz`L_Cl zS8r24e*U71o@dV6Soupo-}Ttu*Dk&EwY`h4KdY-k55DSqR&o7nufO)%>%s-Es^5Q_ z60#cReEy=$4|nW)bLh=|4bxW4j}A?qOle+wjn88oAeYb~!eA+EQ;8Ggp-UldAt$3M z7*E590amz>YB9L(z?Xx&?I37XYw?Os-t+05x6Z4vkzBE6-hrbB=GAB?p{DQXV4CKg zls@_wh*&XC<3R(CEZxg8*Y(6a>cIOq9Nss7{=UQ7Nv%O_WxSyBqnH{@(<>A&2on@z zn57W4Dh*E)o#rJ2#tyxV2;C5#rl8%%As$4qB=IbMt-z|jnWi>>7Ymq37;AW!6Y4nx z1Ogx#!WVdA92mEipgUxzy_?ddg|x)KOCyK)P5v@usc;0sN3{=0slt4CuwaxK@20eO zhdp~Z8iJ7GWrkq_-X`~(eBpthn9|`tZEUCIGiFpJjjxPVE9I)#z3Q$3tw`a69qxjuf+~ z*?v>d5~pcH-AQ~0)8PyIjumD^?SM8!Wb>KZoD7hOlc2nA0_(eG!in>}Ru}>6)>5 z@*}T`Hw{I^-?PS9>(#UFBQpW72* zsfj(2+_9@5x+57aN!`e`f(Mp_I(D>}p8)@&g^g+X1%d{ z%X5boE?hEoj0CiwTh9)#8^?~;|wgor_=Z1BI9_dI{ z&t*f95n?ZgZ5CnQa!v(p|JT?y0%KKgi`Smi9k5r!+!Mkz=&Z$%CFl;?AOzV`YBKrY z0#Y6~J6&dA=m>T@TYb8ukaV4z^Z?VX*MCKcp13-ye1*`gAj_Tm@r{fpm?K!U@Xg2AfndEo6jZN} z=XK0GRNXVLW2c?}B)rH^yR>u}b?|p(W$!TkQTAgu1AIG>MFfNchMQB_^-AQxRE$Th5-E_tBP@v(Cy|ojjP5LEU|JrM8 zVF5;$>Hl^jlHWDPChrTH(vh%bARyj5#TPb>omAs-)4zN z9?9(wybd0$Z5s+}Fiytv}-8U`IC<{6U2_NqEAkv;7lys5Qcq3EKt z0-!^Xy3idllgZ~qX^QTe=i*oGUCJNk>Y26?+9U(Ks|C81S{-v+6ebc`c(yibQbuB% zxM7mk>}dI-TfUi5Jqdu6b`4SqF)y5humuCaHhssdcR(jKf5ZGprx;Oe7VG#G6TA1+ z8oZLl<+ey(L+$Qsck^4fi{I|)p15MX73gHFUU!l${lN{)Ht_Wb%j#UE6cZ9}Wq^>+1wz z9TBA@%f~tby^0YWafmn&8Ppjn1Ng{d;S01WImtMzV<`!zU7;+8e-Xko>qM^OfOZ`Y zEZG#vcm>EGF??&G6+v(3l`X(xMn8ESv=@LdMfdcxFi%g1?0HDPG>blldR`OLlWN80 zz<$t+MM9%1K~JT@#aBZjOu9*G{W$u7cqTM|&a1)0wR8R^*r$<&AhuCq1Z{-aUhc5P zdyaaK{$P=Y6R{40FrWmLbDOCijqB(1PrKlnL)Tm|t=l}toVLAZOXJ*~-dx|_A&o65 zskcpT@bs+d@ia`f)t8ivl{(t%H?O?;=^s3O^GXqopx7E3kz06f^UQq<>gyNmo4Ij; zrOxuzn{WOqP75~PwPXC;3mZ#YW1xy&DEXsl~)u4`-v_{*B%R6xNH3* zJElz8@d#i4`#JV(ko%x;u{LMqLEEDmwD*(ccB9Wp;u*9I?=sC7g>%L{%$4m#zhbjm z)gK{LWQvE1>_yl|4T$nYKNVZ<)vza7FKU5*W~4)KNgN@;SA<9&ERxIfA&UZnB=r%N z5YD4fY$9Mkzy}!G+`KUy>3l(FSi1 zw)t)*w$E4#ZSxfm3cZLC(o3aQQ7uHk>_@fMTHoM0=quh%mfN6%{`O($pyzg0kPf=2 zjA%M7bRl4BhV5{{d4HbnTh`HM&YKw@N~47e7NFGr*9Yzi(7XQl-FJb4hPEKOC!K2x$nWy>8=PJYE)T$=Cqe(n*ChZE zklF{Ms}h0Jd|@o;Gz(~b;9d&c#0O^j{1?tF5dtMj9dG`|j0qZi^aF1r{<7KC5hZ`E zNX2nxJYEr@>u86|tPjTDet;fLn1R+IOm6&3b*}TOyNpIaid@W9c9!jIfiJOgK-aw=xb5Kpb)`E9x%CU82 zEQg_v`e+tWYClJHl=_EsSW?LZO3)o#ox(#2UW9|V7I8fYnz5fRtph`u)dywWL9}UV z*hdU9-BBK5G&}j~O6&dSdWDIpFX;&Or5wNbm^Y+A-x6(K$$Of6JTVl9n0gFY&=T5p zZX?pCxA&w{J)eDSfb?Zh*LT#AdiPlB;A%p|-`Aw6RP2mYTh zLmL~zM^VS0V@*4LkOEG~nQR)HyRB+;*KWli%QqKt&%16HWyMXRhtwdCgyoTm*5#itgp(Wap66 zyr-dgKgjl&t?JLMuw}!Boz)TOa2|37p^FAcPmxX0apWmfp$B1WF_@-dsK+?1F6~yY zEwi!-))Q_CbOP%?p%bx|=d^nLBig-_$e!nh19^Ps`s{SNq{nnW)V-qnz3y+Ipd7HS zsb}z%!+}y8izoy>Nyyj4m_br&8TGFcze#gP4?v*NEdl zzGBLM4qpvdu;5vCFi9^zXU;sW`>pPi|NFD# ze=$xI@7q9B4WPsw4CAO~UJ(S)s@u41E>#9D>!?=*N5m$%^0E` z<0RjkAj02TN9RLX3Js+GArg=Nu>E5z zPa!vMuMV06#7$1dLbwv+VGT(5V_&A~Uy3T^+|y~Q2>lA|=hZZ)ex%G`rhkN54C5gq z>w?qN=A+LgB0-@s{OJs7Da|z%dK)uDH4?m5Y=K(N5KWL)uqDxwBt>QmOk(h~1u6_s z>9x>G_+@bJhBQ;(Rr?20>Tjn}^Y`|rQvI3Ua5$aGq{HFf4BhwAFVk2oHNbk)hmAri zjQ_!g*-c^AKM>A@je&H)i1PsJ5929F<8bLXvONK4;-n6d;Zm7Q=G|k6Fp*AY!b1a`eoS*c zF413z6`x;!NZV1k5)sv;-Dqjt?t&|JLNGSA2yWhU-RYC^oiWI1+idw;6*>m1&Io`^iPgF6c$sN zw9j3KFYs@%*HNz1Jr?F^RiLV%@DyQ^Dnc1h&59pWKhD#AMQV~3k7}>c@gdw=dyRf5 zHGNU7bA_hHWUnI-9SXtjM~LT>U5!uS#{ zKSOhB>l^nUa&S8kEFoAUIDG}(Lr#|uJCGb%29Xr>1S4yk0d)9hoJ7#4xNbi?5Dt?N zBp45evje1L)A;&Smy9J8MJe@1#HwBFoYPv$=k%GOaq!kd58)tzBI~EkGG3Rqy>GOTce-p>jH0rb~c(K z1|9q=$3)Vdgcwyvy&>S3p(f~O;~?XK{)Kch&2!gs=%kNH#-Ee-i}S+a@DNWR(Xnv< zv7kIUUD(c?RS|JmPeXBC6cbxUl6qRxl;fFAiK%!>EzFa zJ$-mz?G%WqC+P-l!DLX&nfxzGAnLaFsOg^Vq~gaW2QQ<(qixj#J=;Y{m`?kHkfO)i zdxQ*`2Jr3iXdj4QE%|AlQ;|Wx~pKrr7xuNnTe=t-AO)iha6xDYpH}>yZ z+FD^H2VS0x4us;Wo_95^kElZ$>j2HW@wyeLi3i%Q28NXxQT7V1{iHY}Llc~!Dkv8* zM><6X$}-pv0N#?+N%W`5%}K0Is%8kCOC~LuR6+;gtHYPi9=dqUoin~Q^MhE;TSIe$6dEI=Xs(`oTlj_C-3c4KT+wJvpu4Kkn_RZVg5jE+RF`XNx?0xmaV~bW?v}wVTXn4{5 zO&2X+*pF%!%qu@3SLRk-npU5?`f_cV9;|pa#ktlD9VuvRx;TK+fWUv_$vC8-@TcO4 zN_-D6?7|-4!VWMEgQ}TUe(c3w4{eyxe8C5t7pS0MFe;X@U&B?sVDIGR;u>?mPyb2F zV5WLiQ2mX&1v=E#B`oe9yk4Y2^CFRk8*rV6k1!uW{m47&7E!m%(ANz&+ixrB^ng(;#RLHnX%tfsjJWM- zyBo5Of=eNl8*;gm`ozE0weGdP7~Iz5$$pI`$C5 z`U46T|8cnpt;J+VO?%~H_`Ph??bcn%Jzu`2`z~tc^PoA?r znJlfFuxIeRC?a>J?C!EC2Bn;dnhn3XeZ}sbjb-10*a7A?aS00$P{m0wm zO_v_`nJOwO*k6S$tHR@xmt`N`;fR%l>^^ZvbfRm}PUBtryK5pTwRdIZgj<#_irORP zr7I?yj7m&+KkD(;PKtLXmF-s9=>`j_AFjI$YN7_w1g7hD(md1~ysZj9;u_Y4i3Ssz zgRH~g_UH9AHR4A!67Z@2zch=Odh*4WzWc2=ekK0-ueW&=xy{z7Gz9CSbv}Pk+4ST# z#ZxnW&!Z1tS0A}`@LT_*wh{sv=f-Dy+2cPoUi{nzYTGjx)eit9s#G5^D0+(|iNBlJ zV$vUX35MrZ8K19VAN|i75_}Z#DO`R~MZQy~2$6gqOvN0Js%d70SzJm|ER&Jy5k>-I z!fh9^fC*zr22w0EG6&Uqo`eqC7_L8gi(#?!A>;y86ak0F7|oHQIhmW!15hHkZ(*|o zF+vd5r!A(imA-b0}qc4-&FS58}j>!?PW$SEg*;W8H~a^e%b?2`O8 z*`i%!x17FmIo=X;^83K2Y3Hja(b_rMns6%ts^>=(bA-9V<9O1I>564?R3a}v1yYtH z*l6T7AY0T66-95WtZgaP8(}|MBGlfNdh@=~Y1m!IA7($BPUtE`qT@h@;M3Hd z;_dtQw^?1x7-WaPK4XDxuqd5+qVz|PQlALGw|x}&MFa4RtVSK`(e|RtFN=u%s&M?) z7+HD3$diG_iYZuX{0ijc(*2C7cTX)p*3LRRtn3r@wq>%<@A9jY)yX*dv zSq7pIH0)jCA$)wa^7RfPVlWXzzoH}vzHmu4?W&f|zEC#fi<;dYS!Z*G+=!O(wLx7} zkfS~!6{@R-(Uw86L(mJl7`6&&tfKDx<)c+WIlqL)3pSX=7*`N5ysyr`8ap$bd^E3w89)ZgPiCBi|f{Ji^U)|AMCk%95n_gVk3|_XmE_Z6(keo8NCgI|@0sfZs3_s1} z$KK|ZCF;AE#cQiOrv*z^HWTBHM`H8Hwdx20FDq8lu^{(Q!@5s%Urrmi_ZX=7)j%7* z2x#|wO+pMI^e#2DpLkU+erWUorFxiNlu1s>XIg^5wIEm|joek2Rd2IsPtNkBRLQTFsnoh4v_<(`f@uV0I_G*I9RD+?L~j{1bx`#0ta zEeZiTNBzhh^|GEN+1vl7{w)Wm!`yhLKAuC&Ve`GhjRo0c|E^`tZXfkQW;&_kBLS|M z7!XYb?!E&&=u`h5Ld{_dyivFMQHW{aI!yVS7oS=ttZ_4U4sb{P=wmO6wCrO3g8Cir zRxN0ht{}^=kNOy`2fdgiLzr_8?$^fWMSdbcHb<)&+4+$`i%$>mB*aF7fv0tiFWhcK zRThLy0Mtx?A6Q34Vn$tJOcHkv?-ldg8_%9Jr8YX#=C;}%u*pWq^?L5VVi61EUkC^@ zTi3LAgna%bC9aB?Qos0?XlUZtnp9cISx)1AbGeO~JGb1<*DpHId@iRrT4e7+!$h07 zWDZ4FAXQ;*hdB%9)8U`#Aq1XW1`G)sm$Ol@ZCv2#2r5~I^BXuYJm%NgOkCQOAufat z)Mo2&C`TDc7EDz1sE;V{`=Bx<#5gYrDb+@@FE3>Yx=pZB79-7UjD-g%Z#qc&td6cl zI`S1u2Q2b!m^1LOg{LEV_eV*@cFW|i{!+a94itA#8 z2;?I%3?C8LQn5B+Ac|?$1Ejde^`AH_B}3`>#H=np*@XDR^y^=fZDd~Fz;wS>e@!M7JaPvv zPU?=U|2$6iw_+;&j{0oiARgl1!2p}_PMTg!Yxs?H%{HmJgU62_ghA}_;}{7x*brZc z@>!rSz|M}1YPdKizI;?B3~2O%LY`8A1SF;-m z+Oxu{+PYOU-V9O}bVd$T!;AU2M<2*KtciMEC29!H9V-u9ZUJ$M-4#Nb$5QVy@LP8HyfiyK->WR(e1g77J;isq@ zxu$>@C(@*mf}RY@L8hJXBrWMOEKDqt3i8iwFSwpR$W>G_j=iMN>(!1>S7GdmXt%UH zpfdn%XxP3S<>d1=1{yBn9c@?(YZkyNN1 zQx^M4-32#mo8SKR;r8t_CV3=RwbSNzS!Jbd%GS0L=qT*0!ERw05x~DzSsUKHYQ||Y zuwKD!+2nux!l3~g>0-F=;qnW{w$F|jqXuhZz#N`4WtzLDj_MYvu(*X@fb3G;s!oPE z?QMW|e7J7#=?C#3QWQRp-~(1;_=?J(Y^}oNmHRoN$^y4Pv2Z8cL)EmwWVNJh@>2ER z)el6y-IQ`!2h2{kx3}jwTf$_!N75)(mi|n=?Ylj_>QzqjfMiO67Wc4{rOcF4JS+{j z&z%duf1`r(U@ZlI{F=sZFnCGJv}cN<(cA|5AP8m+HUK z@vG9%#_zOu)ChxFSxmKsBSSO9XX%g4SU79e4=G!|Cgo(;VeA8dsRxIZ$Eqhj(brh0 z>Jh)P2`<<#u_i^?L>%2jxXAxZX%?<7l073C+~1p!t{Dj_9ZxL$sz|_G{C#{Hv@t=B zP}EsMr62u$;U#=d%MRJHCiNv=5OI3(_o-A=G_9B~AsrRui@pzUDE@tHg#6PmWEuT^ ziPt|@8=kjTNmkqdOlyJS!m{E9I87hqn;%9rT0<0-L99QeURoyK-&OxH^mcao3^t~WeS^K zH`XC|VCLo6*duA78O!ugN@5Elxkhd!CmdSX&*f=utfmDFD9PkBHMk3&aFB&)R8NL4 zD&i)OQLO z(Z_o2Zs~o#^$zu`{XU~$I{T&vAH3;ofJ*ZpJ&JR~s{J0}8cw}`t#a3NvWA?#tMY67 zLG}{Q{#6^CipQ$*V2|W$g2v->Y9+4=(K+K`;I4$BFUb9!Nrk0B*fL+v z_lcdO1uEs@|8I@xoKCB{68@q=)}90JCVF33Lb?M@bC5mog<2~vPXXzk7B$|75Lya& zL)t=%E&Pk`S-PznN<)4iAI;NU!@f0_V&wOND{4!~b@1&pAN$Goqzvq>;o=lr=43Xx{tUtEaN3B>CWZ)Uac%%Y9--wFCA~Ek7aAC_APm}b zpXAnlNOIF+;t%pPlAxIkvv1neXa8*XxNLX6ZDDR(+U5bi-=^>US$+3TyUFaf{gSPI z&A@*!TUbRQ-p-3$KUDc=Hp9j|c+t%)Z{KNid2DyGia&p6lgtpOkDeM{Qy=)H&22V` zFBRKM=Etf98a&;o2pD`R2ctkyWxz`aTDZXBjY52aOspy*2=?xDIZi>&&))8y?Pe*( zt;DkFm|`@cFI!Kx=wFn7fh&cqy-f1RZb2KRCK7JNBsApYHWk=M5J&|wBQOdb+2_^g z*;b(s3o^wX$sWZHhUhNh^+UU2+hPaWw)eN~kHy66akHOp4#cDm_4zDetK1Mqx+sR1`nMz9wwQP*hL>=&Kei3+FtV>|yg%{T(6f`N5BR!MdXj8xHG^3) zqCJiEswQF>ZLP}3Hs3ciKciD63}0Z^MFL6+`V473sGm^=U1^Mx3`Y|Mrl>H0pEcT6 zg^H5MH*WeRUNMs9VN5fcZQ=>}GHBs};LS}+P-y~P#IlYJ0P8ym@R(0L;jYe*1D4ll zwDy~vES0HtyCCI2411OeiC>SA#1wX;8DRXzVihdy^T9BjrZUmN_=b)~n*!R4%Wps~ zkbFH!%W;I*pJZ#8%)c_#RUtKlOksrV!Y3i%vh>?b076sjL-)-NtH_t7E8;OBZOPa@ zAofQ3jdT&<%k!kzaG)7qW3j4HcvQe1&&jd+f8}J3!f+>UDx7H_B8^6hA&r*!PDQ-B za5jys`+BVIUd>7lmgi)Y&fyh!`yosPQAwyIh?7D-h2#b7);pTpdfDrCm->#&W_JPe zRvi?=>OgitOs_62y`!|JbhXf5STOdjJDPjj*#EK7D|Q>bl1&L=hPkN@2)(QE#vP@l zt9uJeTG&n{WG78N)aYu19%#`y%8i44oVsSwNLRxgR6hF`tsw;8VRy)COB4`B4i4SsLAa4`Y(WRazi3X`Vv!fMiDilJX?r1a{9%U3-*f6J-iKJh{i^La~ z$yJ?ASG(MP>=IKImh$g9bD7xJqR}YghlfIHszUwEmoF2yQ`Xet0HgZCGNmYge2TvH z+d^IF=q3{GD`-m8K+R-7AdPA64e{l|c4AofbmD)4hUvwM1bw^%@mXLok{H%R#q;qz z+gU3h@JZH-G^8$-2?T_&a!E51(fhSa5Q$w^j>=mA9b7)O1^G1VKyM1v8fOAgDLfFwlSN7aDkBbh=1Vofi; z{_|sQ`!zOY>fWC264~Y0Y;ZbE!j3Cqv4wlfV?E8SiTe3tr;ceTaXo*JV!Oufp0KT} z!>xB&7aARQo9It=F0Wa;$5j)X(=fKBtv5LhYKFC6eJA)BwZ>zny85O7zI6@a-&ln8 zLF2LorHz$i{9dO!8mb#Jp?&t4L$8*9&!)KTkLxQVHBP8FA!bZwX zC$1xtlqa{pU|8*e#v_V+#E4OT zjwi(7(vGZ$V!mG>tD`=FtRvSqWZ9$*B?GPmVd1ek!0@{$s=gg&_gx>I&W_E$e<7Y+ z5K(_sDS$qH^8rKPSita&*B->#;u88_rMf;Axsguitwh`|=XF8(EVlU^L*PKbu#TN~ zwj8|9X*SENE}$egSAG|3#!^5By}_`$$?RM3+{=QMMid7b`V01GIvvI+&E63R2wQNp zn}sc$*2c&2oUL%!tO4~7wk4n)tpFT)D3<_3R0r=|=}&0KCf!VqIpm|jC(z<~qb-#Q zZxk@2wJZtt%hiN1;J9w_Hzt9B+S-HzVkb8@NIl-+0XLm`=_dDWyDqXB zn&w}0*`hmpYVLH;R9>jKpbgr%Tssmku7 zB4?i;DJ=yE$6)n>a-tiWd=_(RksK=Y6Abz5;b5mLI|>)(FA9o zGzACes-Q@1Vend}5C)iY7*G)}1M%Udge?eW(1HnSXri;yq(~2bXQq`x;Yrz#0k&ke zS%JGlk~lDWC_ny*-Pvc@4#dzy&@`+2PkV%% zOIv<3)+u>drFF184*~^AoZL$_J<;#J>d$8hF1HEz)8d7HT$%mI=(a%Fw_CitukY~T zzCPh-wvU#V(e-YoddEiUO$O~Gr_8a91@$Jc+rpZOpW6;!qTct6s-1GiRv51Kzn!ku z>d;8_q{~ie0yF5Z-59^#vLXATUx*cq!zD=G$XZeu&u5Te*HqWE4IIDJ=3 z;X=s*MnE=AeJ9|E8#P5YEW>Y3>i7+gy{D`72zWgEJ6_;p$$k1u>hqEMJ4WhXT+1`J z2UoHdw1-mEKE?MEYBN#+HGKNk5c-SiJgPNDBrxIO3hq2zQ?Q-Gzn`%I_?VYp&dv2M zvIvf0jiNBnpf1lm=3_A6ApuPS)>4!*8O26GMgpxwaM6T-up7}x$fShgk;qe5v^RIo z>TaB#z4r{2{wUbivuj#sL%^MIIAif88=Zo8VO`(VhtJ#lK)G7`AVbhecjuza-rrB| zo4s>x>$20;IoY}UyhY=kM#Bz+WZSjeUwYHVtw){{#_rt79ybJJr`6`3xa`^N&f)n! zT=yimh90T==dW``)l)vNIle^QUoEWPPd=w1q+I0(zj?aa4;5EaZaQsy5FJ4LeF}5{ z$zg##sP#GwKG2!Ph}IYe2=jqBViZeEZy;=DiXR5O3_2O25Y~Q9y=cg)D}9l1=&&Xw&3l?g{8))$`(k@{a1p3a{ens7utuI^2=vshxrlD-kY-br`D+hAM=))3(PZ zpyB3*357l{^D%K-(OTUkjEoJ4X>x<^UfmPAA7hlXG?QgK21ybCZk1lxS0Sifv<291 zEjcA#Q%-#E!a(4PJtQIWk)#atL{s*GU*JZt07Zc#S!1%fwV7fXkwZu$LI=?Jii9b& z9N7&))d3Vh8fPHy4GD@Ijl7yD&?%NGuJ_OccYXkIaDN7{Ux?ntALbeUyb?sbz03s# zLfJD@r)GcJGkZS!PFErpG3low5RJ#jCL63{qLHqyaMc*AVNejQp_b+{ucvHN$a_^~ zK+n|6Qz^l#n5WiWi;#UEURyWC?C}74{5m0i9bm^jS=(82np)-?!p5j&Hj8-6#y5q$ z-cZx{GVhaJT^!E3OK(B$?9)Oq;h*nmgonr@l}$~5ny#*74^BUz-dtT@>WZ;S_3r_} zQNaQi9BKB}jHzND-dA1Yeacj3_qnU%q4vw$L-Baogt=3ig3Ri*h;4T_HQn8u6~D8% zu3dIGR>z7KUO$}07IDA zm>ULZ#zLtQpB=zl`Xly=k@2w#_&57?*Xi!kJ;wQT>Y(diU_s7c9> zJt9NLo6(QTdY?<&%(7s~gGuhxX6Ia@TxNd)1c%NSn z1vg!?!9F%t+BbteRT}T^ikFtgySn40Y{9CQ#s-^l6%*Z|a#r=PT|QRt>uzZ1KDuU2 z_UG&)_39e07-r|Hmy8d@CawADtYBN~ud`dnC6l4WwkC7cwB?%@#G0C73m(O(B@{A= zKYo4MwAZI+m;dFW_8z_0tM6&w{t;apJRSqCB|8-3|G^xy4{cteem4EFg?KyO^H>jM zvPiWhJ7a++c1XQBBKT_Aev;X1adZCx?O6i7i}=MPVM!{DFhM1no>Vgi=FJObSSzE4 z!cz06q4?jt9&?tl`>Ym||8Lbn@fQ|L_G8v#F`IpVs|l!&x&>B}_z$1B(XGyIsHAWY znA8qOJ=@^)4xPoaU-h^g^}_jK@kTQ7$?aFf|5I6D)sIC2%qiC(coF8shYu$ie*)ue ze%G2{U`NRIn<&=&^cNmI;H`MZjd~?#3I1s@KF{obqiu%g9@l{o^DS=Z{*u!j)-EktzHk%L~ zUeueNeuutfbuxAHnCfe9zB#!P8?xVF){CM-QK}``94{Bxq4Q=lI*@*(t$ z0*llTSuC3*FY_i0Esz=DU(#!`f?@wi{if=Z>r@~3asMrB8H6RvvkTcW)vbP8ZeWX4 zzxps+&i<@^TXl<*)K}C$u*vFs=c>O<uva_OepgZ3^mp(p%~u)K{5Z{k!@f>W^5N zctHJ;`gb-C%!>u<(kED#4A{XPx$+SHa}?%+(O6P8P)JhxL-2PKS-#1p!TbB=d;5nL zMMOs=yP`{Yvn%^wn}ki9e$C!VtI_NeVz`$Lz%L_RchA@F7J^6AM{gFM+M7MOSKOPu ztXH`F#C^w(VO);r;56Hd1-i|6n#b*T>ceqoYd9adu&Oc+x`?PF5k{oi7$_HEV@K2z zymA4)N+`DI{|3bN<-4D@&N)YxIVoqR5q@8N=Kc5COtz?XZfomYb%y==nU^drYn>b!5Ctr?PZ$sZJGC4(Lx<*GmYK3@9};69v2?xCz*86!x1fq z9-^Oe{|eU+0lSwM-%%oRlZiDYBcsgabpN8BFSM>vThx{{TLd#395z2-=dkJ; zUPumj_0A`QOXa%S$dG#HKaV)PHrXJUqTZlMEURp*D&K#c?PX)`>TojQ>yzh(U5ggE z+}3v2ww-mQmrPrgHX82`E)7LZ#9*S)OrYMVHZ2*%Ix2 z-f6n^R()lg_{@W9puD-%bs!$vZY>)VYBn{#u=iUtgZ1U*4oibOw!C4kr;~&cIo+d? zul5rmlh}%uY=)i|^mJ>IyR&mweFZIu_7x~{W-C@zr5Q1cK^!y+OU~frPEZqXZ04#L0$|tY}D-NPT^J>z!>2 zLk;VdDSg7vTYSmLjc%I1lCVSm>+G7BEY6w@(XH|*G{ zSt~)o`-!M-5J4aV2N@%gOd!0FRFIBn|vW}Drt z-eWVGJOi3H9hf$!nudR8+Nmhg011-@!@NC3DA2QVhVsnWtq@_vVUsn7Lgo{)!})lf zHnxUxXX|Z}q6~&9Cutz=WXN1iJCP;&D8)pBPR#N=xfBTp2pd7-lFF5XXBc!;f}%nR z1Ca6zjC^CAo!5Zpsbiu(lgpE2dZaZQmR3Pl1Nu#$p&}HOO1KhD0hr0cDxiUoC%PDR zz2y;b(?1FUenyXAUfrc`fgeIi%?Q>s#3O>1`S`d7)!ab-ztxcdp zi(oNgfzqrSy+Qa-h~$kCFl>tV#u zT0yo>Sj8|%X=Z5eLYl_j3H$wFA3GlQ`NIC8!J3ZtWgQ*Tf>iySj%6K(I%;b=*zAUs z@a=8sq4nu=XBezD!_2jBtet7FSqQn zIF@m`p^X#2_+Y@)f(;Nc7NdxOl%T-$NRFKpzZ*Diiyv-9$byI~Y_VA7@fF$z4H|Dx5g*3@-my-zW{NS^+s=4LU=S;5ULvFYRU7E$thNp8*A(h3CX5s zqQ~5@=c+ot#VX*Ndavjg1ef4*RI#r4+51F`-Xy>#L9~eMYl6w8mrb%>5bZT?ljVD6 ztEdNv0*uOqR@o*xU>7I~%q&O{-x-#ny*Sp3}O21M?Rd(O98C84<|F{P!iYQi+&Y*nsLu5^Ihu$V)k)=GECZL$l#xZCMb z%xz~?w@;eYGR~3+M_}0ce(?P zl902^TxqD4$DQx-Ouql3YC)>Mv?0+^0b7X9MdejK@03cTh{%+U%}ktHqQF-^C6`xw zO``FD0}P~L0z_&PDjancf@m?ZGR0TUYN{lM-RfudpltLzU;yJ{R+GzQ*P|q&zCuzY zP@pguLKr`*Q*oFilK?v&y$CF+j-b`jSz!_lC6mW>m+2px;ND~mcq=BCmMTz-PuXY< zOa5z2j)rQ{(LTN*&~0=Yh5whf_W+NhI=_eaPTAgjUu|FYx>|LuiX}^yT;wh{;oiU% z_p&Z@Y`}m`FN5C~v?rUXJU2@qOB4H#QH{+~N5*}@@#Jm2%V%+B2D zcW!yhdC$u$WMz8Y@Q7Sm;An!nZCaUSSuojY3}>m>9D|bq{)XtxPsx!lnpMKJ$>l0=VE#0Q${LhbVQ?(avB~M5H(A<6VIs~Hmen|XCr57cj;wDg~y7PjIZR* zau8CZLCaPfRJMsKeNi~1P;*LSAkgMF^Q=afBekooDqXYIppZJ`(kv}2%`0n&8lEg` z4=C(+1ET{^|A%kM#z zXK7m|9Wcfc3=~;>1jcJfX#rU|Ppz!j;7pMyJxd%-z##=(QTY&BIZl!@lVSAb*KE2t zsC)F&?X{LH;g7;@GHGHi9oIy36f@s3g3 zRt#I$TBG}b-9;4UrV$&5Ij9vP)Y;Np6VLT3k-c!=P<<;z&y-p^C+_T2?PjhnuA3&) zZg_w4iMx50MTey|GHd-~Qvv|JOonzEpncEx-PZbcYu(#|MF)Yep>~>mY?NK)j*MDlofYp2?IA zdWFjqQYB^@4u{F4kONMK_E=?Xxs$LThk3UpU19S{Nzmr?e_{2qb`9sV2yanqH0d@5 zKGJp8aZ;((RpJ-E(g5Ey-P)#3bab(6W+bgQb9J5E$fs<9fcfNuxIvFo=h1Dgwcy+w zPuTU(HesXi2ZPm;XEiGog3BROSUdQwi5UwQ_J3+1m1G-UYluB@01JOMr|AGf`7CDG z0ig`8Ee4)kL6qbPGy~CNdwL7bt`jNhr{b~f<0Mqx@25+$lS$DH(Vxp|&m0t?&qQTw z7?k*9V*W>p{DU=}4O&dJVTtJY(^>`^lPL~F6O|IFf&j!DWck6E9}tqnNz(gl(B;1+U04#Mx7H@PM!jr;8}`p8X5AFzRgZ z`H&lBbVagpDgs^cAL}3%1zD$XOne$PNmH;OFF;TKQt?TS2u1Xly;A5E%X>i&LS8)c z94WDnS|omqYiN=XeK3B}x+|c@HmfZ(WQ<~YG9AvJ!q|jbd#I*5WUrl&T>ys=H|eYa z=2P;fwY|sZguD`qxdX)M>uI;{{E0Cl55B`!K{}wLHeN|4VH*YnBfJf$tm5E77<2U`gq>@HG1qNC7Hcyb!M;d687pf$B(PUZ=T|xM7)L(EmRVw z;~E{-q~ZvOOr2pdE3KGuy*wmJ%9P@R0*A2yuAhIFS3E2{e{lXEPa&La>y?-W>-8zjMwKGjQ$BzcAdCp)p^-It?U!LP5Hxpchm^Keq$?$57$5a!Z+()BJRD{ z6WgCQN}23z-^iC&TytVqsnMs6p-*RQ(ixw2F8vzfP=&GB|8F?{vwhrLatNCSGk0hY z#-0-r+MT6XGIxqGf<)4vq(!0^mfU%UhXXyCkz}3fmG;0s&`8l>X!W^JfDuz9HUo@{ zuuFqpp>Uv)!psk76{RqQDF$&!v^n_ECT`}V@{zZoqC)oA7_w~`M~N|5Q|_k zJ;Up>vyh*=Kjn%>HQJW}(v6${w!9Z%lq8ZlF>@K=Ek<&|IT4DB~B~Y_O;v9%9bdID;FI$4}a;O}@l!+Yy zZ67)fU;`NEa8WOT7DH7N_&*q17&?q>qwQXMcFgOOnF<0N*-^sEWbzzvC)kr_vv+i5 zgPm2{O*$B>IAd@{>+WUK><(pc@%$Y%QkK)@5Tn}4^Ln|tOsDsh=f>O`Mru?jc?N+S zjv9?oZ;e0J6*s%IG6n*@)S#6c137i!nnDgDIU_YINmjH(${tUCloc<{sdVK)q-C~s z^SX%F!SQCb+A?8SAq-ab;ILesL&}?2F1w-0Zdb;3_7dq1y_J`mAZv20%2Kk(?Wvhm z?BgJojYahs`X@A7)HA9Qm5P}EkW30FIDr{C1ON{u z1g5dIMr=}b5GjQLE~kiOEsekhAqGW;iWew{c8QDP()f-j!!>b}0<_?aiq6~yI>*3B zi`CdXW~Cg76+JS8SL=N!|F26HjVUaAW#N(;&=GruQ@h?1{-Ra%60++(*a{-;SN={& z3m*yJzP9zU)P6F#y&<2IYIRcSWv>_H=QF%ksji&bymFkwB+s?s!OWBD?KvFpwAYaF z6HB9tl5(fq9jdFlXQI1E?Q^gHxncuVOg#lH7*|HYd$Tnnm)HD6gV_v+Ekb4 zp_-m+TC}!*?8^M?Y`$XK{JN&qk1Sq6xYYg&+mlym)o2Awb#46$jTWSN#;OI(jOptu zaCbaIeUAorw`cR3Q9bDuE~l}?)pf9WSllS}RTN5{AmKP8TP%l##64O+ z<9w~)>KD$L^#-v&PKLdn&JjL-V;0%hPd@a%E}(nDen@49b&%5#O-QsX6;-7Ym_{)3 zVl37&u%3X?ma&!7b)K&CFgV2vcWds-QvlU}1h5qyxV^(mlpUfHjzhVqKa?A?iY8<~>_=ad! zk8dO`rvOwQj>Y9oP2*Ot9wKK_hBC~WVtf!r`yU%(p%oD8e+cg4QUi%h2a{}O5}EG* zZ-HLS&Y#FkWd<|*0G}o#4taLmE^k0-iGxUlg8Xl6I@jpH*%~?tx@JuRJn#pu1 z@%_I=rNM%Y&`YFTCG|8jY9=GAaO%H4EqhwG9gJlaZKg1oi{db>rau>VdE^b)^5%>b8}?cL9itw!Y(Bor%WpI?%Pj4J{j!bwjl?n=A z?##%PqWmuA8zS)5vCxk(#bC(9jFU0xQk5C=7R7TRzMFn&JpLe}gI6mL{C!MbWW0*I zJeV8RWO=t%FK{h(m362pOLR55=AN7W`u2&T{v&qlpQUo)8&gl^+xyG^_=H+E&E8{g zDtj>Tm&AiGOuNYD{?mSBc+fDm!jX{TQ=#IZQaQll|>^G`1^D^SV zM+ZBRqk?)b(96%pKAv6kG#;Gx_9RUJOrL=Ch#REmXQRXa?RfD@|1DZPOH<>K-+Z~L-ZeSdCe_=8y zv$DFgjbD+f$Xn5p?QtF#T$_pgT|@$@QGPJGo8D>TeAt8fg6onA*w0M>p@iDdM_^a=-IIAa==ijmLcDs$P+!j}iuEj;;q_SK-hF(6t&u*(3 zU!LE)pqCz!$h##W9aWv*rYjeIUm+JxEFjgC8ezyBN-_G-vS}?09R$E(jR6BMU5U^@ z(V0P0B}3^eADjeW+@$S6T2jX+!gXXQh=c{DMBthD%*Muwk`k2(;0!J{>|O2$aekt_pC0cNlWBQj*NqU$H3%h)ui z?qoV$6o>@NL$D;;M02ATJ{}%ng;dfcXd{fw1p6fDH854f8 zL_5c+rAD;odO-?4m`z)jE@0QsIP#m%s{3yxi%G|qJ9mC592Bk*4$?J5vvrf&4==v> zL*Z%RPT^^~#-wiB-EW#fR>F=Qt#Nm25b;_CbGzR|l<+O7jV3LT3y%tNHaS?@`}o41 zF$uNZFw7Y~77Aa>jb2bAph2cqyb2hF{`0@kc^4I@JroH*5@Ck{3%HA7J ze{=QfTZrXPG(~C3e0zG=<=@}#yeD$(it9e|@}t3Eyl(l}7SBEY4FhdhBIcb^!*gCl znFlPvfq4vU4akQLkM!yPH0F@Xp4CK5WGsrIY#-Z~%66Yny0cS6LL^vZ{#CoPf547v zDOQeSMJf?e5Ldtea!LXg_#yu@^rU^*gZ%^VuaIC)(1`K^c$#TLNtk$0pons6AR0!$ zLUWQKxeJ{spst%xMbvmTKy*u_|1@&<2(Jsb3$Ne98JRk3nUx!DJ=x2tx%A513Tb^+ z6{A$>`g952ZR_y#^#BMQ;Q?NEWr8Kwqc!wGt6zh&EFKrvp{{ zN~{S=Y!iu^0Jos91XK~^De&WAO?3BQ!NF<=uyq~mg=ar(~#oOa0#k@s$PSzc6DGpZY zT%MiJKfg1}p{soS^vIIw;22}*cuMOjV++=yo`T|dD%z@Ov!(S!t0^oRsA=_x^+YR- zRun2H5=~%|fM4gQs|vMD>7n5f8#?tsN@5RaH1W^l8V#@Kb6(2f^@31PSCF5~CtaD} zHvqx#ExV!o0Lk}Jze|zj2?JMi!xC>^ZcUbx|8oD`UrHT5QaV&bC3|pDTvIB|$&v2% z6%>eP4*a&})c8hn-$b+WaF^U1-Y9%4?aZpl@s?;DwsrU3yUt6`1&HKhr(r4L3qt&ZY~Ue$d;q9YOJv}hM+5p1Omb%T%HEakh-=S^t}!cIW|NCt zvYY;N*Q~sC1sQXeEuA^!svEU*$tdANv&&^(v#x9Tve5*SsoPZk-nva@m)o@7>0Un? z!Atj^ZD6Nk^lh>fKMh(sMon0&1|FKqIv6qslh=z6Ed%72Dy!IIOJsI&k(zNe{r5j` zk_^X6`ZxFWKTWP6!%seNfB&|pQNmWNqVSmX-rpQQ`2bN0Cje~8WfmX!`rCUhuDV6| z?tzm(+(*>4Rl?Uf)zvuzW2UIDP+k<|WI}{Ib%x>RC*r31(n%p}+BT+-9GkW+IrRJX zl4DHYwrN6EI=PMW4E<6fuero2mvA4UMJq5i)7)epXyn;=e>z3@9f-LGcf5hMl*Uci zj^i)l8w{96&a4mrQ~GllC9!c~%TH#{M$B;EW?N3ttH6-F_R*bkE z%xs+9eK>1JJlEyUi3|T4SYbBZx6y2}B_?h-TH3hruKPE(H$8SVQM-|~4Xr_@In|BW zVgnhInnHim#YFuiJF;qqG`&6hB@?p%o1y+ku}Y5rxPFzA>{ANaiBNe-q$cmhZ(g6f}5CD+Sf>5JC1{YNhE(3F0!pqbX3(RwM@_N|c zFzw=ol!l+B7sM0Mdy|AsMx{HQl(76 z$#hO*p?1?0eXP0O(<)bIWm(nM?>D&fvK;|!P?al}G1;T~4{9s&3~cWA(L?15m&fK{ z)~>Hj3O^K`+eU6-gO#NfAS4*o;1-7UNR|0&(@~!?n_WwQKqAZxwyrJL|JM&?c06U%ORPS!-dO@oAf`H*?OVR=v)~F4S5z zN+5)YCd&}E8gy1RrguKlTO10oX1m^K%4>6G=~)DM_>yi%EXJsGuk#kUP6`2@0mFH& z*Y7NFja4Y}-Gp?I88a-Qs4d@6Y3k4^;uG$8HkVZ>6{d2Ts(+j_*H>Op!RM>kkox{2 z;Rsw5Iu&f8xr|1}tTY4tlHM>@EiDGFo?bbl;~Fu({1Z6Pa>+DgRgwURk+FuLorv&p zv=R76sC6XM%S1>W=qad%1G_wM3Sh6nDM0zsc0|E!6pSFE;zY!kd0?&wr8l1tn`~l0 zKjN<7P2T10Tav&7>10G6STwUFdt$Ckoo6!J;)Qlku~Vxs*jOESa`jr1$`w?}mAukM zx|OzkuRpal^rsm`;TczAm!Ag(3+p`9y^Z2s;Xjy+&E`xnc2|LnIxpPt&XsPg6uUf-7ft7w~JT& zfw+4o-?d@ch@?j;51V6l_vA4*Mm!^38vC%}t2Q0LXa*LS0U5%JS+ZNQ2IGMa4z4Ku z1XMXlM4({XWT3mXmejMX4KfvQpFUQG=p6zh1P(#hx0TaeK{z8y&FKjo3kEhe;iDcE zfcF9NrmRd+z#75I#zyOzI${$C4z8egkGJ98@%p80)mt99&dA=tEGF*_>L9oaR=CWYsR-P*G_o6S+z$z#(P~a{(6#ymX0~h z+zw|!lNvkPaUB%ja-FB?(Fv**Bgd~HFZW*OO%_;My4Q{$zEnTq*A43HRN?uNFg=hl z(mS>Jp)!boM~Ci|rMz6Z8QFl};xW z+VC;%K?kAOOY{Zm7ozQ4hK7!RFs`B9d6c9mQ-&9ZPv@IOdauhoi;5;SiiX_ zWHK;M)?aq=IP-A2oqKccL$m)pH~*+mz|;ySZZ3~)-BsluH|nc;xl+!#{ao9QcRBNG&Y@@wdtJbh8!GYyZ)Aw zzW!rQ{z;Ot{z+k{O^#r%wLyJLxwd z^XJOJx5eNf7|~5`*>4^z8HR_EXsbFq6_{Qh=&*U_cl%k zwM=iU2Q-PXbe70@^dA>Q@*j7JJAQ6|4-hly6bGu#Guf4I3#=NJmMq+jRMnDLMGTM8 z6FZqoQTr`j5OI0-s_>JgLyrB~1ISJSSW>S5iIM8Fd`kT8G)kmiG74kB5_qw%knBSo z@oyzBOWuPdb_$`9K7a)3Pq%~9W`D>*IUiM@0O!f@)4ww;cr6QD5gESP1B%!6;MicH!*-Y@P77+wB?U{(vm~ z0JN-bp*I7tds}$B|2Yv_ml9GUw621L=mG8zKA?tYOyL8Y$OA*gF20al| zE!BG;U}OpgXwsPQkfX7WgsEmUAWlI(Q%5G%c5JA@ zvU7cnaQC>*j%_XCf?T?a7#|JPH|92fQQw$ue`M)hN67HnNs*fMopiZ@%w_PtA1jc&hb32b{w#B}vxOro)&kk4QYrL#`LlzCOWDbu%nMm`flvZfG|KV$j$ z-FNRE&whE;GvWRhXt!eH;b*Q&eRI=I-{8}UJ`2g|xFh(1d6<`@`9woMA|kP%%i+S5 zK1F0WhSZW`Qt4EZc`V(MZsAXaeCedS(Vb5ELclEaS@QrmjTB5H)0hpPEE5EQNlSt? z21ITlh|EwEWF@giEs@COAQx(+_op}^iJXqHgKDa5asPlpLpVlbgj@6s?#6S zYL9`li=n^zx)AA&B=wJxE3xcTD*N=wh_LiAeKO-y5#$mc`A=Xw@xj(!AZfrCg?F2! z%%%|*5?(3e55O%Be>hdJWqz|Y>@NYc35+My#uxNsQ%rG0cZ281FRKs`l-S?BR7$Qh z-dVrO@Xl=E(CcZ!zjWz~bC~pbD^8Y^*o%J<{*O3DPI*%37d~UUCSH7g{XNT97LQ$? zYDwS3-Mc~fzXjb-ryofsKuafo;|MWb{O%5q#oGdD3s3+{Gu!C$mzxRqo(e`nj_uaPooI_7+V3f_n$&KXNEvegYzVOAmOI2;f z%Txl_vJgS~zx%NlOt`B5A1jvKoKv>6a#W5%cB9YQE}Ng#F-&RRe*ZmNFS`A= zffzY&T}2~NcH;d+T}$M2l)?WJg&c4iEkTi+0V>Z^9RNlas=*@uckms`6J|+}MwkVl zE*N-dTsD!&Rw6C9;`uACcs{*j*L;_2erJQvcU_02%bc~Ubv}FK!A+YVd~oxo2X_nq zIxLJ(Kec`BV~&r=1*4{GtdwIw_4r|;;(YY{D^5OnWS2C@x2K~s>682AHEryBn;yjZ z4?M8>3E?~8cUvB~Zsk;R?@dJv+4DFYRsX`H578avc%LRj22up7SnVaEaV$dP+@Mb2 zq4CIrhOkSI?M#gOW_%ee~$=YyOXUUtta- z@3Q5iMlTbdyK_ZVk=cxE)U2`ldFI@H5%zHXu&HYiR*LHY$S&l*@|^Pwk?pbS!QI|E{fuLT9l>Vn41g5I@&W>ri?f&GFo z2Mvui(Ha1iNH}VO&gaA?EjuED!@2g}wMSvNZckt@^ zbBcT{_aqY7%7ddWm!=M@i%rJXYvdmtmEHZ<%5=2wE#Ya?`{vOxdvUPHUc~Hq)u^&+ zVxd}piz@JUQn_L0+rqRxfv#aS1_Qa)SFTn?$r9m8tB0)&yDHj4Q)OzVO1NO^@T(S# zL(0QB&KiTUe&dAnr^5A~AR?Oh+sP8L@Ls*u%05spT>iM4%=WoC#%#@Vlnc)Y*M>(1 z%>k=bX=I0!#ZUiZtZ{s3P3^i(18oF$Y@`P&pb7q@ zvO&%Rinll&IO>Nvk;2BP83HY%nxOt@^RQ6}1388?OVhV+Wsgs0?25ERVP|+&EE0^` z9;D*zmtfJOHEx^cUSPX*CM%hFt8IaM+BUL@o;Mw^gE?}ONuG9OHsL}9goCExOl6k9 zcBF9hZPPbzo-Rz=Cbo417-4=XMb6q`w5^}k)dn8)rye-Nvy7(}Gh*3HgK@Lu%)3+n z3oI%!*v)_P(IJ#lCcqSZfges}9(VST_vZX!8Iyu_9WRljFOkeF&%DGjD#;zAuOeiL z)kL;tDxm*yaTD@D7Ic(j;`>P;SyBFLyqBneU^?`pM<(c}IK9OD2nZ!U*T9lL1{g;P zQHC5spChCsLWwhCBD+2mm(S2;iqgWTOcCcZWEYknl3hS(8+Jq-!Js3u!vGXFx%%`X z1GZyXL7}pT{gaax|rmpxnPf6C{R0 zTib|2S=j5#k%yaW)!9?dat0A=*X;8^v`SQ&KeDAp3DgrAcLuh@xA;PZBR zg`=d<4p03_tdo51mGomi;T*5W zBR30JjLniAk}JV|c8{b_@+!PN3ED$3pu<0a5gVJRMq0Nr)(md5j3YKqt%Cs={mM&V zt(QUujwTQ>MqnxgM4FbD0^omUM`j%X;ov|kMM@GAVteUvCTv*~XK!V8i8e-rGO=_w zoddypK}UkYEyU(oO|oKfA7hGR%Au_RIi%5mMX8P!NNn^DF#hO?MyUXe5YZ^CBuAyz zAaoLmQ4tEOMf%#4pPP{;jWHM)?Ifp@kt=LAg`7AKI~*z{W3ezw)pVPUQEMy~jk*Wh zTB*WpR!FsEi}0SsqLk?wqmj|el+#Tnl^ko>maAr>%xuC2=oZxEl4o@~9aI9XR%h1D z(rWcqJyENP-l}^|YjhfkRH_Dq0Csag*5}@Ne*Zr;M)&xhr-|1PuRQ|g&-ss8aV zHQ)cOM)PgI#`o!W$Vm6yr&5JrWzH40eATw{n%~Tk@(&l_f~OwphL< zCqVa}HZY$G%oj?XR`mrDRG?uJ%%7|Dde!ITbG2SC$p5Y}8a2z$XEq>ISjNkZ>1)ov zgE4B@ZHNjMe(1B_iMB^&AdI3IXEcx*Chj7 zB70ZAgoM~V!p$$OCVPKo`w;0RGhZ4!{v}p2VcgvrJjUJQ`tKgHL2`y{a5*?8l{pSS zVw`E_9ZV7@{DRZbcUGeBT!b+Rqb4RXao8LXXKXTqpXO606l_ghxNxwE%@d7RW#3 z3UEXjf7lI6*9ic+0Pae`^tPR>QL2SMsL3oEYnGOP$E&ou>S`~7xQVo(=)(GU4qQK3 zr?C@W$tk9f*D9E@M03cl(WrbDVpAIxG#Fl;5L{*BOWVj61YAL>qYM>lvf-j@87tpW z>ZJvtU!o^7M2?;aC>6H~*pz?_@A_f43oiSGu}SQ@oNif|jUiqc=UP!8 z=>_F32*pk3PFPZ*vcpA%CN-p;Wxmn4U-oTG7E0BO+K-oF$b+b15-I&yI4^>TevPA| z*`O%f1ySQ{Y5ZqvdO^$W`%*F%#Lt9hQ~Pdj5nk<{#WM`}1&EZna`}}EkJxL5;b(RK zf@)(^i_(k8hi0cS63J zs|Oki5QJx-ntFo~>>H%pY^E}xqM$b5MkoYvA@~kW?9WyLsNftU=J84%FU=uI1-qz& z1e^PwZW2CepU0^YenL2@YGH@)Zu1jQ{eo)vbm78VWF|Q$<=}w5W#K|%AkIaL_Q^~f zi|eTOp-#ROKBVnH#1e_)P3HY8s08{;dZ}0gP%Po!hLQr;BV~334uMWAl-Bd--#Lr4 zPP?Qdr)gAseNmTiQDw`*c6`PC1Bk z|3&YFAt(-S5J%N3gxme>D{!fPNgp+SjP6|uarzfLH$e)iK6*+D$1m-L*m8QjAGFH^ z!4#H29_}tYGe9>0-gpLnEkFNVf|O((Fhz0>mN{pkLJV{|+nAL!+nm@Nc5q(1;$0 zM^XlI4futW(0Z&+Dmx`;z%>=+F$`--08{c%b07caoO2rfcx&P4E_cI%*(-V`x`@j; zY3;gE`&aF}^~k{oo~)8NnyMR&zN(UV^8aqFW1e}|cCqmFEzbNRLwxxa?}InfKOla<+Aw3N@!C?SkfJo8^8o_ zI-fw6;_#rs8M>Q+4?{*lf6ip$gGD1_2)F*3nIb$OJoLNYv87o1MtGo;=rMVHc^Mg* zzJq)5cfvzNlfHv34fMZg$+Pso7znVXSU~|SIp>ji?}fH(>3^H-I{4m&4?q0ywD-t7 z&`*A`g)pImWS4M#Zu;G9Tl!s%h6&iR8RREo0+8h2rQ~oF4^Cf%UjrF-Vx~<}RSZ*I zE(2MIVn4)+wu!iV_&KCBJ7WozHtAvFJ})oAL?hICnfWHzmC33lUvkOkcX2xQWGg~> z@BaL}sp{L$pV2vjL?679*l!~z{`9L2m(0`GtD8C#ot^Q#F%1oEW0p0nz3W%&ub4Tl zv7>Bsdu8sZhQ_w8CH3p>X8H^MuC2*;raREK{(9zN$DD5BT3H_a=?1Nud0!pn*^pUZupA z00^Tj5tSm3ES7<&%$QX!=9c9_0)sU3X6E^ShyF8t!uA7Cb=}?d)XA@&a=V}EW*W(c zOu_RclPZ>-{Zx1NQ$Vf%1X5Uw9d3Fmy}|)ud-_SSfJENUoGgFpK<0AjCt1h|evE%Z z;>VXe18_1@Fu#N{v}Dy$lYcahh+FBgOa3nO3B5w!-!FNJjDG1I;T;eXh*@fdciwr4 zjDCtq-A8v`@^_NF?=`aGOWz0iLhnbEgMcy@d_;QkKk$7ipcWA}i23ZFsLEMr>E*^m zNiljMCxS`D0CtQRk`;cwZFtH2PC&AwZk-Esg4y{wTFw0ENVACmqI*lPKgx2}QEvCVye^Z; z7cdw4Cy!~hT58(tTvkqTwpOE+DP#Ggikowbz?sCpE1Y-gkZ|y`3z*$+64-JWdFkBM z*Ij#OYe`h^Gw4gVEuZc6IEwvFsdR;*#pxI9Sj47n+C_64wj)Xcy{3t;pT-^ zp1g)@-ZnI(|2o#{s+>8q(rfAp^75*M!p%o28Vqk=(~!6B6Rq}RU(=z=?xM1(WkubU zhnjpJYqg*F8xK`aD#}}&S2U^mP@|C3P(crm1S=Pk9!@{A(q$bR3U-;imDb8&gx;j0 z;T429XfFCd_&s7}e*eKm7kxl#5W7Zh_&9LS%OJK_PssaKWeGE7bk2mF(NjBbZ8CnPRDNY_y0vqvSTwEU)@I|E zO68Zv=36_MNF$?~kh8xcr^0{F%jpBc+=KqI8uz?&m(F%qRQMx)?AV_(LB-(KX^Hq` zc*ZkN%k29pbUyV*rbJ(s3^CW0uoy3ptf1(|FpOf9QHdS+wI<@yAcjwBu(VmQ6c=8m z6b?EH45R20DOnSoM;S*<`PnH@ znU-mbX3h<@cXoy%caE$qshO~gkdgW$q6rpc|}mM zfW4fn2@zHg?ak<`h$MyQiiQ`Lv=lS5hhmgJXsl0?YsZi4E)8$=c$QBnnXh9F&2c*$ zo}1qk)E{n2YI&bMPp&&}lpO)v=eQDNTY=41B&;b>thIE#&z#?7w)+at2l>OB;qvN; zop}qqD&bJPd~C*5L)|+2Gh=x(#-YO)hiLs$8|GplsgTtp7@+wT*fLZpU7J+vUEW}w38eItqmZNf`rIh|C45G*4gvtuv2ThuDXc4 z_`F(~o4xr#n>-TrA-kYAe{7|2#8J7Z{f-(gd;Ga>&c1)lWrqs;pUj`koHIS(pOU_D z^8LS$#%g*dRg)QD^LVnOJea-VNlv(W8>d}4abi{VBvc^g{(<%>=A~8;kSobx+W^dd z&`(FbE}}m!n<$swWH;yBxQ58)FmSG&`4)_se1oQtH6u;oagR#y4*UV% z$RlzEQQ?Bxx~KCmCdnIwnIbM2*apCK_K0`0o;qZC^gB zrnD~peLitnc+7HIOQfYaR@=5i$KjSiQ`sTL}ZLR4Z5zHCAtN>{bMsjN!6PEI-ku9@ESMg(;v}J0-^JMuS7w0b5 znX@cD7-?=8W)2tRaCYfAMyrX35sT!5f6!STjzv9;6_lBvK768%HD@<*NHttQXnIdk z?y7^F`IN{L?uU%rCUVHqK1zo@akLs-EoXkZnBZUz#7i_Tpn#3a5+TYeLYd_#dc{U1 z(h#`k#S*5uBs;gUF*loal*U~7`L0;$=f#;4=AN=BEs2&1-}$2Zg%57C1^v#VI#-t> zJzRMAY0~-3eWdazv*eQV6Mxve+y^*iS4kA#R|fn- zu&3e;qG3vLMn`=l-=NG{P!dW@q#yXDaL&2329-vr{@Uo%C`>lC=j2i0{4mP|q$wR{ zgn!v%CnO%Y0uBjp+Bjf5$TTk4KkHU)cFe@~QB_pz^SCGfJ*?JQKf0@!=#AcW;GQ7N zoi;maX8SBB zw0v&=GnX)%`~NoZ44HYcOdJ!a{DCi*(Pc}iWH`|I(H=k{g-Q{v<}ma?m=r%QWf!J} z8H0%E83q-u1cZqn?7c^L{#>B=FH!3BvbI-O&wt|5F=H-$V*bp7Etk-A)B;d}v8Z?J zB4WCFFCq`qCkDZL$3!R|>lU7)++0^}S32aEDj4OA`8fRuuF~3gDH32)EFsOzy=Bgl zbuV3)$8@b(Z6hmq6?u zdXVtQzxf91Fn&M9rzk%aFfXVsQ6;NGq(q#$=}<**)WJ{ZWib+A-;a)nqTVnf6_5cn z4t)>}4PzEXog;w~#$Z1ki{Lk<(qh}xw}&MofCb9!BjRB5?P=tIsR5L1!lWmvIA=!w|rhUdd}Y5$nj z@Zd2XuQLzdk4WtBzY3^hY>D1*R4J-QL@7{T4h1Gs&|F;1!b2qrcn-4Ri{yl`y@Yd0 z*^pzgBXmX3x!4)Jdgi9aQKc`rW~P=gL~>^9sMO=stc>u zp1E|DPH z1|+>G%%}<4&@;lb7~m`>2842kdFnKRX;3oaB^xJ=tNn^$zN#HJY2(KGHZfn-jm65O zv2|Y|sE=$MDk`P#+f=niuhp-qLb%_?NizMK%8mDJtX!j)P1?vF8!9)6SVmEIG{8bp z2aE9}WF=dHrxwk=qJ>vZKCOv%Yh zo)At7f2FjnBAx2PwiC{psVaa#f^a&N&m&A4FlmWM^^S9%ZFIKlfmIcYLA zle~cwab?#R3c6H?C69~O?j5+5(Ku}I{&=DcPF1X14!C@Ld06RKKXaA|hyZ9WLm+u1 zYU9HRsSL0LRFN&gn`8*8j+(;EIWTVc&J}Lr|J??}oqO%vFY7Pd{Y6}OUwA+M#qNvh zzMOllm$Y2A^8D}4UwIj6VU8R*BHYKNenP=LIsAo_?BrvlN&QmChJE`sbiAY%o;Ws{ zJ^8}+nDF|rXml9KiJ>Kc>Yu7U7@IPDQ1zHiY1R;GVYn5!>kiY=A@hYZ6D5!jXKm9F zjgDUbX@8jR^5dZ3&mH;m`~C4Uo)bA9>NwaLyc_};espuXotf1sT)&St6D)?TGRdDT zPCw<2Figb7ochV#|KTi>N(;hPVQX42l#brCNgD1 zvWp5s5{;f&-4$_d+2V?%|A$k^r5fdYhRjiF3}qc7I;+Crs?HH`C`>$a*KxQcE=)hS z=pzx^E@g3}=pCRZL~ZT#1ON~Xut5lx&eUcc*{uON08|U3d`6q&Pp<)B?F42E1NRRy zJM%GAHH^}96C?Sr?6UqhDb*1YaDnW1aE>TLszQtvMYxNSj>v)_3QAO@Im7ql1+=foE6>vkVT=e zML-E2DW}+g0qxjgNR(UI1)Cq(jDO_2P2H0>Z=T$}>HXxWlfN2Uojavei`8=j+%dd!-BCV*E({dFq=jrOQYQES*I7_41O!tkCj<#5M2QaG8ryvdqK7=gu9TZr8csspKTHAy4i_ol!q6 z<&!|m64QwpObHr;Z$XeC@yn?D)x@T*VtiL!l|DIvw7dzSd8F_dSYno+%Z(I9k_YJj zv|M0aC;$HDo7~;~Dq$pkFC_j<8=icM@OSfRWQ@v%95YffhmKT`I%QJSENWZSf?);l z!poo|oEX;_!8Rr%>f(a^n0^QrUm-z17`_DZ-=T;mxdE-G&1&Sa35xRsy&xnq5mJN0 zK!wb!qvfZ98jkQ>%^p&%D|XmjyV>G3!aoc_lNykvoS^23*1T~x2U{uIUmA95?=I9L z*Jlw~^}!~T5!peeSTkrd+Vf# zRppW?oSGxi$X>^L&`5?#8hsNQ=(QGe0tSE&-C`W$&(dQ$TdnBh+>We?VZv27Gv#S`x zZY2OyBt_P2SMC;6st1M5LWQvTL6yp|2gJf0<7BwUm3uT-o3rxrvdkMw@MpJCqwJhC zsZ*&j?k0Nqf?0WWb$PpuYUTD_yS6LUDAXx#+PCi}1wHVwKmF-3dLTu?Q9A&nV6oSo z@k-UhPdpYrmPL~F=$s-#*jh4}6K)VM{Y!r-HzX`A;+Gyg=WM=6{lGoW=DZ`R5fm3e zUJ!qT%nyqa{2SQ%$wGES$NUcb69&&849DX!S%_!9&{1|m^t$s{#zpXjSU!ThAZ`em zpMkBPEKH+)mURqx;F(k6X~?W8PDi4?A>1LBv62%KdYqIl(To)^r+k4rkHRibtuKrp z+A+}kFuI9BP}DF9=o3}v!~q124L~~#QGm2Yp#;K80}BN8x{HW(2&G>btrLYno+H9@ z35Jh4PFn1&B4`XL_{g>k=KW^r+_+su5K}zr`hwB#F1xI|d$y4oOH{&}z~X<*=X;n5 zfz3sWma*%`tr432PLpt_&gu7BDvm9EuOiIYq6=p1X{ncj7rFYuMO!}UiUBs)BTs*) z1o`Z5JrSoV`*u2pM+f-Tl<-D7;B|slWs{gddl4xwg@uU$RM2QL(h>#HgZf$A;YVLG zl0$wIQT7Opo4-^W&Ft;P9i#4#aYx_(jN}G|+H66>&7adGyzLmnne=3yCCIN}dz^55 z%q53NnLa4o_=l&E4%Pk62f{t%3gK|tBrIdDXQSypVUnQ#)ZYSK&Dbq7n*`JDF?m)27D?iLX(kMOA%T@ zfiG0Ffqf_p6^<=Uz=~9Qb}N=Wa;dfq39?xAiLF(tr0^|+?3lV+4bD}=FZvDP!*|ZV zleuo#==FO+)Lay)iB4#-+S-?Fy@|QJIIp+>9J{11)nNVZ*TGkL-3_oO9~YaG97`l8 z*{J|YePRu82%1q-h4#rUt33k4Y)Nlow(4E0rq3O23t7Bbe$|x$vS#+eW=Ftc^%IBu z#`5&R9&0=M)JgGTyx2DFr|X7BOXMQjAPG%>5=Me~z-OXC8J2#zo#gSvuEokmLq13>Ks;moLJ;z3yyYjIm? zg0+BGvYJ>*qa~#P6T$wBIE>PGX-G8vh!q|}3>8NeL~*NpU@c$^L@~tDK^DVraY>x& z?bc$O#cGkc2@KvrDU$WVlNFHR@nrPQ)cb{S2>N5OmC_7h^vhB+a6Q4DaVe_5(lU!# zw4+1&r_Wz*i%LbWS3HQz&{u#fCNW?^PSAZ(dZ*GecfnPx^t#xIhor9}Uia*q{^*2( zor4b~3k1>VM86!(%Z+PMc6V6DU}B5XdIGL@P}a@}*xZcN_4A&%c+8lK56{0owQc&0 z+cr&|vU&5AsnfR3n7%D_{rtmp-xKq$XXeNZGSNw8Bf?kHe2W-ikXB#O|-cKR7uZ5(TT(GVQ1;IKD*BA^?N;j z@0}ix!ATR1xOEQ{YHbdiSq;J%Z=uHSbC@*_zsJ8-uF;r^io9-jp=FLI67~A6TB9W( zn-kh*Q+vJO4pAtKQNPEeH5!aIo6)4#n%(}Fki*jDi6SSb_5z#QlcAS z@#%&1i23tyME{#Ci!?+UvreNCDv`Mgsb5hG8a^*#cNk6fiCMnPiX-Hp+aBztPl4Oh zyHn6D*0IHn$3DB=tiNbPC^UlpZ*J0?V|6jJJs@Q`rA}qn+Rc8tYS7vYi29IOYhBsd zuG*5FF<(~HWYziASy7zd5#-z)PSo2q#2&G$?fT0GFSTxP_hrrNTFu!t*=E!SBi0Cg z2=SRH$2YzncHm7u96A(;d=Z&(Qi-??nsK-hIGvf`4q1jA~oib#XKO7tb8)6w1$r@c;e$bb_`&F~Ni2jzvZn2Fw$ zz~B)d_)khjggJGS~kwcJ`S$EEhn$FG)b)C?Be?Rg4{?f);@1;dk*(~!#;TB_6ue~koujG{(Beh zUbt{KVXkcLp4__g$fK)QtXTahxoGr)j=G9-8WhCenK&*7rYIphp6F!0FZDa$cKI}A zbC$PH6CR9|P9~in$MVcdqgHQm<%JWmV76W(Ra?!jyjZd}yEEKSQq&abG|$;JC;bSc zi%r_Ko|C*fHU5MMZZ-d!_K;<@%9@Wx|6OFrky`ijgBLxNotf;yC;P z19KdM9L-wjp>Ck8BG5)h!T0r&0%+sf$hTN2Lv zkjxKXirD2~To#O4g3+K1RK6xdDPT%wEeGp9$`BglwrgN{jB|EL-iaRh)`YmW(^uJ7uLBa*m(&$7XGI-Ke zN;nA09{>_C7UNiom=;}hVi~*+tXPQjh2p-!$Alh2G7T7~LDWZk#B@Y`_||eS0j5c8 z+}MXS8)x<*jNC9-9f5cm&Im-bpfa@rDJ#}aeD&mfrlGy%ww*gk?W`wa$f&eubjT!agn2CWzTsF$9FQLv-MyCyzdwe%0(XgSv}M>Fy@F$&>plh^`XnrC<3lF=|wT zxwE#mprEjD7ST?yA%cmit*xpe>+d> ze4^cc(iT%F0-o}GzhxHDd0~0Nw%;391a(%WY$gC>p7cuGwE}l#_6uJTU3%q&Du-Sv z1BNQ6(xHc+GOV2wta51Ju2zM;w9pK?-$vo<7hb5Tx!}@jjIK(9#}tXZhOa3(4AZCt zeR8mWs=yNvM86y>IS;5hz*qP;0}qHi0D~PqBaSeil!iUQlCV3>8lbEi7?siLw38X7Ay0^wp7>Q~U9X90Kmz9u zGh;-Yf!@kam`UQaU~ zKC^g{E;aY>7jX`w7r}f$FY=D2T_qmcXkvb7<8v^QFe+0lBwIdIEMQiJi?iI}QvaG9 zFIlAGEc-(x;`Yw!xJj5VRhrI|!-jRvUkNW&`eTdRs$1-4wL%XTJcV-aZoPtMmT%{l z$~8)|v|`{C&B}j2h3Jt^>K>w12|Y-kXd!bQUbiuM2zE$ z5%+bOo?z+mdio*1I#~xKh1Nl9@bD{9rvijuq<*AxPY@W|#D%3Lf z|LDW95-oJ%uc7PzKjz*$Fsdr;AD?r})J$)wlbIwl6Vlsc5+KPWKp=z?2qjWO?+|(s zVdyBJ6hQ>RtcW5iifb1!x@%WfU2)a5#9eiDS6yFsbs@=IzMtn#5`yBo@BZFDewoaj z+wVE&p7WfiejXa4W`Z0o=tf#%Y#8W@tEJz+IKR>U~HRPH7}){FA_g z2@RTRpp84qzJ|6Tbl~m%2s1O8`iyqZ5(?E!d*MNCf_fBIp0pN>Y$)^p^{g6c-qdT) z2G|`q!rdp`_EOQ1xd-;oeZW1skI7UsOBvE8XfB>qbJ|9n@GEyp#)N$*zuR$;iHTMl zMb6o*mJJixJe)xE3Q6_4>)`+&0VYGZT=+r_+-_y*&qQ=9TDu^?KY|vD9{9zI3DK(5 zME=Du$arMS#9PPZ2`ya}-Oqi0SJ|R6){pAu>P}GuxC!H>S(E&)JRvc zK(%pLIt!%_Ggh;J!P3mN(C&zQ%b!{2zgdp>O3i+p(=nue_40cDaryCg10&jdx17tO z(^oG`_H-m)1cDqwb`64b;Smyx)_@t0hzGhdMCC4<9`|!TD8jm$rK?L{m%e7ES5xX| zjVv*(Fl`#N^Ymjk_TQ;du2gC}db*#$3;ZWOD(u{Xf?=5$H@|z8nKTK#24ycWnW{7M zAKQD&^LZK7DvgHE{3S1zo_>f1NH&P+M;%Csfl8EPu7x`aIkw>Sb*g?XAd3zsX^HUS z;UC1y6~<^aDLl9k{x&4~;8i-HtfOnX;mQ^KYx5>mteILiZ%SkHXs&4RwL5E-R@LO( zM6u}hNxwS1`A=KMZudb^r4d&kLjbo*jB_XUZm7xw()$Npp75WZModdD;0bDHwr`R1 z_{sVCpn^HUU7WwBZ2nzSn$~Q2(Y)xssf8Q^yiQfaGpCL)?csqTYl$*OC+Z@HVq^XB zOye(GF$~=Qgsvvqt>JX}F)?~g{W!WMD}jH~8i`yrp|6CFShk_1l1@(nOjnF*SpCVK zPZ>c(Klp(l_zKcZz|T@YCZ0yA0EZ^D{lW`$b84Z^U^;j-tpQBvB00=t(w>;jRGNw zHbmPcyBkeUMyN*Dp&<=!4Z*9_kr2sB-A2w*DIcMAtDSr>qu8;Cw5OT*sv9K9fcGOK zSm!4y(a2K=dfsK5;!ihJii?WuI$xqIGc`8d;YdoW%gL@wbJ?B#*wjo{qOWdT^k9m- zk==Ptc1~SdlEaZs=lt{%`6zA(m=DT}5dFZ2(yka(5~#H%rX*T@>g=_aAidv5RVz4Y)D3sGFSTS2r^}yJIAKH`4lg%ntx|R z@g|#cj@ugfX#OhfWp`jJqBtUbHkZ4DSHKDHin0O4ELt|2GH9gHaP!L}3}X%RMu9^v zuS(%Jt&VKN;Q3N&Y~gBXg}t%bWVW+k1Gq)5L#s5@ZkEsLIw^XNABqBodZ8Z+V-=0W zNfK@`WLS{B9Hl>p2R#J6Cms(mA4-IIVD5qlOg);Cpn%vztqY4NIw=`LQ{iB&^7#Wa z7a&uV)>V||WdnY{zt5auLkdb=`8s!>hE*dQPt81kI ziO)fk1BII*_SGJx{lTuOLY^sHz={3|Pb?n%Yie4$M&R<(ilKI}PV{R%0}AWba;7QM zlhO+kSbd)<)y`7?fZ^f#8IR88g^8yYJUP*(>zlFUnxzNtoZYl6N1f{El@=@+k}>b# z?4Dj;?9= zS6nw@ob*rWHR+$@M%;ibXjl5MM&Dm&83`?45etEsp3Zfah6&wn{SbZWiSl#g2s8QF z!b4X)kx8BIv0a|9d#)&qO#jKn1JeLSU&g}PO{iQL9$?_n`%N@9{Doli;kV#$3Nk1^ z#U4_1qX>;tNcxH3ovQtK_!)Q;noSJxssaap?qI9Elad>s5bi2j#ytCs3 za>OCS+>#mBw~`ecHs)WC{zzU^cx+5Je#R3lToHj6;g(tCOO%@6wkpq&GX4R1 zbtJ>0R7-sa=3topyX?tUg83mJE@(3F#$*?KY=Y=`;PXg{F}hsA=r60uXOmHR?c0m~v#F!u!V#*&AI! zFCAz1AzPG%yv`L)O!?wt1!(?ra)UJ3BIHo!{9Yy?_5{>Guyf`FChX$Fc_I zzkl<0r)IOI1!D?xv z|1Xy@#d)U%ppGeWtaJ{l2B)wBCoHNdN?uM*O~xylSFjm1X(4SGMWdi;NKxSuf(5t$ z(yq)xWA3qIH}GW;dPcJn8YKu5f;{oiO;wizg-JCFwS~i3j<8^y&6ATjN8`%xe@W3ZTPIsDF&xo?<=iJvK1bU>vQqQpAR2|98e;? zywn>Lli7c4!^k9)D%NBa68o3AL)UnD;d+hQ!;L5&d5@<^J+vey>4Buo;w7UeC9Ww; z>UC`7uuab)c08w7zw+VUfg^7(8}2hqI@xh>QPckSg{{)#cJ`ZoB^^z5>Wnx}rQ)|t zm9Bv?Y4QiD9p9(jwKLujJIq}-HB>Ae=~c1k&Xe~rE;Db4B|o4OT`5J0Rv@-mt!atz zj@X>-1Cp1zVgT55j#C)|HMfmO@q}V#n`2Twx+XYdZTw(Y`5GfTH>Yk!#zc-pZW=AdnU&ctSGLmPRA#Yl%*st2 zE5@3|99PQ)1!p??$QLg?_qS8cq3YGk^9J=x+wtQaLmvIzOJ(X93s+Gg81?GDFTVN4 zi)CtqLG-vQfkdF``vU)J8+thXfiD0dYXo1A1iUiY;}P;M1b7IG9)w;9FLlWY2N_j$6R}D_C#tuFLyR zQg?8Y>?h+f4n;=rDT>*O1&SreUa?-W86MDk6bIlb(X6-=xcVo7u>QE>DaBdEvx-;o zHejCOiI7E?piCY_R(m?>8YV(eH+fkc1o9v@DE}J~P!EEwJy^lDDl0jm&=M6(WjI1} zhsug1OnxZaJWem}2`>S^DmBPMa~QOGSg}|L3CHQ+J#ajM_k+p-7#qsBCaS65;S<0J2iW7)(J59wVcB6%k{?6%EJ!OsS@Utz_$(y8; zY_=t%V?5*DFrIlzZ{ki!YtM2>w{6Pe9$-Sq>~eHS?^dvtrb=lv8>;ST64@AOhk#MC zHzd7!sHq55P!v@j9C-9X0WZ0+LTk2bC|f@z1F_*7DLz zruI=vvH$QnNO|>oNZOsqiluu5BhEgp6xpgOR(aQlPoGxv0hs4a`qNCWlU_c;dVlqi zTDma!WiF=mlT6^9KFbP?yQEJ)%wpTyIW&YF?FBzULCQyRsUJR;KJU0*`iv#~`OnpC z4l-gG(E_)Pgd|FRRmT4(%sYi_RPEM6;$3%-Z%5%{n>c_iJhrLhpPL>N-gq#SBPHg9 zDzo{9P0z5IZB?7kp52`GFuR8^%q3e+zbL)g1bTBFEEJU4yBB)6py1I-C^!=N&1nNd zCbKBK(G8K1;))gUZ+7rVPAR3Vw7t$6-x$fJPaG&+8+m@w#PTMtSUR>8IWwlE8>A1U z(8^i-@18xi?eGFN_%(Z7r8sxBlq5ZS&Db~Cl-F;l9Je^~taR<5acm>kyS*=)&e>K> zn6*kON8)>1LFFjt>#TO+!OahJ(gx)D`j_ncOO%}4G{JPx7gXF@3{UmqLN~)yN9>Bc zpC>`rSsX-oGVPMHLph6`su_njt$XR&Kiz!upPqdwyjDEi%D68N9r}`S(*JBYcVz9o z&$k{p(E9wnYv-(faNH~R-S=Ja_ctH>=)vYCYu{Y{=JESp5mvRUOUK`Q^Y~KX!uq*$ z+wUr^XJ)0&pP$0-5Nl^v=I{ zJj$bjzVt*|k!cGIjUTvd6KyVeA${ty&7gHGB<#Q1y14zTyV}$4`fA-A?XMQk9G1;8 zp5EWF&#>*jJebfrN6kWh2{r0A9OgK6uv*5?N2oX#x;mx`pR@Uo*GrC8yA6OX273VP`NcBT5$Qr0j?G(M{{P7piqRt*) zN=el73s(VL`SV{oUT6>g%o)xA9Yvu3PritOk*PmT7!2X&#aO|Vk=pG~2a{1WGXR_p zgE>l4UMm$H7b0r$wzikJ{oJv(mqs9+QS`6EILDZbuS@=&Z5%$wIA;~Ut2=)?DwiM7V8y|a2de7gte_wyolz2Y5-{hoV zNoufec(7NxJ*CD7ZahunGQ>M#l7ayb)Ka^pQ*2}^2^dYOPAi<uj~;F1rK7F4-`>hvE3z-Vn_W?n%^t`Kao>fq*aO)WY&#u0N+&ig zJ}Q*7oyn@G$P)Y0@>jpY5>F&PG#&KoJ^YRX^+K*%Ss=<$$y_-}L{UXErgc(E5-&jp znr?_BbPwuI#L%IiL?tQGQxhLhEFNIO&2PPbbo8M$OJ>hnvg%;{q2Ii5`}B85i|$0V z!QOX<^!@rRpKN0Z=T@CRx@XJQI$o|_piwYoJ1MS+k z4@{;Nph^J0Rz&vw*R{6pWnO9y>5qG@xbr22mF}0)L#gr~)}4H_qp>6$<~$925GmFS z&0^K?9>3KCfKji9ml=9*)MPGa_6R~d<|%laTO_^BzGM?4)z`l!wMngf1bd$Dc#b>y zn)D5~h>eq4r8agA3&T>^5wi5Qbc9S$4}>iqA?)E5ky+fW9UZ(72IOS8<1gH;@(K&j zloXa+bBDra6BOoL3kUoHL_@>&^ECv-8f4FE#sp1A{n>?AMziib z$qd)|3UYAtV1Drc0u&k(6_1!N+06DIJd)YHfVjlPDl1-ccwBwGrPxwmkM*Bj&`JO9 zczs)T=dI|h&|7Ak>vWhY=o3EevYFqaC&{Tq z)3qak!8J0(ysUS8nYK5}M38q_I^SDc7B9UZ{n3JhIN{&iL_m^m`s*5hGQUi*X#Er` z6bg?OrWdP`5fltDi&4H2EUat@&_IR9LpUa5W4Rg%4tUpe(;Ger9WZ1j`qB}QTf#b^ z3yJPJRD~)R&xINrsUgCROu=#5G1XI4iK;2pV}O@}KOO%07*Vf-`?EeR$EwxqVsv_~ zH78B)v;dStjN$1NIP~7JcXh{s)q6EbIU@q&-f?ixy=5Md=FW1>?>pa>4E#k(Gs<^oc+1PZ8N16fN=wp54FANlzWFAaH=&b{ zfQAnN$J&Hh3yED}MWOIH7)ogV@}!cEsZ;SyN(m5WYD~`QDI`rOS`C|IRmP8uznuy3 z6YU4j3nT_Wj2)#Thq^tT0U!@=r>Blx9f|3`@u^wA`q~sTeE7h|h2DfqiUHkf@F7ED zuYDvW)BRyvr)4E^ilw7Jav_Gs7aQ@|s+U+3X3)W3FWt2JrdKY!z4Sq+^g^o5V&0dV z1qHkqhFbheojd#ItY@|lQRzNyUi9L?d3B#|Oz?MU#uKs^g5D++Bss#_E~hJT&JrXc zz?^emMMC_0k@h`{lHJLW=t%Jn&Ha_?_9*|MfFDXLc--MM6MEpA;3i*GXw={t1haxc zP`O~@;Da)-23idkDiZUq^f)0+6fq@S=PW6PuYLV{sqOpMudQ0PYG8bpASTE6ZY)hl zG*aHwjnBOO%*LsCJTs=3HujEB7KN<%fvc8PNnxb6k3uS-^=bnQO7TWH*Hy)gvgG8l z85Q}%i&JB8E8I|<5bHDvy5v-s&E`r=ju8y8&IB#)g!{#$77yo#OK1lAl0AaH(6h4> z(VSQ$yN2aB^90#@%0m!-u!JJq(ht2_FagGX;(L(h1it7V^eiZib?`=sRIu_INiKC4V|*i)2yOAx9uOS);1I@Ox3+wfauYF3K4 zOuA;4)LOn_QC(VE-J%WUtrDkDYIq@X0)YDCI7@<^#YJY=;(>PkSyL*zZ_nWm%{ET# zC5_}x+2RxIQr_V`A6&?+38kflYBDbn563}g9u_;~*cxbq6e@C1CRBO&B}a9MFmZHg z>&!U}3RApc!IDO{B7B9g^xk`|r1yg^5$eF`>Vbc3h|%r%WXnmGaS946*%m{#AHL;7 z=?R!_dYl?{EfP$pnC0-+&-WUwd!@fx$VwEwO6D^=?VyBEslcEkgpa6}lN3z`4yHZX z0PJK?bdvJ0Fj_W+No&{9n%>9*>{puinPiN$s+-au%71qGl-(Z(C}l zy-X=>xb4;D(X;8Ib!?q{o3`-fx)3Rmbs0h!^KMx*b`G$h3KiVGf3^t&K3Le`N(YJq z`T??m-Xc>Hm9neQeEFW!XjHi*jq+ootM5tgo!)c20)egr?CPwRuUfLyNo8iMvLbTl z7wD>#prGjauD7x7YW3UykBu=V=6-d>2Mvl# zTMd@Tw#(HL(Xa4!u(TMqUOM{n)hmcjWIp^F%XAv5s*(Aoy|L%plHZjaTRM->L;jn( z(Yu2hvm0`_bA)sevFNaIg4T5+6&Jg&Yy|O_8v!qQUC|6pyf#nEG;`oi7ov(2?tsOx zW$u{H1LI1Mvb{(D%T}Up@bb~XA}v#AsS~tIo6y!hUe3Hpod>3stXub!RwUgIXogZk z%z6oQ`n9kwl4ZuhA>I2=`@QF9hzRu%%$g3QTQ>nzmM@SQ5=@t%DGc~QxEVaeP4Jqc zE{Alb9FSjsl+J($zLMM^QvCIE_uhN%b>{Eb2iB!!>8wMCW-XNs%-qH6SFXIC z3q3(Y{R#O1|M$bvH>XTjkfI*9XHkN54q(mprAzIAYmU6KiOt`%2|=Delpg<6>)oYM zq5=0I!8m-lQR)EeDAT#pyIcQs9D(S9f?ZOoh&EIM?{pHpqp#BEz&v%nL&nrW6Gbh|z9nE=Zz&d4Rf@@`|1|q{5LbefQW~ z(y@Na-`H2D*4*%?Z7cqGjog2Fym_fl%A@S)Jyb3{)5Cj6+>5ufz_Gs;=VK3ci$ultSBF&OH3*5JvSrRY&ov&|RRcDKAZ z(cw&Ty~QfLtM*D4J5(^?V^3o8Thg=GgEmxl+BF8F4JW{^@$+qnKJ#x0Zx>;LPPL%3 zDdoN=vwA^5&Z75q_c;@~T)1b`pb6d5zaIJc$>lpxad^4*pst56UgwNs`X^hT+WSqu4jr1Y{0Y7^+WF+oE2$aU?qR7TA!Y3_<4M?r;FMCY> z>^ypYr$&JXSqv) zJkOTO`5Ya&wv_O*k&sroHp^$Wtud4XmQ7u&@r=;Yy;MG736DQB|-Wj=&+b6p7iRe>0zW&L)D!&`j4@G&%F8+)rOvC}XxURy=?4n#mJfM>!i*&PxL}F-W zkK9IO;HJ||)yaiLUj5NCL14o|7!omTpTvmD-|p^AUS5hQg_f_|cA5JFKL-naH`m7n zI=RB=4=O-BzC3o)xxBqV0Xqb!Tu66N_d)rAQ6f+M;=QQ_1*y{N7hRv__Fq%6 zbo;TFUW#~VpBOGkZ9AD-z}0_ob4dyNou+y3yBady!b zsk!m-lN*MHO8omWr)7?;DG;?sk|%t|#pff(gj0?OGPsDT8jDC;_neTvuR;&>6WRxhYVu;z}Q4(tjcOss|yB*Dg8?( z$7qdB>%TlPefo(nCH$-!{@qcKb>@6!)v8ydFK_+LNon%-`Kw;x3K}$`)|2TElxOd4 znm1NGzMq5F+ilxb_8P59T@woAsifhZH^I;PSC4-=bhbE?ZX%tNzIxlhm1xPGGD9ey)#?$3zhFH_?bxWu38Tp`)Pc?nRWaOu>(v7H@ zlDf9o9vj%k|G|rRTJ#G<8O$^XX>W<(?povI(@G+4a&HDuP4}|f?kLjO$)v~`g&X*S zz!hZRIEaPq;YHFl4|uw~M=0fi$Bt7-bx&?hoe~UINb3*u)8{@Rbbc6V9X8E&&~9{n*uB*L8l|I+P0y*hf| zNK4U>ZwhW$9hk9v`s9A;<}&=58;4Mm8R~;!)xYHW6)Fhbu&aL56A>mLqh-iT)S*Hi zVh9wVw0xuvlQ9-lBDsDgKH@D7cZu={LF`@K&_guDLmGUhP(n_=q-cY(TUG*b23?^S5*O33rKQWp`|kc5{)N;`2O~X&znq+_Ev|3VnupxP#M8lT)F{tXa(Ls#n=<(4Vni86uEij zxr*|XIyD@2Vjt;y08EWu4f$gMAVxChP$i+o2Wl3vT ze{-rKhD#EJ@$K`FxbsVGu2WcMOEg|m@UuFOGA&o#{-?NP{RjMKe8)2bxiy?IQ7L@~ zEfdOxcE*?_JT62j^u$+(_uY>$)saQ&N+fmRWYqgDRx#?5Qhg_K4@cvaa~1tzS?^#< zW`Xyt7j(Wa8^}hmNx-38$$rhAWADKLBXMvj6bUJf)Gkm>Ad7i46SLo^49e>yI{B2* zb1>K990uf+PH-K6bk+q9Dnu<+IR{;@1H7{%dPl))ptQ$`M*zGUTr;9ez`u}u>kM>G zdt?g*8%I+e)b4ngzX&&rURUgJB1?hOLAO9)H9pXprr|v~f`#QgMR(BzNda6c;P(@r z03L%p=H<{f(h)kKOoh=j`b@ino(y9E)c&-jn&BEcOpjEmQv41l;wO9}o`;I#a@++C zlTUGFbVU%HM*z_j)J`r69t!#tAQWWU3>5J`RR9)gdB0CAhvqY&gwCAycq!YK3^4~= zgvuc}i__2?MdiRTvCB_ZqTYCjI#r4M&?vJKP&BlM1bzo!Ovr*hl!mHR9HfHCSApxH z_%)>}6=iY?K;_1Ud`+soz)RIq6(jc}KB$j;D-mGp)GFlBi{i77)ILjGfMX*QP^lu7 z&l(5Uruqbjqf|dOC42C;y!70*CHgVZ)g10+)+;q3rPx=LC^ij82I1Ce|5%%_=(-gn zxbM_f6&oKe&TDW)Mnrz=9GeeJT~4&Bm2rjyl}4ACISiqiVXrP|R(u;|{6mGadqmF3^XjRN+iBC;*8a(j{I;}cU z@07mRjC2VJi8lAJ)Hr=VmtN#c3XOwZh76tEVRBtO>l&%?SQ8V{lltr9QoY8)prCou z(8rpVof99&zo$0yyxyFi#bTw_FYdbQi@S>F%w;NV(uQP>AWGk<0n_p}Cn%M=l&#W1 zQ?F8^1u*a8faiGcX6C%>K4w4c0nm)O${1f#2u;08%PBRg8040<3Uf<^7?%ksjlYiN zigUAK)MicZBsK!MG5oz&H;Abliwno-ox*RPpL%?X(#a)jVzRVWpmSMAb2e^;|)N>Gz+l?B(pIZGYpz!&J^?7uV3IA#fDWGz5!-lJEpLB;|`NorHQjTszjmC z-ebKXp;DtqKHLSOI69@rx=>|QXD6fq?ta z-5z8G>m>ry0eLfV$5^$`?5;@f6{yy5`LRZHqQn?YqRFDyXcJv_HU9u$kEVOCO|l9r zGPd;AyA6iW43kmImagUdZ_S_Xj!Uu#)}(89BpZ5f$xs?i(<{xDYZnP<%WLNGe%~&u zMWwcF>dSGPjxSq&{P^-^k`Em*VFd=2jvv(TNui+u&2AetQZ#Ze^;sFGR$5FqCvh8{ z`du#s^Pjs_ZwGu6VGOC*xC{(QwLV`|1K0^SVH%s+ssr4bxwJx~&e7|W($FlC%?8uJ z6}p(fyy8F|$MyZ7qGWMd(e^1woB-f1t5c`f)%Qzz-EQBPpX%Uwdt%=(%Pp?*dDze) z=s&SGi-0^1XD9X9Sv)Tgqgz>RGUTK9NQ_N9Lq83GlELp9$zvM%ysz-gU@o*P>@ot8 zBvrYXgP*h~k1U+C^6S?vCHzG9{bO7&w3J&?jaj zO`h0T?TZV?l6?;3_||BI3Sl44qHHcOwkQ$U=jhB-M2LSD|0j}cLI< z(l?ECuyNw1O%tPQd(WNgxDj3x#L3bUEsH+V89N2YUfIe7UX1~7qNg`14158Zng(zOWHZZB`0%GAORjEQ%lLEDZf_T|T3sl8!I;#U` zLC?`F!N%B3r}6U1%@mY$MVS)1%M?`#QxHb|q%`cV#bNea923nMVrzz3v?}Ns3Lcz1d|VaGZ6{zYv(1C0 z+pqM%ZPX1Mi9n&bNM3gq;|L#;TA-r{g+kJ|O$amzg;)r_FfI5sH8n9)NDQ}1jp0aZ zYk2S8a4Y8yvu1fU+MIZv9M{m5?SZ7OAgFjHo=>Bx?N1NlS0B$s*YYK&MZ+^&$qq(y;2J`Akhi`c2ew>|nRVJ|Sf!+aP6 z1uA_3C6dCF3pjd}fa9HiZMXut9k>Xpb%|a}7jksHyp5k|E3{*c{y2Oi_|PAG zh`OFh4RBc&G$TqC@@WrJis+;irPD*bRt2ROlCzhji^!QyY1+f=I%C1(1tSq(+8Eti zlHSo+GH4`rLZ(DJcgdJa%=4rhKoU48cD#7g_!Jcr?WTl_Jqf3{>OxY?6EV_v%-xQT zUBX^UPkbEd+B+0ok7kMsTAXo&M~7hU^b)=q#~N`GGPzUHO7LiUnVon@I@HOJ-Z=_6 zDirXC>;@!6f{D&`N1+2C+EK9_`LL3i+Z(_!_!&XEfd~XsfPsT%7pdMLl?I|2w}EMg zTKqJ4TXlP~Q?0%AR;}8pcRBf(9XpU=*4aMi(;@xluMTYQmB9vauS}aUf6bctGp6Ou zPE1_?*wn17sgJFn!PktbDh-XS0y`;{vcC6PhqjmsMA(v`xE#REiM-7hCt#Y66{;ft@pA0iz} zSjM^~tb=&Orj}C=FhH${=v%+Jm=XiYNEry&a0^Th zBfXyf>(lt}6&c)%y(v8>eTO@|xAJyoIC4Z9vg7-^8t;(adGcQAk0)o`^A)eWqB?S) zQ*`rc;4Q@;&B8y9Oe4?x%k#91=@+#jfR9jyt@?H-ORah#q_>7ARkh39fB@D3W3KC1 zv&<;a&PF<|bGI<`^2w7}d9$oZp~+O} zUY+{il&BYt2mU@3DjYROmt#gF2W44BEOhDDq81nEf`JhYWw1aXHH381y+hdo+Nrn* zGQlg@BZi7}u929YwicQ7X-uy$NOoFff3r_rJJrtqMjMfes@&YFTw(Xb8~1JAcjLtB zCDUgMmLV2l_Vgvy?TV}I6+)DKArj)lxMkb-GKVQIL>(R~uayoQSSqiWaPQozjwvmWi`5;Z$A2@%HvTz`RJQFbywZnQ^%PNos)tAUBF@Ka(SRW84X)B!CJ#z22<*6 zFILV6JQ&l^M}Q6(c)JH(8`__uVljNax%qswO+r-n#_nxVZllNzLw7H&?od=O-96Om zbXsXk=-Lv)$T_oU?p$e+)PA|jkP`P`MC@VW<$aO9N$Vf_Zu92v9$KHI@}zrIS8hh> zCproGM>Y@@;Nkzjs$nMc*boqi&}q(}iu(OxwOTtA8vYwi|HV6pd_H97;{N}6O{&Vv z+WKw$`|0(`$?H%5eIwCdqWzc4PO((~o43=5~p6-pOh*OVS)S?o$2~{+?jdTqg(ywmH0_V zD%`WDkb2Y=@4*P`b`9v^k4Q=o4#_!czsI0fAd?iXC@_o9#e0#hy+pL-V29`mXdqPPkfAXtkqjNQ(vnVrWf-TBTXy%VpThV+J86Ln zRRp#Xoy1s_v=%@m47R+Ohj8Q$<>ge#i&R$ZM_w6-#oGB=d2fN=puxe)0#QAxvb3tt z?34ue^qu+z%BH$Vc+`C9wIREv=|ts@$wfJXgfPG%Cg$}+WMsYTKKgCVO_kpDSCH5n z*DH-ZoYw0H+U>qBy;99p<%HK14i#CrAf-58b<^}83QMISvAK0k%SW;FnwhQBcCpDD z?E`46QTr&Aji3|xKw?*rVpx`w@f!#AEj1H04z&!L1u};mB|_q9*O}dIf%q}x+2Err znV;|_NIW5zU}}w{6RO-*6RHmRLV;Rx#SL)}rWC7&h}cK_-4AbHnrwAW+coDF^$^2# zBO-Nu7op@XQJ@X$hVgiuNT$^GE*c)VO9#;?@nOf$#J9K zcAdcO&UtQNnXqe`S-EqLWJu4H<`178%;gmQ$ILyD!XBEoODLoI%RG#1>xFj%ydpNI*<~C9GFl(tM$4k0N>uX1e^R$82$DfY?lLM-#^|M8<&5`68_?lI zW}+zONRW(_aFD}MYD}OJQ}BB<$_SQq*+!ufh5XaUDxBptqSQY3z=64ovj&epFgGWg zTZWn7!2B`N{S$6Fe9V^`4k@*!YL~GJViIz;0siMG!tc|X;FCr^q9f8_xFK39z z5-I2WGH22Jku|J7vluFZ*S4ooyO$OX$ni<9gm>i!MAz~GJ}qp4=EO~Pa}SvReqe57 zdczL;XeamLz`=%~C#On#NLyEMNr9EkdUd?r>nI3mnhinTd_i3sNUt)y6hfHK+!rb` zXLcy8qjdwaxZ47?>pc0=yE*06Id8mCouwWT$QWb>#q8{RvOJh3vil}EG_c8|{0VqtyR!Zfb$ zil#aV30s_eQu;?G-UNINjDl>lDw0u-0?ouQGHIr^Rfa<9+R@KVF55$ zL9={*3VN0oWRD^8lK`fee&v8#z7vuJ@%hSBp1jjjG5tlyuC>Q18Vqs$7|RH0l1ZNm zcn$F|c17tRF2fKn^08NkuC~t5i_27NCz>~nt>0*?pJm%vf6W%dgjK3*wLwQ-N`Bm& z1EmF$*nf1suS|32`aPO5UtWmc96wD{?#r#>m#GBxbaj!3do&}3wU^WuVW_?y8pI2s zTz{EnS^NRM;*w%=E!$ICnC)O6Cb%YU*N&b)YlL(syKls-rDL@>OpHyH6sk;-CEeXEy{d`^M~UA#LiWpps$zpKvy!{UCw86PWiw7no zP1=|^!8E%nQV=DC`{xYobKtLT=B9rU^MRz0!mkt$p_Ww?B37WOaq4@$`j(`Z(L4|u z7aU$2XykeahldZ(`+yr@AFJ9n>AhtOq}`zrQ8GB^mQ*fv?g2RGft&C8cD51mja~(1 zv7Mp-OGapv@?00KVgP|-Q5U9UB8o&0sS$u?X_TP|8;v#u+1bLLF4)iOV(`qOG z_+Z!c5$&Z+J^^45xIOwhq5%T9hKM7@C1MbZ>b|+VoTKeK8Y0u@9{9WYz}&h`iDnS0 z1p9#HPkMre!2^Q@b)ZdE4>-K`c(s1Bwkij^n>C^KO7(@AnH4X9D%FNwGE}8QZ=0Ak zKsVaD%RDF}FhZSG{l*(P)#W+TyZN4VwE=#$v*Ot4NfV^|$IL$frkh)qoiq2q_`z9= zi4aTeVofm3b?k6OJ{xI^&#BsGGG$s4rH^Pm&BYomHehAXa>Pbf3|N%&CFdmlC=^Bp zZ+30l--!od%UJJtpe*)(UenI&eMUaJ{~-y3b3542idFMO!6?b2KL*5!Ij$J_G7Sr+|rgT<=t zsL<=Q<``~>G#0^__eLIyF>AF3{@EC_HF6;~L6xdO(3hF2gbH=ySZWa2+&dbFKp^3e zwTe+xxh{U56e!Uk5YTuaB}C^z2aFt77)hW|=r)j$!9=k1^^Cgqj;cXLuOmT+^`K4t z++l9Xd(sZG!DMC& zq&w(71cMWseA~_!yk3%~qR#;naQ4Kj;5Z<%w`pUifwy#_ugmdESS=N;VdElD$UO9S3EG< z^u$wyF14y!M7QiyqR!sd&7JEVJjVu68>}5{r%k;7QkgHVkQADXZ z8=k=_bYU2mRIwLu>Hpw%&){~rumKQyKkbyHtNsA`x-_(n6?TPamdyb`avHBdMaWsO zt54Qu4p-qWPhP7B zf;c!c(gu=82Sjrs^=VKnkxz(6PJYhqfFn&1ZtFo|V{lk7IIP3JxOp-Dg$;}AhA&y% z+%e$T(q+f){QQ`(@z}DZ$FR}yvGhOBT=(|cwQpbd41cdAAGJjgY=W z7F48EVCw|7KC4`_@Q`%j@Rl#?a!2Y$yX(H(a#*@>XrZP&i!IpCZu?U!yMarHK0e6N z(~Bq3GZ!yrav56W2OndfA3OH>F)5v`W5%`T+s>~Qbc+^_KlJwUrEeab1kY#e#%sW1 z1)*?#;Vn+n&4y`=>8%LZ6ul2fRa=XEk^i@E2CN;a!ad zLb7BsK+ZYv2%?eA~Kv}WS~~$IVP{89HcxWKO`4m{y;*=fr#%bZI^yvS|Imm zr2~&|+VuD)mZcZ;>Dm6JFV!%e%N3J6Cb{2B()Y<@u$s(tgI-N9 zYAPLnm)GYB<)v}Ukzx7_?)1Z%r`X|56DMriG+|=o?u6{LUY@ub`ylx)dY7v|{EuBO zy=x5J&t4Pf>6Mn9U~?HP@q!^W-hrIw@fL$io(saV-c6`NQhcNa(eFK6<(5t8fviTe2ViJK=*+{_BKX?>ElzO@@yBqSvF zNz*#g`_dQso>?*!OO31{6cAu<(q3FiE&KoQp620ZwB10gn54_f5&eGl37agIM_uR9RZ^068 zmiYOw@^LW?KR)u|lLbf_jS&FekOCpqT;|9%GQOuQbSsl8$8G;idiH?_rDs3iJ|VBZkLUMlL=mwS2y9+vhCwAg2mVXn)s30E_tpJkl$y z*fSu%FhyERIvs|x90U!RMSV_0WD!gih+;(WMJf=%Jaz-H^c2Xf2DK-8TR^l&9k}3@ za?<-kgq;!0Yef+X4#trn3C^E&f>#~#I zcUa#^@*U$?-+p$_eD}hN*#47Q==?rw`4Z20{bwrngkfNxc=j4&JIW*9d1i5sSO+*FW&%vPA*H>)gG#i^0hLJ*21Q<1YGUj9u$uxPlPzLa=~j;p(&6w0j|L+ zS^q(P!zq4BFh?|wXqPN68A-trBv@WZOt~0*LGpUX%neqUQlCHr0C5Y_z0Fa9fobB% z!=ooNa|I*AKjMjt_oWnoH<+YZzIDfBUOJ{)wRz_x?uOZXVw|AwGx)7Q(WgKmaY(sufE+i9hOTeI~Wzvk|}?8NQ&OYpx(+-~s6w>BC6< z76Z3v6RTLE#1*I8Xj~zV5_+VUWov?40ZdQ`)3ig zD>3e{*bD1=6;7)0mX&HCJ~?{D_r2%3!Ka(|&r8Tu_sbqTJ;Au=dIpjraHH>dSNigj zf@NRW#740JEOVmt7Xxn|v4qS1U0*eLL?(_%RXOvtPxs3lS_1FKLO&<;PUBP-y_%mq zLRXfVTr)E;{?$`HU;V(7Y}}%u(md(;^_LVM+&8V0#-aY0&r)I0R}c{s$Y&EKQGjz| zFc4@EU|0#>8?duTKq@c*n$yrK2BItHr(uKi#^;YecUbyrX6-eCa82z@W;^`c@zv7n z_aqq}kbe8=R^qWALW^|ox{6UHZ0e_fW>ZV+E3cF8L%B&lG2y*^3onlV>?GAh z6;vKl>Hz=(uK@)_A<5SwXz?m}ivrRK(C1|69|uod5tMf1oQo@D2Uq6FA=L|rV*7?a z-aPI80(N)FXVSS7Pu=tBU0-LLC%njPkN=|rsYT;lM#ZIvLbFHb)y}A%J8J&k)vpdH zy!gVDF-vb*^H|PQc7c0WeD|i^f8fTJra!*Haxu&~K& zd3Uj4$PD=Lq^=Jk;J18h({2%8Y6Ds~_sB6=z^7_BUrp?G6 zT%8{iUzO1R?6G4n4fFL1>0@-x+sQbsIx~uaN~w| zd9+gKA|&h41|$UX>Y>0*d5PJCqE~_#2Nb#j&t^)>Yal@%pFk=(qQm9f+!=92Mh841 zSWLm`=&O{olfYx_X7odvtfHF`HL0~aU!x5w1^AiMGf)EHb%IKE6_qZg`_Vx>e6@1% z-b2TZAG~?d;_{3bp{P(~mc)XYQ^T8g-?Sw>MX5E$*wZ9?RfRp#Y}9JXt3<8Q#97o; zRVJ53uT)i5T3iY2#hmOBb?B0DEpqtnIf zHLAHY!Z&Z(kYEAn({H@z&V$$Ml#9zlp^B!ay|cz7s?~{%A2(p_%&EmCB|(%};H_S6 zq+DWcS(Rwwj0TmqvdWZX5vwZAu7trW7S0(_H(^5E$k`rMg4vWftv{>hwl~f?w|Czg zCS5_Hn&*`_&6-g?ux?O;G_7CF)(0oQuxsbeKnjQS=W5Yucy7%YzsSdmLWT!Ev3+G(b#j%Fj>TBSu>f^ zpw__F0smj++=867(&hxO&!GQv`Y@|iXYj4uzI)T`@{)$@R_&ZtU{4vVwD&FQYmwg1 z8n^EB%;|Sbsf>#>R#(-GavA!}UQpRrsZ6q(f+PCnmycgQv6sdOggjw+{)1!E-!je1 zukU5hTC;C;s5Cr)iK5A3InI=)RK>7+lB)_bbh=jWP@7HX=rcB5nOA?)_)$A2*7Qo$ zaO*4G0nXta8BFNAV*bedf|`lLQzA#lGi!P#y-z zl9w(wls=@q58ZI?bE1^#wBlgX7XKVt@AV>*=n26tghev}h|K z49Acbsu>qTZYYI_ssb#nyBT=J<#h&UrmM7CxM&D##>LSSBX0?cmY>wwAlHA`)f=OXtB?`4oRisQZ4=|BwuRxG^w2{Z{!MGYh`{_h${bV>?josn9j zE%O13HdTA$f7dKrUr7PbWp}i_aX0z4k>3ABV~{Kz<$04j=?Dpb;8r?+FhzHU z-72GEc6M{Q9QHYionTo|*EUFRa|#+Hd(T-CE%&e%V`MQsn!8EJj~<3v{KOC(JGYlk zTS+PlJll(L@ke=%@=}~dR0Y*tAx}4P1V41{3Y zb3@UnR7HAX#~FtDqpEy}jiG8i15RE?NGR0)(x9MQ3GA`4H;@>?i%F*Q6un*M8VW`$=60JJjrr3({3V6f+6E?_ zXIK%zv(tMgdB_cUh$2^v;LFJ&wo?b(l~JYZ7aDC@IueOP0qa<er^N)+%bc*@!y_d=@)A1hV&Y`*M#|WlEr?!!7C(z4)c>-EE zpq9Zhrvcs%0%=!;NKYN`75gBWmy6Ja!2^<^UM_akntdtFmX5r6)5ft0u{j5?%`6>I z_8Ob^=9_E;Rk*tL1*t8+QZ&X2yojLM7*3UE?-lFP9eL!k$%uQTM~$PkXW<=RUElQT z;DW~SBP!~LDB9cdLiEuuqtzg9Xc{ra;Tr)D(_ z8f{rHH1A@gRZ519o0R9v4Ahw=+5h5r*Q^hr$K^pAYa45O%)_JW!dBpq#2?hMh1s_ zNS)-d1Kf}l;-q2RVAu!lE@1XRlIuK=%E9l9sZEZXH!m)^HfD0b9gq&V#`}VRPuER2}!z+-;9AM#K$N(^$dr~Cf#Vz za2h}+P~E4?x|v+~@r{7BhipAjgAC%wWFrj7Ir%bpVMBI`Q1V6Rmv&2a(w_6W!t!PHqx-(kdM)E)4Q#Px zP-b~U!`iXZL$g`dAA66kU)FZV*tHD}#*n6!@*Q>d?xtGqR)#);Cnba`p7RTDL z4Q1sG+(W%5$K@2jXmcy{0MJ0?lQJ~u#~R3rEIzM7x^I# zQlrkL(`qx)(=)VMZL%)2K%*(RKo1+c7JY+ElPhpPBBke;u550~+o(>)t6n8i#jmf8nW1XBHhB>5lJLC~XT4=89`r<8QxX zqo(%VG->F%p(XKvpA?60yrrwZ%D(kcH2MUE0zD1Ak!E1(kZ^knV785N)rA@bqOc%O zP!I=&sVE@{{0sZsTw|meq5(^x*bM>FMr&&o+{dHyl3e#>)E@J@7ph2zpCI6rl)!;} zbZJoGMHSW{k6`f>o*oHDoqQ^Sg`fw6_kl9+{lVYw+IM01=shnk-1Oy;KP;4Pf8|%w z`){vX_crtW>O5O4g}6tS!BGCqqg|HrN0IE}_;t7Y8@Ic&W3<^nELwHL?hAVtzPM-f z>iO5*)3WYu>3vWS+~OUsT566+u-JE**QM{jl$JF!1d)`aqi?&xr?lc75>`tm9zoE< z{APq=n1Sfb#C?%N6Zo-hk325iZrd06icOGWI__c90jj(4mX42>@#7+Kjgvd>V#B%h z9UpOM3VF^}hM^NAd+v4UC~`(}NOzE4kg^8SU36W<8;LqX;upt~5M_!Mid`J8y?hPsg=j2!n+uy7P56f~wevR;29`yHc6Wcp z7?p{+Jy{-iw$DD)WbUgnRVP?#tmy^Jq>2%{&!hX8T1}V#BPJFihc&5%`_^P?;+n9K zze*Ja{BAR*{=e$p13ZrE>KosCXJ&hocD1XnRa^D8+FcdfvYO>?%e`AxSrw~V#f@Tt zu?;rW*bdEw&|3&4)Iba*Ku9Pdv_L|PA%!HAkP5cO-|x(fY}t^!$@f0r^MC%fcIM8V z+veVL&pr3tQ@lQ(H{B5hU3cf}4x7V@V;L~v)I?6_*wq6t@dtRqF(&Zxdh`_-87jFo zg{9(bQc^a6km*oxBtb82j0+|3Gt$9d#X?J%2b?W%t;(wOlfeAIqtZ25;A4nbqKVe@ z8qq%asL^OLI8WZ5S?G*P@uv8q)`9n^>;UDX_ULuK%KXB_tZ0`vF~1;IzRt6IISK77 z-|gv)Eyz#wx}viZ3-c>|-7zgy^wCu`W4o?X0{{rKZ1(}3OoJ%xgbRfJ&Tt)B>$;bt~Ya)oH02^A> z?zHL{FI=YWUC4L_u%Zs96<+WowQSBTzrv!*aGs7Lwv$2y=zHr!2B#q>)@n^jG<&zc ze%{XG;hsiMezkXY7Y&E#ncsi?kFPxOhr2$1aeo!7dhU;Gm3R31ubRC%u~1x$o<2R= z8k`#4%yc`wIbK)1ExM;C+7=&Q70n)*)D%-t6q_iRE0U+rIPYg$_ijm?=dI57%-;XT z{{DGazWCW)*MH=B>?8TP-^D$-<^HQvZBbL>I~nhcugb8+Us*55zK~{%u8P0)+2_6; zKQ$`angE(21O97%3H)Kw^?{5e3Q?J>K!-R4#1|JrMzTtP{cS}&H-*?hL0I&l<9B)i z6o@xu<10Ov6^e?+7tRS`%uDbl8>L@f`0%!E4`2B4(2c2kKkj|(ycU=)HYFA;TE8$q z!RSrw$;uu&5M2;nyJlvhWBAIBoSaoVU)Z|&#fw(@lk>v)QC#ne4`vi5x*f|iGwWM( z&Hnlem(96g&CKF7mzmpEY}>YC<+g1 z-E18(f+jMBv@km*uT?$Ws`}>>XgO8h2Io!Cra!F>uk%$gXCXL2%;_N?C)hp_*NI3p zLO*9c^P;nL+SwtN{ng&RU&-&_%08v`D05%sR4GB}+=id{&fc$1=bESTv%dZrXyY0B zl{^}LttWv8RCRvzoLD`v1a|b__0`w<=ggRC@<{)xcgob>IE|eDZEy5ZXQ)H;UvvRJ zdjbx$K;{Ty_n9R3hq1t>(ZxW(1Ldb;KSs(Ir|$s|xUMuAwG~zi!?c^=p=Xxp=9N5eEhR^|KX^olF;(A#aC4bl_-Q$^6);{6eB9CdQM8S1*_Np2I_X^o_%P!ZYABl3X2mGHCDR>zQW zM&Suv;SA%DgXBtCBtD({cutV6nQ`n0z7>Datx)gle30qL!MpT$DK7KGg=;Q}xGrCL zhbpgr$I8oHkxSNCrWGK9?4#dNFioHy99v&Fd2%5?fZ)kv93s_6;?u<(n9`0*t40`| zB(GDt>P$EW@i}5Ty~yEd;=6Jidwh96CF)-;PiHsfms7YL@Sh4?@@vou0_@DgLsq&# zhhK2HffFY(<(4WC=bWG-{d9<+MByX3&V*<_x!eGAnboY! zVK$59QoQ{50z>REr`aUTlM(s=hgAsum~KePrdLx~Ny(-!FvJ~G-=7XqIVNI9;pqII z$6`h} zUU)nZq6Cr^WSIYowj~UDC{{Lwnfvzd-?yE;CcnZ0a`CA(tXe+0Mt6$8THSy5Gk<^P z?*8iW0Q+#?e&O={`%X5q*H{4mUmH89JGBO)3O_&wHUI?r!jI1{DLMbgtO5wHLJg~P zGaEJlV5LoKmoBp`3*P!%#3>-bN!W00}QqoFh(U5 z_I3)fCvSpLkO+H)?~@-H`}}!1@Vqe~6-Nv>$hb*}RUVB()kzcIXv>RX!ILKas?#Y8)jb>rWA^~=6v($U zWv7;bzCwQyw=J5D9yuaR>)f;J%XMt|KlfcEXDhZ1Mq5|NV~=fprP4LWRr$)+$KUT=ltlgu{Ty{aMm#cPR0)3*R$@YWTsR5O zIA6&3uq7mxJGM^9vKoEz&eva;clwN0t5JN%h%MXW@_N4KSGXKsT6H43YU$D{@tvxr ze8cFd?$owzGFd;+so|5iQjSx)d+x!UG@i&t8RFUl2M)N;WFt$Gv>s#A2-r`dRf$Bi z>AxOF>X6ofSS6jCQVeH>63_Bk5f4s)J_ddop~SgAl^4$0uxL_c;p{9-qi0y?N@4$dG>VPyZ;IP+7B1L zH0+AXb|$CfMJ`#pILf$q_uUtd_-ge+T1HGIX8whfFFttPFP~?DOJ@u`aOZFC{&3Uc z#a=jNOyaR{(}54sc%S$VvZg_HCpz$Th0GxOa8#?DCEGdhE2#WZ5~D0D1?v+*oGL@y z5~4St@wFK#p0gJL8!tbqFgW?1{-==hxP0QN{{E++Ft;7OwL)25*Re+~}0H_}6{CX*0oRXs#@+*Y&tIGCWw(8|;cD7%( z`BrA!|Gm`Zm6GqX`1)k_`wVMT-pgz#XJ2RMzOIw+u3x!l?^F9u>>b`S`DOn1hN7`w zU@^4~_>H@!av%5N}n6I9m zvS)bjSNp!dZ_o1HYhK1z(VlUf-X{s&m6#W&542T6n!zXlB-zx%Zsmv@<^mME79>ML zJ3cXrLWL~$buQ;TKC1C5o*G0`w)>7%&%^hp`% zPFq|?O75ft_f)HXp&{OU^dVM<;wBa=KYGqq1O1V8N|07y+)a?xn6F!hKB9F>;pTuu zgG6>AWXypxT=3$F|H{5PfuwtsIfqT6p!g_fblgBT7%}xo@&{5J>HaLZjs@h9%YqV%e4vbA=;aBYfUvbgnw@=pZFuUNz%ud1nDwW_*iEIp78 zsneHMX_ zOssGM6bn=xAm$numq;aA5H6YM&=B$gPUVSqYj_0A35IkspBaRNOlh)^@*l)_*+1`L z!t%(vaBx-6*t5)Kf5+~Ue^q9Vmj4#xvhjRVG@E003zJT~Ab(+ZyY0;SBD;<`5~t*q z`YYmL8HL&7%l&ydRY_6&al}`hiH{qPhcZr+qvu&HZRLV_`A)#~k&iZ*wwh>!m-}4xID_ zG^|!*hXR=*3CtZ5mh)o)CdLgc0m4fdEPG&&LCBw^P{FgO_mH~-?9zsr#KP#mvO2hc zvxrHAjG%kK*wcGJjUx&SASDKl6_f~UxKWN0g>ATjcg2IUFv4DDhIegjnoVz(j4U&g z86~scmKM9#o8d5-jErZ*FY~#vuc(+mH7P|el=%H6I9dNlEq>- zCKQOK&1)^5DOO{2RMC>MI;)}kUHOZ5ySHYo%3v(oXq_V50rfescC*N3;p{hNyS_($ z<_6j1L5esaFF)`iMXdS*)BRx;MfGCI`>FhUYz4v5ql z6V~H?*!H|}6V`n|7DZcb6R+jmIa+B5D*-w%hIi}vUr*BND`6?@Q1GX~hzUw=5E#tG_8d-|q?Y7r{^tJ9yvIzVGg7UAc>DpVJI{$37J zKpTy)c84=_2JI+igw)j%EJDmdjF=*-sZBi{Y5Ne1L-ndKJ{HihqBxqi+G{X96iGlL z|G{@8Be)RJB-ucc0UeJ}_x-rqMQFffI}}py(;M-K+BG>`$TJwnFg_$_(V_dU zLeDGQZ8H51d)NtVcac%BMhudDsp>4h$Wvc*%4@ zB_<3{JjklBxfQ`oWI|$avv5WXcfRUy;5Gb@BO}I239C$V8ZsbNLdEKfQiTN%)(V`vnnc%4~>T=X>a7EQFGF(W|S5SHevO_?5Ko{=$M%3jD)D{ zgRAvU=plb*cVtH$vDiI7+ZVNeOUnF!A*G?{ysNXPic)d*;@O3vp^l7r;epdB;?oO~ z;?y*vF{5l^s_1`H6|*O@bgGM2bJ)b59V$;XrevjsF4pc`iDl90@lh#JtZh-o>?o5d zYIeq=HqH|^8`4>|x5T!IS#D%eZE=RGdGV8`EsjD9(N1%LIS@VjeEBG)kpFh0{8^hP zJw;8yiZf29$oLm!1Gf?ltM2PuuqZx{B-E7iYs@JhQQXAA2mQw3r&xPZW+JwBFm*)p zlny~C5zSLD`3o7iGvs22^zN_>I^cC4q*_4q(FB3rQ`|0j?2=CMIf5W2Km3toWM!vi zlzI=WCm25bfy1AalAaOtuDWsT+2dnRS<|d{TCMtOTt1GUUVG81S8Zwhs0QwPHSlL2 zl6yOPQ0GZmbFeV0cu8}`dWEfdIH$JCpPo~+ymb<0&)DTuEJ{tY>h-wVK8~Ayeb=g2 z!F@Wz4|c=GODFXP0G$2^7||CBNkB(Kevkr?=O9%lQ26Ma(f}5Hq)bnvvkt6}G@~@5 zCpaQkML$Sj9Q}2!bu^*H27(Y&q1#d!Y^YE4CPuN}&a=hXR_)?K$rrKtYxmE(`Pw)p zdhD|ca$}N`J%-q6Dd`n)9m^K(T@j;qNrGi#Z}EI4NT$cmQqCJos0+Lpu)rd9YxVMb z{q|J3!hW7)oXb7OYd+RTUGx2>y@&KXZBekLD7MHKhskO1B-JlWTi&yNZ=+|0$Eu$k z%}m^J@+>tyP^pl4lir0r`Z&<3I4dJT5Q855Kx$qdKm#EG;>&`pqBlw}67LtCL#LKr zP^n6%fyx4~<*FiG1V-UfAAC0&yp#+mgZ~~%Q{JqsuAZojX+>h9)otd^YNv~T;V|kw zjnyf4Jm%1wlZ@WA+aFxF>u}bxu>V$;T3G1A0dHd{&m$Qi&%i$XYT9{E^}!V4#yOG@ zxn-#*#kEy@H8v^5;jNVaaasPNc}0*Xu$t$x(A-sHcNlC;aGKT_T^V~)Ry}at+B+@{ zjds-~GH+I3hCelX>Y9z~a!p)de>>iD{Mjp9Ci%J+`P&&nMU~C)1Hcf&Ir}!q*G++s zxLxQS5{1Pd?SfIV21sPH1yE61Ks!KUYfG?yMm_;z`P__1pOuD?$VxJ=s`*pE`x!CslJ5wr>oJ+y}lyT%s!BB_805*;dH&79sLC)5WEie6Y2K2gqSDZl`=kM z0*kfyQf4Jw$@R<^E!^f19mUqN^*m>9sQUf1+|tZH#@W+S=f*-K_N$nf%=FprKVRyI zNz0rU^-RQ=91A7V@|>)4p(%P_cE#O=ljT-lo>=ZH&xX9AZ*opnkX1|7Iq3zH*P5qh zW)$#snXJ%ufpGPsoaB|xGLx<#c9?O}`6n}NPQ^}BrYr$x(!G2%> zr!KVMK$Rp|rN>f;J5Bo(?6!P5qU|vT%3c)Pch0badE&A0SC%xadgP)DLtKPqj?|r8 z?o4ln3%Y;A8_*G&Kvo5>0)u2`c_B+7F1@WH1_DY3yFQvf#;ko&!`5i?`K#NYoc!vw zZuhEF-$IndWj?=Jt~XTX2><-lWSdk0{(V+nEIZ#~zf4?zEI*C=4Br)kB`oTJhvkp! zW~`O_65UI;CT1r-cp*$5nG6r}itnyY&N8{3ZmY-W6;2F3Z*!TeoxgF(pZq>$PRf

        |<\/pre>$/gi,""));c=c.replace(E,"$1$2");c=x(c);c=r(c);f=!1===a.fixForBody?!1:d(a.enterMode,b.config.autoParagraph);c=CKEDITOR.htmlParser.fragment.fromHtml(c,a.context,f);f&&(n=c,!n.children.length&&CKEDITOR.dtd[n.name][f]&&(f=new CKEDITOR.htmlParser.element(f),n.add(f)));a.dataValue=c},null,null,
        +5);b.on("toHtml",function(a){a.data.filter.applyTo(a.data.dataValue,!0,a.data.dontFilter,a.data.enterMode)&&b.fire("dataFiltered")},null,null,6);b.on("toHtml",function(a){a.data.dataValue.filterChildren(n.dataFilter,!0)},null,null,10);b.on("toHtml",function(a){a=a.data;var b=a.dataValue,c=new CKEDITOR.htmlParser.basicWriter;b.writeChildrenHtml(c);b=c.getHtml(!0);a.dataValue=t(b)},null,null,15);b.on("toDataFormat",function(a){var c=a.data.dataValue;a.data.enterMode!=CKEDITOR.ENTER_BR&&(c=c.replace(/^
        /i, +""));a.data.dataValue=CKEDITOR.htmlParser.fragment.fromHtml(c,a.data.context,d(a.data.enterMode,b.config.autoParagraph))},null,null,5);b.on("toDataFormat",function(a){a.data.dataValue.filterChildren(n.htmlFilter,!0)},null,null,10);b.on("toDataFormat",function(a){a.data.filter.applyTo(a.data.dataValue,!1,!0)},null,null,11);b.on("toDataFormat",function(a){var c=a.data.dataValue,d=n.writer;d.reset();c.writeChildrenHtml(d);c=d.getHtml(!0);c=r(c);c=m(c,b);a.data.dataValue=c},null,null,15)};CKEDITOR.htmlDataProcessor.prototype= +{toHtml:function(a,b,c,d){var e=this.editor,f,n,q,v;b&&"object"==typeof b?(f=b.context,c=b.fixForBody,d=b.dontFilter,n=b.filter,q=b.enterMode,v=b.protectedWhitespaces):f=b;f||null===f||(f=e.editable().getName());return e.fire("toHtml",{dataValue:a,context:f,fixForBody:c,dontFilter:d,filter:n||e.filter,enterMode:q||e.enterMode,protectedWhitespaces:v}).dataValue},toDataFormat:function(a,b){var c,d,e;b&&(c=b.context,d=b.filter,e=b.enterMode);c||null===c||(c=this.editor.editable().getName());return this.editor.fire("toDataFormat", +{dataValue:a,filter:d||this.editor.filter,context:c,enterMode:e||this.editor.enterMode}).dataValue}};var w=/(?: |\xa0)$/,J="{cke_protected}",F=CKEDITOR.dtd,p="caption colgroup col thead tfoot tbody".split(" "),B=CKEDITOR.tools.extend({},F.$blockLimit,F.$block),H={elements:{input:g,textarea:g}},C={attributeNames:[[/^on/,"data-cke-pa-on"],[/^srcdoc/,"data-cke-pa-srcdoc"],[/^data-cke-expando$/,""]],elements:{iframe:function(a){if(a.attributes&&a.attributes.src){var b=a.attributes.src.toLowerCase().replace(/[^a-z]/gi, +"");if(0===b.indexOf("javascript")||0===b.indexOf("data"))a.attributes["data-cke-pa-src"]=a.attributes.src,delete a.attributes.src}}}},N={elements:{embed:function(a){var b=a.parent;if(b&&"object"==b.name){var c=b.attributes.width,b=b.attributes.height;c&&(a.attributes.width=c);b&&(a.attributes.height=b)}},a:function(a){var b=a.attributes;if(!(a.children.length||b.name||b.id||a.attributes["data-cke-saved-name"]))return!1}}},q={elementNames:[[/^cke:/,""],[/^\?xml:namespace$/,""]],attributeNames:[[/^data-cke-(saved|pa)-/, +""],[/^data-cke-.*/,""],["hidefocus",""]],elements:{$:function(a){var b=a.attributes;if(b){if(b["data-cke-temp"])return!1;for(var c=["name","href","src"],d,e=0;ed? +1:-1})},param:function(a){a.children=[];a.isEmpty=!0;return a},span:function(a){"Apple-style-span"==a.attributes["class"]&&delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes["class"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},style:function(a){var b=a.children[0];b&&b.value&&(b.value=CKEDITOR.tools.trim(b.value));a.attributes.type||(a.attributes.type="text/css")},title:function(a){var b=a.children[0];!b&&k(a,b=new CKEDITOR.htmlParser.text); +b.value=a.attributes["data-cke-title"]||""},input:l,textarea:l},attributes:{"class":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g,""))||!1}}};CKEDITOR.env.ie&&(q.attributes.style=function(a){return a.replace(/(^|;)([^\:]+)/g,function(a){return a.toLowerCase()})});var D=/<(a|area|img|input|source)\b([^>]*)>/gi,v=/([\w-:]+)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,y=/^(href|src|name)$/i,Q=/(?:])[^>]*>[\s\S]*?<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi, +S=/(])[^>]*>)([\s\S]*?)(?:<\/textarea>)/gi,n=/([^<]*)<\/cke:encoded>/gi,P=new RegExp("("+z("\x3ccke:encoded\x3e")+"(.*?)"+z("\x3c/cke:encoded\x3e")+")|("+z("\x3c")+z("/")+"?"+z("cke:encoded\x3e")+")","gi"),G=/(<\/?)((?:object|embed|param|html|body|head|title)([\s][^>]*)?>)/gi,E=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,K=/]*?)\/?>(?!\s*<\/cke:\1)/gi})();"use strict"; +CKEDITOR.htmlParser.element=function(a,d){this.name=a;this.attributes=d||{};this.children=[];var b=a||"",c=b.match(/^cke:(.*)/);c&&(b=c[1]);b=!!(CKEDITOR.dtd.$nonBodyContent[b]||CKEDITOR.dtd.$block[b]||CKEDITOR.dtd.$listItem[b]||CKEDITOR.dtd.$tableContent[b]||CKEDITOR.dtd.$nonEditable[b]||"br"==b);this.isEmpty=!!CKEDITOR.dtd.$empty[a];this.isUnknown=!CKEDITOR.dtd[a];this._={isBlockLike:b,hasInlineStarted:this.isEmpty||!b}}; +CKEDITOR.htmlParser.cssStyle=function(a){var d={};((a instanceof CKEDITOR.htmlParser.element?a.attributes.style:a)||"").replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,c,f){"font-family"==c&&(f=f.replace(/["']/g,""));d[c.toLowerCase()]=f});return{rules:d,populate:function(a){var c=this.toString();c&&(a instanceof CKEDITOR.dom.element?a.setAttribute("style",c):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=c:a.style=c)},toString:function(){var a=[],c; +for(c in d)d[c]&&a.push(c,":",d[c],";");return a.join("")}}}; +(function(){function a(a){return function(b){return b.type==CKEDITOR.NODE_ELEMENT&&("string"==typeof a?b.name==a:b.name in a)}}var d=function(a,b){a=a[0];b=b[0];return ab?1:0},b=CKEDITOR.htmlParser.fragment.prototype;CKEDITOR.htmlParser.element.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_ELEMENT,add:b.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},filter:function(a,b){var d=this,k,g;b=d.getFilterContext(b);if(!d.parent)a.onRoot(b, +d);for(;;){k=d.name;if(!(g=a.onElementName(b,k)))return this.remove(),!1;d.name=g;if(!(d=a.onElement(b,d)))return this.remove(),!1;if(d!==this)return this.replaceWith(d),!1;if(d.name==k)break;if(d.type!=CKEDITOR.NODE_ELEMENT)return this.replaceWith(d),!1;if(!d.name)return this.replaceWithChildren(),!1}k=d.attributes;var l,u;for(l in k){for(g=k[l];;)if(u=a.onAttributeName(b,l))if(u!=l)delete k[l],l=u;else break;else{delete k[l];break}u&&(!1===(g=a.onAttribute(b,d,u,g))?delete k[u]:k[u]=g)}d.isEmpty|| +this.filterChildren(a,!1,b);return!0},filterChildren:b.filterChildren,writeHtml:function(a,b){b&&this.filter(b);var h=this.name,k=[],g=this.attributes,l,u;a.openTag(h,g);for(l in g)k.push([l,g[l]]);a.sortAttributes&&k.sort(d);l=0;for(u=k.length;lCKEDITOR.env.version||CKEDITOR.env.quirks))this.hasFocus&&(this.focus(),b());else if(this.hasFocus)this.focus(), +a();else this.once("focus",function(){a()},null,null,-999)},getHtmlFromRange:function(a){if(a.collapsed)return new CKEDITOR.dom.documentFragment(a.document);a={doc:this.getDocument(),range:a.clone()};J.eol.detect(a,this);J.bogus.exclude(a);J.cell.shrink(a);a.fragment=a.range.cloneContents();J.tree.rebuild(a,this);J.eol.fix(a,this);return new CKEDITOR.dom.documentFragment(a.fragment.$)},extractHtmlFromRange:function(a,b){var c=F,d={range:a,doc:a.document},e=this.getHtmlFromRange(a);if(a.collapsed)return a.optimize(), +e;a.enlarge(CKEDITOR.ENLARGE_INLINE,1);c.table.detectPurge(d);d.bookmark=a.createBookmark();delete d.range;var f=this.editor.createRange();f.moveToPosition(d.bookmark.startNode,CKEDITOR.POSITION_BEFORE_START);d.targetBookmark=f.createBookmark();c.list.detectMerge(d,this);c.table.detectRanges(d,this);c.block.detectMerge(d,this);d.tableContentsRanges?(c.table.deleteRanges(d),a.moveToBookmark(d.bookmark),d.range=a):(a.moveToBookmark(d.bookmark),d.range=a,a.extractContents(c.detectExtractMerge(d)));a.moveToBookmark(d.targetBookmark); +a.optimize();c.fixUneditableRangePosition(a);c.list.merge(d,this);c.table.purge(d,this);c.block.merge(d,this);if(b){c=a.startPath();if(d=a.checkStartOfBlock()&&a.checkEndOfBlock()&&c.block&&!a.root.equals(c.block)){a:{var d=c.block.getElementsByTag("span"),f=0,g;if(d)for(;g=d.getItem(f++);)if(!t(g)){d=!0;break a}d=!1}d=!d}d&&(a.moveToPosition(c.block,CKEDITOR.POSITION_BEFORE_START),c.block.remove())}else c.autoParagraph(this.editor,a),z(a.startContainer)&&a.startContainer.appendBogus();a.startContainer.mergeSiblings(); +return e},setup:function(){var a=this.editor;this.attachListener(a,"beforeGetData",function(){var b=this.getData();this.is("textarea")||!1!==a.config.ignoreEmptyParagraph&&(b=b.replace(r,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,"getSnapshot",function(a){a.data=this.getData(1)},this);this.attachListener(a,"afterSetData",function(){this.setData(a.getData(1))},this);this.attachListener(a,"loadSnapshot",function(a){this.setData(a.data,1)},this);this.attachListener(a, +"beforeFocus",function(){var b=a.getSelection();(b=b&&b.getNative())&&"Control"==b.type||this.focus()},this);this.attachListener(a,"insertHtml",function(a){this.insertHtml(a.data.dataValue,a.data.mode,a.data.range)},this);this.attachListener(a,"insertElement",function(a){this.insertElement(a.data)},this);this.attachListener(a,"insertText",function(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass("cke_editable");a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?this.attachClass("cke_editable_inline"): +a.elementMode!=CKEDITOR.ELEMENT_MODE_REPLACE&&a.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO||this.attachClass("cke_editable_themed");this.attachClass("cke_contents_"+a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=+a.readOnly;a.keystrokeHandler.attach(this);this.on("blur",function(){this.hasFocus=!1},null,null,-1);this.on("focus",function(){this.hasFocus=!0},null,null,-1);if(CKEDITOR.env.webkit)this.on("scroll",function(){a._.previousScrollTop=a.editable().$.scrollTop},null, +null,-1);if(CKEDITOR.env.edge&&14CKEDITOR.env.version?q.$.styleSheet.cssText=k:q.setText(k)):(k=f.appendStyleText(k),k=new CKEDITOR.dom.element(k.ownerNode||k.owningElement),g.setCustomData("stylesheet", +k),k.data("cke-temp",1))}g=f.getCustomData("stylesheet_ref")||0;f.setCustomData("stylesheet_ref",g+1);this.setCustomData("cke_includeReadonly",!a.config.disableReadonlyStyling);this.attachListener(this,"click",function(a){a=a.data;var b=(new CKEDITOR.dom.elementPath(a.getTarget(),this)).contains("a");b&&2!=a.$.button&&b.isReadOnly()&&a.preventDefault()});var D={8:1,46:1};this.attachListener(a,"key",function(b){if(a.readOnly)return!0;var c=b.data.domEvent.getKey(),d;b=a.getSelection();if(0!==b.getRanges().length){if(c in +D){var e,f=b.getRanges()[0],q=f.startPath(),g,k,l,c=8==c;CKEDITOR.env.ie&&11>CKEDITOR.env.version&&(e=b.getSelectedElement())||(e=h(b))?(a.fire("saveSnapshot"),f.moveToPosition(e,CKEDITOR.POSITION_BEFORE_START),e.remove(),f.select(),a.fire("saveSnapshot"),d=1):f.collapsed&&((g=q.block)&&(l=g[c?"getPrevious":"getNext"](x))&&l.type==CKEDITOR.NODE_ELEMENT&&l.is("table")&&f[c?"checkStartOfBlock":"checkEndOfBlock"]()?(a.fire("saveSnapshot"),f[c?"checkEndOfBlock":"checkStartOfBlock"]()&&g.remove(),f["moveToElementEdit"+ +(c?"End":"Start")](l),f.select(),a.fire("saveSnapshot"),d=1):q.blockLimit&&q.blockLimit.is("td")&&(k=q.blockLimit.getAscendant("table"))&&f.checkBoundaryOfElement(k,c?CKEDITOR.START:CKEDITOR.END)&&(l=k[c?"getPrevious":"getNext"](x))?(a.fire("saveSnapshot"),f["moveToElementEdit"+(c?"End":"Start")](l),f.checkStartOfBlock()&&f.checkEndOfBlock()?l.remove():f.select(),a.fire("saveSnapshot"),d=1):(k=q.contains(["td","th","caption"]))&&f.checkBoundaryOfElement(k,c?CKEDITOR.START:CKEDITOR.END)&&(d=1))}return!d}}); +a.blockless&&CKEDITOR.env.ie&&CKEDITOR.env.needsBrFiller&&this.attachListener(this,"keyup",function(b){b.data.getKeystroke()in D&&!this.getFirst(c)&&(this.appendBogus(),b=a.createRange(),b.moveToPosition(this,CKEDITOR.POSITION_AFTER_START),b.select())});this.attachListener(this,"dblclick",function(b){if(a.readOnly)return!1;b={element:b.data.getTarget()};a.fire("doubleclick",b)});CKEDITOR.env.ie&&this.attachListener(this,"click",b);CKEDITOR.env.ie&&!CKEDITOR.env.edge||this.attachListener(this,"mousedown", +function(b){var c=b.data.getTarget();c.is("img","hr","input","textarea","select")&&!c.isReadOnly()&&(a.getSelection().selectElement(c),c.is("input","textarea","select")&&b.data.preventDefault())});CKEDITOR.env.edge&&this.attachListener(this,"mouseup",function(b){(b=b.data.getTarget())&&b.is("img")&&!b.isReadOnly()&&a.getSelection().selectElement(b)});CKEDITOR.env.gecko&&this.attachListener(this,"mouseup",function(b){if(2==b.data.$.button&&(b=b.data.getTarget(),!b.getAscendant("table")&&!b.getOuterHtml().replace(r, +""))){var c=a.createRange();c.moveToElementEditStart(b);c.select(!0)}});CKEDITOR.env.webkit&&(this.attachListener(this,"click",function(a){a.data.getTarget().is("input","select")&&a.data.preventDefault()}),this.attachListener(this,"mouseup",function(a){a.data.getTarget().is("input","textarea")&&a.data.preventDefault()}));CKEDITOR.env.webkit&&this.attachListener(a,"key",function(b){if(a.readOnly)return!0;var c=b.data.domEvent.getKey();if(c in D&&(b=a.getSelection(),0!==b.getRanges().length)){var c= +8==c,d=b.getRanges()[0];b=d.startPath();if(d.collapsed)a:{var f=b.block;if(f&&d[c?"checkStartOfBlock":"checkEndOfBlock"]()&&d.moveToClosestEditablePosition(f,!c)&&d.collapsed){if(d.startContainer.type==CKEDITOR.NODE_ELEMENT){var n=d.startContainer.getChild(d.startOffset-(c?1:0));if(n&&n.type==CKEDITOR.NODE_ELEMENT&&n.is("hr")){a.fire("saveSnapshot");n.remove();b=!0;break a}}d=d.startPath().block;if(!d||d&&d.contains(f))b=void 0;else{a.fire("saveSnapshot");var q;(q=(c?d:f).getBogus())&&q.remove(); +q=a.getSelection();n=q.createBookmarks();(c?f:d).moveChildren(c?d:f,!1);b.lastElement.mergeSiblings();e(f,d,!c);q.selectBookmarks(n);b=!0}}else b=!1}else c=d,q=b.block,d=c.endPath().block,q&&d&&!q.equals(d)?(a.fire("saveSnapshot"),(f=q.getBogus())&&f.remove(),c.enlarge(CKEDITOR.ENLARGE_INLINE),c.deleteContents(),d.getParent()&&(d.moveChildren(q,!1),b.lastElement.mergeSiblings(),e(q,d,!0)),c=a.getSelection().getRanges()[0],c.collapse(1),c.optimize(),""===c.startContainer.getHtml()&&c.startContainer.appendBogus(), +c.select(),b=!0):b=!1;if(!b)return;a.getSelection().scrollIntoView();a.fire("saveSnapshot");return!1}},this,null,100)}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData("classes"))for(;a.length;)this.removeClass(a.pop());if(!this.is("textarea")){a=this.getDocument();var b=a.getHead();if(b.getCustomData("stylesheet")){var c=a.getCustomData("stylesheet_ref");--c?a.setCustomData("stylesheet_ref",c):(a.removeCustomData("stylesheet_ref"), +b.removeCustomData("stylesheet").remove())}}this.editor.fire("contentDomUnload");delete this.editor}}});CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;arguments.length&&(b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null));return b};CKEDITOR.on("instanceLoaded",function(b){var c=b.editor;c.on("insertElement",function(a){a=a.data;a.type==CKEDITOR.NODE_ELEMENT&&(a.is("input")||a.is("textarea"))&&("false"!=a.getAttribute("contentEditable")&& +a.data("cke-editable",a.hasAttribute("contenteditable")?"true":"1"),a.setAttribute("contentEditable",!1))});c.on("selectionChange",function(b){if(!c.readOnly){var d=c.getSelection();d&&!d.isLocked&&(d=c.checkDirty(),c.fire("lockSnapshot"),a(b),c.fire("unlockSnapshot"),!d&&c.resetDirty())}})});CKEDITOR.on("instanceCreated",function(a){var b=a.editor;b.on("mode",function(){var a=b.editable();if(a&&a.isInline()){var c=b.title;a.changeAttr("role","textbox");a.changeAttr("aria-multiline","true");a.changeAttr("aria-label", +c);c&&a.changeAttr("title",c);var d=b.fire("ariaEditorHelpLabel",{}).label;if(d&&(c=this.ui.space(this.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"top":"contents"))){var e=CKEDITOR.tools.getNextId(),d=CKEDITOR.dom.element.createFromHtml('\x3cspan id\x3d"'+e+'" class\x3d"cke_voice_label"\x3e'+d+"\x3c/span\x3e");c.append(d);a.changeAttr("aria-describedby",e)}}})});CKEDITOR.addCss(".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}");x=CKEDITOR.dom.walker.whitespaces(!0); +t=CKEDITOR.dom.walker.bookmark(!1,!0);z=CKEDITOR.dom.walker.empty();I=CKEDITOR.dom.walker.bogus();r=/(^|]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:]*>| |\u00A0| )?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi;m=function(){function a(b){return b.type==CKEDITOR.NODE_ELEMENT}function b(c,d){var e,f,q,g,h=[],k=d.range.startContainer;e=d.range.startPath();for(var k=v[k.getName()],D=0,y=c.getChildren(),l=y.count(),m=-1,u=-1,Q=0,C=e.contains(v.$list);DCKEDITOR.env.version&&d.getChildCount()&&d.getFirst().remove())}return function(d){var e=d.startContainer,f=e.getAscendant("table",1),g=!1;c(f.getElementsByTag("td"));c(f.getElementsByTag("th"));f=d.clone();f.setStart(e,0);f=a(f).lastBackward();f||(f=d.clone(),f.setEndAt(e, +CKEDITOR.POSITION_BEFORE_END),f=a(f).lastForward(),g=!0);f||(f=e);f.is("table")?(d.setStartAt(f,CKEDITOR.POSITION_BEFORE_START),d.collapse(!0),f.remove()):(f.is({tbody:1,thead:1,tfoot:1})&&(f=b(f,"tr",g)),f.is("tr")&&(f=b(f,f.getParent().is("thead")?"th":"td",g)),(e=f.getBogus())&&e.remove(),d.moveToPosition(f,g?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END))}}();w=function(){function a(b){b=new CKEDITOR.dom.walker(b);b.guard=function(a,b){if(b)return!1;if(a.type==CKEDITOR.NODE_ELEMENT)return a.is(CKEDITOR.dtd.$list)|| +a.is(CKEDITOR.dtd.$listItem)};b.evaluator=function(a){return a.type==CKEDITOR.NODE_ELEMENT&&a.is(CKEDITOR.dtd.$listItem)};return b}return function(b){var c=b.startContainer,d=!1,e;e=b.clone();e.setStart(c,0);e=a(e).lastBackward();e||(e=b.clone(),e.setEndAt(c,CKEDITOR.POSITION_BEFORE_END),e=a(e).lastForward(),d=!0);e||(e=c);e.is(CKEDITOR.dtd.$list)?(b.setStartAt(e,CKEDITOR.POSITION_BEFORE_START),b.collapse(!0),e.remove()):((c=e.getBogus())&&c.remove(),b.moveToPosition(e,d?CKEDITOR.POSITION_AFTER_START: +CKEDITOR.POSITION_BEFORE_END),b.select())}}();J={eol:{detect:function(a,b){var c=a.range,d=c.clone(),e=c.clone(),f=new CKEDITOR.dom.elementPath(c.startContainer,b),g=new CKEDITOR.dom.elementPath(c.endContainer,b);d.collapse(1);e.collapse();f.block&&d.checkBoundaryOfElement(f.block,CKEDITOR.END)&&(c.setStartAfter(f.block),a.prependEolBr=1);g.block&&e.checkBoundaryOfElement(g.block,CKEDITOR.START)&&(c.setEndBefore(g.block),a.appendEolBr=1)},fix:function(a,b){var c=b.getDocument(),d;a.appendEolBr&&(d= +this.createEolBr(c),a.fragment.append(d));!a.prependEolBr||d&&!d.getPrevious()||a.fragment.append(this.createEolBr(c),1)},createEolBr:function(a){return a.createElement("br",{attributes:{"data-cke-eol":1}})}},bogus:{exclude:function(a){var b=a.range.getBoundaryNodes(),c=b.startNode,b=b.endNode;!b||!I(b)||c&&c.equals(b)||a.range.setEndBefore(b)}},tree:{rebuild:function(a,b){var c=a.range,d=c.getCommonAncestor(),e=new CKEDITOR.dom.elementPath(d,b),f=new CKEDITOR.dom.elementPath(c.startContainer,b), +c=new CKEDITOR.dom.elementPath(c.endContainer,b),g;d.type==CKEDITOR.NODE_TEXT&&(d=d.getParent());if(e.blockLimit.is({tr:1,table:1})){var v=e.contains("table").getParent();g=function(a){return!a.equals(v)}}else if(e.block&&e.block.is(CKEDITOR.dtd.$listItem)&&(f=f.contains(CKEDITOR.dtd.$list),c=c.contains(CKEDITOR.dtd.$list),!f.equals(c))){var h=e.contains(CKEDITOR.dtd.$list).getParent();g=function(a){return!a.equals(h)}}g||(g=function(a){return!a.equals(e.block)&&!a.equals(e.blockLimit)});this.rebuildFragment(a, +b,d,g)},rebuildFragment:function(a,b,c,d){for(var e;c&&!c.equals(b)&&d(c);)e=c.clone(0,1),a.fragment.appendTo(e),a.fragment=e,c=c.getParent()}},cell:{shrink:function(a){a=a.range;var b=a.startContainer,c=a.endContainer,d=a.startOffset,e=a.endOffset;b.type==CKEDITOR.NODE_ELEMENT&&b.equals(c)&&b.is("tr")&&++d==e&&a.shrink(CKEDITOR.SHRINK_TEXT)}}};F=function(){function a(b,c){var d=b.getParent();if(d.is(CKEDITOR.dtd.$inline))b[c?"insertBefore":"insertAfter"](d)}function b(c,d,e){a(d);a(e,1);for(var f;f= +e.getNext();)f.insertAfter(d),d=f;z(c)&&c.remove()}function c(a,b){var d=new CKEDITOR.dom.range(a);d.setStartAfter(b.startNode);d.setEndBefore(b.endNode);return d}return{list:{detectMerge:function(a,b){var d=c(b,a.bookmark),e=d.startPath(),f=d.endPath(),g=e.contains(CKEDITOR.dtd.$list),h=f.contains(CKEDITOR.dtd.$list);a.mergeList=g&&h&&g.getParent().equals(h.getParent())&&!g.equals(h);a.mergeListItems=e.block&&f.block&&e.block.is(CKEDITOR.dtd.$listItem)&&f.block.is(CKEDITOR.dtd.$listItem);if(a.mergeList|| +a.mergeListItems)d=d.clone(),d.setStartBefore(a.bookmark.startNode),d.setEndAfter(a.bookmark.endNode),a.mergeListBookmark=d.createBookmark()},merge:function(a,c){if(a.mergeListBookmark){var d=a.mergeListBookmark.startNode,e=a.mergeListBookmark.endNode,f=new CKEDITOR.dom.elementPath(d,c),g=new CKEDITOR.dom.elementPath(e,c);if(a.mergeList){var h=f.contains(CKEDITOR.dtd.$list),k=g.contains(CKEDITOR.dtd.$list);h.equals(k)||(k.moveChildren(h),k.remove())}a.mergeListItems&&(f=f.contains(CKEDITOR.dtd.$listItem), +g=g.contains(CKEDITOR.dtd.$listItem),f.equals(g)||b(g,d,e));d.remove();e.remove()}}},block:{detectMerge:function(a,b){if(!a.tableContentsRanges&&!a.mergeListBookmark){var c=new CKEDITOR.dom.range(b);c.setStartBefore(a.bookmark.startNode);c.setEndAfter(a.bookmark.endNode);a.mergeBlockBookmark=c.createBookmark()}},merge:function(a,c){if(a.mergeBlockBookmark&&!a.purgeTableBookmark){var d=a.mergeBlockBookmark.startNode,e=a.mergeBlockBookmark.endNode,f=new CKEDITOR.dom.elementPath(d,c),g=new CKEDITOR.dom.elementPath(e, +c),f=f.block,g=g.block;f&&g&&!f.equals(g)&&b(g,d,e);d.remove();e.remove()}}},table:function(){function a(c){var e=[],f,g=new CKEDITOR.dom.walker(c),h=c.startPath().contains(d),n=c.endPath().contains(d),k={};g.guard=function(a,g){if(a.type==CKEDITOR.NODE_ELEMENT){var l="visited_"+(g?"out":"in");if(a.getCustomData(l))return;CKEDITOR.dom.element.setMarker(k,a,l,1)}if(g&&h&&a.equals(h))f=c.clone(),f.setEndAt(h,CKEDITOR.POSITION_BEFORE_END),e.push(f);else if(!g&&n&&a.equals(n))f=c.clone(),f.setStartAt(n, +CKEDITOR.POSITION_AFTER_START),e.push(f);else{if(l=!g)l=a.type==CKEDITOR.NODE_ELEMENT&&a.is(d)&&(!h||b(a,h))&&(!n||b(a,n));if(!l&&(l=g))if(a.is(d))var l=h&&h.getAscendant("table",!0),m=n&&n.getAscendant("table",!0),p=a.getAscendant("table",!0),l=l&&l.contains(p)||m&&m.contains(p);else l=void 0;l&&(f=c.clone(),f.selectNodeContents(a),e.push(f))}};g.lastForward();CKEDITOR.dom.element.clearAllMarkers(k);return e}function b(a,c){var d=CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_IS_CONTAINED,e=a.getPosition(c); +return e===CKEDITOR.POSITION_IDENTICAL?!1:0===(e&d)}var d={td:1,th:1,caption:1};return{detectPurge:function(a){var b=a.range,c=b.clone();c.enlarge(CKEDITOR.ENLARGE_ELEMENT);var c=new CKEDITOR.dom.walker(c),e=0;c.evaluator=function(a){a.type==CKEDITOR.NODE_ELEMENT&&a.is(d)&&++e};c.checkForward();if(1f&&e&&e.intersectsNode(c.$)){var n=[{node:d.anchorNode,offset:d.anchorOffset}, +{node:d.focusNode,offset:d.focusOffset}];d.anchorNode==c.$&&d.anchorOffset>f&&(n[0].offset-=f);d.focusNode==c.$&&d.focusOffset>f&&(n[1].offset-=f)}}c.setText(t(c.getText(),1));n&&(c=a.getDocument().$,d=c.getSelection(),c=c.createRange(),c.setStart(n[0].node,n[0].offset),c.collapse(!0),d.removeAllRanges(),d.addRange(c),d.extend(n[1].node,n[1].offset))}}function t(a,b){return b?a.replace(J,function(a,b){return b?" ":""}):a.replace(w,"")}function z(a,b){var c=b&&CKEDITOR.tools.htmlEncode(b)||"\x26nbsp;", +c=CKEDITOR.dom.element.createFromHtml('\x3cdiv data-cke-hidden-sel\x3d"1" data-cke-temp\x3d"1" style\x3d"'+(CKEDITOR.env.ie&&14>CKEDITOR.env.version?"display:none":"position:fixed;top:0;left:-1000px;width:0;height:0;overflow:hidden;")+'"\x3e'+c+"\x3c/div\x3e",a.document);a.fire("lockSnapshot");a.editable().append(c);var d=a.getSelection(1),e=a.createRange(),f=d.root.on("selectionchange",function(a){a.cancel()},null,null,0);e.setStartAt(c,CKEDITOR.POSITION_AFTER_START);e.setEndAt(c,CKEDITOR.POSITION_BEFORE_END); +d.selectRanges([e]);f.removeListener();a.fire("unlockSnapshot");a._.hiddenSelectionContainer=c}function I(a){var b={37:1,39:1,8:1,46:1};return function(c){var d=c.data.getKeystroke();if(b[d]){var e=a.getSelection().getRanges(),f=e[0];1==e.length&&f.collapsed&&(d=f[38>d?"getPreviousEditableNode":"getNextEditableNode"]())&&d.type==CKEDITOR.NODE_ELEMENT&&"false"==d.getAttribute("contenteditable")&&(a.getSelection().fake(d),c.data.preventDefault(),c.cancel())}}}function r(a){for(var b=0;b=d.getLength()?g.setStartAfter(d):g.setStartBefore(d));e&&e.type==CKEDITOR.NODE_TEXT&&(n?g.setEndAfter(e): +g.setEndBefore(e));d=new CKEDITOR.dom.walker(g);d.evaluator=function(d){if(d.type==CKEDITOR.NODE_ELEMENT&&d.isReadOnly()){var e=c.clone();c.setEndBefore(d);c.collapsed&&a.splice(b--,1);d.getPosition(g.endContainer)&CKEDITOR.POSITION_CONTAINS||(e.setStartAfter(d),e.collapsed||a.splice(b+1,0,e));return!0}return!1};d.next()}}return a}var m="function"!=typeof window.getSelection,M=1,w=CKEDITOR.tools.repeat("​",7),J=new RegExp(w+"( )?","g"),F,p,B,H=CKEDITOR.dom.walker.invisible(1),C=function(){function a(b){return function(a){var c= +a.editor.createRange();c.moveToClosestEditablePosition(a.selected,b)&&a.editor.getSelection().selectRanges([c]);return!1}}function b(a){return function(b){var c=b.editor,d=c.createRange(),e;if(!c.readOnly)return(e=d.moveToClosestEditablePosition(b.selected,a))||(e=d.moveToClosestEditablePosition(b.selected,!a)),e&&c.getSelection().selectRanges([d]),c.fire("saveSnapshot"),b.selected.remove(),e||(d.moveToElementEditablePosition(c.editable()),c.getSelection().selectRanges([d])),c.fire("saveSnapshot"), +!1}}var c=a(),d=a(1);return{37:c,38:c,39:d,40:d,8:b(),46:b(1)}}();CKEDITOR.on("instanceCreated",function(a){function b(){var a=c.getSelection();a&&a.removeAllRanges()}var c=a.editor;c.on("contentDom",function(){function a(){p=new CKEDITOR.dom.selection(c.getSelection());p.lock()}function b(){f.removeListener("mouseup",b);l.removeListener("mouseup",b);var a=CKEDITOR.document.$.selection,c=a.createRange();"None"!=a.type&&c.parentElement()&&c.parentElement().ownerDocument==e.$&&c.select()}function d(a){a= +a.getRanges()[0];return a?(a=a.startContainer.getAscendant(function(a){return a.type==CKEDITOR.NODE_ELEMENT&&a.hasAttribute("contenteditable")},!0))&&"false"===a.getAttribute("contenteditable")?a:null:null}var e=c.document,f=CKEDITOR.document,g=c.editable(),q=e.getBody(),l=e.getDocumentElement(),A=g.isInline(),D,p;CKEDITOR.env.gecko&&g.attachListener(g,"focus",function(a){a.removeListener();0!==D&&(a=c.getSelection().getNative())&&a.isCollapsed&&a.anchorNode==g.$&&(a=c.createRange(),a.moveToElementEditStart(g), +a.select())},null,null,-2);g.attachListener(g,CKEDITOR.env.webkit||CKEDITOR.env.gecko?"focusin":"focus",function(){if(D&&(CKEDITOR.env.webkit||CKEDITOR.env.gecko)){D=c._.previousActive&&c._.previousActive.equals(e.getActive());var a=null!=c._.previousScrollTop&&c._.previousScrollTop!=g.$.scrollTop;CKEDITOR.env.webkit&&D&&a&&(g.$.scrollTop=c._.previousScrollTop)}c.unlockSelection(D);D=0},null,null,-1);g.attachListener(g,"mousedown",function(){D=0});if(CKEDITOR.env.ie||A)m?g.attachListener(g,"beforedeactivate", +a,null,null,-1):g.attachListener(c,"selectionCheck",a,null,null,-1),g.attachListener(g,CKEDITOR.env.webkit||CKEDITOR.env.gecko?"focusout":"blur",function(){c.lockSelection(p);D=1},null,null,-1),g.attachListener(g,"mousedown",function(){D=0});if(CKEDITOR.env.ie&&!A){var u;g.attachListener(g,"mousedown",function(a){2==a.data.$.button&&((a=c.document.getSelection())&&a.getType()!=CKEDITOR.SELECTION_NONE||(u=c.window.getScrollPosition()))});g.attachListener(g,"mouseup",function(a){2==a.data.$.button&& +u&&(c.document.$.documentElement.scrollLeft=u.x,c.document.$.documentElement.scrollTop=u.y);u=null});if("BackCompat"!=e.$.compatMode){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat){var r,t;l.on("mousedown",function(a){function b(a){a=a.data.$;if(r){var c=q.$.createTextRange();try{c.moveToPoint(a.clientX,a.clientY)}catch(d){}r.setEndPoint(0>t.compareEndPoints("StartToStart",c)?"EndToEnd":"StartToStart",c);r.select()}}function c(){l.removeListener("mousemove",b);f.removeListener("mouseup",c);l.removeListener("mouseup", +c);r.select()}a=a.data;if(a.getTarget().is("html")&&a.$.yCKEDITOR.env.version)l.on("mousedown",function(a){a.data.getTarget().is("html")&&(f.on("mouseup",b),l.on("mouseup",b))})}}g.attachListener(g,"selectionchange",h,c);g.attachListener(g,"keyup",k,c);g.attachListener(g,"touchstart", +k,c);g.attachListener(g,"touchend",k,c);CKEDITOR.env.ie&&g.attachListener(g,"keydown",function(a){var b=this.getSelection(1),c=d(b);c&&!c.equals(g)&&(b.selectElement(c),a.data.preventDefault())},c);g.attachListener(g,CKEDITOR.env.webkit||CKEDITOR.env.gecko?"focusin":"focus",function(){c.forceNextSelectionCheck();c.selectionChange(1)});if(A&&(CKEDITOR.env.webkit||CKEDITOR.env.gecko)){var z;g.attachListener(g,"mousedown",function(){z=1});g.attachListener(e.getDocumentElement(),"mouseup",function(){z&& +k.call(c);z=0})}else g.attachListener(CKEDITOR.env.ie?g:e.getDocumentElement(),"mouseup",k,c);CKEDITOR.env.webkit&&g.attachListener(e,"keydown",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:g.hasFocus&&x(g)}},null,null,-1);g.attachListener(g,"keydown",I(c),null,null,-1)});c.on("setData",function(){c.unlockSelection();CKEDITOR.env.webkit&&b()});c.on("contentDomUnload",function(){c.unlockSelection()});if(CKEDITOR.env.ie9Compat)c.on("beforeDestroy", +b,null,null,9);c.on("dataReady",function(){delete c._.fakeSelection;delete c._.hiddenSelectionContainer;c.selectionChange(1)});c.on("loadSnapshot",function(){var a=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT),b=c.editable().getLast(a);b&&b.hasAttribute("data-cke-hidden-sel")&&(b.remove(),CKEDITOR.env.gecko&&(a=c.editable().getFirst(a))&&a.is("br")&&a.getAttribute("_moz_editor_bogus_node")&&a.remove())},null,null,100);c.on("key",function(a){if("wysiwyg"==c.mode){var b=c.getSelection();if(b.isFake){var d= +C[a.data.keyCode];if(d)return d({editor:c,selected:b.getSelectedElement(),selection:b,keyEvent:a})}}})});if(CKEDITOR.env.webkit)CKEDITOR.on("instanceReady",function(a){var b=a.editor;b.on("selectionChange",function(){var a=b.editable(),c=a.getCustomData("cke-fillingChar");c&&(c.getCustomData("ready")?(x(a),a.editor.fire("selectionCheck")):c.setCustomData("ready",1))},null,null,-1);b.on("beforeSetMode",function(){x(b.editable())},null,null,-1);b.on("getSnapshot",function(a){a.data&&(a.data=t(a.data))}, +b,null,20);b.on("toDataFormat",function(a){a.data.dataValue=t(a.data.dataValue)},null,null,0)});CKEDITOR.editor.prototype.selectionChange=function(a){(a?h:k).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){return!this._.savedSelection&&!this._.fakeSelection||a?(a=this.editable())&&"wysiwyg"==this.mode?new CKEDITOR.dom.selection(a):null:this._.savedSelection||this._.fakeSelection};CKEDITOR.editor.prototype.lockSelection=function(a){a=a||this.getSelection(1);return a.getType()!=CKEDITOR.SELECTION_NONE? +(!a.isLocked&&a.lock(),this._.savedSelection=a,!0):!1};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;return b?(b.unlock(a),delete this._.savedSelection,!0):!1};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath};CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable?this.root.editor.getSelection(): +new CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;CKEDITOR.dom.selection=function(a){if(a instanceof CKEDITOR.dom.selection){var b=a;a=a.root}var c=a instanceof CKEDITOR.dom.element;this.rev=b?b.rev:M++;this.document=a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=c?a:this.document.getBody();this.isLocked=0;this._={cache:{}};if(b)return CKEDITOR.tools.extend(this._.cache,b._.cache), +this.isFake=b.isFake,this.isLocked=b.isLocked,this;a=this.getNative();var d,e;if(a)if(a.getRangeAt)d=(e=a.rangeCount&&a.getRangeAt(0))&&new CKEDITOR.dom.node(e.commonAncestorContainer);else{try{e=a.createRange()}catch(f){}d=e&&CKEDITOR.dom.element.get(e.item&&e.item(0)||e.parentElement())}if(!d||d.type!=CKEDITOR.NODE_ELEMENT&&d.type!=CKEDITOR.NODE_TEXT||!this.root.equals(d)&&!this.root.contains(d))this._.cache.type=CKEDITOR.SELECTION_NONE,this._.cache.startElement=null,this._.cache.selectedElement= +null,this._.cache.selectedText="",this._.cache.ranges=new CKEDITOR.dom.rangeList;return this};var N={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};CKEDITOR.tools.extend(CKEDITOR.dom.selection,{_removeFillingCharSequenceString:t,_createFillingCharSequenceNode:e,FILLING_CHAR_SEQUENCE:w});CKEDITOR.dom.selection.prototype={getNative:function(){return void 0!==this._.cache.nativeSel?this._.cache.nativeSel:this._.cache.nativeSel= +m?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:m?function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_NONE;try{var c=this.getNative(),d=c.type;"Text"==d&&(b=CKEDITOR.SELECTION_TEXT);"Control"==d&&(b=CKEDITOR.SELECTION_ELEMENT);c.createRange().parentElement()&&(b=CKEDITOR.SELECTION_TEXT)}catch(e){}return a.type=b}:function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE; +else if(1==c.rangeCount){var c=c.getRangeAt(0),d=c.startContainer;d==c.endContainer&&1==d.nodeType&&1==c.endOffset-c.startOffset&&N[d.childNodes[c.startOffset].nodeName.toLowerCase()]&&(b=CKEDITOR.SELECTION_ELEMENT)}return a.type=b},getRanges:function(){var a=m?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()}var b=function(b,c){b=b.duplicate();b.collapse(c);var d=b.parentElement();if(!d.hasChildNodes())return{container:d,offset:0};for(var e=d.children,f,g,h=b.duplicate(),k=0, +l=e.length-1,q=-1,m,p;k<=l;)if(q=Math.floor((k+l)/2),f=e[q],h.moveToElementText(f),m=h.compareEndPoints("StartToStart",b),0m)k=q+1;else return{container:d,offset:a(f)};if(-1==q||q==e.length-1&&0>m){h.moveToElementText(d);h.setEndPoint("StartToStart",b);h=h.text.replace(/(\r\n|\r)/g,"\n").length;e=d.childNodes;if(!h)return f=e[e.length-1],f.nodeType!=CKEDITOR.NODE_TEXT?{container:d,offset:e.length}:{container:f,offset:f.nodeValue.length};for(d=e.length;0]*>)[ \t\r\n]*/gi,"$1");g=g.replace(/([ \t\n\r]+| )/g, +" ");g=g.replace(/]*>/gi,"\n");if(CKEDITOR.env.ie){var h=a.getDocument().createElement("div");h.append(f);f.$.outerHTML="\x3cpre\x3e"+g+"\x3c/pre\x3e";f.copyAttributes(h.getFirst());f=h.getFirst().remove()}else f.setHtml(g);b=f}else g?b=t(c?[a.getHtml()]:e(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,k;(k=c.getPrevious(y))&&k.type==CKEDITOR.NODE_ELEMENT&&k.is("pre")&&(d=x(k.getHtml(),/\n$/,"")+"\n\n"+x(c.getHtml(),/^\n/,""),CKEDITOR.env.ie?c.$.outerHTML="\x3cpre\x3e"+d+"\x3c/pre\x3e": +c.setHtml(d),k.remove())}else c&&m(b)}function e(a){var b=[];x(a.getOuterHtml(),/(\S\s*)\n(?:\s|(]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,function(a,b,c){return b+"\x3c/pre\x3e"+c+"\x3cpre\x3e"}).replace(/([\s\S]*?)<\/pre>/gi,function(a,c){b.push(c)});return b}function x(a,b,c){var d="",e="";a=a.replace(/(^]+data-cke-bookmark.*?\/span>)|(]+data-cke-bookmark.*?\/span>$)/gi,function(a,b,c){b&&(d=b);c&&(e=c);return""});return d+a.replace(b,c)+e}function t(a,b){var c; +1=c?(h=f.createText(""),h.insertAfter(this)):(a=f.createText(""),a.insertAfter(h),a.remove()));return h},substring:function(a, +d){return"number"!=typeof d?this.$.nodeValue.substr(a):this.$.nodeValue.substring(a,d)}}); +(function(){function a(a,c,d){var h=a.serializable,k=c[d?"endContainer":"startContainer"],g=d?"endOffset":"startOffset",l=h?c.document.getById(a.startNode):a.startNode;a=h?c.document.getById(a.endNode):a.endNode;k.equals(l.getPrevious())?(c.startOffset=c.startOffset-k.getLength()-a.getPrevious().getLength(),k=a.getNext()):k.equals(a.getPrevious())&&(c.startOffset-=k.getLength(),k=a.getNext());k.equals(l.getParent())&&c[g]++;k.equals(a.getParent())&&c[g]++;c[d?"endContainer":"startContainer"]=k;return c} +CKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,d)};var d={createIterator:function(){var a=this,c=CKEDITOR.dom.walker.bookmark(),d=[],h;return{getNextRange:function(k){h=void 0===h?0:h+1;var g=a[h];if(g&&1b?-1:1}),f=0,g;fCKEDITOR.env.version? +a[h].$.styleSheet.cssText+=g:a[h].$.innerHTML+=g}}var h={};CKEDITOR.skin={path:a,loadPart:function(c,d){CKEDITOR.skin.name!=CKEDITOR.skinName.split(",")[0]?CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(a()+"skin.js"),function(){b(c,d)}):b(c,d)},getPath:function(a){return CKEDITOR.getUrl(d(a))},icons:{},addIcon:function(a,b,c,d){a=a.toLowerCase();this.icons[a]||(this.icons[a]={path:b,offset:c||0,bgsize:d||"16px"})},getIconStyle:function(a,b,c,d,f){var g;a&&(a=a.toLowerCase(),b&&(g=this.icons[a+"-rtl"]), +g||(g=this.icons[a]));a=c||g&&g.path||"";d=d||g&&g.offset;f=f||g&&g.bgsize||"16px";a&&(a=a.replace(/'/g,"\\'"));return a&&"background-image:url('"+CKEDITOR.getUrl(a)+"');background-position:0 "+d+"px;background-size:"+f+";"}};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{getUiColor:function(){return this.uiColor},setUiColor:function(a){var b=c(CKEDITOR.document);return(this.setUiColor=function(a){this.uiColor=a;var c=CKEDITOR.skin.chameleon,d="",h="";"function"==typeof c&&(d=c(this,"editor"),h= +c(this,"panel"));a=[[l,a]];f([b],d,a);f(g,h,a)}).call(this,a)}});var k="cke_ui_color",g=[],l=/\$color/g;CKEDITOR.on("instanceLoaded",function(a){if(!CKEDITOR.env.ie||!CKEDITOR.env.quirks){var b=a.editor;a=function(a){a=(a.data[0]||a.data).element.getElementsByTag("iframe").getItem(0).getFrameDocument();if(!a.getById("cke_ui_color")){var d=c(a);g.push(d);b.on("destroy",function(){g=CKEDITOR.tools.array.filter(g,function(a){return d!==a})});(a=b.getUiColor())&&f([d],CKEDITOR.skin.chameleon(b,"panel"), +[[l,a]])}};b.on("panelShow",a);b.on("menuShow",a);b.config.uiColor&&b.setUiColor(b.config.uiColor)}})})(); +(function(){if(CKEDITOR.env.webkit)CKEDITOR.env.hc=!1;else{var a=CKEDITOR.dom.element.createFromHtml('\x3cdiv style\x3d"width:0;height:0;position:absolute;left:-10000px;border:1px solid;border-color:red blue"\x3e\x3c/div\x3e',CKEDITOR.document);a.appendTo(CKEDITOR.document.getHead());try{var d=a.getComputedStyle("border-top-color"),b=a.getComputedStyle("border-right-color");CKEDITOR.env.hc=!(!d||d!=b)}catch(c){CKEDITOR.env.hc=!1}a.remove()}CKEDITOR.env.hc&&(CKEDITOR.env.cssClass+=" cke_hc");CKEDITOR.document.appendStyleText(".cke{visibility:hidden;}"); +CKEDITOR.status="loaded";CKEDITOR.fireOnce("loaded");if(a=CKEDITOR._.pending)for(delete CKEDITOR._.pending,d=0;de;e++){var f=e,c;c=parseInt(a[e],16);c=("0"+(0>d?0|c*(1+d):0|c+(255-c)*d).toString(16)).slice(-2);a[f]=c}return"#"+a.join("")}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ background-color:{defaultBackground};border-bottom-color:{defaultBorder};] {id} .cke_bottom [background-color:{defaultBackground};border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [background-color:{defaultBackground};border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [background-color:{defaultBackground};outline-color:{defaultBorder};] {id} .cke_dialog_tab [background-color:{dialogTab};border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [background-color:{lightBackground};] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} a.cke_button_off:hover,{id} a.cke_button_off:focus,{id} a.cke_button_off:active [background-color:{darkBackground};border-color:{toolbarElementsBorder};] {id} .cke_button_on [background-color:{ckeButtonOn};border-color:{toolbarElementsBorder};] {id} .cke_toolbar_separator,{id} .cke_toolgroup a.cke_button:last-child:after,{id} .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after [background-color: {toolbarElementsBorder};border-color: {toolbarElementsBorder};] {id} a.cke_combo_button:hover,{id} a.cke_combo_button:focus,{id} .cke_combo_on a.cke_combo_button [border-color:{toolbarElementsBorder};background-color:{darkBackground};] {id} .cke_combo:after [border-color:{toolbarElementsBorder};] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover,{id} a.cke_path_item:focus,{id} a.cke_path_item:active [background-color:{darkBackground};] {id}.cke_panel [border-color:{defaultBorder};] "),panel:new CKEDITOR.template(".cke_panel_grouptitle [background-color:{lightBackground};border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active [background-color:{menubuttonHover};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")}; +return function(g,d){var a=b(g.uiColor,.4),a={id:"."+g.id,defaultBorder:b(a,-.2),toolbarElementsBorder:b(a,-.25),defaultBackground:a,lightBackground:b(a,.8),darkBackground:b(a,-.15),ckeButtonOn:b(a,.4),ckeResizer:b(a,-.4),ckeColorauto:b(a,.8),dialogBody:b(a,.7),dialogTab:b(a,.65),dialogTabSelected:"#FFF",dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-.6),menubuttonHover:b(a,.1),menubuttonIcon:b(a,.5),menubuttonIconHover:b(a,.3)};return f[d].output(a).replace(/\[/g,"{").replace(/\]/g,"}")}}();CKEDITOR.plugins.add("dialogui",{onLoad:function(){var h=function(b){this._||(this._={});this._["default"]=this._.initValue=b["default"]||"";this._.required=b.required||!1;for(var a=[this._],d=1;darguments.length)){var c=h.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+ +"_label";this._.children=[];var e={role:a.role||"presentation"};a.includeLabel&&(e["aria-labelledby"]=c.labelId);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"div",null,e,function(){var e=[],g=a.required?" cke_required":"";"horizontal"!=a.labelLayout?e.push('\x3clabel class\x3d"cke_dialog_ui_labeled_label'+g+'" ',' id\x3d"'+c.labelId+'"',c.inputId?' for\x3d"'+c.inputId+'"':"",(a.labelStyle?' style\x3d"'+a.labelStyle+'"':"")+"\x3e",a.label,"\x3c/label\x3e",'\x3cdiv class\x3d"cke_dialog_ui_labeled_content"', +a.controlStyle?' style\x3d"'+a.controlStyle+'"':"",' role\x3d"presentation"\x3e',f.call(this,b,a),"\x3c/div\x3e"):(g={type:"hbox",widths:a.widths,padding:0,children:[{type:"html",html:'\x3clabel class\x3d"cke_dialog_ui_labeled_label'+g+'" id\x3d"'+c.labelId+'" for\x3d"'+c.inputId+'"'+(a.labelStyle?' style\x3d"'+a.labelStyle+'"':"")+"\x3e"+CKEDITOR.tools.htmlEncode(a.label)+"\x3c/label\x3e"},{type:"html",html:'\x3cspan class\x3d"cke_dialog_ui_labeled_content"'+(a.controlStyle?' style\x3d"'+a.controlStyle+ +'"':"")+"\x3e"+f.call(this,b,a)+"\x3c/span\x3e"}]},CKEDITOR.dialog._.uiElementBuilders.hbox.build(b,g,e));return e.join("")})}},textInput:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this._.inputId=CKEDITOR.tools.getNextId()+"_textInput",c={"class":"cke_dialog_ui_input_"+a.type,id:f,type:a.type};a.validate&&(this.validate=a.validate);a.maxLength&&(c.maxlength=a.maxLength);a.size&&(c.size=a.size);a.inputStyle&&(c.style=a.inputStyle);var e=this,m=!1;b.on("load",function(){e.getInputElement().on("keydown", +function(a){13==a.data.getKeystroke()&&(m=!0)});e.getInputElement().on("keyup",function(a){13==a.data.getKeystroke()&&m&&(b.getButton("ok")&&setTimeout(function(){b.getButton("ok").click()},0),m=!1);e.bidi&&w.call(e,a)},null,null,1E3)});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var b=['\x3cdiv class\x3d"cke_dialog_ui_input_',a.type,'" role\x3d"presentation"'];a.width&&b.push('style\x3d"width:'+a.width+'" ');b.push("\x3e\x3cinput ");c["aria-labelledby"]=this._.labelId;this._.required&& +(c["aria-required"]=this._.required);for(var e in c)b.push(e+'\x3d"'+c[e]+'" ');b.push(" /\x3e\x3c/div\x3e");return b.join("")})}},textarea:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this,c=this._.inputId=CKEDITOR.tools.getNextId()+"_textarea",e={};a.validate&&(this.validate=a.validate);e.rows=a.rows||5;e.cols=a.cols||20;e["class"]="cke_dialog_ui_input_textarea "+(a["class"]||"");"undefined"!=typeof a.inputStyle&&(e.style=a.inputStyle);a.dir&&(e.dir=a.dir);if(f.bidi)b.on("load", +function(){f.getInputElement().on("keyup",w)},f);CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){e["aria-labelledby"]=this._.labelId;this._.required&&(e["aria-required"]=this._.required);var a=['\x3cdiv class\x3d"cke_dialog_ui_input_textarea" role\x3d"presentation"\x3e\x3ctextarea id\x3d"',c,'" '],b;for(b in e)a.push(b+'\x3d"'+CKEDITOR.tools.htmlEncode(e[b])+'" ');a.push("\x3e",CKEDITOR.tools.htmlEncode(f._["default"]),"\x3c/textarea\x3e\x3c/div\x3e");return a.join("")})}},checkbox:function(b, +a,d){if(!(3>arguments.length)){var f=h.call(this,a,{"default":!!a["default"]});a.validate&&(this.validate=a.validate);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"span",null,null,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_checkbox":CKEDITOR.tools.getNextId()+"_checkbox"},!0),e=[],d=CKEDITOR.tools.getNextId()+"_label",g={"class":"cke_dialog_ui_checkbox_input",type:"checkbox","aria-labelledby":d};t(c);a["default"]&&(g.checked="checked");"undefined"!=typeof c.inputStyle&&(c.style=c.inputStyle); +f.checkbox=new CKEDITOR.ui.dialog.uiElement(b,c,e,"input",null,g);e.push(' \x3clabel id\x3d"',d,'" for\x3d"',g.id,'"'+(a.labelStyle?' style\x3d"'+a.labelStyle+'"':"")+"\x3e",CKEDITOR.tools.htmlEncode(a.label),"\x3c/label\x3e");return e.join("")})}},radio:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);this._["default"]||(this._["default"]=this._.initValue=a.items[0][1]);a.validate&&(this.validate=a.validate);var f=[],c=this;a.role="radiogroup";a.includeLabel=!0;CKEDITOR.ui.dialog.labeledElement.call(this, +b,a,d,function(){for(var e=[],d=[],g=(a.id?a.id:CKEDITOR.tools.getNextId())+"_radio",k=0;karguments.length)){var f=h.call(this,a);a.validate&&(this.validate=a.validate);f.inputId=CKEDITOR.tools.getNextId()+"_select";CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_select":CKEDITOR.tools.getNextId()+"_select"},!0),e=[],d=[],g={id:f.inputId,"class":"cke_dialog_ui_input_select","aria-labelledby":this._.labelId};e.push('\x3cdiv class\x3d"cke_dialog_ui_input_', +a.type,'" role\x3d"presentation"');a.width&&e.push('style\x3d"width:'+a.width+'" ');e.push("\x3e");void 0!==a.size&&(g.size=a.size);void 0!==a.multiple&&(g.multiple=a.multiple);t(c);for(var k=0,l;karguments.length)){void 0===a["default"]&&(a["default"]="");var f=CKEDITOR.tools.extend(h.call(this,a),{definition:a,buttons:[]});a.validate&&(this.validate=a.validate);b.on("load",function(){CKEDITOR.document.getById(f.frameId).getParent().addClass("cke_dialog_ui_input_file")});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){f.frameId=CKEDITOR.tools.getNextId()+"_fileInput";var b=['\x3ciframe frameborder\x3d"0" allowtransparency\x3d"0" class\x3d"cke_dialog_ui_input_file" role\x3d"presentation" id\x3d"', +f.frameId,'" title\x3d"',a.label,'" src\x3d"javascript:void('];b.push(CKEDITOR.env.ie?"(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"})()":"0");b.push(')"\x3e\x3c/iframe\x3e');return b.join("")})}},fileButton:function(b,a,d){var f=this;if(!(3>arguments.length)){h.call(this,a);a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),e=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d= +a["for"];c=e?e.call(this,c):!1;!1!==c&&("xhr"!==c&&b.getContentElement(d[0],d[1]).submit(),this.disable())};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(f)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(f,c,e){if(!(3>arguments.length)){var m=[],g=c.html;"\x3c"!=g.charAt(0)&&(g="\x3cspan\x3e"+g+"\x3c/span\x3e");var k=c.focus;if(k){var l=this.focus; +this.focus=function(){("function"==typeof k?k:l).call(this);this.fire("focus")};c.isFocusable&&(this.isFocusable=this.isFocusable);this.keyboardFocusable=!0}CKEDITOR.ui.dialog.uiElement.call(this,f,c,m,"span",null,null,"");m=m.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);e.push([g[1]," ",m[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,f,c){var e=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,f,"fieldset",null,null,function(){var a= +[];e&&a.push("\x3clegend"+(c.labelStyle?' style\x3d"'+c.labelStyle+'"':"")+"\x3e"+e+"\x3c/legend\x3e");for(var b=0;ba.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue= +b;return this},getLabel:function(){var b=CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?"":b.getChild(0).getText()},eventProcessors:v},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return this._.disabled?!1:this.fire("click",{dialog:this._.dialog})},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")}, +isVisible:function(){return this.getElement().getFirst().isVisible()},isEnabled:function(){return!this._.disabled},eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)}, +focus:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){if(this.bidi){var a=b&&b.charAt(0);(a="‪"==a?"ltr":"‫"==a?"rtl":null)&&(b=b.slice(1));this.setDirectionMarker(a)}b||(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)}, +getValue:function(){var b=CKEDITOR.ui.dialog.uiElement.prototype.getValue.call(this);if(this.bidi&&b){var a=this.getDirectionMarker();a&&(b=("ltr"==a?"‪":"‫")+b)}return b},setDirectionMarker:function(b){var a=this.getInputElement();b?a.setAttributes({dir:b,"data-cke-dir-marker":b}):this.getDirectionMarker()&&a.removeAttributes(["dir","data-cke-dir-marker"])},getDirectionMarker:function(){return this.getInputElement().data("cke-dir-marker")},keyboardFocusable:!0},q,!0);CKEDITOR.ui.dialog.textarea.prototype= +new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var f=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;f.$.text=b;f.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(f.$):c.add(f.$,null):c.add(f.$,d);return this},remove:function(b){this.getInputElement().$.remove(b); +return this},clear:function(){for(var b=this.getInputElement().$;0b-a;c--)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function z(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId),c=b+1;ck.width-c.width-g?k.width-c.width+("rtl"==f.lang.dir?0:h[1]):d.x,d.y+h[0]k.height-c.height-g?k.height-c.height+h[2]:d.y,1);b.data.preventDefault()} +function c(){CKEDITOR.document.removeListener("mousemove",b);CKEDITOR.document.removeListener("mouseup",c);if(CKEDITOR.env.ie6Compat){var a=t.getChild(0).getFrameDocument();a.removeListener("mousemove",b);a.removeListener("mouseup",c)}}var e=null,d=null,f=a.getParentEditor(),g=f.config.dialog_magnetDistance,h=CKEDITOR.skin.margins||[0,0,0,0];"undefined"==typeof g&&(g=20);a.parts.title.on("mousedown",function(g){e={x:g.data.$.screenX,y:g.data.$.screenY};CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup", +c);d=a.getPosition();if(CKEDITOR.env.ie6Compat){var f=t.getChild(0).getFrameDocument();f.on("mousemove",b);f.on("mouseup",c)}g.data.preventDefault()},a)}function Y(a){function b(b){var c="rtl"==f.lang.dir,n=k.width,q=k.height,F=n+(b.data.$.screenX-m.x)*(c?-1:1)*(a._.moved?1:2),G=q+(b.data.$.screenY-m.y)*(a._.moved?1:2),A=a._.element.getFirst(),A=c&&A.getComputedStyle("right"),B=a.getPosition();B.y+G>p.height&&(G=p.height-B.y);(c?A:B.x)+F>p.width&&(F=p.width-(c?A:B.x));if(d==CKEDITOR.DIALOG_RESIZE_WIDTH|| +d==CKEDITOR.DIALOG_RESIZE_BOTH)n=Math.max(e.minWidth||0,F-g);if(d==CKEDITOR.DIALOG_RESIZE_HEIGHT||d==CKEDITOR.DIALOG_RESIZE_BOTH)q=Math.max(e.minHeight||0,G-h);a.resize(n,q);a._.moved||a.layout();b.data.preventDefault()}function c(){CKEDITOR.document.removeListener("mouseup",c);CKEDITOR.document.removeListener("mousemove",b);q&&(q.remove(),q=null);if(CKEDITOR.env.ie6Compat){var a=t.getChild(0).getFrameDocument();a.removeListener("mouseup",c);a.removeListener("mousemove",b)}}var e=a.definition,d=e.resizable; +if(d!=CKEDITOR.DIALOG_RESIZE_NONE){var f=a.getParentEditor(),g,h,p,m,k,q,n=CKEDITOR.tools.addFunction(function(d){k=a.getSize();var e=a.parts.contents;e.$.getElementsByTagName("iframe").length&&(q=CKEDITOR.dom.element.createFromHtml('\x3cdiv class\x3d"cke_dialog_resize_cover" style\x3d"height: 100%; position: absolute; width: 100%;"\x3e\x3c/div\x3e'),e.append(q));h=k.height-a.parts.contents.getSize("height",!(CKEDITOR.env.gecko||CKEDITOR.env.ie&&CKEDITOR.env.quirks));g=k.width-a.parts.contents.getSize("width", +1);m={x:d.screenX,y:d.screenY};p=CKEDITOR.document.getWindow().getViewPaneSize();CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup",c);CKEDITOR.env.ie6Compat&&(e=t.getChild(0).getFrameDocument(),e.on("mousemove",b),e.on("mouseup",c));d.preventDefault&&d.preventDefault()});a.on("load",function(){var b="";d==CKEDITOR.DIALOG_RESIZE_WIDTH?b=" cke_resizer_horizontal":d==CKEDITOR.DIALOG_RESIZE_HEIGHT&&(b=" cke_resizer_vertical");b=CKEDITOR.dom.element.createFromHtml('\x3cdiv class\x3d"cke_resizer'+ +b+" cke_resizer_"+f.lang.dir+'" title\x3d"'+CKEDITOR.tools.htmlEncode(f.lang.common.resize)+'" onmousedown\x3d"CKEDITOR.tools.callFunction('+n+', event )"\x3e'+("ltr"==f.lang.dir?"◢":"◣")+"\x3c/div\x3e");a.parts.footer.append(b,1)});f.on("destroy",function(){CKEDITOR.tools.removeFunction(n)})}}function H(a){a.data.preventDefault(1)}function M(a){var b=CKEDITOR.document.getWindow(),c=a.config,e=CKEDITOR.skinName||a.config.skin,d=c.dialog_backgroundCoverColor||("moono-lisa"==e?"black":"white"),e=c.dialog_backgroundCoverOpacity, +f=c.baseFloatZIndex,c=CKEDITOR.tools.genKey(d,e,f),g=y[c];g?g.show():(f=['\x3cdiv tabIndex\x3d"-1" style\x3d"position: ',CKEDITOR.env.ie6Compat?"absolute":"fixed","; z-index: ",f,"; top: 0px; left: 0px; ",CKEDITOR.env.ie6Compat?"":"background-color: "+d,'" class\x3d"cke_dialog_background_cover"\x3e'],CKEDITOR.env.ie6Compat&&(d="\x3chtml\x3e\x3cbody style\x3d\\'background-color:"+d+";\\'\x3e\x3c/body\x3e\x3c/html\x3e",f.push('\x3ciframe hidefocus\x3d"true" frameborder\x3d"0" id\x3d"cke_dialog_background_iframe" src\x3d"javascript:'), +f.push("void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.write( '"+d+"' );document.close();")+"})())"),f.push('" style\x3d"position:absolute;left:0;top:0;width:100%;height: 100%;filter: progid:DXImageTransform.Microsoft.Alpha(opacity\x3d0)"\x3e\x3c/iframe\x3e')),f.push("\x3c/div\x3e"),g=CKEDITOR.dom.element.createFromHtml(f.join("")),g.setOpacity(void 0!==e?e:.5),g.on("keydown",H),g.on("keypress",H),g.on("keyup",H),g.appendTo(CKEDITOR.document.getBody()), +y[c]=g);a.focusManager.add(g);t=g;a=function(){var a=b.getViewPaneSize();g.setStyles({width:a.width+"px",height:a.height+"px"})};var h=function(){var a=b.getScrollPosition(),c=CKEDITOR.dialog._.currentTop;g.setStyles({left:a.x+"px",top:a.y+"px"});if(c){do a=c.getPosition(),c.move(a.x,a.y);while(c=c._.parentDialog)}};I=a;b.on("resize",a);a();CKEDITOR.env.mac&&CKEDITOR.env.webkit||g.focus();if(CKEDITOR.env.ie6Compat){var p=function(){h();p.prevScrollHandler.apply(this,arguments)};b.$.setTimeout(function(){p.prevScrollHandler= +window.onscroll||function(){};window.onscroll=p},0);h()}}function N(a){t&&(a.focusManager.remove(t),a=CKEDITOR.document.getWindow(),t.hide(),t=null,a.removeListener("resize",I),CKEDITOR.env.ie6Compat&&a.$.setTimeout(function(){window.onscroll=window.onscroll&&window.onscroll.prevScrollHandler||null},0),I=null)}var u=CKEDITOR.tools.cssLength,V='\x3cdiv class\x3d"cke_reset_all {editorId} {editorDialogClass} {hidpi}" dir\x3d"{langDir}" lang\x3d"{langCode}" role\x3d"dialog" aria-labelledby\x3d"cke_dialog_title_{id}"\x3e\x3ctable class\x3d"cke_dialog '+ +CKEDITOR.env.cssClass+' cke_{langDir}" style\x3d"position:absolute" role\x3d"presentation"\x3e\x3ctr\x3e\x3ctd role\x3d"presentation"\x3e\x3cdiv class\x3d"cke_dialog_body" role\x3d"presentation"\x3e\x3cdiv id\x3d"cke_dialog_title_{id}" class\x3d"cke_dialog_title" role\x3d"presentation"\x3e\x3c/div\x3e\x3ca id\x3d"cke_dialog_close_button_{id}" class\x3d"cke_dialog_close_button" href\x3d"javascript:void(0)" title\x3d"{closeTitle}" role\x3d"button"\x3e\x3cspan class\x3d"cke_label"\x3eX\x3c/span\x3e\x3c/a\x3e\x3cdiv id\x3d"cke_dialog_tabs_{id}" class\x3d"cke_dialog_tabs" role\x3d"tablist"\x3e\x3c/div\x3e\x3ctable class\x3d"cke_dialog_contents" role\x3d"presentation"\x3e\x3ctr\x3e\x3ctd id\x3d"cke_dialog_contents_{id}" class\x3d"cke_dialog_contents_body" role\x3d"presentation"\x3e\x3c/td\x3e\x3c/tr\x3e\x3ctr\x3e\x3ctd id\x3d"cke_dialog_footer_{id}" class\x3d"cke_dialog_footer" role\x3d"presentation"\x3e\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e\x3c/div\x3e\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e\x3c/div\x3e'; +CKEDITOR.dialog=function(a,b){function c(){var a=l._.focusList;a.sort(function(a,b){return a.tabIndex!=b.tabIndex?b.tabIndex-a.tabIndex:a.focusIndex-b.focusIndex});for(var b=a.length,c=0;cb.length)){var c=l._.currentFocusIndex;l._.tabBarMode&&0>a&&(c=0);try{b[c].getInputElement().$.blur()}catch(d){}var e=c,g=1c.height||b.width+(0c.width?a.setStyle("position","absolute"):a.setStyle("position","fixed"));this.move(this._.moved?this._.position.x:e,this._.moved?this._.position.y:d)},foreach:function(a){for(var b in this._.contents)for(var c in this._.contents[b])a.call(this,this._.contents[b][c]);return this},reset:function(){var a=function(a){a.reset&&a.reset(1)};return function(){this.foreach(a);return this}}(), +setupContent:function(){var a=arguments;this.foreach(function(b){b.setup&&b.setup.apply(b,a)})},commitContent:function(){var a=arguments;this.foreach(function(b){CKEDITOR.env.ie&&this._.currentFocusIndex==b.focusIndex&&b.getInputElement().$.blur();b.commit&&b.commit.apply(b,a)})},hide:function(){if(this.parts.dialog.isVisible()){this.fire("hide",{});this._.editor.fire("dialogHide",this);this.selectPage(this._.tabIdList[0]);var a=this._.element;a.setStyle("display","none");this.parts.dialog.setStyle("visibility", +"hidden");for(aa(this);CKEDITOR.dialog._.currentTop!=this;)CKEDITOR.dialog._.currentTop.hide();if(this._.parentDialog){var b=this._.parentDialog.getElement().getFirst();b.setStyle("z-index",parseInt(b.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2))}else N(this._.editor);if(CKEDITOR.dialog._.currentTop=this._.parentDialog)CKEDITOR.dialog._.currentZIndex-=10;else{CKEDITOR.dialog._.currentZIndex=null;a.removeListener("keydown",P);a.removeListener("keyup",Q);var c=this._.editor; +c.focus();setTimeout(function(){c.focusManager.unlock();CKEDITOR.env.iOS&&c.window.focus()},0)}delete this._.parentDialog;this.foreach(function(a){a.resetInitValue&&a.resetInitValue()});this.setState(CKEDITOR.DIALOG_STATE_IDLE)}},addPage:function(a){if(!a.requiredContent||this._.editor.filter.check(a.requiredContent)){for(var b=[],c=a.label?' title\x3d"'+CKEDITOR.tools.htmlEncode(a.label)+'"':"",e=CKEDITOR.dialog._.uiElementBuilders.vbox.build(this,{type:"vbox",className:"cke_dialog_page_contents", +children:a.elements,expand:!!a.expand,padding:a.padding,style:a.style||"width: 100%;"},b),d=this._.contents[a.id]={},f=e.getChild(),g=0;e=f.shift();)e.notAllowed||"hbox"==e.type||"vbox"==e.type||g++,d[e.id]=e,"function"==typeof e.getChild&&f.push.apply(f,e.getChild());g||(a.hidden=!0);b=CKEDITOR.dom.element.createFromHtml(b.join(""));b.setAttribute("role","tabpanel");e=CKEDITOR.env;d="cke_"+a.id+"_"+CKEDITOR.tools.getNextNumber();c=CKEDITOR.dom.element.createFromHtml(['\x3ca class\x3d"cke_dialog_tab"', +0arguments.length)){var h=(e.call?e(b):e)||"div",p=["\x3c",h," "],m=(d&&d.call?d(b):d)||{},k=(f&&f.call?f(b):f)||{},q=(g&&g.call?g.call(this,a,b):g)||"",n=this.domId=k.id||CKEDITOR.tools.getNextId()+"_uiElement";b.requiredContent&&!a.getParentEditor().filter.check(b.requiredContent)&&(m.display="none",this.notAllowed=!0);k.id=n;var r={};b.type&&(r["cke_dialog_ui_"+ +b.type]=1);b.className&&(r[b.className]=1);b.disabled&&(r.cke_disabled=1);for(var l=k["class"]&&k["class"].split?k["class"].split(" "):[],n=0;nCKEDITOR.env.version?"cke_dialog_ui_focused":"";b.on("focus",function(){a._.tabBarMode=!1;a._.hasFocus=!0;t.fire("focus"); +c&&this.addClass(c)});b.on("blur",function(){t.fire("blur");c&&this.removeClass(c)})}});CKEDITOR.tools.extend(this,b);this.keyboardFocusable&&(this.tabIndex=b.tabIndex||0,this.focusIndex=a._.focusList.push(this)-1,this.on("focus",function(){a._.currentFocusIndex=t.focusIndex}))}},hbox:function(a,b,c,e,d){if(!(4>arguments.length)){this._||(this._={});var f=this._.children=b,g=d&&d.widths||null,h=d&&d.height||null,p,m={role:"presentation"};d&&d.align&&(m.align=d.align);CKEDITOR.ui.dialog.uiElement.call(this, +a,d||{type:"hbox"},e,"table",{},m,function(){var a=['\x3ctbody\x3e\x3ctr class\x3d"cke_dialog_ui_hbox"\x3e'];for(p=0;parguments.length)){this._||(this._={});var f=this._.children=b,g=d&&d.width||null,h=d&&d.heights||null;CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"vbox"},e,"div",null,{role:"presentation"},function(){var b=['\x3ctable role\x3d"presentation" cellspacing\x3d"0" border\x3d"0" ']; +b.push('style\x3d"');d&&d.expand&&b.push("height:100%;");b.push("width:"+u(g||"100%"),";");CKEDITOR.env.webkit&&b.push("float:none;");b.push('"');b.push('align\x3d"',CKEDITOR.tools.htmlEncode(d&&d.align||("ltr"==a.getParentEditor().lang.dir?"left":"right")),'" ');b.push("\x3e\x3ctbody\x3e");for(var e=0;earguments.length)return this._.children.concat();a.splice||(a=[a]);return 2>a.length?this._.children[a[0]]:this._.children[a[0]]&&this._.children[a[0]].getChild?this._.children[a[0]].getChild(a.slice(1,a.length)):null}},!0);CKEDITOR.ui.dialog.vbox.prototype=new CKEDITOR.ui.dialog.hbox;(function(){var a={build:function(a,c,e){for(var d=c.children,f,g=[],h=[],p=0;pe.length&&(a=g.document.createElement(g.config.enterMode==CKEDITOR.ENTER_P?"p":"div"),b=h.shift(),c.insertNode(a),a.append(new CKEDITOR.dom.text("",g.document)),c.moveToBookmark(b),c.selectNodeContents(a),c.collapse(!0),b=c.createBookmark(),e.push(a),h.unshift(b));d=e[0].getParent();c=[];for(b=0;ba||(this.notifications.splice(a,1),b.element.remove(),this.element.getChildCount()||(this._removeListeners(),this.element.remove()))},_createElement:function(){var b=this.editor,a=b.config,c=new CKEDITOR.dom.element("div");c.addClass("cke_notifications_area");c.setAttribute("id","cke_notifications_area_"+b.name);c.setStyle("z-index",a.baseFloatZIndex-2);return c},_attachListeners:function(){var b=CKEDITOR.document.getWindow(),a=this.editor;b.on("scroll",this._uiBuffer.input);b.on("resize",this._uiBuffer.input); +a.on("change",this._changeBuffer.input);a.on("floatingSpaceLayout",this._layout,this,null,20);a.on("blur",this._layout,this,null,20)},_removeListeners:function(){var b=CKEDITOR.document.getWindow(),a=this.editor;b.removeListener("scroll",this._uiBuffer.input);b.removeListener("resize",this._uiBuffer.input);a.removeListener("change",this._changeBuffer.input);a.removeListener("floatingSpaceLayout",this._layout);a.removeListener("blur",this._layout)},_layout:function(){function b(){a.setStyle("left", +k(n+d.width-g-h))}var a=this.element,c=this.editor,d=c.ui.contentsElement.getClientRect(),e=c.ui.contentsElement.getDocumentPosition(),f,l,u=a.getClientRect(),m,g=this._notificationWidth,h=this._notificationMargin;m=CKEDITOR.document.getWindow();var p=m.getScrollPosition(),t=m.getViewPaneSize(),q=CKEDITOR.document.getBody(),r=q.getDocumentPosition(),k=CKEDITOR.tools.cssLength;g&&h||(m=this.element.getChild(0),g=this._notificationWidth=m.getClientRect().width,h=this._notificationMargin=parseInt(m.getComputedStyle("margin-left"), +10)+parseInt(m.getComputedStyle("margin-right"),10));c.toolbar&&(f=c.ui.space("top"),l=f.getClientRect());f&&f.isVisible()&&l.bottom>d.top&&l.bottomp.y?a.setStyles({position:"fixed",top:0}):a.setStyles({position:"absolute",top:k(e.y+d.height-u.height)});var n="fixed"==a.getStyle("position")?d.left:"static"!=q.getComputedStyle("position")?e.x-r.x:e.x;d.width< +g+h?e.x+g+h>p.x+t.width?b():a.setStyle("left",k(n)):e.x+g+h>p.x+t.width?a.setStyle("left",k(n)):e.x+d.width/2+g/2+h>p.x+t.width?a.setStyle("left",k(n-e.x+p.x+t.width-g-h)):0>d.left+d.width-g-h?b():0>d.left+d.width/2-g/2?a.setStyle("left",k(n-e.x+p.x)):a.setStyle("left",k(n+d.width/2-g/2-h/2))}};CKEDITOR.plugins.notification=q})();(function(){var c='\x3ca id\x3d"{id}" class\x3d"cke_button cke_button__{name} cke_button_{state} {cls}"'+(CKEDITOR.env.gecko&&!CKEDITOR.env.hc?"":" href\x3d\"javascript:void('{titleJs}')\"")+' title\x3d"{title}" tabindex\x3d"-1" hidefocus\x3d"true" role\x3d"button" aria-labelledby\x3d"{id}_label" aria-describedby\x3d"{id}_description" aria-haspopup\x3d"{hasArrow}" aria-disabled\x3d"{ariaDisabled}"';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(c+=' onkeypress\x3d"return false;"');CKEDITOR.env.gecko&&(c+= +' onblur\x3d"this.style.cssText \x3d this.style.cssText;"');var k="";CKEDITOR.env.ie&&(k='return false;" onmouseup\x3d"CKEDITOR.tools.getMouseButton(event)\x3d\x3dCKEDITOR.MOUSE_BUTTON_LEFT\x26\x26');var c=c+(' onkeydown\x3d"return CKEDITOR.tools.callFunction({keydownFn},event);" onfocus\x3d"return CKEDITOR.tools.callFunction({focusFn},event);" onclick\x3d"'+k+'CKEDITOR.tools.callFunction({clickFn},this);return false;"\x3e\x3cspan class\x3d"cke_button_icon cke_button__{iconName}_icon" style\x3d"{style}"')+ +'\x3e\x26nbsp;\x3c/span\x3e\x3cspan id\x3d"{id}_label" class\x3d"cke_button_label cke_button__{name}_label" aria-hidden\x3d"false"\x3e{label}\x3c/span\x3e\x3cspan id\x3d"{id}_description" class\x3d"cke_button_label" aria-hidden\x3d"false"\x3e{ariaShortcut}\x3c/span\x3e{arrowHtml}\x3c/a\x3e',v=CKEDITOR.addTemplate("buttonArrow",'\x3cspan class\x3d"cke_button_arrow"\x3e'+(CKEDITOR.env.hc?"\x26#9660;":"")+"\x3c/span\x3e"),w=CKEDITOR.addTemplate("button",c);CKEDITOR.plugins.add("button",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_BUTTON, +CKEDITOR.ui.button.handler)}});CKEDITOR.UI_BUTTON="button";CKEDITOR.ui.button=function(a){CKEDITOR.tools.extend(this,a,{title:a.label,click:a.click||function(b){b.execCommand(a.command)}});this._={}};CKEDITOR.ui.button.handler={create:function(a){return new CKEDITOR.ui.button(a)}};CKEDITOR.ui.button.prototype={render:function(a,b){function c(){var f=a.mode;f&&(f=this.modes[f]?void 0!==p[f]?p[f]:CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,f=a.readOnly&&!this.readOnly?CKEDITOR.TRISTATE_DISABLED: +f,this.setState(f),this.refresh&&this.refresh())}var p=null,q=CKEDITOR.env,r=this._.id=CKEDITOR.tools.getNextId(),g="",d=this.command,k,l,m;this._.editor=a;var e={id:r,button:this,editor:a,focus:function(){CKEDITOR.document.getById(r).focus()},execute:function(){this.button.click(a)},attach:function(a){this.button.attach(a)}},x=CKEDITOR.tools.addFunction(function(a){if(e.onkey)return a=new CKEDITOR.dom.event(a),!1!==e.onkey(e,a.getKeystroke())}),y=CKEDITOR.tools.addFunction(function(a){var b;e.onfocus&& +(b=!1!==e.onfocus(e,new CKEDITOR.dom.event(a)));return b}),u=0;e.clickFn=k=CKEDITOR.tools.addFunction(function(){u&&(a.unlockSelection(1),u=0);e.execute();q.iOS&&a.focus()});this.modes?(p={},a.on("beforeModeUnload",function(){a.mode&&this._.state!=CKEDITOR.TRISTATE_DISABLED&&(p[a.mode]=this._.state)},this),a.on("activeFilterChange",c,this),a.on("mode",c,this),!this.readOnly&&a.on("readOnly",c,this)):d&&(d=a.getCommand(d))&&(d.on("state",function(){this.setState(d.state)},this),g+=d.state==CKEDITOR.TRISTATE_ON? +"on":d.state==CKEDITOR.TRISTATE_DISABLED?"disabled":"off");var n;if(this.directional)a.on("contentDirChanged",function(b){var c=CKEDITOR.document.getById(this._.id),d=c.getFirst();b=b.data;b!=a.lang.dir?c.addClass("cke_"+b):c.removeClass("cke_ltr").removeClass("cke_rtl");d.setAttribute("style",CKEDITOR.skin.getIconStyle(n,"rtl"==b,this.icon,this.iconOffset))},this);d?(l=a.getCommandKeystroke(d))&&(m=CKEDITOR.tools.keystrokeToString(a.lang.common.keyboard,l)):g+="off";l=this.name||this.command;var h= +null,t=this.icon;n=l;this.icon&&!/\./.test(this.icon)?(n=this.icon,t=null):(this.icon&&(h=this.icon),CKEDITOR.env.hidpi&&this.iconHiDpi&&(h=this.iconHiDpi));h?(CKEDITOR.skin.addIcon(h,h),t=null):h=n;g={id:r,name:l,iconName:n,label:this.label,cls:(this.hasArrow?"cke_button_expandable ":"")+(this.className||""),state:g,ariaDisabled:"disabled"==g?"true":"false",title:this.title+(m?" ("+m.display+")":""),ariaShortcut:m?a.lang.common.keyboardShortcut+" "+m.aria:"",titleJs:q.gecko&&!q.hc?"":(this.title|| +"").replace("'",""),hasArrow:"string"===typeof this.hasArrow&&this.hasArrow||(this.hasArrow?"true":"false"),keydownFn:x,focusFn:y,clickFn:k,style:CKEDITOR.skin.getIconStyle(h,"rtl"==a.lang.dir,t,this.iconOffset),arrowHtml:this.hasArrow?v.output():""};w.output(g,b);if(this.onRender)this.onRender();return e},setState:function(a){if(this._.state==a)return!1;this._.state=a;var b=CKEDITOR.document.getById(this._.id);return b?(b.setState(a,"cke_button"),b.setAttribute("aria-disabled",a==CKEDITOR.TRISTATE_DISABLED), +this.hasArrow?b.setAttribute("aria-expanded",a==CKEDITOR.TRISTATE_ON):a===CKEDITOR.TRISTATE_ON?b.setAttribute("aria-pressed",!0):b.removeAttribute("aria-pressed"),!0):!1},getState:function(){return this._.state},toFeature:function(a){if(this._.feature)return this._.feature;var b=this;this.allowedContent||this.requiredContent||!this.command||(b=a.getCommand(this.command)||b);return this._.feature=b}};CKEDITOR.ui.prototype.addButton=function(a,b){this.add(a,CKEDITOR.UI_BUTTON,b)}})();(function(){function D(a){function d(){for(var b=f(),e=CKEDITOR.tools.clone(a.config.toolbarGroups)||v(a),n=0;na.order?-1:0>b.order?1:b.order]+data-cke-bookmark[^<]*?<\/span>/ig, +"");d&&r(a,c)})}function t(){if("wysiwyg"==a.mode){var b=q("paste");a.getCommand("cut").setState(q("cut"));a.getCommand("copy").setState(q("copy"));a.getCommand("paste").setState(b);a.fire("pasteState",b)}}function q(b){var c=a.getSelection(),c=c&&c.getRanges()[0];if((a.readOnly||c&&c.checkReadOnly())&&b in{paste:1,cut:1})return CKEDITOR.TRISTATE_DISABLED;if("paste"==b)return CKEDITOR.TRISTATE_OFF;b=a.getSelection();c=b.getRanges();return b.getType()==CKEDITOR.SELECTION_NONE||1==c.length&&c[0].collapsed? +CKEDITOR.TRISTATE_DISABLED:CKEDITOR.TRISTATE_OFF}var p=CKEDITOR.plugins.clipboard,m=0,u=0;(function(){a.on("key",n);a.on("contentDom",b);a.on("selectionChange",t);if(a.contextMenu){a.contextMenu.addListener(function(){return{cut:q("cut"),copy:q("copy"),paste:q("paste")}});var c=null;a.on("menuShow",function(){c&&(c.removeListener(),c=null);var b=a.contextMenu.findItemByCommandName("paste");b&&b.element&&(c=b.element.on("touchend",function(){a._.forcePasteDialog=!0}))})}if(a.ui.addButton)a.once("instanceReady", +function(){a._.pasteButtons&&CKEDITOR.tools.array.forEach(a._.pasteButtons,function(b){if(b=a.ui.get(b))if(b=CKEDITOR.document.getById(b._.id))b.on("touchend",function(){a._.forcePasteDialog=!0})})})})();(function(){function b(c,d,e,h,f){var n=a.lang.clipboard[d];a.addCommand(d,e);a.ui.addButton&&a.ui.addButton(c,{label:n,command:d,toolbar:"clipboard,"+h});a.addMenuItems&&a.addMenuItem(d,{label:n,command:d,group:"clipboard",order:f})}b("Cut","cut",c("cut"),10,1);b("Copy","copy",c("copy"),20,4);b("Paste", +"paste",d(),30,8);a._.pasteButtons||(a._.pasteButtons=[]);a._.pasteButtons.push("Paste")})();a.getClipboardData=function(b,c){function d(a){a.removeListener();a.cancel();c(a.data)}function e(a){a.removeListener();a.cancel();c({type:f,dataValue:a.data.dataValue,dataTransfer:a.data.dataTransfer,method:"paste"})}var h=!1,f="auto";c||(c=b,b=null);a.on("beforePaste",function(a){a.removeListener();h=!0;f=a.data.type},null,null,1E3);a.on("paste",d,null,null,0);!1===x()&&(a.removeListener("paste",d),a._.forcePasteDialog&& +h&&a.fire("pasteDialog")?(a.on("pasteDialogCommit",e),a.on("dialogHide",function(a){a.removeListener();a.data.removeListener("pasteDialogCommit",e);a.data._.committed||c(null)})):c(null))}}function y(a){if(CKEDITOR.env.webkit){if(!a.match(/^[^<]*$/g)&&!a.match(/^(
        <\/div>|
        [^<]*<\/div>)*$/gi))return"html"}else if(CKEDITOR.env.ie){if(!a.match(/^([^<]|)*$/gi)&&!a.match(/^(

        ([^<]|)*<\/p>|(\r\n))*$/gi))return"html"}else if(CKEDITOR.env.gecko){if(!a.match(/^([^<]|)*$/gi))return"html"}else return"html"; +return"htmlifiedtext"}function z(a,b){function c(a){return CKEDITOR.tools.repeat("\x3c/p\x3e\x3cp\x3e",~~(a/2))+(1==a%2?"\x3cbr\x3e":"")}b=b.replace(/(?!\u3000)\s+/g," ").replace(/> +/gi,"\x3cbr\x3e");b=b.replace(/<\/?[A-Z]+>/g,function(a){return a.toLowerCase()});if(b.match(/^[^<]$/))return b;CKEDITOR.env.webkit&&-1(
        |)<\/div>)(?!$|(

        (
        |)<\/div>))/g,"\x3cbr\x3e").replace(/^(
        (
        |)<\/div>){2}(?!$)/g,"\x3cdiv\x3e\x3c/div\x3e"), +b.match(/
        (
        |)<\/div>/)&&(b="\x3cp\x3e"+b.replace(/(
        (
        |)<\/div>)+/g,function(a){return c(a.split("\x3c/div\x3e\x3cdiv\x3e").length+1)})+"\x3c/p\x3e"),b=b.replace(/<\/div>
        /g,"\x3cbr\x3e"),b=b.replace(/<\/?div>/g,""));CKEDITOR.env.gecko&&a.enterMode!=CKEDITOR.ENTER_BR&&(CKEDITOR.env.gecko&&(b=b.replace(/^

        $/,"\x3cbr\x3e")),-1){2,}/g,function(a){return c(a.length/4)})+"\x3c/p\x3e"));return A(a,b)}function B(a){function b(){var a= +{},b;for(b in CKEDITOR.dtd)"$"!=b.charAt(0)&&"div"!=b&&"span"!=b&&(a[b]=1);return a}var c={};return{get:function(d){return"plain-text"==d?c.plainText||(c.plainText=new CKEDITOR.filter(a,"br")):"semantic-content"==d?((d=c.semanticContent)||(d=new CKEDITOR.filter(a,{}),d.allow({$1:{elements:b(),attributes:!0,styles:!1,classes:!1}}),d=c.semanticContent=d),d):d?new CKEDITOR.filter(a,d):null}}}function v(a,b,c){b=CKEDITOR.htmlParser.fragment.fromHtml(b);var d=new CKEDITOR.htmlParser.basicWriter;c.applyTo(b, +!0,!1,a.activeEnterMode);b.writeHtml(d);return d.getHtml()}function A(a,b){a.enterMode==CKEDITOR.ENTER_BR?b=b.replace(/(<\/p>

        )+/g,function(a){return CKEDITOR.tools.repeat("\x3cbr\x3e",a.length/7*2)}).replace(/<\/?p>/g,""):a.enterMode==CKEDITOR.ENTER_DIV&&(b=b.replace(/<(\/)?p>/g,"\x3c$1div\x3e"));return b}function C(a){a.data.preventDefault();a.data.$.dataTransfer.dropEffect="none"}function D(a){var b=CKEDITOR.plugins.clipboard;a.on("contentDom",function(){function c(b,c,d){c.select();r(a,{dataTransfer:d, +method:"drop"},1);d.sourceEditor.fire("saveSnapshot");d.sourceEditor.editable().extractHtmlFromRange(b);d.sourceEditor.getSelection().selectRanges([b]);d.sourceEditor.fire("saveSnapshot")}function d(c,d){c.select();r(a,{dataTransfer:d,method:"drop"},1);b.resetDragDataTransfer()}function g(b,c,d){var e={$:b.data.$,target:b.data.getTarget()};c&&(e.dragRange=c);d&&(e.dropRange=d);!1===a.fire(b.name,e)&&b.data.preventDefault()}function h(a){a.type!=CKEDITOR.NODE_ELEMENT&&(a=a.getParent());return a.getChildCount()} +var e=a.editable(),f=CKEDITOR.plugins.clipboard.getDropTarget(a),l=a.ui.space("top"),m=a.ui.space("bottom");b.preventDefaultDropOnElement(l);b.preventDefaultDropOnElement(m);e.attachListener(f,"dragstart",g);e.attachListener(a,"dragstart",b.resetDragDataTransfer,b,null,1);e.attachListener(a,"dragstart",function(c){b.initDragDataTransfer(c,a)},null,null,2);e.attachListener(a,"dragstart",function(){var c=b.dragRange=a.getSelection().getRanges()[0];CKEDITOR.env.ie&&10>CKEDITOR.env.version&&(b.dragStartContainerChildCount= +c?h(c.startContainer):null,b.dragEndContainerChildCount=c?h(c.endContainer):null)},null,null,100);e.attachListener(f,"dragend",g);e.attachListener(a,"dragend",b.initDragDataTransfer,b,null,1);e.attachListener(a,"dragend",b.resetDragDataTransfer,b,null,100);e.attachListener(f,"dragover",function(a){if(CKEDITOR.env.edge)a.data.preventDefault();else{var b=a.data.getTarget();b&&b.is&&b.is("html")?a.data.preventDefault():CKEDITOR.env.ie&&CKEDITOR.plugins.clipboard.isFileApiSupported&&a.data.$.dataTransfer.types.contains("Files")&& +a.data.preventDefault()}});e.attachListener(f,"drop",function(c){if(!c.data.$.defaultPrevented){c.data.preventDefault();var d=c.data.getTarget();if(!d.isReadOnly()||d.type==CKEDITOR.NODE_ELEMENT&&d.is("html")){var d=b.getRangeAtDropPosition(c,a),e=b.dragRange;d&&g(c,e,d)}}},null,null,9999);e.attachListener(a,"drop",b.initDragDataTransfer,b,null,1);e.attachListener(a,"drop",function(e){if(e=e.data){var h=e.dropRange,f=e.dragRange,g=e.dataTransfer;g.getTransferType(a)==CKEDITOR.DATA_TRANSFER_INTERNAL? +setTimeout(function(){b.internalDrop(f,h,g,a)},0):g.getTransferType(a)==CKEDITOR.DATA_TRANSFER_CROSS_EDITORS?c(f,h,g):d(h,g)}},null,null,9999)})}var m;CKEDITOR.plugins.add("clipboard",{requires:"dialog,notification,toolbar",init:function(a){var b,c=B(a);a.config.forcePasteAsPlainText?b="plain-text":a.config.pasteFilter?b=a.config.pasteFilter:!CKEDITOR.env.webkit||"pasteFilter"in a.config||(b="semantic-content");a.pasteFilter=c.get(b);w(a);D(a);CKEDITOR.dialog.add("paste",CKEDITOR.getUrl(this.path+ +"dialogs/paste.js"));if(CKEDITOR.env.gecko){var d=["image/png","image/jpeg","image/gif"],g;a.on("paste",function(b){var c=b.data,f=c.dataTransfer;if(!c.dataValue&&"paste"==c.method&&f&&1==f.getFilesCount()&&g!=f.id&&(f=f.getFile(0),-1!=CKEDITOR.tools.indexOf(d,f.type))){var l=new FileReader;l.addEventListener("load",function(){b.data.dataValue='\x3cimg src\x3d"'+l.result+'" /\x3e';a.fire("paste",b.data)},!1);l.addEventListener("abort",function(){a.fire("paste",b.data)},!1);l.addEventListener("error", +function(){a.fire("paste",b.data)},!1);l.readAsDataURL(f);g=c.dataTransfer.id;b.stop()}},null,null,1)}a.on("paste",function(b){b.data.dataTransfer||(b.data.dataTransfer=new CKEDITOR.plugins.clipboard.dataTransfer);if(!b.data.dataValue){var c=b.data.dataTransfer,d=c.getData("text/html");if(d)b.data.dataValue=d,b.data.type="html";else if(d=c.getData("text/plain"))b.data.dataValue=a.editable().transformPlainTextToHtml(d),b.data.type="text"}},null,null,1);a.on("paste",function(a){var b=a.data.dataValue, +c=CKEDITOR.dtd.$block;-1 <\/span>/gi," "),"html"!=a.data.type&&(b=b.replace(/]*>([^<]*)<\/span>/gi,function(a,b){return b.replace(/\t/g,"\x26nbsp;\x26nbsp; \x26nbsp;")})),-1/,"")),b=b.replace(/(<[^>]+) class="Apple-[^"]*"/gi,"$1")); +if(b.match(/^<[^<]+cke_(editable|contents)/i)){var d,g,n=new CKEDITOR.dom.element("div");for(n.setHtml(b);1==n.getChildCount()&&(d=n.getFirst())&&d.type==CKEDITOR.NODE_ELEMENT&&(d.hasClass("cke_editable")||d.hasClass("cke_contents"));)n=g=d;g&&(b=g.getHtml().replace(/
        $/i,""))}CKEDITOR.env.ie?b=b.replace(/^ (?: |\r\n)?<(\w+)/g,function(b,d){return d.toLowerCase()in c?(a.data.preSniffing="html","\x3c"+d):b}):CKEDITOR.env.webkit?b=b.replace(/<\/(\w+)>


        <\/div>$/,function(b,d){return d in +c?(a.data.endsWithEOL=1,"\x3c/"+d+"\x3e"):b}):CKEDITOR.env.gecko&&(b=b.replace(/(\s)
        $/,"$1"));a.data.dataValue=b},null,null,3);a.on("paste",function(b){b=b.data;var d=a._.nextPasteType||b.type,f=b.dataValue,g,m=a.config.clipboard_defaultContentType||"html",n=b.dataTransfer.getTransferType(a)==CKEDITOR.DATA_TRANSFER_EXTERNAL,k=!0===a.config.forcePasteAsPlainText;g="html"==d||"html"==b.preSniffing?"html":y(f);delete a._.nextPasteType;"htmlifiedtext"==g&&(f=z(a.config,f));if("text"==d&&"html"==g)f= +v(a,f,c.get("plain-text"));else if(n&&a.pasteFilter&&!b.dontFilter||k)f=v(a,f,a.pasteFilter);b.startsWithEOL&&(f='\x3cbr data-cke-eol\x3d"1"\x3e'+f);b.endsWithEOL&&(f+='\x3cbr data-cke-eol\x3d"1"\x3e');"auto"==d&&(d="html"==g||"html"==m?"html":"text");b.type=d;b.dataValue=f;delete b.preSniffing;delete b.startsWithEOL;delete b.endsWithEOL},null,null,6);a.on("paste",function(b){b=b.data;b.dataValue&&(a.insertHtml(b.dataValue,b.type,b.range),setTimeout(function(){a.fire("afterPaste")},0))},null,null, +1E3);a.on("pasteDialog",function(b){setTimeout(function(){a.openDialog("paste",b.data)},0)})}});CKEDITOR.plugins.clipboard={isCustomCopyCutSupported:(!CKEDITOR.env.ie||16<=CKEDITOR.env.version)&&!CKEDITOR.env.iOS,isCustomDataTypesSupported:!CKEDITOR.env.ie||16<=CKEDITOR.env.version,isFileApiSupported:!CKEDITOR.env.ie||9CKEDITOR.env.version||b.isInline()?b:a.document},fixSplitNodesAfterDrop:function(a, +b,c,d){function g(a,c,d){var g=a;g.type==CKEDITOR.NODE_TEXT&&(g=a.getParent());if(g.equals(c)&&d!=c.getChildCount())return a=b.startContainer.getChild(b.startOffset-1),c=b.startContainer.getChild(b.startOffset),a&&a.type==CKEDITOR.NODE_TEXT&&c&&c.type==CKEDITOR.NODE_TEXT&&(d=a.getLength(),a.setText(a.getText()+c.getText()),c.remove(),b.setStart(a,d),b.collapse(!0)),!0}var h=b.startContainer;"number"==typeof d&&"number"==typeof c&&h.type==CKEDITOR.NODE_ELEMENT&&(g(a.startContainer,h,c)||g(a.endContainer, +h,d))},isDropRangeAffectedByDragRange:function(a,b){var c=b.startContainer,d=b.endOffset;return a.endContainer.equals(c)&&a.endOffset<=d||a.startContainer.getParent().equals(c)&&a.startContainer.getIndex()CKEDITOR.env.version&&this.fixSplitNodesAfterDrop(a,b,g.dragStartContainerChildCount, +g.dragEndContainerChildCount);(f=this.isDropRangeAffectedByDragRange(a,b))||(e=a.createBookmark(!1));g=b.clone().createBookmark(!1);f&&(e=a.createBookmark(!1));a=e.startNode;b=e.endNode;f=g.startNode;b&&a.getPosition(f)&CKEDITOR.POSITION_PRECEDING&&b.getPosition(f)&CKEDITOR.POSITION_FOLLOWING&&f.insertBefore(a);a=d.createRange();a.moveToBookmark(e);h.extractHtmlFromRange(a,1);b=d.createRange();g.startNode.getCommonAncestor(h)||(g=d.getSelection().createBookmarks()[0]);b.moveToBookmark(g);r(d,{dataTransfer:c, +method:"drop",range:b},1);d.fire("unlockSnapshot")},getRangeAtDropPosition:function(a,b){var c=a.data.$,d=c.clientX,g=c.clientY,h=b.getSelection(!0).getRanges()[0],e=b.createRange();if(a.data.testRange)return a.data.testRange;if(document.caretRangeFromPoint&&b.document.$.caretRangeFromPoint(d,g))c=b.document.$.caretRangeFromPoint(d,g),e.setStart(CKEDITOR.dom.node(c.startContainer),c.startOffset),e.collapse(!0);else if(c.rangeParent)e.setStart(CKEDITOR.dom.node(c.rangeParent),c.rangeOffset),e.collapse(!0); +else{if(CKEDITOR.env.ie&&8l&&!f;l++){if(!f)try{c.moveToPoint(d,g-l),f=!0}catch(m){}if(!f)try{c.moveToPoint(d,g+l),f=!0}catch(n){}}if(f){var k="cke-temp-"+(new Date).getTime();c.pasteHTML('\x3cspan id\x3d"'+k+'"\x3e​\x3c/span\x3e');var t=b.document.getById(k);e.moveToPosition(t,CKEDITOR.POSITION_BEFORE_START);t.remove()}else{var q=b.document.$.elementFromPoint(d, +g),p=new CKEDITOR.dom.element(q),r;if(p.equals(b.editable())||"html"==p.getName())return h&&h.startContainer&&!h.startContainer.equals(b.editable())?h:null;r=p.getClientRect();d/i,bodyRegExp:/([\s\S]*)<\/body>/i,fragmentRegExp:/\x3c!--(?:Start|End)Fragment--\x3e/g,data:{},files:[],nativeHtmlCache:"",normalizeType:function(a){a= +a.toLowerCase();return"text"==a||"text/plain"==a?"Text":"url"==a?"URL":a}};this._.fallbackDataTransfer=new CKEDITOR.plugins.clipboard.fallbackDataTransfer(this);this.id=this.getData(m);this.id||(this.id="Text"==m?"":"cke-"+CKEDITOR.tools.getUniqueId());b&&(this.sourceEditor=b,this.setData("text/html",b.getSelectedHtml(1)),"Text"==m||this.getData("text/plain")||this.setData("text/plain",b.getSelection().getSelectedText()))};CKEDITOR.DATA_TRANSFER_INTERNAL=1;CKEDITOR.DATA_TRANSFER_CROSS_EDITORS=2;CKEDITOR.DATA_TRANSFER_EXTERNAL= +3;CKEDITOR.plugins.clipboard.dataTransfer.prototype={getData:function(a,b){a=this._.normalizeType(a);var c="text/html"==a&&b?this._.nativeHtmlCache:this._.data[a];if(void 0===c||null===c||""===c){if(this._.fallbackDataTransfer.isRequired())c=this._.fallbackDataTransfer.getData(a,b);else try{c=this.$.getData(a)||""}catch(d){c=""}"text/html"!=a||b||(c=this._stripHtml(c))}"Text"==a&&CKEDITOR.env.gecko&&this.getFilesCount()&&"file://"==c.substring(0,7)&&(c="");if("string"===typeof c)var g=c.indexOf("\x3c/html\x3e"), +c=-1!==g?c.substring(0,g+7):c;return c},setData:function(a,b){a=this._.normalizeType(a);"text/html"==a?(this._.data[a]=this._stripHtml(b),this._.nativeHtmlCache=b):this._.data[a]=b;if(CKEDITOR.plugins.clipboard.isCustomDataTypesSupported||"URL"==a||"Text"==a)if("Text"==m&&"Text"==a&&(this.id=b),this._.fallbackDataTransfer.isRequired())this._.fallbackDataTransfer.setData(a,b);else try{this.$.setData(a,b)}catch(c){}},storeId:function(){"Text"!==m&&this.setData(m,this.id)},getTransferType:function(a){return this.sourceEditor? +this.sourceEditor==a?CKEDITOR.DATA_TRANSFER_INTERNAL:CKEDITOR.DATA_TRANSFER_CROSS_EDITORS:CKEDITOR.DATA_TRANSFER_EXTERNAL},cacheData:function(){function a(a){a=b._.normalizeType(a);var c=b.getData(a);"text/html"==a&&(b._.nativeHtmlCache=b.getData(a,!0),c=b._stripHtml(c));c&&(b._.data[a]=c)}if(this.$){var b=this,c,d;if(CKEDITOR.plugins.clipboard.isCustomDataTypesSupported){if(this.$.types)for(c=0;cc?d+c:b.width>c?d-a.left:d-a.right+b.width):mc?d-c:b.width>c?d-a.right+b.width:d-a.left);c=a.top;b.height-a.tope?p-e:b.height>e?p-a.bottom+b.height:p-a.top);CKEDITOR.env.ie&&!CKEDITOR.env.edge&&(b=a=new CKEDITOR.dom.element(l.$.offsetParent),"html"==b.getName()&&(b=b.getDocument().getBody()),"rtl"==b.getComputedStyle("direction")&&(d=CKEDITOR.env.ie8Compat?d-2*l.getDocument().getDocumentElement().$.scrollLeft:d-(a.$.scrollWidth-a.$.clientWidth)));var a=l.getFirst(),f; +(f=a.getCustomData("activePanel"))&&f.onHide&&f.onHide.call(this,1);a.setCustomData("activePanel",this);l.setStyles({top:p+"px",left:d+"px"});l.setOpacity(1);g&&g()},this);n.isLoaded?a():n.onLoad=a;CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.env.webkit&&CKEDITOR.document.getWindow().getScrollPosition().y;this.focus();k.element.focus();CKEDITOR.env.webkit&&(CKEDITOR.document.getBody().$.scrollTop=a);this.allowBlur(!0);this._.markFirst&&(CKEDITOR.env.ie?CKEDITOR.tools.setTimeout(function(){k.markFirstDisplayed? +k.markFirstDisplayed():k._.markFirstDisplayed()},0):k.markFirstDisplayed?k.markFirstDisplayed():k._.markFirstDisplayed());this._.editor.fire("panelShow",this)},0,this)},CKEDITOR.env.air?200:0,this);this.visible=1;this.onShow&&this.onShow.call(this)},reposition:function(){var a=this._.showBlockParams;this.visible&&this._.showBlockParams&&(this.hide(),this.showBlock.apply(this,a))},focus:function(){if(CKEDITOR.env.webkit){var a=CKEDITOR.document.getActive();a&&!a.equals(this._.iframe)&&a.$.blur()}(this._.lastFocused|| +this._.iframe.getFrameDocument().getWindow()).focus()},blur:function(){var a=this._.iframe.getFrameDocument().getActive();a&&a.is("a")&&(this._.lastFocused=a)},hide:function(a){if(this.visible&&(!this.onHide||!0!==this.onHide.call(this))){this.hideChild();CKEDITOR.env.gecko&&this._.iframe.getFrameDocument().$.activeElement.blur();this.element.setStyle("display","none");this.visible=0;this.element.getFirst().removeCustomData("activePanel");if(a=a&&this._.returnFocus)CKEDITOR.env.webkit&&a.type&&a.getWindow().$.focus(), +a.focus();delete this._.lastFocused;this._.showBlockParams=null;this._.editor.fire("panelHide",this)}},allowBlur:function(a){var b=this._.panel;void 0!==a&&(b.allowBlur=a);return b.allowBlur},showAsChild:function(a,b,c,f,h,g){if(this._.activeChild!=a||a._.panel._.offsetParentId!=c.getId())this.hideChild(),a.onHide=CKEDITOR.tools.bind(function(){CKEDITOR.tools.setTimeout(function(){this._.focused||this.hide()},0,this)},this),this._.activeChild=a,this._.focused=!1,a.showBlock(b,c,f,h,g),this.blur(), +(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&setTimeout(function(){a.element.getChild(0).$.style.cssText+=""},100)},hideChild:function(a){var b=this._.activeChild;b&&(delete b.onHide,delete this._.activeChild,b.hide(),a&&this.focus())}}});CKEDITOR.on("instanceDestroyed",function(){var a=CKEDITOR.tools.isEmpty(CKEDITOR.instances),b;for(b in f){var c=f[b];a?c.destroy():c.element.hide()}a&&(f={})})})();CKEDITOR.plugins.add("colorbutton",{requires:"panelbutton,floatpanel",init:function(e){function u(a,d,g,y,l){var n=new CKEDITOR.style(m["colorButton_"+d+"Style"]),q=CKEDITOR.tools.getNextId()+"_colorBox",k={type:d},p;l=l||{};e.ui.add(a,CKEDITOR.UI_PANELBUTTON,{label:g,title:g,modes:{wysiwyg:1},editorFocus:0,toolbar:"colors,"+y,allowedContent:n,requiredContent:n,contentTransformations:l.contentTransformations,panel:{css:CKEDITOR.skin.getPath("editor"),attributes:{role:"listbox","aria-label":h.panelTitle}}, +onBlock:function(a,b){p=b;b.autoSize=!0;b.element.addClass("cke_colorblock");b.element.setHtml(z(a,d,q,k));b.element.getDocument().getBody().setStyle("overflow","hidden");CKEDITOR.ui.fire("ready",this);var c=b.keys,f="rtl"==e.lang.dir;c[f?37:39]="next";c[40]="next";c[9]="next";c[f?39:37]="prev";c[38]="prev";c[CKEDITOR.SHIFT+9]="prev";c[32]="click"},refresh:function(){e.activeFilter.check(n)||this.setState(CKEDITOR.TRISTATE_DISABLED)},onOpen:function(){var a=e.getSelection(),b=a&&a.getStartElement(), +c=e.elementPath(b);if(c){b=c.block||c.blockLimit||e.document.getBody();do c=b&&b.getComputedStyle("back"==d?"background-color":"color")||"transparent";while("back"==d&&"transparent"==c&&b&&(b=b.getParent()));c&&"transparent"!=c||(c="#ffffff");!1!==m.colorButton_enableAutomatic&&this._.panel._.iframe.getFrameDocument().getById(q).setStyle("background-color",c);if(b=a&&a.getRanges()[0]){for(var a=new CKEDITOR.dom.walker(b),f=b.collapsed?b.startContainer:a.next(),b="";f;){f.type!==CKEDITOR.NODE_ELEMENT&& +(f=f.getParent());f=r(f.getComputedStyle("back"==d?"background-color":"color"));b=b||f;if(b!==f){b="";break}f=a.next()}"transparent"==b&&(b="");"fore"==d&&(k.automaticTextColor="#"+r(c));k.selectionColor=b?"#"+b:"";a=b;b=p._.getItems();for(f=0;fd.group?1:a.orderd.order?1:0})}var h='\x3cspan class\x3d"cke_menuitem"\x3e\x3ca id\x3d"{id}" class\x3d"cke_menubutton cke_menubutton__{name} cke_menubutton_{state} {cls}" href\x3d"{href}" title\x3d"{title}" tabindex\x3d"-1" _cke_focus\x3d1 hidefocus\x3d"true" role\x3d"{role}" aria-label\x3d"{label}" aria-describedby\x3d"{id}_description" aria-haspopup\x3d"{hasPopup}" aria-disabled\x3d"{disabled}" {ariaChecked} draggable\x3d"false"'; +CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(h+=' onkeypress\x3d"return false;"');CKEDITOR.env.gecko&&(h+=' onblur\x3d"this.style.cssText \x3d this.style.cssText;" ondragstart\x3d"return false;"');var h=h+(' onmouseover\x3d"CKEDITOR.tools.callFunction({hoverFn},{index});" onmouseout\x3d"CKEDITOR.tools.callFunction({moveOutFn},{index});" '+(CKEDITOR.env.ie?'onclick\x3d"return false;" onmouseup':"onclick")+'\x3d"CKEDITOR.tools.callFunction({clickFn},{index}); return false;"\x3e'),r=CKEDITOR.addTemplate("menuItem", +h+'\x3cspan class\x3d"cke_menubutton_inner"\x3e\x3cspan class\x3d"cke_menubutton_icon"\x3e\x3cspan class\x3d"cke_button_icon cke_button__{iconName}_icon" style\x3d"{iconStyle}"\x3e\x3c/span\x3e\x3c/span\x3e\x3cspan class\x3d"cke_menubutton_label"\x3e{label}\x3c/span\x3e{shortcutHtml}{arrowHtml}\x3c/span\x3e\x3c/a\x3e\x3cspan id\x3d"{id}_description" class\x3d"cke_voice_label" aria-hidden\x3d"false"\x3e{ariaShortcut}\x3c/span\x3e\x3c/span\x3e'),t=CKEDITOR.addTemplate("menuArrow",'\x3cspan class\x3d"cke_menuarrow"\x3e\x3cspan\x3e{label}\x3c/span\x3e\x3c/span\x3e'), +n=CKEDITOR.addTemplate("menuShortcut",'\x3cspan class\x3d"cke_menubutton_label cke_menubutton_shortcut"\x3e{shortcut}\x3c/span\x3e');CKEDITOR.menu=CKEDITOR.tools.createClass({$:function(a,b){b=this._.definition=b||{};this.id=CKEDITOR.tools.getNextId();this.editor=a;this.items=[];this._.listeners=[];this._.level=b.level||1;var d=CKEDITOR.tools.extend({},b.panel,{css:[CKEDITOR.skin.getPath("editor")],level:this._.level-1,block:{}}),m=d.block.attributes=d.attributes||{};!m.role&&(m.role="menu");this._.panelDefinition= +d},_:{onShow:function(){var a=this.editor.getSelection(),b=a&&a.getStartElement(),d=this.editor.elementPath(),m=this._.listeners;this.removeAll();for(var g=0;g <\/span>/g,""),a.replace(/<.*?>/g,"")):a.getText()}function d(a, +c){var f=a,g=/\s/g,h="p br ol ul li td th div caption body".split(" "),m=!1,k=!1,p,n;do{for(p=b(f,c);!p&&f.getParent();){f=f.getParent();if(-1!==l(h,f.getName())){k=m=!0;break}p=b(f,c)}if(p&&p.getName&&-1!==l(h,p.getName())){m=!0;break}f=p}while(f&&f.getStyle&&("none"==f.getStyle("display")||!f.getText()));for(f||(f=a);f.type!==CKEDITOR.NODE_TEXT;)f=!m||c||k?f.getChild(0):f.getChild(f.getChildCount()-1);for(h=e(f);null!=(k=g.exec(h))&&(n=k.index,c););if("number"!==typeof n&&!m)return d(f,c);if(m)c? +n=0:(g=/([\.\b]*$)/,n=(k=g.exec(h))?k.index:h.length);else if(c&&(n+=1,n>h.length))return d(f);return{node:f,offset:n}}var c=/\b\w+\b/ig,f,g,h,m,k;h=m=k=a.startContainer;for(f=e(h);null!=(g=c.exec(f));)if(g.index+g[0].length>=a.startOffset)return a=g.index,c=g.index+g[0].length,0===g.index&&(g=d(h,!0),m=g.node,a=g.offset),c>=f.length&&(f=d(h),k=f.node,c=f.offset),{startNode:m,startOffset:a,endNode:k,endOffset:c};return null},_filterStyles:function(a){var b=CKEDITOR.tools.isEmpty,e=[],d,c;for(c=0;c< +a.length;c++)d=a[c]._.definition,-1!==CKEDITOR.tools.indexOf(CKEDITOR.plugins.copyformatting.inlineBoundary,d.element)&&(d.element=a[c].element="span"),"span"===d.element&&b(d.attributes)&&b(d.styles)||e.push(a[c]);return e},_determineContext:function(a){function b(b){var d=new CKEDITOR.dom.walker(a),c;if(a.startContainer.getAscendant(b,!0)||a.endContainer.getAscendant(b,!0))return!0;for(;c=d.next();)if(c.getAscendant(b,!0))return!0}return b({ul:1,ol:1})?"list":b("table")?"table":"text"},_applyStylesToTextContext:function(a, +b,e){var d=CKEDITOR.plugins.copyformatting,c=d.excludedAttributesFromInlineTransform,f,g;CKEDITOR.env.webkit&&!CKEDITOR.env.chrome&&a.getSelection().selectRanges([b]);for(f=0;fc.width&&(a.resize_minWidth=c.width);a.resize_minHeight>c.height&&(a.resize_minHeight=c.height);CKEDITOR.document.on("mousemove",f);CKEDITOR.document.on("mouseup",k);b.document&&(b.document.on("mousemove",f),b.document.on("mouseup",k));d.preventDefault&&d.preventDefault()});b.on("destroy", +function(){CKEDITOR.tools.removeFunction(q)});b.on("uiSpace",function(a){if("bottom"==a.data.space){var e="";h&&!p&&(e=" cke_resizer_horizontal");!h&&p&&(e=" cke_resizer_vertical");var c='\x3cspan id\x3d"'+r+'" class\x3d"cke_resizer'+e+" cke_resizer_"+g+'" title\x3d"'+CKEDITOR.tools.htmlEncode(b.lang.common.resize)+'" onmousedown\x3d"CKEDITOR.tools.callFunction('+q+', event)"\x3e'+("ltr"==g?"◢":"◣")+"\x3c/span\x3e";"ltr"==g&&"ltr"==e?a.data.html+=c:a.data.html=c+a.data.html}},b,null,100);b.on("maximize", +function(a){b.ui.space("resizer")[a.data==CKEDITOR.TRISTATE_ON?"hide":"show"]()})}}});(function(){function q(a,c){function k(b){b=h.list[b];var e;b.equals(a.editable())||"true"==b.getAttribute("contenteditable")?(e=a.createRange(),e.selectNodeContents(b),e=e.select()):(e=a.getSelection(),e.selectElement(b));CKEDITOR.env.ie&&a.fire("selectionChange",{selection:e,path:new CKEDITOR.dom.elementPath(b)});a.focus()}function l(){m&&m.setHtml('\x3cspan class\x3d"cke_path_empty"\x3e\x26nbsp;\x3c/span\x3e');delete h.list}var n=a.ui.spaceId("path"),m,h=a._.elementsPath,q=h.idBase;c.html+='\x3cspan id\x3d"'+ +n+'_label" class\x3d"cke_voice_label"\x3e'+a.lang.elementspath.eleLabel+'\x3c/span\x3e\x3cspan id\x3d"'+n+'" class\x3d"cke_path" role\x3d"group" aria-labelledby\x3d"'+n+'_label"\x3e\x3cspan class\x3d"cke_path_empty"\x3e\x26nbsp;\x3c/span\x3e\x3c/span\x3e';a.on("uiReady",function(){var b=a.ui.space("path");b&&a.focusManager.add(b,1)});h.onClick=k;var v=CKEDITOR.tools.addFunction(k),w=CKEDITOR.tools.addFunction(function(b,e){var g=h.idBase,d;e=new CKEDITOR.dom.event(e);d="rtl"==a.lang.dir;switch(e.getKeystroke()){case d? +39:37:case 9:return(d=CKEDITOR.document.getById(g+(b+1)))||(d=CKEDITOR.document.getById(g+"0")),d.focus(),!1;case d?37:39:case CKEDITOR.SHIFT+9:return(d=CKEDITOR.document.getById(g+(b-1)))||(d=CKEDITOR.document.getById(g+(h.list.length-1))),d.focus(),!1;case 27:return a.focus(),!1;case 13:case 32:return k(b),!1}return!0});a.on("selectionChange",function(b){for(var e=[],g=h.list=[],d=[],c=h.filters,p=!0,k=b.data.path.elements,u=k.length;u--;){var f=k[u],r=0;b=f.data("cke-display-name")?f.data("cke-display-name"): +f.data("cke-real-element-type")?f.data("cke-real-element-type"):f.getName();(p=f.hasAttribute("contenteditable")?"true"==f.getAttribute("contenteditable"):p)||f.hasAttribute("contenteditable")||(r=1);for(var t=0;tCKEDITOR.env.version?n.createText("\r"):n.createElement("br"),b.deleteContents(),b.insertNode(a),CKEDITOR.env.needsBrFiller?(n.createText("").insertAfter(a),g&&(k||f.blockLimit).appendBogus(),a.getNext().$.nodeValue="",b.setStartAt(a.getNext(), +CKEDITOR.POSITION_AFTER_START)):b.setStartAt(a,CKEDITOR.POSITION_AFTER_END)),b.collapse(!0),b.select(),b.scrollIntoView()):r(a,e,b,l)}}};v=CKEDITOR.plugins.enterkey;u=v.enterBr;r=v.enterBlock;w=/^h[1-6]$/})();(function(){function k(a,f){var g={},c=[],e={nbsp:" ",shy:"­",gt:"\x3e",lt:"\x3c",amp:"\x26",apos:"'",quot:'"'};a=a.replace(/\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(a,b){var d=f?"\x26"+b+";":e[b];g[d]=f?e[b]:"\x26"+b+";";c.push(d);return""});a=a.replace(/,$/,"");if(!f&&a){a=a.split(",");var b=document.createElement("div"),d;b.innerHTML="\x26"+a.join(";\x26")+";";d=b.innerHTML;b=null;for(b=0;ba&&(a=640);420>b&&(b=420);var f=parseInt((window.screen.height-b)/2,10),g=parseInt((window.screen.width-a)/2,10);d=(d||"location\x3dno,menubar\x3dno,toolbar\x3dno,dependent\x3dyes,minimizable\x3dno,modal\x3dyes,alwaysRaised\x3dyes,resizable\x3dyes,scrollbars\x3dyes")+",width\x3d"+ +a+",height\x3d"+b+",top\x3d"+f+",left\x3d"+g;var c=window.open("",null,d,!0);if(!c)return!1;try{-1==navigator.userAgent.toLowerCase().indexOf(" chrome/")&&(c.moveTo(g,f),c.resizeTo(a,b)),c.focus(),c.location.href=e}catch(h){window.open(e,null,d,!0)}return!0}});(function(){function k(a){this.editor=a;this.loaders=[]}function l(a,c,b){var d=a.config.fileTools_defaultFileName;this.editor=a;this.lang=a.lang;"string"===typeof c?(this.data=c,this.file=n(this.data),this.loaded=this.total=this.file.size):(this.data=null,this.file=c,this.total=this.file.size,this.loaded=0);b?this.fileName=b:this.file.name?this.fileName=this.file.name:(a=this.file.type.split("/"),d&&(a[0]=d),this.fileName=a.join("."));this.uploaded=0;this.responseData=this.uploadTotal=null;this.status= +"created";this.abort=function(){this.changeStatus("abort")}}function n(a){var c=a.match(m)[1];a=a.replace(m,"");a=atob(a);var b=[],d,f,g,e;for(d=0;dd.status||299h.height-c.bottom?e("pin"):e("bottom"),d=h.width/2,d=l.floatSpacePreferRight?"right":0n.width?"rtl"==l.contentsLangDirection? +"right":"left":d-c.left>c.right-d?"left":"right",n.width>h.width?(d="left",f=0):(f="left"==d?0h.width&&(d="left"==d?"right":"left",f=0)),b.setStyle(d,w(("pin"==m?u:p)+f+("pin"==m?0:"left"==d?v:-v)))):(m="pin",e("pin"),t(d))}}}();if(p){var k=new CKEDITOR.template('\x3cdiv id\x3d"cke_{name}" class\x3d"cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_float cke_{langDir} '+CKEDITOR.env.cssClass+'" dir\x3d"{langDir}" title\x3d"'+(CKEDITOR.env.gecko? +" ":"")+'" lang\x3d"{langCode}" role\x3d"application" style\x3d"{style}"'+(a.title?' aria-labelledby\x3d"cke_{name}_arialbl"':" ")+"\x3e"+(a.title?'\x3cspan id\x3d"cke_{name}_arialbl" class\x3d"cke_voice_label"\x3e{voiceLabel}\x3c/span\x3e':" ")+'\x3cdiv class\x3d"cke_inner"\x3e\x3cdiv id\x3d"{topId}" class\x3d"cke_top" role\x3d"presentation"\x3e{content}\x3c/div\x3e\x3c/div\x3e\x3c/div\x3e'),b=CKEDITOR.document.getBody().append(CKEDITOR.dom.element.createFromHtml(k.output({content:p,id:a.id,langDir:a.lang.dir, +langCode:a.langCode,name:a.name,style:"display:none;z-index:"+(l.baseFloatZIndex-1),topId:a.ui.spaceId("top"),voiceLabel:a.title}))),u=CKEDITOR.tools.eventsBuffer(500,t),e=CKEDITOR.tools.eventsBuffer(100,t);b.unselectable();b.on("mousedown",function(a){a=a.data;a.getTarget().hasAscendant("a",1)||a.preventDefault()});a.on("focus",function(b){t(b);a.on("change",u.input);g.on("scroll",e.input);g.on("resize",e.input)});a.on("blur",function(){b.hide();a.removeListener("change",u.input);g.removeListener("scroll", +e.input);g.removeListener("resize",e.input)});a.on("destroy",function(){g.removeListener("scroll",e.input);g.removeListener("resize",e.input);b.clearCustomData();b.remove()});a.focusManager.hasFocus&&b.show();a.focusManager.add(b,1)}}var g=CKEDITOR.document.getWindow(),w=CKEDITOR.tools.cssLength;CKEDITOR.plugins.add("floatingspace",{init:function(a){a.on("loaded",function(){k(this)},null,null,20)}})})();CKEDITOR.plugins.add("listblock",{requires:"panel",onLoad:function(){var f=CKEDITOR.addTemplate("panel-list",'\x3cul role\x3d"presentation" class\x3d"cke_panel_list"\x3e{items}\x3c/ul\x3e'),g=CKEDITOR.addTemplate("panel-list-item",'\x3cli id\x3d"{id}" class\x3d"cke_panel_listItem" role\x3dpresentation\x3e\x3ca id\x3d"{id}_option" _cke_focus\x3d1 hidefocus\x3dtrue title\x3d"{title}" draggable\x3d"false" ondragstart\x3d"return false;" href\x3d"javascript:void(\'{val}\')" {onclick}\x3d"CKEDITOR.tools.callFunction({clickFn},\'{val}\'); return false;" role\x3d"option"\x3e{text}\x3c/a\x3e\x3c/li\x3e'), +h=CKEDITOR.addTemplate("panel-list-group",'\x3ch1 id\x3d"{id}" draggable\x3d"false" ondragstart\x3d"return false;" class\x3d"cke_panel_grouptitle" role\x3d"presentation" \x3e{label}\x3c/h1\x3e'),k=/\'/g;CKEDITOR.ui.panel.prototype.addListBlock=function(a,b){return this.addBlock(a,new CKEDITOR.ui.listBlock(this.getHolderElement(),b))};CKEDITOR.ui.listBlock=CKEDITOR.tools.createClass({base:CKEDITOR.ui.panel.block,$:function(a,b){b=b||{};var c=b.attributes||(b.attributes={});(this.multiSelect=!!b.multiSelect)&& +(c["aria-multiselectable"]=!0);!c.role&&(c.role="listbox");this.base.apply(this,arguments);this.element.setAttribute("role",c.role);c=this.keys;c[40]="next";c[9]="next";c[38]="prev";c[CKEDITOR.SHIFT+9]="prev";c[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(c[13]="mouseup");this._.pendingHtml=[];this._.pendingList=[];this._.items={};this._.groups={}},_:{close:function(){if(this._.started){var a=f.output({items:this._.pendingList.join("")});this._.pendingList=[];this._.pendingHtml.push(a); +delete this._.started}},getClick:function(){this._.click||(this._.click=CKEDITOR.tools.addFunction(function(a){var b=this.toggle(a);if(this.onClick)this.onClick(a,b)},this));return this._.click}},proto:{add:function(a,b,c){var d=CKEDITOR.tools.getNextId();this._.started||(this._.started=1,this._.size=this._.size||0);this._.items[a]=d;var e;e=CKEDITOR.tools.htmlEncodeAttr(a).replace(k,"\\'");a={id:d,val:e,onclick:CKEDITOR.env.ie?'onclick\x3d"return false;" onmouseup':"onclick",clickFn:this._.getClick(), +title:CKEDITOR.tools.htmlEncodeAttr(c||a),text:b||a};this._.pendingList.push(g.output(a))},startGroup:function(a){this._.close();var b=CKEDITOR.tools.getNextId();this._.groups[a]=b;this._.pendingHtml.push(h.output({id:b,label:a}))},commit:function(){this._.close();this.element.appendHtml(this._.pendingHtml.join(""));delete this._.size;this._.pendingHtml=[]},toggle:function(a){var b=this.isMarked(a);b?this.unmark(a):this.mark(a);return!b},hideGroup:function(a){var b=(a=this.element.getDocument().getById(this._.groups[a]))&& +a.getNext();a&&(a.setStyle("display","none"),b&&"ul"==b.getName()&&b.setStyle("display","none"))},hideItem:function(a){this.element.getDocument().getById(this._.items[a]).setStyle("display","none")},showAll:function(){var a=this._.items,b=this._.groups,c=this.element.getDocument(),d;for(d in a)c.getById(a[d]).setStyle("display","");for(var e in b)a=c.getById(b[e]),d=a.getNext(),a.setStyle("display",""),d&&"ul"==d.getName()&&d.setStyle("display","")},mark:function(a){this.multiSelect||this.unmarkAll(); +a=this._.items[a];var b=this.element.getDocument().getById(a);b.addClass("cke_selected");this.element.getDocument().getById(a+"_option").setAttribute("aria-selected",!0);this.onMark&&this.onMark(b)},markFirstDisplayed:function(){var a=this;this._.markFirstDisplayed(function(){a.multiSelect||a.unmarkAll()})},unmark:function(a){var b=this.element.getDocument();a=this._.items[a];var c=b.getById(a);c.removeClass("cke_selected");b.getById(a+"_option").removeAttribute("aria-selected");this.onUnmark&&this.onUnmark(c)}, +unmarkAll:function(){var a=this._.items,b=this.element.getDocument(),c;for(c in a){var d=a[c];b.getById(d).removeClass("cke_selected");b.getById(d+"_option").removeAttribute("aria-selected")}this.onUnmark&&this.onUnmark()},isMarked:function(a){return this.element.getDocument().getById(this._.items[a]).hasClass("cke_selected")},focus:function(a){this._.focusIndex=-1;var b=this.element.getElementsByTag("a"),c,d=-1;if(a)for(c=this.element.getDocument().getById(this._.items[a]).getFirst();a=b.getItem(++d);){if(a.equals(c)){this._.focusIndex= +d;break}}else this.element.focus();c&&setTimeout(function(){c.focus()},0)}}})}});CKEDITOR.plugins.add("richcombo",{requires:"floatpanel,listblock,button",beforeInit:function(c){c.ui.addHandler(CKEDITOR.UI_RICHCOMBO,CKEDITOR.ui.richCombo.handler)}}); +(function(){var c='\x3cspan id\x3d"{id}" class\x3d"cke_combo cke_combo__{name} {cls}" role\x3d"presentation"\x3e\x3cspan id\x3d"{id}_label" class\x3d"cke_combo_label"\x3e{label}\x3c/span\x3e\x3ca class\x3d"cke_combo_button" title\x3d"{title}" tabindex\x3d"-1"'+(CKEDITOR.env.gecko&&!CKEDITOR.env.hc?"":" href\x3d\"javascript:void('{titleJs}')\"")+' hidefocus\x3d"true" role\x3d"button" aria-labelledby\x3d"{id}_label" aria-haspopup\x3d"listbox"';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(c+=' onkeypress\x3d"return false;"'); +CKEDITOR.env.gecko&&(c+=' onblur\x3d"this.style.cssText \x3d this.style.cssText;"');var c=c+(' onkeydown\x3d"return CKEDITOR.tools.callFunction({keydownFn},event,this);" onfocus\x3d"return CKEDITOR.tools.callFunction({focusFn},event);" '+(CKEDITOR.env.ie?'onclick\x3d"return false;" onmouseup':"onclick")+'\x3d"CKEDITOR.tools.callFunction({clickFn},this);return false;"\x3e\x3cspan id\x3d"{id}_text" class\x3d"cke_combo_text cke_combo_inlinelabel"\x3e{label}\x3c/span\x3e\x3cspan class\x3d"cke_combo_open"\x3e\x3cspan class\x3d"cke_combo_arrow"\x3e'+ +(CKEDITOR.env.hc?"\x26#9660;":CKEDITOR.env.air?"\x26nbsp;":"")+"\x3c/span\x3e\x3c/span\x3e\x3c/a\x3e\x3c/span\x3e"),k=CKEDITOR.addTemplate("combo",c);CKEDITOR.UI_RICHCOMBO="richcombo";CKEDITOR.ui.richCombo=CKEDITOR.tools.createClass({$:function(a){CKEDITOR.tools.extend(this,a,{canGroup:!1,title:a.label,modes:{wysiwyg:1},editorFocus:1});a=this.panel||{};delete this.panel;this.id=CKEDITOR.tools.getNextNumber();this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.className="cke_combopanel"; +a.block={multiSelect:a.multiSelect,attributes:a.attributes};a.toolbarRelated=!0;this._={panelDefinition:a,items:{},listeners:[]}},proto:{renderHtml:function(a){var b=[];this.render(a,b);return b.join("")},render:function(a,b){function f(){if(this.getState()!=CKEDITOR.TRISTATE_ON){var b=this.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;a.readOnly&&!this.readOnly&&(b=CKEDITOR.TRISTATE_DISABLED);this.setState(b);this.setValue("");b!=CKEDITOR.TRISTATE_DISABLED&&this.refresh&&this.refresh()}} +var c=CKEDITOR.env,h="cke_"+this.id,e=CKEDITOR.tools.addFunction(function(b){l&&(a.unlockSelection(1),l=0);g.execute(b)},this),d=this,g={id:h,combo:this,focus:function(){CKEDITOR.document.getById(h).getChild(1).focus()},execute:function(b){var c=d._;if(c.state!=CKEDITOR.TRISTATE_DISABLED)if(d.createPanel(a),c.on)c.panel.hide();else{d.commit();var f=d.getValue();f?c.list.mark(f):c.list.unmarkAll();c.panel.showBlock(d.id,new CKEDITOR.dom.element(b),4)}},clickFn:e};this._.listeners.push(a.on("activeFilterChange", +f,this));this._.listeners.push(a.on("mode",f,this));this._.listeners.push(a.on("selectionChange",f,this));!this.readOnly&&this._.listeners.push(a.on("readOnly",f,this));var m=CKEDITOR.tools.addFunction(function(a,b){a=new CKEDITOR.dom.event(a);var d=a.getKeystroke();switch(d){case 13:case 32:case 40:CKEDITOR.tools.callFunction(e,b);break;default:g.onkey(g,d)}a.preventDefault()}),n=CKEDITOR.tools.addFunction(function(){g.onfocus&&g.onfocus()}),l=0;g.keyDownFn=m;c={id:h,name:this.name||this.command, +label:this.label,title:this.title,cls:this.className||"",titleJs:c.gecko&&!c.hc?"":(this.title||"").replace("'",""),keydownFn:m,focusFn:n,clickFn:e};k.output(c,b);if(this.onRender)this.onRender();return g},createPanel:function(a){if(!this._.panel){var b=this._.panelDefinition,c=this._.panelDefinition.block,k=b.parent||CKEDITOR.document.getBody(),h="cke_combopanel__"+this.name,e=new CKEDITOR.ui.floatPanel(a,k,b),b=e.addListBlock(this.id,c),d=this;e.onShow=function(){this.element.addClass(h);d.setState(CKEDITOR.TRISTATE_ON); +d._.on=1;d.editorFocus&&!a.focusManager.hasFocus&&a.focus();if(d.onOpen)d.onOpen()};e.onHide=function(b){this.element.removeClass(h);d.setState(d.modes&&d.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);d._.on=0;if(!b&&d.onClose)d.onClose()};e.onEscape=function(){e.hide(1)};b.onClick=function(a,b){d.onClick&&d.onClick.call(d,a,b);e.hide()};this._.panel=e;this._.list=b;e.getBlock(this.id).onHide=function(){d._.on=0;d.setState(CKEDITOR.TRISTATE_OFF)};this.init&&this.init()}},setValue:function(a, +b){this._.value=a;var c=this.document.getById("cke_"+this.id+"_text");c&&(a||b?c.removeClass("cke_combo_inlinelabel"):(b=this.label,c.addClass("cke_combo_inlinelabel")),c.setText("undefined"!=typeof b?b:a))},getValue:function(){return this._.value||""},unmarkAll:function(){this._.list.unmarkAll()},mark:function(a){this._.list.mark(a)},hideItem:function(a){this._.list.hideItem(a)},hideGroup:function(a){this._.list.hideGroup(a)},showAll:function(){this._.list.showAll()},add:function(a,b,c){this._.items[a]= +c||a;this._.list.add(a,b,c)},startGroup:function(a){this._.list.startGroup(a)},commit:function(){this._.committed||(this._.list.commit(),this._.committed=1,CKEDITOR.ui.fire("ready",this));this._.committed=1},setState:function(a){if(this._.state!=a){var b=this.document.getById("cke_"+this.id);b.setState(a,"cke_combo");a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled");this._.state=a}},getState:function(){return this._.state},enable:function(){this._.state== +CKEDITOR.TRISTATE_DISABLED&&this.setState(this._.lastState)},disable:function(){this._.state!=CKEDITOR.TRISTATE_DISABLED&&(this._.lastState=this._.state,this.setState(CKEDITOR.TRISTATE_DISABLED))},destroy:function(){CKEDITOR.tools.array.forEach(this._.listeners,function(a){a.removeListener()});this._.listeners=[]}},statics:{handler:{create:function(a){return new CKEDITOR.ui.richCombo(a)}}}});CKEDITOR.ui.prototype.addRichCombo=function(a,b){this.add(a,CKEDITOR.UI_RICHCOMBO,b)}})();(function(){function p(b,f,e,d,r,p,t,x){var y=b.config,u=new CKEDITOR.style(t),g=r.split(";");r=[];for(var k={},l=0;lCKEDITOR.env.version&&b.enterMode!=CKEDITOR.ENTER_DIV&&f("div");if(CKEDITOR.env.webkit||CKEDITOR.env.ie&&10this.$.offsetHeight){var d=b.createRange();d[33==c?"moveToElementEditStart":"moveToElementEditEnd"](this);d.select();a.data.preventDefault()}});CKEDITOR.env.ie&&this.attachListener(c,"blur",function(){try{c.$.selection.empty()}catch(a){}});CKEDITOR.env.iOS&&this.attachListener(c,"touchend",function(){a.focus()});d=b.document.getElementsByTag("title").getItem(0); +d.data("cke-title",d.getText());CKEDITOR.env.ie&&(b.document.$.title=this._.docTitle);CKEDITOR.tools.setTimeout(function(){"unloaded"==this.status&&(this.status="ready");b.fire("contentDom");this._.isPendingFocus&&(b.focus(),this._.isPendingFocus=!1);setTimeout(function(){b.fire("dataReady")},0)},0,this)}function n(a){function f(){var c;a.editable().attachListener(a,"selectionChange",function(){var d=a.getSelection().getSelectedElement();d&&(c&&(c.detachEvent("onresizestart",b),c=null),d.$.attachEvent("onresizestart", +b),c=d.$)})}function b(a){a.returnValue=!1}if(CKEDITOR.env.gecko)try{var c=a.document.$;c.execCommand("enableObjectResizing",!1,!a.config.disableObjectResizing);c.execCommand("enableInlineTableEditing",!1,!a.config.disableNativeTableHandles)}catch(d){}else CKEDITOR.env.ie&&11>CKEDITOR.env.version&&a.config.disableObjectResizing&&f(a)}function p(){var a=[];if(8<=CKEDITOR.document.$.documentMode){a.push("html.CSS1Compat [contenteditable\x3dfalse]{min-height:0 !important}");var f=[],b;for(b in CKEDITOR.dtd.$removeEmpty)f.push("html.CSS1Compat "+ +b+"[contenteditable\x3dfalse]");a.push(f.join(",")+"{display:inline-block}")}else CKEDITOR.env.gecko&&(a.push("html{height:100% !important}"),a.push("img:-moz-broken{-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}"));a.push("html{cursor:text;*cursor:auto}");a.push("img,input,textarea{cursor:default}");return a.join("\n")}var l;CKEDITOR.plugins.add("wysiwygarea",{init:function(a){a.config.fullPage&&a.addFeature({allowedContent:"html head title; style [media,type]; body (*)[id]; meta link [*]", +requiredContent:"body"});a.addMode("wysiwyg",function(f){function b(b){b&&b.removeListener();a.editable(new l(a,d.$.contentWindow.document.body));a.setData(a.getData(1),f)}var c="document.open();"+(CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"")+"document.close();",c=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie&&!CKEDITOR.env.edge?"javascript:void(function(){"+encodeURIComponent(c)+"}())":"",d=CKEDITOR.dom.element.createFromHtml('\x3ciframe src\x3d"'+c+'" frameBorder\x3d"0"\x3e\x3c/iframe\x3e'); +d.setStyles({width:"100%",height:"100%"});d.addClass("cke_wysiwyg_frame").addClass("cke_reset");c=a.ui.space("contents");c.append(d);var e=CKEDITOR.env.ie&&!CKEDITOR.env.edge||CKEDITOR.env.gecko;if(e)d.on("load",b);var g=a.title,h=a.fire("ariaEditorHelpLabel",{}).label;g&&(CKEDITOR.env.ie&&h&&(g+=", "+h),d.setAttribute("title",g));if(h){var g=CKEDITOR.tools.getNextId(),k=CKEDITOR.dom.element.createFromHtml('\x3cspan id\x3d"'+g+'" class\x3d"cke_voice_label"\x3e'+h+"\x3c/span\x3e");c.append(k,1);d.setAttribute("aria-describedby", +g)}a.on("beforeModeUnload",function(a){a.removeListener();k&&k.remove()});d.setAttributes({tabIndex:a.tabIndex,allowTransparency:"true"});!e&&b();a.fire("ariaWidget",d)})}});CKEDITOR.editor.prototype.addContentsCss=function(a){var f=this.config,b=f.contentsCss;CKEDITOR.tools.isArray(b)||(f.contentsCss=b?[b]:[]);f.contentsCss.push(a)};l=CKEDITOR.tools.createClass({$:function(){this.base.apply(this,arguments);this._.frameLoadedHandler=CKEDITOR.tools.addFunction(function(a){CKEDITOR.tools.setTimeout(m, +0,this,a)},this);this._.docTitle=this.getWindow().getFrame().getAttribute("title")},base:CKEDITOR.editable,proto:{setData:function(a,f){var b=this.editor;if(f)this.setHtml(a),this.fixInitialSelection(),b.fire("dataReady");else{this._.isLoadingData=!0;b._.dataStore={id:1};var c=b.config,d=c.fullPage,e=c.docType,g=CKEDITOR.tools.buildStyleHtml(p()).replace(/","
        "].join(""),R=t(window),F=t(document),j=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};j.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},j.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=R.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+v),o=e.elem=t(i(H).render({VIEW_CLASS:v,data:a,index:e.index}));if(a.index=e.index,e.key=a.id||a.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(m),e.layBox=o.find(g),e.layHeader=o.find(x),e.layMain=o.find(C),e.layBody=o.find(k),e.layFixed=o.find(w),e.layFixLeft=o.find(T),e.layFixRight=o.find(A),e.layTotal=o.find(L),e.layPage=o.find(N),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(x).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},j.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},j.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},j.prototype.renderToolbar=function(){var e=this,a=e.config,l=['
        ','
        ','
        '].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i="string"==typeof t?r[t]:t;i&&d.push('
        ')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},j.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](f),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},j.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},j.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&ln&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},j.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},j.prototype.reload=function(e){var i=this;e=e||{},delete i.haveInit,e.data&&e.data.constructor===Array&&delete i.config.data,i.config=t.extend(!0,{},i.config,e),i.render()},j.prototype.errorView=function(e){var i=this,a=i.layMain.find("."+p),l=t('
        '+(e||"Error")+"
        ");a[0]&&(i.layNone.remove(),a.remove()),i.layFixed.addClass(f),i.layMain.find("tbody").html(""),i.layMain.append(i.layNone=l),d.cache[i.key]=[]},j.prototype.page=1,j.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),i.loading(),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.errorView(t[n.msgName]||'返回的数据不符合规范,正确的成功状态码应为:"'+n.statusName+'": '+n.statusCode)):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.errorView("数据接口请求异常:"+t),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,i.renderData(c,e,c[n.countName]),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},j.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},j.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,y=e[s.response.dataName]||[],h=[],v=[],m=[],g=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(y,function(a,l){var o=[],y=[],p=[],g=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,h=s.index+"-"+r.key,v=l[c];if(void 0!==v&&null!==v||(v=""),!r.colGroup){var m=['','
        '+function(){var n=t.extend(!0,{LAY_INDEX:g},l),o=d.config.checkName;switch(r.type){case"checkbox":return'";case"radio":return n[o]&&(e=a),'';case"numbers":return g}return r.toolbar?i(t(r.toolbar).html()||"").render(n):u(r,v,n)}(),"
        "].join("");o.push(m),r.fixed&&"right"!==r.fixed&&y.push(m),"right"===r.fixed&&p.push(m)}}),h.push(''+o.join("")+""),v.push(''+y.join("")+""),m.push(''+p.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+p).remove(),c.layMain.find("tbody").html(h.join("")),c.layFixLeft.find("tbody").html(v.join("")),c.layFixRight.find("tbody").html(m.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return d.cache[c.key]=y,c.layPage[0==o||0===y.length&&1==n?"addClass":"removeClass"](f),r?g():0===y.length?(c.renderForm(),c.errorView(s.text.none)):(c.layFixed.removeClass(f),g(),c.renderTotal(y),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},j.prototype.renderTotal=function(e){var t=this,i=t.config,a={};if(i.totalRow){layui.each(e,function(e,i){0!==i.length&&t.eachCols(function(e,t){var l=t.field||e,n=i[l];t.totalRow&&(a[l]=(a[l]||0)+(parseFloat(n)||0))})}),t.dataTotal={};var l=[];t.eachCols(function(e,n){var o=n.field||e,r=function(){var e=n.totalRowText||"",t=parseFloat(a[o]).toFixed(2),i={};return i[o]=t,t=u(n,t,i),n.totalRow?t||e:e}(),d=['','
        '+r,"
        "].join("");n.field&&(t.dataTotal[o]=r),l.push(d)}),t.layTotal.find("tbody").html(""+l.join("")+"")}},j.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},j.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},j.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},j.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},u=c.config,h=u.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},u.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[u.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,y,"sort("+h+")",{field:n,type:i})},j.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(b).remove()):(i.layInit=t(['
        ','',"
        "].join("")),i.layBox.append(i.layInit)))},j.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},j.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},j.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},j.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=R.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e-=t.layPage.outerHeight()||41),t.layMain.css("height",e-2))},j.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},j.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('
        ');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(k).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](f),e.layFixRight.css("right",a-1)},j.prototype.events=function(){var e,i=this,a=i.config,o=t("body"),c={},s=i.layHeader.find("th"),h=".layui-table-cell",p=a.elem.attr("lay-filter");i.layTool.on("click","*[lay-event]",function(e){var o=t(this),c=o.attr("lay-event"),s=function(e){var l=t(e.list),n=t('
          ');n.html(l),a.height&&n.css("max-height",a.height-(i.layTool.outerHeight()||50)),o.find(".layui-table-tool-panel")[0]||o.append(n),i.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),F.trigger("table.tool.panel.remove"),l.close(i.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return i.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('
        • ')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var l=t(e.elem),n=this.checked,o=l.data("key"),r=l.data("parentkey");layui.each(a.cols,function(e,t){layui.each(t,function(t,l){if(e+"-"+t===o){var d=l.hide;l.hide=!n,i.elem.find('*[data-key="'+a.index+"-"+o+'"]')[n?"removeClass":"addClass"](f),d!=l.hide&&i.setParentCol(!n,r),i.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['
        • 导出到 Csv 文件
        • ','
        • 导出到 Excel 文件
        • '].join("")}(),done:function(e,l){l.on("click",function(){var e=t(this).data("type");d.exportFile.call(i,a.id,null,e)})}});break;case"LAYTABLE_PRINT":var u=window.open("打印窗口","_blank"),h=[""].join(""),v=t(i.layHeader.html());v.append(i.layMain.find("table").html()),v.append(i.layTotal.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),u.document.write(h+v.prop("outerHTML")),u.document.close(),u.print(),u.close()}layui.event.call(this,y,"toolbar("+p+")",t.extend({event:c,config:a},{}))}),s.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var l=t(this);if(c.allowResize){var n=l.data("key");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],i.getCssRule(n,function(e){var t=e.style.width||l.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=l.data("minwidth")||a.cellMinWidth})}}),F.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var a=c.ruleWidth+t.clientX-c.offset[0];a');return n[0].value=i.data("content")||l.text(),i.find("."+W)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(h);if(!i.data("off"))if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('
          ')}};i.layBody.on("click","."+g,function(e){var n=t(this),o=n.parent(),d=o.children(h);i.tipsIndex=l.tips(['
          ',d.html(),"
          ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:i.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),i.layBody.on("click","*[lay-event]",function(){var e=t(this),a=e.parents("tr").eq(0).data("index");layui.event.call(this,y,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),i.setThisRowChecked(a)}),i.layMain.on("scroll",function(){var e=t(this),a=e.scrollLeft(),n=e.scrollTop();i.layHeader.scrollLeft(a),i.layTotal.scrollLeft(a),i.layFixed.find(k).scrollTop(n),l.close(i.tipsIndex)}),R.on("resize",function(){i.resize()})},function(){F.on("click",function(){F.trigger("table.remove.tool.panel")}),F.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()})}(),d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.exportFile=function(e,t,i){var a=this;t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var l=c.config[e]||{},n={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],s=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(s.href="data:"+n+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],l=[],n=[];return layui.each(t,function(t,a){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(a),function(e,t){n.push('"'+(t||"")+'"')})):d.eachCols(e,function(e,l){if(l.field&&"normal"==l.type&&!l.hide){var o=a[l.field];void 0!==o&&null!==o||(o=""),0==t&&i.push(l.title||""),n.push('"'+u(l,o,a,"text")+'"')}}),l.push(n.join(","))}),layui.each(a.dataTotal,function(e,t){n.push(t)}),i.join(",")+"\r\n"+l.join("\r\n")+"\r\n"+n.join(",")}()),s.download=(l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(s),s.click(),void document.body.removeChild(s))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,t){var i=s(e);if(i){var a=c.that[e];return a.reload(t),c.call(a)}},d.render=function(e){var t=new j(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(y,d)});layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
            ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
          "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a",u=1;u<=i.length;u++){var r='
        • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
        • ":n+=r}n+=""+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)});layui.define("jquery",function(t){"use strict";var e=layui.$,i={fixbar:function(t){var i,n,a="layui-fixbar",o="layui-fixbar-top",r=e(document),l=e("body");t=e.extend({showHeight:200},t),t.bar1=t.bar1===!0?"":t.bar1,t.bar2=t.bar2===!0?"":t.bar2,t.bgcolor=t.bgcolor?"background-color:"+t.bgcolor:"";var c=[t.bar1,t.bar2,""],g=e(['
            ',t.bar1?'
          • '+c[0]+"
          • ":"",t.bar2?'
          • '+c[1]+"
          • ":"",'
          • '+c[2]+"
          • ","
          "].join("")),s=g.find("."+o),u=function(){var e=r.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+a)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),n=i.attr("lay-type");"top"===n&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,n)}),r.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var n=this,a="function"==typeof e,o=new Date(t).getTime(),r=new Date(!e||a?(new Date).getTime():e).getTime(),l=o-r,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=e);var g=setTimeout(function(){n.countdown(t,r+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],e,g),l<=0&&clearTimeout(g),g},timeAgo:function(t,e){var i=this,n=[[],[]],a=(new Date).getTime()-new Date(t).getTime();return a>6912e5?(a=new Date(t),n[0][0]=i.digit(a.getFullYear(),4),n[0][1]=i.digit(a.getMonth()+1),n[0][2]=i.digit(a.getDate()),e||(n[1][0]=i.digit(a.getHours()),n[1][1]=i.digit(a.getMinutes()),n[1][2]=i.digit(a.getSeconds())),n[0].join("-")+" "+n[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=12e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var n=t.length;n/g,">").replace(/'/g,"'").replace(/"/g,""")},event:function(t,n,a){n=i.event[t]=e.extend(!0,i.event[t],n)||{},e("body").on(a||"click","*["+t+"]",function(){var i=e(this),a=i.attr(t);n[a]&&n[a].call(this,i)})}};!function(t,e,i){"$:nomunge";function n(){a=e[l](function(){o.each(function(){var e=t(this),i=e.width(),n=e.height(),a=t.data(this,g);(i!==a.w||n!==a.h)&&e.trigger(c,[a.w=i,a.h=n])}),n()},r[s])}var a,o=t([]),r=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";r[s]=250,r[u]=!0,t.event.special[c]={setup:function(){if(!r[u]&&this[l])return!1;var e=t(this);o=o.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===o.length&&n()},teardown:function(){if(!r[u]&&this[l])return!1;var e=t(this);o=o.not(e),e.removeData(g),o.length||clearTimeout(a)},add:function(e){function n(e,n,o){var r=t(this),l=t.data(this,g)||{};l.w=n!==i?n:r.width(),l.h=o!==i?o:r.height(),a.apply(this,arguments)}if(!r[u]&&this[l])return!1;var a;return t.isFunction(e)?(a=e,n):(a=e.handler,void(e.handler=n))}}}(e,window),t("util",i)});layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('
          ");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)});layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("string"==typeof t?"#"+t:t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
          ','
          '+f+"
          ",'
          ','',"
          ","
          "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

          ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

          "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

          "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

            ','
          • ','','
            ','',"
            ","
          • ",'
          • ','','
            ','",'","
            ","
          • ",'
          • ','','',"
          • ","
          "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
        • '+e+'
        • ')}),'
            '+t.join("")+"
          "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
            ','
          • ','','
            ','","
            ","
          • ",'
          • ','','
            ','',"
            ","
          • ",'
          • ','','',"
          • ","
          "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)});layui.define("jquery",function(e){"use strict";var a=layui.$,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
          1. '+o.replace(/[\r\t\n]+/g,"
          2. ")+"
          "),c.find(">.layui-code-h3")[0]||c.prepend('

          '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

          ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/public/static/plugs/michat/chart.js b/public/static/plugs/michat/chart.js new file mode 100644 index 0000000..369d8e4 --- /dev/null +++ b/public/static/plugs/michat/chart.js @@ -0,0 +1,116 @@ +(new function () { + this.app = angular.module("michat", []).run(callback); + angular.bootstrap(document.getElementById(this.app.name), [this.app.name]); + + function callback($rootScope) { + $rootScope.text = ''; + $rootScope.user = {}; + $rootScope.list = []; + + // 数字位数处理 + function toNum(value, fixed) { + while (("" + value).length < fixed) value = '0' + value; + return value; + } + + // 显示时间内容 + $rootScope.showDatetime = function (date) { + var md, td, tm, my = new Date(); + md = my.getFullYear() + '-' + toNum(my.getMonth() + 1, 2) + '-' + toNum(my.getDate(), 2); + td = date.getFullYear() + '-' + toNum(date.getMonth() + 1, 2) + '-' + toNum(date.getDate(), 2); + tm = toNum(date.getHours(), 2) + ':' + toNum(date.getMinutes(), 2) + ':' + toNum(date.getSeconds(), 2); + return md === td ? tm : (td + tm); + }; + for (let i = 10; i <= 99; i++) $rootScope.list.push({ + active: false, + headimg: 'https://demo.thinkadmin.top/upload/decb0fe26fa3f486/b3f6521bf29403c8.png', + username: 'nickname_a_' + i, + nickname: 'NickName_A_B_C' + i, + message: [ + { + type: 'text', + float: 'left', + nickname: 'Nickname_A_' + i, + headimg: 'https://demo.thinkadmin.top/upload/decb0fe26fa3f486/b3f6521bf29403c8.png', + content: '消息内容_1_' + i, + datetime: new Date() + }, + { + type: 'text', + float: 'right', + username: 'think_admin', + nickname: 'ThinkAdmin', + headimg: 'https://demo.thinkadmin.top/upload/decb0fe26fa3f486/b3f6521bf29403c8.png', + content: '消息内容_2_' + i, + datetime: new Date() + }, + { + type: 'text', + float: 'right', + username: 'think_admin', + nickname: 'ThinkAdmin', + headimg: 'https://demo.thinkadmin.top/upload/decb0fe26fa3f486/b3f6521bf29403c8.png', + content: '消息内容_2_' + i, + datetime: new Date() + }, + { + type: 'text', + float: 'left', + username: 'nickname_a_' + i, + nickname: 'Nickname_A_' + i, + headimg: 'https://demo.thinkadmin.top/upload/decb0fe26fa3f486/b3f6521bf29403c8.png', + content: '消息内容_2_' + i, + datetime: new Date() + } + ] + }); + // 移除当前用户 + $rootScope.removeUser = function (user, temp) { + temp = []; + for (let i in $rootScope.list) { + if ($rootScope.list[i].username !== user.username) { + temp.push($rootScope.list[i]); + } + } + $rootScope.list = temp; + }; + // 聊天内容底部 + $rootScope.scrollBottom = function () { + setTimeout(function (div) { + div = document.querySelector('.michat-right-list'); + div.scrollTop = div.scrollHeight; + }, 10); + }; + // 切换当前用户 + $rootScope.switchUser = function (user) { + for (let i in $rootScope.list) { + if ($rootScope.list[i].username === user.username) { + $rootScope.list[i].active = true; + $rootScope.user = user; + } else { + $rootScope.list[i].active = false; + } + } + this.scrollBottom(); + }; + // 回复消息内容 + $rootScope.replyUser = function () { + if ($rootScope.text.length < 1) { + alert('请输入内容'); + } + $rootScope.user.message.push({ + type: 'text', + float: 'right', + username: 'NICKNAME_A', + headimg: 'https://demo.thinkadmin.top/upload/decb0fe26fa3f486/b3f6521bf29403c8.png', + content: $rootScope.text, + datetime: new Date() + }); + $rootScope.text = ''; + $rootScope.scrollBottom(); + }; + // 默认选择会话 + $rootScope.switchUser($rootScope.list[2]); + } +}); + diff --git a/public/static/plugs/michat/image/bg.jpg b/public/static/plugs/michat/image/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53ba9216283a962b6d325965a4a11c7504056e54 GIT binary patch literal 18610 zcmeIZcUY6@wkVEWu>u0pN0DAak={n7NK2$f2n3}XAVhkH85NN}3L$hxAoLeXx4uCZLd&T{A0jazqk*;!cFdGB)lk?#J$#e15#e)vI1 zL{voR2N{_M4`gJ1{KxbMkTWc|Zn3hlaEf9Se}l_% z?iA|zhxbg_UdVag{`nN{hfkIEUR7V_s3((5*Up^|VL8Xbq{X!I+rQ!Ze|7FmIdP=` z!3yzO-#vb7)GlRhJ=-ZCKbf2xJ=1I4Oee-R9{34{0QM9#b2sZ;mZ%Kh;FcoK1N3$8|?-AtGEI1{!8-RvGQ>^TF>P{Wq}dY=t>_>o$7Q&_!fY^JR1Y=9HScyL;=xG+Q zuA>#}OIaNq+-T)VNm-S@^{tAm@<{G=EEcFJH0C|)f-A6B0_^47bC#07lQAB?*Cg$o zeItDmSCO`*ABctT+P1#dI;?2d4cv28s$M}cQ4QD}{N--C*s)q|w3 z{r?R(pXK-CrP=UW(+V2G!#dzL*x|8g7nLPGL2y3d5|^@0@6E7}1pnzU(+|2BnuJR1 zps;Lz_&1`w+c18STv`?@Fxef^SPCg>!YGYJ%@MXcFw4 z!??QEYmh(wH=z4JApVB~|0f(^UOVy!eTk=A_1e~Tl?cj=JSbBiV%Zg+43q1q3RZRE zK4G#vIAOAHJf7@|lNaF8F8f|}t;~=R zwY&RvruV$?U_&Y?lVHW#{eOblKa9Di&@gdBP3@r-*AQz{N+&EJPNAvsfc^b@l<^K0 zcb)5m>82z%UzX$sX~+Ge;l^?MAd9X3`}PMRSxWtnR2`QbViIChKykKVtIj>|{4=Ne z^0Rc&Kl7XV&T0qKLhhqB4x*Ca{ojAib)0wQF6qh1PJU_(>TlXY5iX1Pbj|QRF|o}o z>`hl!mToCk^{G+Pb&}`aVI^1Bsw=Ow zNJ5F8W|iCP>vVAn8ipk+S4m^bB%?}Q-4CVd`aTP-4+Uz#hUBR16Q;NT29mi%0#hhX zz9I3Nu+1>o%nqjz!a1s0_D+~4wh*H)_hCw6{?Wl6c+5ikLfoB^D6D5KpQ8gs!IJVe z^Pt5bEMc~wGURiuq8^{s3zzoENWJSA!UE*|KEc5`pO?on zk)@DXUPbdP1-H8`atZsM8w>cu%fFAcb~%NaX@R&*b5$+H1|Nj^EHXGMBz^Odd8S7U z_!nH+*z(7?VX|E^&yWWsh)VRD@|(|ug!A_0wtZXTUfGWc1YQ9EbiN^T?bwO8>gLGv zkFRYdy`Cu`}5Z_$DaFota=)Gt(!uUYWm zy#nlZ>idi?bR1)log=_3I~%`#@S%atPQY|*n&qpzWb8bev%x9V$jDQ2bQ1 zG8cdR`{G~Z?=W5baTtjNN_qI}>x9>{DO)Gi7O=+_%7^`sZvs8P2MW)(ODVM?aBC&( zA7Xvqy2D70j~C&=OT7bV0qrA2!*4YrKscN0&a-%v9Z412)H~>|^erJ`xR0)io58rC ztOgzDQ&ddWdw0mq0IJn291(Q`$=LbXg4B%u9jzzKAq#VuDQF*^PnduN?}${(wmy8st?!fJuyS;U`~g{nvS=ja%ln4$Nd01kyGSg->U^W{_N0CH$)zV)24i!9d#Hdt=#e5qd@Ki`` z7kR$QWfwU&@Vz8|CcB&b5;rmy zhU5fwvUW9rzVr9r^DhgN@7zH56+R-8xcZ_Kz<|Th4jwn_#^%LVy6+?h@>+laMQ^}k zsKOEhh*eflPy#x{(yLlzBIjR`0l>E(yH?|)<>BPMoZPGY?<;Ox(U(@oY{3tby{&Pue%gStN$~+- zNlZ=A20|-q{=nRyw{|O{2@vn}-+>oH1Mv6_A)ZYN zSA4jmqI(-`ZZ6nbG3zMIJ84ZX=u}OX#%+1h1Y_nzzuIY+%*M_(B1WSk^%6>0G8*7= z=!m#G(<5C|)!ES5 z7D(_b;l#;=2uf)3)Np}4*f=C-zuq5p$eL+vOH2F3g*I;%0J=9qKB)OWZ#yT;+Y zpUu4IU3H`x#uI7*!cKb_8n_w+c5x&!+QK7 z5f~y@JB?6h@e30ZUQN)(CZ8U?^Zb2khMxF!vuD}yx!Ux%;c`1KrgL+R>qj>N$iXp= zW%+CjT>%}7g1A@a|BR9U+J5FI(b^27rm3`&Xd?f014L*dWXCAhyU%rvFx%q^ z;=It6Ll;6;uh+bld(!z^V1#Fx=W9an4;nw6JAcjNNtZ&)Oy0SbOIp`lU$y*T(E9bA zk**r~WqMGKfGT-%>J=gPh)@8NKtf#=EQY|e^s<1mj9FbDni;1$D>BHiGtXVui^C+SE2w$iu&g!ca z5)G{08R$9c2uw$&*WgxMSn2Bqlhrqd`1fqh-QOl9(jNr)<&ERm?s%9oSJ&~2IJ(6o zWewX-+>=+1_xiN=Mr5(l;hI>I*@EQd`#i+J{r z-p_SL<;MBd%Qvx3yY~X#rCEo6q=L0hm@Ei(X_JAEkN8fQ>YrpZDujrZot{}D5PPFk z+OY%c5Njj<$P%SB*UsKkay@9WwtP0UYAM&jYh%~5Z0sLMbe`r zs=}b%2vLFnU07&q4VB=WVc9qE?agQD&Ml}kj!>3Y#nU))lR*Aa zgd=UcEMS`d(^$@??5XmeDYtwiVE*x_^LhJ_3G!xpvWi3JTCmdZ^p7#SN72^aylPEa zu>)|RvpkoVr+*_GV&$H!blG@CZ%{URQC-OTJM?jx)iAI^ZmLQ5_GpbOUZH%wb;pnL z-IJ_iAXiD){Qyw1Bo@4nK4H>-s2kfbmSlCs4;E3gj@juV#nQa-qtW#B37!{P7lvZ1Iln`{<%u=cP zSa7rys0OP*v#H<`KJwL#86M`7Hg_EnmMws;CJ?3`mkO1uGC90F)ThK~>HILrYn_xf zNU(BV0CnaJ*s*w;Km~4!ryaz4H9LP05M3?Ow+0VB?!q~im2A_K!iK!X3Z$F0q!aI8 zJ70i9*-Dt+f zAP=mTRw*4)?Mq^x-e0`KE$3C-8I7zWXugp!12Ph+-gc~n-eq8kidTZuvP)nPl+VSH z8Wm;ob=7s1gRzY|VRDk-ZBP)Fpw&2Yu$bEqdYOO>fRe#5u6fQh zKJR4JENzE5{{rlz!Ej-FDJ)1KdmjbOJQrtGvf|xF;>M@h`m;$_a6VG-R$SrtDT6F2 z_@7bX1JTiWirAmZ4NWJVknfYSdye!gnEy0{#xRe z#z7@ZU$AagradP3T?Epx^#=C1&0eY`7rLH6@fUbkl=)zD&+<#)-Z5gT$!F`-YSXa@ z>j%iLelIL9KfIUQx`w$C3|uvCS#Uc`mQajM=JJ~vH z^Fu~^-$)t8J79B4P)QTg#$czYm1QS9a}g2V|C%O@isYghPN(5cw{lwIQq*)$)Qduh zrG-rKgEsN9S*(JWyYei*aHXy< zGu=6h1;-+kF&^eXLX*MsoV2< zMRjO^PzkNaZ$To+eJz2W(R)z0Z(RSGod2Wx%c^KAyh+=|4vWSk#Kh0~F`0$1!0Moy z@EZ%LxEqx-n$1^$d^a?m6^#PT+?}(l?_MwO)@z&)agXn&dd=qSaLFu&uZqv)RE~1? z(&pwj@w-QFA4*6L_&YDZlmhSNz3A-aj7fyxhK#(5jCwFPALcItL&<{L{Xybk#=$$hKKsmg7= zTD)czOkF1qSv_f$Fvxy=sDR|j9q#Z-%7*VHrn1=RKB_Qx>C zJUq5it5)@d$?fp6xYor&Dq5*(HZ;mOrw(+Dz;y8r`~KbyiUr&)SOO!zy4Dy`-N`n> zoPMU9aW~YXzCz*(IzM@u@7JuTA&bovw|kK$@(x|bz5Do$2nuW{;x#@*?(ovce+JFtbR zqQ6(EmwLreq(R{elR^U}p9)k1O1+=?A_+Y9=t~V@h1I<&X@er~e*5V^QkVa%PLMp0 zN7_Xoo(27yk|A0h#)tDnMcJ(91aF`@xMAan_DAQbJ3IwlY)Xr8+Ykv=eZ5`5ce7Gl zT}76wa-&qqI1Zbswa6@XY!&pY%;0{_#+TefdFLX#*s8nCN2Xi)VawHbY~~JS^YId5 zJ!VLv5~os)^^wWEE;(aES5b<DH{CA#;DumQCA5qp^W2>YUtF50uRBofnPp-NC&;Kuu(Cc zDy~Mz&98>%r_{h-kPAq8zZ!;>|-^zXXq?K>;ic~|*fv=8WMnj2R+skx&d(&6G*9N5ayo>tU z-TDB18|~U{p>S1KlFKoluqL=)^C{zMT}454l+iV-KbWrII8{_^sr6&6M9c6q`lpI{ z1&cuy+k3}Z5?)OWJ58>pmDqaM?!7b{by1P|p8cR8wxrH?NN3@#F8q4Ao54^~FYK}G z!(OvU<4G3hpfrwhXRY`Ek1yk!4c)^AZ_4Y+O}FP!jUtnRz;thUnSmSQTUFn4s`!$> zfA_cHCIk|%X;6uGPMB_#HjM4|NaPVS9QbltM-uNu8izDm%F5P@$j>prq>-r*W%uF) zm(O$7fl4th>q>eNhU^AK^^Zb>wux(8Zm!1=mpfm7lmE}u=-<`L)?Gh6vdR4R3GXXp z>s1h$9-5SD)z{cLvIxlHUAIEb6G#@V0NZAh45wu`*f{La-#}4^u7?~71BK33mYAuWN6u?3ujC2GFhT6v8O#@851bVS0EK!rIZI zuUzp^qby4+AV9yidWX3qV2P*zGZcri%b;R3kO`q9)A=dXqGF0G(po(*HlO^znT}aq2VOJvF zYi(pKeZ);;PSEfRP9ldB5?q~jXpp~mKU)tsS{*-*k)^=CA6CxOiaKNVeO<&0u*ibt z6eo$iZ&&=D2jthy0EPqF1Q4n&?N6~iNuy2_fUXf_ZJa8sg4=&I82BxIDyU$^ zD#FLeeUJG)2-+N3L1fOstH zYC2hW>>}i3?@GqHsR!jwhxwi`eRQ}sFB}k$JLcc}xw!Cau*i*%N!bN7A%!x(K?)h) zX`ugL7c_PeWb<)DPF=Tm4f55%aN3uP_qZgVAUQF8Rr#waRM60$Rc0kFK(1V z^%X*!ceea z%p3+;zxXQh6WNYdS!BX<$W^DbpVP>AYwVDnXv0*?*WK=B`&8t$UPPj z76v-W+dvZOFDR}sm~~1PpN5xLtWEMjd7*mLyt81+yWjq%MSuA?%XE5FWMaC;Y!@Y7 z)&KJQVbydFD$?bR@@U3EJnuW>s$w+*Ufd>!Wh>S{QMtfG9`Gt4>!vDvD+mWD@n3H4 zGY<4#-uI23KUB4gtUPoFuy!>h(g5(7u4@WA^YApEmbc~{-73!BD!QXiKAsE9jA1Jn zy4ruJKnM_ps4`Fjv?c8Pa@25d6usoGWEH7Wj2I2SdBb#}B$Dp!P;RDpm|m&erY%}w zHzp^Ukeqh67Mj_}wkp?~96eJln{gLd&haYPCm6B(;uc-rw!Y07D3r4P$gp8L*q1K# zG6^;y#g)(Ex!qUZ0_CK55oZyPhKD?i4cwb%M0VdzidT<1LR$mUt4zb1nD@tJM)Z*%%E53)rlr@5~7wIw~XgoJ{ypFbSJI}x3^J4-wL7sHY-%Le`Mhob#g(jA2Tc|N^+ES=S{pXNn365Z(c zTqyb3oaGyW(vJ?Wt(B%o_`fFYz$tY01Z-G2(YxSf*NBbgZLD-fd12jJuIQJJ)-YQ` zB&o##R01-F+9}ao~>*^cOskMw^xiAhS6M zL@@~m70f>X3xrfeB!9?%P8wD#MJ2cgS%oxIw6Z#TGUPSu%~vOD@!^!D?=AAg*wq#K zwp~37*TSOel2{tY2fqv1?@{x5v5d`c)gh*0DT8|fV?L!eSH+Q4NyQDp4;s-^LoBQ_ zEfzZx529&U^Enrjs}1U|B=T&731C(FXQ6nFVWr+4z9#jE&U(<1`! z(euOI_Ky0YTIWhA`dYn{L9JdqhSYMz`G>0_&99ZZ{jH*yB7(GgR=%^naKbd|(jY{v zHkFuhp_|z32PAbq?Tzt}na@xTO`r91JB=RjnnbwiAgJy1{^}iJ@||f>1o`9kab|4w z5LTx~NslMIHa+! z-Jg$+*5=Do5P8oXB;D?^Ulq?t3s3jmy=zo25LE;CUK*j=K!S|(Q^VR9Act&)4npes z(wv6HsFf3@wN#6VTYp$4WiDwHHu_#$HZwp)Si71LbHh_T+Crr&+2oH?_E4-c9XXTt za(#qzIk79tKr7>X!jNP*&OaoRU3a5$3v$Kx4Pq>`z09x!o;5z{mrZ->N$v|@e&p-x zKlJSDOUM6;f&9+Y-yC@?Te5;kaHN=W`9aqw)|RaNo@o}gqY_!4erp<98l!u)%{9~? zQGuwG!I@c3e(2W@H-rseq(Z4I}p+reQIn29vMvTMOvcb;QAS!w`#h_WofS#C=^vY6$>r9L*#U)Lv3ysF~qK- z&imVFl{?1g>+IRnOe~vM6>aXIs&0y1sO^C#XxUqs%u$i3h=)LpWn@ z%lg9%(1>NC2he;SL3(kM4FIzATAmY_? zotJ0lnxvBsZOPm4>agbC^)_Rvz|k1X4^eIC-+JSL52Q_AfoQG9ar{oJvhE-lpda&) zf6^ggu*kxT%;n=YeZGGy#nQF)`n;oqXJ_NaRkOR zRwdBQ&OrYNG!^`6P~|;2m~Uidm$?aauTcMy>7?n}YrjGH_`6YL3meiELzrRJm1yhX z20_{DjS+u4HvQ%Ndzs&nt{rF6Qvs-)KP(rv$iZ#w?O zbnUuHP9cWGmys>9`$8r8+fUd1t+-c{7U;2->mTkb-@MV^6=n=KP*49j?PZAbadQ2> z69TvH6w5HGwRqIR`S6ihW5QhF?m_hLH1E~Ib?%1JSWMbHX>+QUO0nZcz!p{M%RV+M z6gz;8B8DPuX;@68-@|NYOFVKpz7K+;xDDgL3nl}G30xwWp$fkNLCTjR4w6i5Y_9Z> zmz9wNw(O^F?zLi$P{UU#HTZlBPZNUlPtzKGV$xp(FtMcuUZhTP%XG_^Pz^&;~BNCaM73xiFcBVOL%z@vAsC_GL2r?(Nms|WbP~?H-wcPXnpow zp+Kpv0suF#YH9r_J@M&uMNPvcPT3*TqM;&fBe{8E_A@@p``{CP=Ef( z;4liXtXIpEZLcSW%9MobQL!Nc_wk5IHszqCGT#Su+-h<|HPkOCb88M6G!|D1#9>=@X_~Zxg+|!w?f`er?@ot!rIJvTc=91d_&?(@pDdw`y&=B4Z?S z#|?Ar>LEbxJw|wmt%Aq-o`%62(oS zmHvX3=^$?w<6+y>?JbLppf#fh8(K9PYEobkNXP>HsL#UIzzoqVSl|+$`^Y45#&pB| z`{vdX@1v)GtRk>(%LerCYo&)}^eg4^L(t)xoy>2s_r)!4TAJz3fCP05rjs3nP^Z|%01_iVPnuTP|SO@?$=kmZl)T!E)oyV}_mp0ja z&E2T5jE(%Bd3%}SJ!1>?m`bTo={GhS{2k5enje5|k4!^Vbo>QCbnB&+*dy^nqcmp0Uv zP|GRS41tR0Dd@8I5ykz;MCi3ZyeM{vP@((K)i@wa$PD@Gf{T@e?T6QgmC&zlC?G1) z+ES2pSRjHXDAi<+YLKXG-LLI>;s;Bu3$|6v#XBC8Jh;J@Y1zC>@tN@wUY%%ceS z%K058xu+~wF3zL&XQ!}>#uc3j`hAE~&8!bMFayKu=GlL#zOiR#WWE0$A->@?sTkV8 zKoUEx!%;7>e1^^n?6c9OpZ3N()yoq+_|wA{teX^Yv|S)!j)xo1Rb(NR*KA_YP9~&T z%POb%K5&B0@rQ$p8edQP^pnu#l4xbb52VreQFBf5r-4JF3Tr7Hdy2lMkR;TnIegqO zF^y!jLF$V(Os1{lX6=y_LP=;-aAyGQ?QSKoTkMg>uLoLFE^f-`TEQiC&@(vZgoz)o zbwh#S8BJhMMdTLT?sq6afn%=t5)lYfw>NfSQ(z+QEhNIn0H`J%(trR|N)~Y*Tapm@ zT`DhZlKhtVvW~t%5s*&JJ?l9)rAG7et>m&)*MM3=^mj^0Peim-P?~xXE~PKv>A&#) z4BOLq?aI8$nQ_JySS|*Te!|45VI&7=F&PcgrS}AFMqt0q&HM_{Ug>s(SZCaARE7PRlrWfsdZ-dMk(%YrfG5$ra`iZ05t|q0mOEp7$+Py)W;TRf+`ZO+7}2ovq6kq6y_ma-s?0XV_F0L;ocl;V<;ot*VZ2 z=}M^FayR?Va*&^-(;TT2XuH4PdK_gfBHyR2$%j)>E6dS3)B3rJ;W0_GEH}XF^jgXI}-g&Evy#C zhY&koPtFLW9snlLL5a}u=Bh3+S>~kF*l|2egW~V+nj$)stL3>Q>i=jPl%XLi8 zK~mePYP`w@sylxC2(YejGjR6c5Ef>x^#%_d^PGB1yx?uGeQTwPFtQPT*{^A|+l~h< zYtf1=Vz#(`i!u9`Dcd_~iziG~59YoUEuQx8B3*gaL6SQ47v~5itvIv3|1(%1GCLD0 z_}FX$>3>wpUW3HbiQ* zy`}sRBF$cm#I@m@df)LbEQ89HF7u?hsnXc}dC00j@y&@??fMfY>GBNw7sZD!aj{jO z*QmwhuCS5VmgVw6%L=4Gg1i5LjXjuqdlk@^)Z)>x(-WAJ?HDt}5~-Nczp6bil9d#r zxMl^c(`W)o9ETe1N9KkmQd5?sJaa>nOrVgpSch1^HZSu=5;8N#4J?8xQT2^$nU<7Y zd7G4jfw^0e2Nr|rlk9(T=r45d)VssT*FcdbkXhWsqekRW8DD#7;e-CdA_Hklyk-+; zRFeQ!Z^C1nlFhw0y-E?(AEmwUt`O@zT?ZLdd(JUx3Hvl#M0r83Nnxj2D|2`A*as+L zqB_D3iq6cNtlR-;0$w@=wLVW8qY9%s`Z|vL-zv05KUg>zsL;((0Se{J##Fu#6E$;+ z3YD`}I?i2yXBVXH^q1)g|<<3Y=my--;qD~Pz-{){669gEQtoB)GL z>p=a@hRtPT^V-F+BQiWJ^8>Axc(eVjTP)`211n`@JP+?k6+dB04Ss+R*S1)8U=heG z$MuwVAqsZ)rpy+s>YrFP#YZls_I+paMr4eXXu<>$B3VnN&7}hL8 zYP5ChAfhH@FjI#?9+&?@AOCD}!xWy*iN3MP{h<3mVPOr4l5aAfgrxH52eI0!B7LJ- z9PA|A^}R1rjFz9@PP){)Pux9cG2%M98sVqk_O@R5wY_!aF(2;by4~rF0X9i;YKRlz z+5qyM)uxp#CFZQ)WQrAb{^|V9>3}Bdm`$Bkha5caiYR5s=;S1!#(^8+|jvV?I3Kn zJ{)2mXRJ~K^dqg`yOql} zVXjW{?>s!{;IOEEF8i5l;!jpE$y`)Ci?vIhgg&y}dpphxtrT&jdb$!i3x%#X+cdtX zV*~us?u%IRiZ;x0ctXNvp93?-Fh>9m1Jel4*xALqL8~*eZ1M^T25WB89i7#}CX?4| zFKis#1CKVtkI)V<`eSBueLbofm3w2Vx$UOw2~(uElda+$L=(UPYNhP3I%Md{OEIn$ z^;Am;8wVs$((Nb-&ucnz8S$JZ6*0k~fN%1>{JMz=h-c+D*Z8=@j45}rUdW}ruytjz zz2)F$Tp&mM{9lTnyU6r|+^M}XN+WrV`8qB zd$oNH4bHVOweos$xk&T}>8~06eq}krK)7da}L6z*; zGoEGPCkTmHeoK#xg{BV&2b_Uv4Z-kO;9WLm)@HoPie1|uYmLZ8ZsmxV@S0HiwtKBp zU&%Z;U5~atMj3AtDN0y9RSBZVWt>N|37}8O_wCI`WTZSUaHMaPr_Ibk_Wavp^!Q(}ECa?vJS zX-)RdsV^lx+ipZ!8mVHv2Nx~C9MF%tqcK>dZ3b1@C!j`;KV^)6Sdvx-$H`6I`jf1) z*r%iXTB2yml+LdsqyLNz2))UdWj+ zYR8q7i~BzkkU6ez7degZz>ZRLMJ$3vR(>(Y_IqHQd3gOZf_xsPyZ%YeKYgE>@6EOM zL^-pu$*R2NTAtW&9Xt#|Q(Eib$2v=I8(vyS|D3t0=>Af)v>z&sj8yvX(jzk~qO6v&vhuCA*j&!O#AyuY*yv$m>YT*$fj_*B=Xiday7;@w znPM*U!4Sdwb_|Mo!=!+k zdh2wjPfKn_{W~m2(qYVlWTWpyDChy_=2WV8L-LP>qq*GPm4GU*SBv?;A#tf&5gtl5_moyNX zKSGJ;djlT-@VBvd&R+BgsU%lHepwzKjsv|+VYE-D+hT8eCQoJw*{4>xsfVO2JRHWw11n5@z5~0{FgF(g%gc z`RmL>J<8*1mQYO%{5o=FhVjRFAaM%O3F{!Pp>~1fY!~Gak#*1P_oGIy_wk=+%`6jT zgN#cYH6DYW;SqP%uQTo?+Gq#}KtffrpyWqY5$<<8yNN~?g^pt&F1
            6=f{=IvB&xZ{@CJbkXwJ>>-%WU+B;9T~kJ&p%aE{r{!MH5H+$YbqW7p$BKKnhsQRSr#WqNPdi_ z3(lOM`1t1niFdDi*f$|und+TdpK2vGHllVE-K?P@ZhCKcvieKkLShW))GzXC2EdWm zKky<@9FCKn(N!06$S_6nSwpKngoA`}4Fm?#(zmkZR!bV%)(hIQS`T?VLIucM_0!_a z<)kR4(~NtyKCTeB*K$ph1?SZl&Lc#sgc}SHI-I9oW+xKrH`zK`e#NU;3~gxLvf*JD z!G81Q2IDkB@m3Xl!eRl)T8a6zA1bgRleS{)jU}2(Bxa5(7gz)b1XoyI$E9SqOdU7c zMcV0%wR}~3RxmdWlIO06xI#j2C9bu;Ht)+Bsi}jFisQ(dwCqM^tTV((fmW_Q``Hdy zTiarWx#cY$c;~}DdPj?V1yS&_Y>9dlK5gZfMfLZUwrDAKd_gRz;E08gUT(*Ia+ppH z)2XaZ;7`|V+%S5aXa+tOhW9%)tg9s+dOU@!4@jMw-co%*i8dins(74OXWsPc36p1Y z@=WuU_he&O&H55aGr7Tu&v1ewk03 zV7}JOPAXFOn-YM^t+NUdNp9LkOZ5T6h%Q&p?#L@&p|&_8BR+|y0C#gpIe4}>CgBDi zt_64OyCa;iv(uN9N(~%cM9nj434ngQPAkpewz3t@dd4QKc*^hf>lsZbv64?JwqMW6 zqr|e?O5GV7n>A&yv_6aANS9}edcTgCD{AGq-U)3DuNGQ5Mh2DhG=I+q+NNEVeC1SY zk`JOv=xgl>X@8da#?EK~N-L^mJzi;f&%n~Jn&PbbRYKN1)}lkMIf z+yHI71Vr24ladvXp1#3Hx4j_tINHsJ*Z+OgyjRlgKLz#A-n^Ub2Bs}&;oR#@r@m2d zHC?CW086x+`w7$iD=`0|fy*AbD~b&+b|CeBC;zG z=`no5XRBaQxTIw;%g*Y;36rKgM&7OnqVwwAG<`>CAfs1k|ITS-iwHqcyUjT9GTj2M zSXyV*5KZ_(5AR_{|Gx5UzX=H%xLKsNCs}->zPPhc-91pnS);BnDC~Fe+@TgSUCgdn z#RHG@+G0f>b7aRwfg&tI9HtBK{=0&rhD?`IAL_$}8qU8e>lrT2sDJ3ceZusc57;i& zE~!aJRKzIjP)+NzgS(6D`u+cEsQszC@vNdFPmbwRvnq)I5quHb$aW{AeNa%ne(fsF zt&ggT6{-DY_n3Lah4^ipx{X;>CPn!gR{E!G|D%8}GUXLpNCh#3P7U+s(2*TC;vRpZ zW^2A2EOCq~N)>Xy+Z@kI_)f%{{;-XyVyuD^*9`2FvoZ!f3JXv}?E9)dAD1WPX8T4* zs7qA)qXte}zxhqg&l&zNhZjK{DGU@3a?S)vW0)`QuX9QHV3Ah3SSkZ$0ee#BS!8p<^s2zx!};K_wxq&?^@Qn*adr0Tt)rm=mP1PR zaiOnlj@ubC{OMi00jNS*rXgs3h%%`&!5!ys&?r^3iTM`XakMLVG5VA4&V4(*L_05I70'); + that.body.on('click', '.michat-message-icon', function () { + layui.$.get(baseRoot + 'plugs/michat/template.html', function (template) { + layui.layer.open({ + type: 1, title: false, skin: 'michat', area: ['800px', '520px'], + closeBtn: true, shadeClose: false, content: template, success: function () { + layui.$.getScript(baseRoot + 'plugs/michat/chart.js') + } + }); + }); + }); + }; + this.showMessageIcon(); + // 给指定账号发送消息 + this.send = function (account, payload) { + this.user.sendMessage(account, payload, false); + }; + // SDK登录初始化 + this.login = function () { + this.user = new MIMCUser(this.appid, this.account); + this.user.registerP2PMsgHandler(function (message) { + console.log("time: " + new Date(parseInt(message.getTimeStamp()))); + console.log('load:' + message.getPayload()); + that.list.push({ + type: message.getBizType || 'TEXT', + text: message.getPayload(), + date: new Date(parseInt(message.getTimeStamp())) + }); + $('.michat-message-number').html(that.list.length); + }); + this.user.registerGroupMsgHandler(function (message) { + console.log(message); + }); + this.user.registerFetchToken(function () { + return that.httpRequest('https://mimc.chat.xiaomi.net/api/account/token', { + appId: that.appid, appKey: that.appkey, appSecret: that.secret, appAccount: that.account + }); + }); + this.user.registerStatusChange(function (bindResult, errType, errReason, errDesc) { + if (bindResult) { + console.log("login succeed"); + } else { + console.log("login failed.errReason=" + errReason + ",errDesc=" + errDesc + ",errType=" + errType); + } + }); + this.user.registerServerAckHandler(function (packetId, sequence, timeStamp, errMsg) { + console.log(packetId, sequence, timeStamp, errMsg); + }); + this.user.registerDisconnHandler(function () { + console.log('disconnect'); + }); + this.user.registerUCDismissHandler(function (topicId) { + console.log("uc dismiss:" + topicId); + }); + this.user.registerUCJoinRespHandler(function (topicId, code, msg, context) { + console.log("uc join:" + topicId + ",code=" + code + ",msg=" + msg + ",context=" + context); + }); + this.user.registerUCMsgHandler(function (groupMsg) { + console.log(groupMsg) + }); + this.user.registerUCQuitRespHandler(function (topicId, code, msg, context) { + console.log("uc quit:" + topicId + ",code=" + code + ",msg=" + msg + ",context=" + context); + }); + this.user.login(); + } + }; +}); diff --git a/public/static/plugs/michat/michat.less b/public/static/plugs/michat/michat.less new file mode 100644 index 0000000..68c09ed --- /dev/null +++ b/public/static/plugs/michat/michat.less @@ -0,0 +1,321 @@ +::-webkit-scrollbar { + width: 3px; + height: 3px; + + &-track { + border-radius: 2px; + background: #ccc !important; + } + + &-thumb { + border-radius: 5%; + background-color: #666 !important; + } +} + +.michat-message-icon { + width: 60px; + height: 60px; + right: 50px; + bottom: 50px; + padding: 0; + z-index: 998; + position: fixed; + line-height: 60px; + border-radius: 50%; + + .layui-icon { + color: #fff; + margin: 0; + font-size: 28px; + } + + .michat-message-number { + width: 25px; + height: 25px; + font-size: 12px; + background: red; + font-weight: 400; + line-height: 25px; + border-radius: 50%; + position: absolute; + margin: -3px 5px 0 0; + } +} + +.michat { + color: #333; + border: 1px solid rgba(0, 0, 0, 0.05); + font-family: \5FAE\8F6F\96C5\9ED1, serif; + background: #fff url(image/bg.jpg) no-repeat center center; + background-size: cover; + + .layui-layer-title { + background-color: rgba(245, 245, 245, 0.8) + } + + .layui-layer-content { + height: auto !important; + overflow: visible; + } +} + +.michat-left { + &:hover { + overflow-y: auto + } + + top: 0; + left: 0; + bottom: 0; + width: 220px; + z-index: 1000; + overflow: hidden; + position: absolute; + background-color: rgba(220, 220, 220, 0.9); + + li { + &:hover { + background-color: #E2E2E2; + + .layui-icon { + display: inline-block + } + } + + &.michat-this { + background-color: #F3F3F3 + } + + .layui-icon { + top: 7px; + right: 5px; + color: #555; + display: none; + font-size: 22px; + position: absolute; + + &:hover { + color: #c00 + } + } + + margin: 5px; + cursor: pointer; + position: relative; + line-height: 40px; + white-space: nowrap; + border-radius: 3px; + padding: 5px 30px 5px 5px; + + img { + width: 40px; + height: 40px; + border-radius: 10% + } + + span { + width: 130px; + font-size: 14px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + + * { + font-size: 14px; + vertical-align: top; + display: inline-block; + *display: inline; + *zoom: 1; + } + } +} + +.michat-right { + position: relative; + margin-left: 220px; + background-color: rgba(255, 255, 255, .9); + + &-header { + height: 80px; + cursor: default; + overflow: hidden; + position: relative; + + img { + top: 15px; + left: 20px; + width: 50px; + height: 50px; + position: absolute; + border-radius: 100% + } + + &-username { + top: 20px; + left: 60px; + font-size: 16px; + position: relative; + } + } + + &-list { + height: 300px; + padding: 15px 15px 5px; + overflow-x: hidden; + overflow-y: auto; + border-bottom: 1px solid #ccc; + + li { + position: relative; + font-size: 0; + min-height: 68px; + padding-left: 60px; + margin-bottom: 10px; + } + + &-item-user { + left: 3px; + position: absolute; + + img { + width: 40px; + height: 40px; + border-radius: 100% + } + } + + &-item-text { + &:hover { + opacity: .9 + } + + &:after { + top: 8px; + left: -16px; + width: 0; + height: 0; + content: ''; + overflow: hidden; + position: absolute; + border-width: 10px; + border-style: solid dashed dashed; + border-color: transparent #e2e2e2 transparent transparent; + } + + display: inline-block; + *display: inline; + *zoom: 1; + color: #333; + padding: 8px 15px; + position: relative; + font-size: 14px; + line-height: 22px; + border-radius: 3px; + vertical-align: top; + word-break: break-all; + background-color: #e2e2e2; + + a { + color: #33DF83 + } + + img { + max-width: 100%; + vertical-align: middle + } + } + + &-right { + text-align: right; + padding-left: 0; + padding-right: 60px; + + .michat-right-list-item { + &-user { + left: auto; + right: 3px; + } + + &-text { + &:after { + left: auto; + right: -16px; + border-color: transparent transparent transparent #5FB878; + } + + color: #fff; + text-align: left; + margin-left: 0; + background-color: #5FB878; + + a { + color: #fff + } + } + } + } + } + + + &-footer { + &-textarea { + display: block; + margin-left: 10px; + + textarea { + + &:focus { + outline: 0 + } + + &::-webkit-input-placeholder { + color: #ccc; + } + + width: 100%; + height: 110px; + border: none; + resize: none; + display: block; + padding: 8px 0 0; + overflow: auto; + background: 0 0; + line-height: 22px; + } + } + + &-bottom { + right: 10px; + height: 32px; + bottom: 10px; + cursor: pointer; + font-size: 0; + position: absolute; + line-height: 32px; + + span { + &:hover { + background-color: #69BC80 + } + + &:active { + background-color: #59B573 + } + + display: inline-block; + *display: inline; + *zoom: 1; + color: #fff; + padding: 0 20px; + font-size: 14px; + margin-left: 5px; + line-height: 32px; + border-radius: 3px; + vertical-align: top; + background-color: #5FB878; + } + } + } +} diff --git a/public/static/plugs/michat/mimc-min_1_0_2.js b/public/static/plugs/michat/mimc-min_1_0_2.js new file mode 100644 index 0000000..8cb631e --- /dev/null +++ b/public/static/plugs/michat/mimc-min_1_0_2.js @@ -0,0 +1,717 @@ +var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var d=a.length,e=0;ea||1342177279>>=1)b+=b;return d}},"es6","es3");$jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).v}},"es6","es3");$jscomp.SYMBOL_PREFIX="jscomp_symbol_"; +$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.Symbol=function(){var a=0;return function(b){return $jscomp.SYMBOL_PREFIX+(b||"")+a++}}(); +$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var a=$jscomp.global.Symbol.iterator;a||(a=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&$jscomp.defineProperty(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(a){var b=0;return $jscomp.iteratorPrototype(function(){return b>>0);goog.uidCounter_=0;goog.getHashCode=goog.getUid; +goog.removeHashCode=goog.removeUid;goog.cloneObject=function(a){var b=goog.typeOf(a);if("object"==b||"array"==b){if(a.clone)return a.clone();b="array"==b?[]:{};for(var c in a)b[c]=goog.cloneObject(a[c]);return b}return a};goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)}; +goog.bindJs_=function(a,b,c){if(!a)throw Error();if(2Number(a[1])?!1:b('(()=>{"use strict";class X{constructor(){if(new.target!=String)throw 1;this.x=42}}let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof String))throw 1;for(const a of[2,3]){if(a==2)continue;function f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()==3}})()')}); +a("es6-impl",function(){return!0});a("es7",function(){return b("2 ** 2 == 4")});a("es8",function(){return b("async () => 1, true")});return c},goog.Transpiler.prototype.needsTranspile=function(a){if("always"==goog.TRANSPILE)return!0;if("never"==goog.TRANSPILE)return!1;this.requiresTranspilation_||(this.requiresTranspilation_=this.createRequiresTranspilation_());if(a in this.requiresTranspilation_)return this.requiresTranspilation_[a];throw Error("Unknown language mode: "+a);},goog.Transpiler.prototype.transpile= +function(a,b){return goog.transpile_(a,b)},goog.transpiler_=new goog.Transpiler,goog.DebugLoader=function(){this.dependencies_={loadFlags:{},nameToPath:{},requires:{},visited:{},written:{},deferred:{}};this.oldIeWaiting_=!1;this.queuedModules_=[];this.lastNonModuleScriptIndex_=0},goog.DebugLoader.IS_OLD_IE_=!(goog.global.atob||!window.document||!window.document.all),goog.DebugLoader.prototype.earlyProcessLoad=function(a){goog.DebugLoader.IS_OLD_IE_&&this.maybeProcessDeferredDep_(a)},goog.DebugLoader.prototype.load= +function(a){var b=this.getPathFromDeps_(a);if(b){var c=function(a){if(!(a in f.written||a in f.visited)){f.visited[a]=!0;if(a in f.requires)for(var b in f.requires[a])if(!g.isProvided(b))if(b in f.nameToPath)c(f.nameToPath[b]);else throw Error("Undefined nameToPath for "+b);a in e||(e[a]=!0,d.push(a))}},d=[],e={},f=this.dependencies_,g=this;c(b);for(a=0;a\x3c/script>')},goog.DebugLoader.prototype.appendScriptSrcNode_=function(a){var b=window.document,c=b.createElement("script");c.type="text/javascript";c.src=a;c.defer=!1;c.async=!1;b.head.appendChild(c)},goog.DebugLoader.prototype.writeScriptTag_= +function(a,b){if(this.inHtmlDocument()){var c=window.document;if(!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING&&"complete"==c.readyState){if(/\bdeps.js$/.test(a))return!1;throw Error('Cannot write "'+a+'" after document load');}void 0===b?goog.DebugLoader.IS_OLD_IE_?(this.oldIeWaiting_=!0,b=" onreadystatechange='goog.debugLoader_.onScriptLoad_(this, "+ ++this.lastNonModuleScriptIndex_+")' ",c.write('

          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 d0mRO}xo^G_%I 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 SdSQM28?+M|D(2r_;{O0|uQ74} literal 0 HcmV?d00001 diff --git a/public/static/plugs/awesome/fonts/webfont.woff2 b/public/static/plugs/awesome/fonts/webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 GIT binary patch literal 77160 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 literal 0 HcmV?d00001 diff --git a/public/static/plugs/ckeditor/ckeditor.js b/public/static/plugs/ckeditor/ckeditor.js new file mode 100644 index 0000000..cc1dc36 --- /dev/null +++ b/public/static/plugs/ckeditor/ckeditor.js @@ -0,0 +1,1349 @@ +/* +Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license +*/ +(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a=/(^|.*[\\\/])ckeditor\.js(?:\?.*|;.*)?$/i,d={timestamp:"J5S8",version:"4.12.1",revision:"64749bb245",rnd:Math.floor(900*Math.random())+100,_:{pending:[],basePathSrcPattern:a},status:"unloaded",basePath:function(){var b=window.CKEDITOR_BASEPATH||"";if(!b)for(var c=document.getElementsByTagName("script"),d=0;de.getListenerIndex(d)){e=e.listeners;h||(h=this);isNaN(g)&&(g=10);var x=this;l.fn=d;l.priority=g;for(var t=e.length-1;0<=t;t--)if(e[t].priority<=g)return e.splice(t+1,0,l),{removeListener:u};e.unshift(l)}return{removeListener:u}}, +once:function(){var a=Array.prototype.slice.call(arguments),b=a[1];a[1]=function(a){a.removeListener();return b.apply(this,arguments)};return this.on.apply(this,a)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,b=function(){a=1},h=0,k=function(){h=1};return function(g,l,u){var e=d(this)[g];g=a;var x=h;a=h=0;if(e){var t=e.listeners;if(t.length)for(var t=t.slice(0),z,I=0;Idocument.documentMode),mobile:-1c||b.quirks);b.gecko&&(d=a.match(/rv:([\d\.]+)/))&&(d=d[1].split("."),c=1E4*d[0]+100*(d[1]||0)+1*(d[2]||0));b.air&&(c=parseFloat(a.match(/ adobeair\/(\d+)/)[1])); +b.webkit&&(c=parseFloat(a.match(/ applewebkit\/(\d+)/)[1]));b.version=c;b.isCompatible=!(b.ie&&7>c)&&!(b.gecko&&4E4>c)&&!(b.webkit&&534>c);b.hidpi=2<=window.devicePixelRatio;b.needsBrFiller=b.gecko||b.webkit||b.ie&&10c;b.cssClass="cke_browser_"+(b.ie?"ie":b.gecko?"gecko":b.webkit?"webkit":"unknown");b.quirks&&(b.cssClass+=" cke_browser_quirks");b.ie&&(b.cssClass+=" cke_browser_ie"+(b.quirks?"6 cke_browser_iequirks":b.version));b.air&&(b.cssClass+=" cke_browser_air"); +b.iOS&&(b.cssClass+=" cke_browser_ios");b.hidpi&&(b.cssClass+=" cke_hidpi");return b}()); +"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if("basic_ready"!=CKEDITOR.status)CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var a=document.createElement("script");a.type="text/javascript";a.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(a)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(a){(this._.pending||(this._.pending=[])).push(a)};(function(){CKEDITOR.domReady(function(){var a= +CKEDITOR.loadFullCore,d=CKEDITOR.loadFullCoreTimeout;a&&(CKEDITOR.status="basic_ready",a&&a._load?a():d&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},1E3*d))})})();CKEDITOR.status="basic_loaded"}();"use strict";CKEDITOR.VERBOSITY_WARN=1;CKEDITOR.VERBOSITY_ERROR=2;CKEDITOR.verbosity=CKEDITOR.VERBOSITY_WARN|CKEDITOR.VERBOSITY_ERROR;CKEDITOR.warn=function(a,d){CKEDITOR.verbosity&CKEDITOR.VERBOSITY_WARN&&CKEDITOR.fire("log",{type:"warn",errorCode:a,additionalData:d})}; +CKEDITOR.error=function(a,d){CKEDITOR.verbosity&CKEDITOR.VERBOSITY_ERROR&&CKEDITOR.fire("log",{type:"error",errorCode:a,additionalData:d})}; +CKEDITOR.on("log",function(a){if(window.console&&window.console.log){var d=console[a.data.type]?a.data.type:"log",b=a.data.errorCode;if(a=a.data.additionalData)console[d]("[CKEDITOR] Error code: "+b+".",a);else console[d]("[CKEDITOR] Error code: "+b+".");console[d]("[CKEDITOR] For more information about this error go to https://ckeditor.com/docs/ckeditor4/latest/guide/dev_errors.html#"+b)}},null,null,999);CKEDITOR.dom={}; +(function(){function a(a,b,e){this._minInterval=a;this._context=e;this._lastOutput=this._scheduledTimer=0;this._output=CKEDITOR.tools.bind(b,e||{});var c=this;this.input=function(){function a(){c._lastOutput=(new Date).getTime();c._scheduledTimer=0;c._call()}if(!c._scheduledTimer||!1!==c._reschedule()){var x=(new Date).getTime()-c._lastOutput;x/g,k=/|\s) /g,function(a,b){return b+"\x26nbsp;"}).replace(/ (?=<)/g,"\x26nbsp;")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},getUniqueId:function(){for(var a="e",b=0;8>b;b++)a+=Math.floor(65536*(1+Math.random())).toString(16).substring(1);return a},override:function(a, +b){var e=b(a);e.prototype=a.prototype;return e},setTimeout:function(a,b,e,c,g){g||(g=window);e||(e=g);return g.setTimeout(function(){c?a.apply(e,[].concat(c)):a.apply(e)},b||0)},throttle:function(a,b,e){return new this.buffers.throttle(a,b,e)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(b){return b.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(b){return b.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(b){return b.replace(a, +"")}}(),indexOf:function(a,b){if("function"==typeof b)for(var e=0,c=a.length;eparseFloat(b);e&&(b=b.replace("-",""));a.setStyle("width",b);b=a.$.clientWidth;return e?-b:b}return b}}(),repeat:function(a,b){return Array(b+1).join(a)},tryThese:function(){for(var a,b=0,e=arguments.length;bb;b++)a[b]=("0"+parseInt(a[b],10).toString(16)).slice(-2);return"#"+a.join("")})},normalizeHex:function(a){return a.replace(/#(([0-9a-f]{3}){1,2})($|;|\s+)/gi,function(a,b,e,c){a=b.toLowerCase();3==a.length&&(a=a.split(""),a=[a[0],a[0],a[1],a[1],a[2],a[2]].join(""));return"#"+a+c})},parseCssText:function(a, +b,e){var c={};e&&(a=(new CKEDITOR.dom.element("span")).setAttribute("style",a).getAttribute("style")||"");a&&(a=CKEDITOR.tools.normalizeHex(CKEDITOR.tools.convertRgbToHex(a)));if(!a||";"==a)return c;a.replace(/"/g,'"').replace(/\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,e,x){b&&(e=e.toLowerCase(),"font-family"==e&&(x=x.replace(/\s*,\s*/g,",")),x=CKEDITOR.tools.trim(x));c[e]=x});return c},writeCssText:function(a,b){var e,c=[];for(e in a)c.push(e+":"+a[e]);b&&c.sort();return c.join("; ")}, +objectCompare:function(a,b,e){var c;if(!a&&!b)return!0;if(!a||!b)return!1;for(c in a)if(a[c]!=b[c])return!1;if(!e)for(c in b)if(a[c]!=b[c])return!1;return!0},objectKeys:function(a){return CKEDITOR.tools.object.keys(a)},convertArrayToObject:function(a,b){var e={};1==arguments.length&&(b=!0);for(var c=0,g=a.length;ce;e++)a.push(Math.floor(256*Math.random()));for(e=0;eCKEDITOR.env.version||CKEDITOR.env.ie6Compat)?4===a.button?CKEDITOR.MOUSE_BUTTON_MIDDLE:1===a.button?CKEDITOR.MOUSE_BUTTON_LEFT:CKEDITOR.MOUSE_BUTTON_RIGHT:a.button:!1},convertHexStringToBytes:function(a){var b=[],e=a.length/2,c;for(c=0;cm)for(l=m;3>l;l++)g[l]=0;d[0]=(g[0]&252)>>2;d[1]=(g[0]&3)<<4|g[1]>>4;d[2]=(g[1]&15)<<2|(g[2]&192)>>6;d[3]=g[2]&63;for(l=0;4>l;l++)b=l<=m?b+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d[l]):b+"\x3d"}return b},style:{parse:{_colors:{aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#00FFFF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD", +blue:"#0000FF",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F", +darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#FF00FF",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",green:"#008000",greenyellow:"#ADFF2F",grey:"#808080",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", +ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#00FF00",limegreen:"#32CD32",linen:"#FAF0E6", +magenta:"#FF00FF",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA", +palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",rebeccapurple:"#663399",red:"#FF0000",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F", +steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",windowtext:"windowtext",wheat:"#F5DEB3",white:"#FFFFFF",whitesmoke:"#F5F5F5",yellow:"#FFFF00",yellowgreen:"#9ACD32"},_borderStyle:"none hidden dotted dashed solid double groove ridge inset outset".split(" "),_widthRegExp:/^(thin|medium|thick|[\+-]?\d+(\.\d+)?[a-z%]+|[\+-]?0+(\.0+)?|\.\d+[a-z%]+)$/,_rgbaRegExp:/rgba?\(\s*\d+%?\s*,\s*\d+%?\s*,\s*\d+%?\s*(?:,\s*[0-9.]+\s*)?\)/gi,_hslaRegExp:/hsla?\(\s*[0-9.]+\s*,\s*\d+%\s*,\s*\d+%\s*(?:,\s*[0-9.]+\s*)?\)/gi, +background:function(a){var b={},e=this._findColor(a);e.length&&(b.color=e[0],CKEDITOR.tools.array.forEach(e,function(b){a=a.replace(b,"")}));if(a=CKEDITOR.tools.trim(a))b.unprocessed=a;return b},margin:function(a){return CKEDITOR.tools.style.parse.sideShorthand(a,function(a){return a.match(/(?:\-?[\.\d]+(?:%|\w*)|auto|inherit|initial|unset|revert)/g)||["0px"]})},sideShorthand:function(a,b){function e(a){c.top=g[a[0]];c.right=g[a[1]];c.bottom=g[a[2]];c.left=g[a[3]]}var c={},g=b?b(a):a.split(/\s+/); +switch(g.length){case 1:e([0,0,0,0]);break;case 2:e([0,1,0,1]);break;case 3:e([0,1,2,1]);break;case 4:e([0,1,2,3])}return c},border:function(a){return CKEDITOR.tools.style.border.fromCssRule(a)},_findColor:function(a){var b=[],e=CKEDITOR.tools.array,b=b.concat(a.match(this._rgbaRegExp)||[]),b=b.concat(a.match(this._hslaRegExp)||[]);return b=b.concat(e.filter(a.split(/\s+/),function(a){return a.match(/^\#[a-f0-9]{3}(?:[a-f0-9]{3})?$/gi)?!0:a.toLowerCase()in CKEDITOR.tools.style.parse._colors}))}}}, +array:{filter:function(a,b,e){var c=[];this.forEach(a,function(g,m){b.call(e,g,m,a)&&c.push(g)});return c},find:function(a,b,e){for(var c=a.length,g=0;gCKEDITOR.env.version)for(g=0;gCKEDITOR.env.version&&(this.type==CKEDITOR.NODE_ELEMENT||this.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)&&c(f);return f},hasPrevious:function(){return!!this.$.previousSibling},hasNext:function(){return!!this.$.nextSibling},insertAfter:function(a){a.$.parentNode.insertBefore(this.$,a.$.nextSibling);return a},insertBefore:function(a){a.$.parentNode.insertBefore(this.$, +a.$);return a},insertBeforeMe:function(a){this.$.parentNode.insertBefore(a.$,this.$);return a},getAddress:function(a){for(var d=[],b=this.getDocument().$.documentElement,c=this.$;c&&c!=b;){var f=c.parentNode;f&&d.unshift(this.getIndex.call({$:c},a));c=f}return d},getDocument:function(){return new CKEDITOR.dom.document(this.$.ownerDocument||this.$.parentNode.ownerDocument)},getIndex:function(a){function d(a,c){var l=c?a.nextSibling:a.previousSibling;return l&&l.nodeType==CKEDITOR.NODE_TEXT?b(l)?d(l, +c):l:null}function b(a){return!a.nodeValue||a.nodeValue==CKEDITOR.dom.selection.FILLING_CHAR_SEQUENCE}var c=this.$,f=-1,h;if(!this.$.parentNode||a&&c.nodeType==CKEDITOR.NODE_TEXT&&b(c)&&!d(c)&&!d(c,!0))return-1;do a&&c!=this.$&&c.nodeType==CKEDITOR.NODE_TEXT&&(h||b(c))||(f++,h=c.nodeType==CKEDITOR.NODE_TEXT);while(c=c.previousSibling);return f},getNextSourceNode:function(a,d,b){if(b&&!b.call){var c=b;b=function(a){return!a.equals(c)}}a=!a&&this.getFirst&&this.getFirst();var f;if(!a){if(this.type== +CKEDITOR.NODE_ELEMENT&&b&&!1===b(this,!0))return null;a=this.getNext()}for(;!a&&(f=(f||this).getParent());){if(b&&!1===b(f,!0))return null;a=f.getNext()}return!a||b&&!1===b(a)?null:d&&d!=a.type?a.getNextSourceNode(!1,d,b):a},getPreviousSourceNode:function(a,d,b){if(b&&!b.call){var c=b;b=function(a){return!a.equals(c)}}a=!a&&this.getLast&&this.getLast();var f;if(!a){if(this.type==CKEDITOR.NODE_ELEMENT&&b&&!1===b(this,!0))return null;a=this.getPrevious()}for(;!a&&(f=(f||this).getParent());){if(b&&!1=== +b(f,!0))return null;a=f.getPrevious()}return!a||b&&!1===b(a)?null:d&&a.type!=d?a.getPreviousSourceNode(!1,d,b):a},getPrevious:function(a){var d=this.$,b;do b=(d=d.previousSibling)&&10!=d.nodeType&&new CKEDITOR.dom.node(d);while(b&&a&&!a(b));return b},getNext:function(a){var d=this.$,b;do b=(d=d.nextSibling)&&new CKEDITOR.dom.node(d);while(b&&a&&!a(b));return b},getParent:function(a){var d=this.$.parentNode;return d&&(d.nodeType==CKEDITOR.NODE_ELEMENT||a&&d.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT)? +new CKEDITOR.dom.node(d):null},getParents:function(a){var d=this,b=[];do b[a?"push":"unshift"](d);while(d=d.getParent());return b},getCommonAncestor:function(a){if(a.equals(this))return this;if(a.contains&&a.contains(this))return a;var d=this.contains?this:this.getParent();do if(d.contains(a))return d;while(d=d.getParent());return null},getPosition:function(a){var d=this.$,b=a.$;if(d.compareDocumentPosition)return d.compareDocumentPosition(b);if(d==b)return CKEDITOR.POSITION_IDENTICAL;if(this.type== +CKEDITOR.NODE_ELEMENT&&a.type==CKEDITOR.NODE_ELEMENT){if(d.contains){if(d.contains(b))return CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING;if(b.contains(d))return CKEDITOR.POSITION_IS_CONTAINED+CKEDITOR.POSITION_FOLLOWING}if("sourceIndex"in d)return 0>d.sourceIndex||0>b.sourceIndex?CKEDITOR.POSITION_DISCONNECTED:d.sourceIndex=document.documentMode||!d||(a=d+":"+a);return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(a))},getHead:function(){var a=this.$.getElementsByTagName("head")[0]; +return a=a?new CKEDITOR.dom.element(a):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),!0)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){return new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView)},write:function(a){this.$.open("text/html","replace");CKEDITOR.env.ie&&(a=a.replace(/(?:^\s*]*?>)|^/i,'$\x26\n\x3cscript data-cke-temp\x3d"1"\x3e('+ +CKEDITOR.tools.fixDomain+")();\x3c/script\x3e"));this.$.write(a);this.$.close()},find:function(a){return new CKEDITOR.dom.nodeList(this.$.querySelectorAll(a))},findOne:function(a){return(a=this.$.querySelector(a))?new CKEDITOR.dom.element(a):null},_getHtml5ShivFrag:function(){var a=this.getCustomData("html5ShivFrag");a||(a=this.$.createDocumentFragment(),CKEDITOR.tools.enableHtml5Elements(a,!0),this.setCustomData("html5ShivFrag",a));return a}});CKEDITOR.dom.nodeList=function(a){this.$=a}; +CKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(a){return 0>a||a>=this.$.length?null:(a=this.$[a])?new CKEDITOR.dom.node(a):null},toArray:function(){return CKEDITOR.tools.array.map(this.$,function(a){return new CKEDITOR.dom.node(a)})}};CKEDITOR.dom.element=function(a,d){"string"==typeof a&&(a=(d?d.$:document).createElement(a));CKEDITOR.dom.domObject.call(this,a)}; +CKEDITOR.dom.element.get=function(a){return(a="string"==typeof a?document.getElementById(a)||document.getElementsByName(a)[0]:a)&&(a.$?a:new CKEDITOR.dom.element(a))};CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node;CKEDITOR.dom.element.createFromHtml=function(a,d){var b=new CKEDITOR.dom.element("div",d);b.setHtml(a);return b.getFirst().remove()}; +CKEDITOR.dom.element.setMarker=function(a,d,b,c){var f=d.getCustomData("list_marker_id")||d.setCustomData("list_marker_id",CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),h=d.getCustomData("list_marker_names")||d.setCustomData("list_marker_names",{}).getCustomData("list_marker_names");a[f]=d;h[b]=1;return d.setCustomData(b,c)};CKEDITOR.dom.element.clearAllMarkers=function(a){for(var d in a)CKEDITOR.dom.element.clearMarkers(a,a[d],1)}; +CKEDITOR.dom.element.clearMarkers=function(a,d,b){var c=d.getCustomData("list_marker_names"),f=d.getCustomData("list_marker_id"),h;for(h in c)d.removeCustomData(h);d.removeCustomData("list_marker_names");b&&(d.removeCustomData("list_marker_id"),delete a[f])}; +(function(){function a(a,b){return-1<(" "+a+" ").replace(h," ").indexOf(" "+b+" ")}function d(a){var b=!0;a.$.id||(a.$.id="cke_tmp_"+CKEDITOR.tools.getNextNumber(),b=!1);return function(){b||a.removeAttribute("id")}}function b(a,b){var c=CKEDITOR.tools.escapeCss(a.$.id);return"#"+c+" "+b.split(/,\s*/).join(", #"+c+" ")}function c(a){for(var b=0,c=0,e=k[a].length;cCKEDITOR.env.version?this.$.text+=a:this.append(new CKEDITOR.dom.text(a))},appendBogus:function(a){if(a||CKEDITOR.env.needsBrFiller){for(a=this.getLast();a&&a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.rtrim(a.getText());)a=a.getPrevious();a&&a.is&&a.is("br")||(a=this.getDocument().createElement("br"),CKEDITOR.env.gecko&&a.setAttribute("type","_moz"),this.append(a))}},breakParent:function(a,b){var c=new CKEDITOR.dom.range(this.getDocument());c.setStartAfter(this);c.setEndAfter(a); +var e=c.extractContents(!1,b||!1),d;c.insertNode(this.remove());if(CKEDITOR.env.ie&&!CKEDITOR.env.edge){for(c=new CKEDITOR.dom.element("div");d=e.getFirst();)d.$.style.backgroundColor&&(d.$.style.backgroundColor=d.$.style.backgroundColor),c.append(d);c.insertAfter(this);c.remove(!0)}else e.insertAfterNode(this)},contains:document.compareDocumentPosition?function(a){return!!(this.$.compareDocumentPosition(a.$)&16)}:function(a){var b=this.$;return a.type!=CKEDITOR.NODE_ELEMENT?b.contains(a.getParent().$): +b!=a.$&&b.contains(a.$)},focus:function(){function a(){try{this.$.focus()}catch(b){}}return function(b){b?CKEDITOR.tools.setTimeout(a,100,this):a.call(this)}}(),getHtml:function(){var a=this.$.innerHTML;return CKEDITOR.env.ie?a.replace(/<\?[^>]*>/g,""):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\?[^>]*>/,"");var a=this.$.ownerDocument.createElement("div");a.appendChild(this.$.cloneNode(!0));return a.innerHTML},getClientRect:function(a){var b=CKEDITOR.tools.extend({}, +this.$.getBoundingClientRect());!b.width&&(b.width=b.right-b.left);!b.height&&(b.height=b.bottom-b.top);return a?CKEDITOR.tools.getAbsoluteRectPosition(this.getWindow(),b):b},setHtml:CKEDITOR.env.ie&&9>CKEDITOR.env.version?function(a){try{var b=this.$;if(this.getParent())return b.innerHTML=a;var c=this.getDocument()._getHtml5ShivFrag();c.appendChild(b);b.innerHTML=a;c.removeChild(b);return a}catch(e){this.$.innerHTML="";b=new CKEDITOR.dom.element("body",this.getDocument());b.$.innerHTML=a;for(b=b.getChildren();b.count();)this.append(b.getItem(0)); +return a}}:function(a){return this.$.innerHTML=a},setText:function(){var a=document.createElement("p");a.innerHTML="x";a=a.textContent;return function(b){this.$[a?"textContent":"innerText"]=b}}(),getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){switch(a){case "class":a="className";break;case "http-equiv":a="httpEquiv";break;case "name":return this.$.name;case "tabindex":return a=this.$.getAttribute(a, +2),0!==a&&0===this.$.tabIndex&&(a=null),a;case "checked":return a=this.$.attributes.getNamedItem(a),(a.specified?a.nodeValue:this.$.checked)?"checked":null;case "hspace":case "value":return this.$[a];case "style":return this.$.style.cssText;case "contenteditable":case "contentEditable":return this.$.attributes.getNamedItem("contentEditable").specified?this.$.getAttribute("contentEditable"):null}return this.$.getAttribute(a,2)}:a}(),getAttributes:function(a){var b={},c=this.$.attributes,e;a=CKEDITOR.tools.isArray(a)? +a:[];for(e=0;e=document.documentMode){var b=this.$.scopeName;"HTML"!=b&&(a=b.toLowerCase()+":"+a)}this.getName=function(){return a};return this.getName()},getValue:function(){return this.$.value},getFirst:function(a){var b=this.$.firstChild;(b=b&&new CKEDITOR.dom.node(b))&&a&&!a(b)&&(b=b.getNext(a));return b},getLast:function(a){var b=this.$.lastChild;(b=b&&new CKEDITOR.dom.node(b))&&a&&!a(b)&&(b=b.getPrevious(a));return b},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]}, +is:function(){var a=this.getName();if("object"==typeof arguments[0])return!!arguments[0][a];for(var b=0;bCKEDITOR.env.version&&this.is("a")){var c=this.getParent();c.type==CKEDITOR.NODE_ELEMENT&&(c=c.clone(),c.setHtml(b),b=c.getHtml(),c.setHtml(a),a=c.getHtml())}return b==a},isVisible:function(){var a=(this.$.offsetHeight||this.$.offsetWidth)&&"hidden"!=this.getComputedStyle("visibility"),b,c;a&&CKEDITOR.env.webkit&&(b=this.getWindow(),!b.equals(CKEDITOR.document.getWindow())&&(c=b.$.frameElement)&&(a=(new CKEDITOR.dom.element(c)).isVisible()));return!!a},isEmptyInlineRemoveable:function(){if(!CKEDITOR.dtd.$removeEmpty[this.getName()])return!1; +for(var a=this.getChildren(),b=0,c=a.count();bCKEDITOR.env.version?function(b){return"name"==b?!!this.$.name:a.call(this,b)}:a:function(a){return!!this.$.attributes.getNamedItem(a)}}(),hide:function(){this.setStyle("display","none")},moveChildren:function(a,b){var c=this.$;a=a.$;if(c!=a){var e;if(b)for(;e=c.lastChild;)a.insertBefore(c.removeChild(e),a.firstChild);else for(;e=c.firstChild;)a.appendChild(c.removeChild(e))}},mergeSiblings:function(){function a(b,c,e){if(c&&c.type==CKEDITOR.NODE_ELEMENT){for(var d= +[];c.data("cke-bookmark")||c.isEmptyInlineRemoveable();)if(d.push(c),c=e?c.getNext():c.getPrevious(),!c||c.type!=CKEDITOR.NODE_ELEMENT)return;if(b.isIdentical(c)){for(var g=e?b.getLast():b.getFirst();d.length;)d.shift().move(b,!e);c.moveChildren(b,!e);c.remove();g&&g.type==CKEDITOR.NODE_ELEMENT&&g.mergeSiblings()}}}return function(b){if(!1===b||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is("a"))a(this,this.getNext(),!0),a(this,this.getPrevious())}}(),show:function(){this.setStyles({display:"", +visibility:""})},setAttribute:function(){var a=function(a,b){this.$.setAttribute(a,b);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(b,c){"class"==b?this.$.className=c:"style"==b?this.$.style.cssText=c:"tabindex"==b?this.$.tabIndex=c:"checked"==b?this.$.checked=c:"contenteditable"==b?a.call(this,"contentEditable",c):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(b,c){if("src"==b&&c.match(/^http:\/\//))try{a.apply(this, +arguments)}catch(e){}else a.apply(this,arguments);return this}:a}(),setAttributes:function(a){for(var b in a)this.setAttribute(b,a[b]);return this},setValue:function(a){this.$.value=a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){"class"==a?a="className":"tabindex"==a?a="tabIndex":"contenteditable"==a&&(a="contentEditable");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b= +0;bCKEDITOR.env.version?(a=Math.round(100*a),this.setStyle("filter",100<=a?"":"progid:DXImageTransform.Microsoft.Alpha(opacity\x3d"+a+")")):this.setStyle("opacity",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select", +"none"));if(CKEDITOR.env.ie){this.setAttribute("unselectable","on");for(var a,b=this.getElementsByTag("*"),c=0,e=b.count();cf||0f?f:d);c&&(0>t||0t?t:e,0)},setState:function(a,b,c){b=b||"cke";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+"_on");this.removeClass(b+ +"_off");this.removeClass(b+"_disabled");c&&this.setAttribute("aria-pressed",!0);c&&this.removeAttribute("aria-disabled");break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+"_disabled");this.removeClass(b+"_off");this.removeClass(b+"_on");c&&this.setAttribute("aria-disabled",!0);c&&this.removeAttribute("aria-pressed");break;default:this.addClass(b+"_off"),this.removeClass(b+"_on"),this.removeClass(b+"_disabled"),c&&this.removeAttribute("aria-pressed"),c&&this.removeAttribute("aria-disabled")}}, +getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)},copyAttributes:function(a,b){var c=this.$.attributes;b=b||{};for(var e=0;e=B.getChildCount()?(B=B.getChild(C-1),q=!0):B=B.getChild(C):v=q=!0;p.type==CKEDITOR.NODE_TEXT?l?y=!0:p.split(H):0da)for(;L;)L=h(L,K,!0);K=A}l|| +g()}}function b(){var a=!1,b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(!0),d=CKEDITOR.dom.walker.bogus();return function(f){return c(f)||b(f)?!0:d(f)&&!a?a=!0:f.type==CKEDITOR.NODE_TEXT&&(f.hasAscendant("pre")||CKEDITOR.tools.trim(f.getText()).length)||f.type==CKEDITOR.NODE_ELEMENT&&!f.is(h)?!1:!0}}function c(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(1);return function(d){return c(d)||b(d)?!0:!a&&k(d)||d.type==CKEDITOR.NODE_ELEMENT&&d.is(CKEDITOR.dtd.$removeEmpty)}} +function f(a){return function(){var b;return this[a?"getPreviousNode":"getNextNode"](function(a){!b&&u(a)&&(b=a);return l(a)&&!(k(a)&&a.equals(b))})}}var h={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1},k=CKEDITOR.dom.walker.bogus(),g=/^[\t\r\n ]*(?: |\xa0)$/,l=CKEDITOR.dom.walker.editable(),u=CKEDITOR.dom.walker.ignored(!0);CKEDITOR.dom.range.prototype={clone:function(){var a= +new CKEDITOR.dom.range(this.root);a._setStartContainer(this.startContainer);a.startOffset=this.startOffset;a._setEndContainer(this.endContainer);a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){a?(this._setEndContainer(this.startContainer),this.endOffset=this.startOffset):(this._setStartContainer(this.endContainer),this.startOffset=this.endOffset);this.collapsed=!0},cloneContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed|| +d(this,2,b,!1,"undefined"==typeof a?!0:a);return b},deleteContents:function(a){this.collapsed||d(this,0,null,a)},extractContents:function(a,b){var c=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||d(this,1,c,a,"undefined"==typeof b?!0:b);return c},createBookmark:function(a){var b,c,d,f,h=this.collapsed;b=this.document.createElement("span");b.data("cke-bookmark",1);b.setStyle("display","none");b.setHtml("\x26nbsp;");a&&(d="cke_bm_"+CKEDITOR.tools.getNextNumber(),b.setAttribute("id", +d+(h?"C":"S")));h||(c=b.clone(),c.setHtml("\x26nbsp;"),a&&c.setAttribute("id",d+"E"),f=this.clone(),f.collapse(),f.insertNode(c));f=this.clone();f.collapse(!0);f.insertNode(b);c?(this.setStartAfter(b),this.setEndBefore(c)):this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?d+(h?"C":"S"):b,endNode:a?d+"E":c,serializable:a,collapsed:h}},createBookmark2:function(){function a(b){var e=b.container,d=b.offset,m;m=e;var f=d;m=m.type!=CKEDITOR.NODE_ELEMENT||0===f||f==m.getChildCount()? +0:m.getChild(f-1).type==CKEDITOR.NODE_TEXT&&m.getChild(f).type==CKEDITOR.NODE_TEXT;m&&(e=e.getChild(d-1),d=e.getLength());if(e.type==CKEDITOR.NODE_ELEMENT&&0=a.offset&&(a.offset=d.getIndex(),a.container=d.getParent()))}}var c=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_TEXT,!0);return function(c){var d=this.collapsed,f={container:this.startContainer,offset:this.startOffset},m={container:this.endContainer,offset:this.endOffset};c&&(a(f), +b(f,this.root),d||(a(m),b(m,this.root)));return{start:f.container.getAddress(c),end:d?null:m.container.getAddress(c),startOffset:f.offset,endOffset:m.offset,normalized:c,collapsed:d,is2:!0}}}(),moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),c=a.startOffset,d=a.end&&this.document.getByAddress(a.end,a.normalized);a=a.endOffset;this.setStart(b,c);d?this.setEnd(d,a):this.collapse(!0)}else b=(c=a.serializable)?this.document.getById(a.startNode):a.startNode, +a=c?this.document.getById(a.endNode):a.endNode,this.setStartBefore(b),b.remove(),a?(this.setEndBefore(a),a.remove()):this.collapse(!0)},getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,c=this.startOffset,d=this.endOffset,f;if(a.type==CKEDITOR.NODE_ELEMENT)if(f=a.getChildCount(),f>c)a=a.getChild(c);else if(1>f)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}if(b.type==CKEDITOR.NODE_ELEMENT)if(f=b.getChildCount(), +f>d)b=b.getChild(d).getPreviousSourceNode(!0);else if(1>f)b=b.getPreviousSourceNode();else{for(b=b.$;b.lastChild;)b=b.lastChild;b=new CKEDITOR.dom.node(b)}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var c=this.startContainer,d=this.endContainer,c=c.equals(d)?a&&c.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-1?c.getChild(this.startOffset):c:c.getCommonAncestor(d);return b&&!c.is?c.getParent():c},optimize:function(){var a= +this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setStartAfter(a):this.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&a.is("span")&&a.data("cke-bookmark")&&this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&b.is&&b.is("span")&&b.data("cke-bookmark")&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)}, +trim:function(a,b){var c=this.startContainer,d=this.startOffset,f=this.collapsed;if((!a||f)&&c&&c.type==CKEDITOR.NODE_TEXT){if(d)if(d>=c.getLength())d=c.getIndex()+1,c=c.getParent();else{var h=c.split(d),d=c.getIndex()+1,c=c.getParent();this.startContainer.equals(this.endContainer)?this.setEnd(h,this.endOffset-this.startOffset):c.equals(this.endContainer)&&(this.endOffset+=1)}else d=c.getIndex(),c=c.getParent();this.setStart(c,d);if(f){this.collapse(!0);return}}c=this.endContainer;d=this.endOffset; +b||f||!c||c.type!=CKEDITOR.NODE_TEXT||(d?(d>=c.getLength()||c.split(d),d=c.getIndex()+1):d=c.getIndex(),c=c.getParent(),this.setEnd(c,d))},enlarge:function(a,b){function c(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.hasAttribute("contenteditable")?null:a}var d=new RegExp(/[^\s\ufeff]/);switch(a){case CKEDITOR.ENLARGE_INLINE:var f=1;case CKEDITOR.ENLARGE_ELEMENT:var h=function(a,b){var c=new CKEDITOR.dom.range(g);c.setStart(a,b);c.setEndAt(g,CKEDITOR.POSITION_BEFORE_END);var c=new CKEDITOR.dom.walker(c), +e;for(c.guard=function(a){return!(a.type==CKEDITOR.NODE_ELEMENT&&a.isBlockBoundary())};e=c.next();){if(e.type!=CKEDITOR.NODE_TEXT)return!1;N=e!=a?e.getText():e.substring(b);if(d.test(N))return!1}return!0};if(this.collapsed)break;var m=this.getCommonAncestor(),g=this.root,k,u,l,p,B,H=!1,C,N;C=this.startContainer;var q=this.startOffset;C.type==CKEDITOR.NODE_TEXT?(q&&(C=!CKEDITOR.tools.trim(C.substring(0,q)).length&&C,H=!!C),C&&((p=C.getPrevious())||(l=C.getParent()))):(q&&(p=C.getChild(q-1)||C.getLast()), +p||(l=C));for(l=c(l);l||p;){if(l&&!p){!B&&l.equals(m)&&(B=!0);if(f?l.isBlockBoundary():!g.contains(l))break;H&&"inline"==l.getComputedStyle("display")||(H=!1,B?k=l:this.setStartBefore(l));p=l.getPrevious()}for(;p;)if(C=!1,p.type==CKEDITOR.NODE_COMMENT)p=p.getPrevious();else{if(p.type==CKEDITOR.NODE_TEXT)N=p.getText(),d.test(N)&&(p=null),C=/[\s\ufeff]$/.test(N);else if((p.$.offsetWidth>(CKEDITOR.env.webkit?1:0)||b&&p.is("br"))&&!p.data("cke-bookmark"))if(H&&CKEDITOR.dtd.$removeEmpty[p.getName()]){N= +p.getText();if(d.test(N))p=null;else for(var q=p.$.getElementsByTagName("*"),D=0,v;v=q[D++];)if(!CKEDITOR.dtd.$removeEmpty[v.nodeName.toLowerCase()]){p=null;break}p&&(C=!!N.length)}else p=null;C&&(H?B?k=l:l&&this.setStartBefore(l):H=!0);if(p){C=p.getPrevious();if(!l&&!C){l=p;p=null;break}p=C}else l=null}l&&(l=c(l.getParent()))}C=this.endContainer;q=this.endOffset;l=p=null;B=H=!1;C.type==CKEDITOR.NODE_TEXT?CKEDITOR.tools.trim(C.substring(q)).length?H=!0:(H=!C.getLength(),q==C.getLength()?(p=C.getNext())|| +(l=C.getParent()):h(C,q)&&(l=C.getParent())):(p=C.getChild(q))||(l=C);for(;l||p;){if(l&&!p){!B&&l.equals(m)&&(B=!0);if(f?l.isBlockBoundary():!g.contains(l))break;H&&"inline"==l.getComputedStyle("display")||(H=!1,B?u=l:l&&this.setEndAfter(l));p=l.getNext()}for(;p;){C=!1;if(p.type==CKEDITOR.NODE_TEXT)N=p.getText(),h(p,0)||(p=null),C=/^[\s\ufeff]/.test(N);else if(p.type==CKEDITOR.NODE_ELEMENT){if((0=m.getLength()?h.setStartAfter(m):(h.setStartBefore(m),c=0):h.setStartBefore(m));g&&g.type==CKEDITOR.NODE_TEXT&&(l?l>=g.getLength()?h.setEndAfter(g):(h.setEndAfter(g),u=0):h.setEndBefore(g));var h=new CKEDITOR.dom.walker(h),p=CKEDITOR.dom.walker.bookmark(),B=CKEDITOR.dom.walker.bogus();h.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var H;h.guard=function(b,c){if(f&&B(b)||p(b))return!0; +if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||c&&b.equals(H)||!1===d&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary()||b.type==CKEDITOR.NODE_ELEMENT&&b.hasAttribute("contenteditable"))return!1;c||b.type!=CKEDITOR.NODE_ELEMENT||(H=b);return!0};c&&(m=h[a==CKEDITOR.SHRINK_ELEMENT?"lastForward":"next"]())&&this.setStartAt(m,b?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_START);u&&(h.reset(),(h=h[a==CKEDITOR.SHRINK_ELEMENT?"lastBackward":"previous"]())&&this.setEndAt(h,b?CKEDITOR.POSITION_BEFORE_END: +CKEDITOR.POSITION_AFTER_END));return!(!c&&!u)}},insertNode:function(a){this.optimizeBookmark();this.trim(!1,!0);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&&this.endOffset++;this.setStartBefore(a)},moveToPosition:function(a,b){this.setStartAt(a,b);this.collapse(!0)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,a.endOffset)},selectNodeContents:function(a){this.setStart(a, +0);this.setEnd(a,a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(b,c){b.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[b.getName()]&&(c=b.getIndex(),b=b.getParent());this._setStartContainer(b);this.startOffset=c;this.endContainer||(this._setEndContainer(b),this.endOffset=c);a(this)},setEnd:function(b,c){b.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[b.getName()]&&(c=b.getIndex()+1,b=b.getParent());this._setEndContainer(b);this.endOffset=c;this.startContainer|| +(this._setStartContainer(b),this.startOffset=c);a(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(),a.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(),a.getIndex())},setStartAt:function(b,c){switch(c){case CKEDITOR.POSITION_AFTER_START:this.setStart(b,0);break;case CKEDITOR.POSITION_BEFORE_END:b.type==CKEDITOR.NODE_TEXT?this.setStart(b, +b.getLength()):this.setStart(b,b.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(b);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(b)}a(this)},setEndAt:function(b,c){switch(c){case CKEDITOR.POSITION_AFTER_START:this.setEnd(b,0);break;case CKEDITOR.POSITION_BEFORE_END:b.type==CKEDITOR.NODE_TEXT?this.setEnd(b,b.getLength()):this.setEnd(b,b.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(b);break;case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(b)}a(this)}, +fixBlock:function(a,b){var c=this.createBookmark(),d=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(d);d.trim();this.insertNode(d);var f=d.getBogus();f&&f.remove();d.appendBogus();this.moveToBookmark(c);return d},splitBlock:function(a,b){var c=new CKEDITOR.dom.elementPath(this.startContainer,this.root),d=new CKEDITOR.dom.elementPath(this.endContainer,this.root),f=c.block,h=d.block,m=null;if(!c.blockLimit.equals(d.blockLimit))return null; +"br"!=a&&(f||(f=this.fixBlock(!0,a),h=(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block),h||(h=this.fixBlock(!1,a)));c=f&&this.checkStartOfBlock();d=h&&this.checkEndOfBlock();this.deleteContents();f&&f.equals(h)&&(d?(m=new CKEDITOR.dom.elementPath(this.startContainer,this.root),this.moveToPosition(h,CKEDITOR.POSITION_AFTER_END),h=null):c?(m=new CKEDITOR.dom.elementPath(this.startContainer,this.root),this.moveToPosition(f,CKEDITOR.POSITION_BEFORE_START),f=null):(h=this.splitElement(f, +b||!1),f.is("ul","ol")||f.appendBogus()));return{previousBlock:f,nextBlock:h,wasStartOfBlock:c,wasEndOfBlock:d,elementPath:m}},splitElement:function(a,b){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END);var c=this.extractContents(!1,b||!1),d=a.clone(!1,b||!1);c.appendTo(d);d.insertAfter(a);this.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);return d},removeEmptyBlocksAtEnd:function(){function a(e){return function(a){return b(a)||c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable()|| +e.is("table")&&a.is("caption")?!1:!0}}var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(!1);return function(b){for(var c=this.createBookmark(),d=this[b?"endPath":"startPath"](),m=d.block||d.blockLimit,f;m&&!m.equals(d.root)&&!m.getFirst(a(m));)f=m.getParent(),this[b?"setEndAt":"setStartAt"](m,CKEDITOR.POSITION_AFTER_END),m.remove(1),m=f;this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer, +this.root)},checkBoundaryOfElement:function(a,b){var d=b==CKEDITOR.START,f=this.clone();f.collapse(d);f[d?"setStartAt":"setEndAt"](a,d?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END);f=new CKEDITOR.dom.walker(f);f.evaluator=c(d);return f[d?"checkBackward":"checkForward"]()},checkStartOfBlock:function(){var a=this.startContainer,c=this.startOffset;CKEDITOR.env.ie&&c&&a.type==CKEDITOR.NODE_TEXT&&(a=CKEDITOR.tools.ltrim(a.substring(0,c)),g.test(a)&&this.trim(0,1));this.trim();a=new CKEDITOR.dom.elementPath(this.startContainer, +this.root);c=this.clone();c.collapse(!0);c.setStartAt(a.block||a.blockLimit,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkBackward()},checkEndOfBlock:function(){var a=this.endContainer,c=this.endOffset;CKEDITOR.env.ie&&a.type==CKEDITOR.NODE_TEXT&&(a=CKEDITOR.tools.rtrim(a.substring(c)),g.test(a)&&this.trim(1,0));this.trim();a=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(!1);c.setEndAt(a.block||a.blockLimit,CKEDITOR.POSITION_BEFORE_END); +a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone();d.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type== +CKEDITOR.NODE_ELEMENT){if("false"==b.getAttribute("contentEditable")&&!b.data("cke-editable"))return 0;if(b.is("html")||"true"==b.getAttribute("contentEditable")&&(b.contains(c)||b.equals(c)))break}b=b.getParent()}return 1}return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&!a.isEditable(!1))return this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START), +!0;for(var c=0;a;){if(a.type==CKEDITOR.NODE_TEXT){b&&this.endContainer&&this.checkEndOfBlock()&&g.test(a.getText())?this.moveToPosition(a,CKEDITOR.POSITION_BEFORE_START):this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);c=1;break}if(a.type==CKEDITOR.NODE_ELEMENT)if(a.isEditable())this.moveToPosition(a,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START),c=1;else if(b&&a.is("br")&&this.endContainer&&this.checkEndOfBlock())this.moveToPosition(a,CKEDITOR.POSITION_BEFORE_START); +else if("false"==a.getAttribute("contenteditable")&&a.is(CKEDITOR.dtd.$block))return this.setStartBefore(a),this.setEndAfter(a),!0;var d=a,f=c,h=void 0;d.type==CKEDITOR.NODE_ELEMENT&&d.isEditable(!1)&&(h=d[b?"getLast":"getFirst"](u));f||h||(h=d[b?"getPrevious":"getNext"](u));a=h}return!!c},moveToClosestEditablePosition:function(a,b){var c,d=0,f,h,m=[CKEDITOR.POSITION_AFTER_END,CKEDITOR.POSITION_BEFORE_START];a?(c=new CKEDITOR.dom.range(this.root),c.moveToPosition(a,m[b?0:1])):c=this.clone();if(a&& +!a.is(CKEDITOR.dtd.$block))d=1;else if(f=c[b?"getNextEditableNode":"getPreviousEditableNode"]())d=1,(h=f.type==CKEDITOR.NODE_ELEMENT)&&f.is(CKEDITOR.dtd.$block)&&"false"==f.getAttribute("contenteditable")?(c.setStartAt(f,CKEDITOR.POSITION_BEFORE_START),c.setEndAt(f,CKEDITOR.POSITION_AFTER_END)):!CKEDITOR.env.needsBrFiller&&h&&f.is(CKEDITOR.dom.walker.validEmptyBlockContainers)?(c.setEnd(f,0),c.collapse()):c.moveToPosition(f,m[b?1:0]);d&&this.moveToRange(c);return!!d},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)}, +moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,!0)},getEnclosedNode:function(){var a=this.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(!1,!0),c=CKEDITOR.dom.walker.whitespaces(!0);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a=this.startContainer; +return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a=this.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},getNextEditableNode:f(),getPreviousEditableNode:f(1),_getTableElement:function(a){a=a||{td:1,th:1,tr:1,tbody:1,thead:1,tfoot:1,table:1};var b=this.startContainer,c=this.endContainer,d=b.getAscendant("table",!0),f=c.getAscendant("table",!0);return d&&!this.root.contains(d)? +null:CKEDITOR.env.safari&&d&&c.equals(this.root)?b.getAscendant(a,!0):this.getEnclosedNode()?this.getEnclosedNode().getAscendant(a,!0):d&&f&&(d.equals(f)||d.contains(f)||f.contains(d))?b.getAscendant(a,!0):null},scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml("\x3cspan\x3e\x26nbsp;\x3c/span\x3e",this.document),b,c,d,f=this.clone();f.optimize();(d=f.startContainer.type==CKEDITOR.NODE_TEXT)?(c=f.startContainer.getText(),b=f.startContainer.split(f.startOffset),a.insertAfter(f.startContainer)): +f.insertNode(a);a.scrollIntoView();d&&(f.startContainer.setText(c),b.remove());a.remove()},getClientRects:function(){function a(b,c){var d=CKEDITOR.tools.array.map(b,function(a){return a}),e=new CKEDITOR.dom.range(c.root),f,h,g;c.startContainer instanceof CKEDITOR.dom.element&&(h=0===c.startOffset&&c.startContainer.hasAttribute("data-widget"));c.endContainer instanceof CKEDITOR.dom.element&&(g=(g=c.endOffset===(c.endContainer.getChildCount?c.endContainer.getChildCount():c.endContainer.length))&&c.endContainer.hasAttribute("data-widget")); +h&&e.setStart(c.startContainer.getParent(),c.startContainer.getIndex());g&&e.setEnd(c.endContainer.getParent(),c.endContainer.getIndex()+1);if(h||g)c=e;e=c.cloneContents().find("[data-cke-widget-id]").toArray();if(e=CKEDITOR.tools.array.map(e,function(a){var b=c.root.editor;a=a.getAttribute("data-cke-widget-id");return b.widgets.instances[a].element}))return e=CKEDITOR.tools.array.map(e,function(a){var b;b=a.getParent().hasClass("cke_widget_wrapper")?a.getParent():a;f=this.root.getDocument().$.createRange(); +f.setStart(b.getParent().$,b.getIndex());f.setEnd(b.getParent().$,b.getIndex()+1);b=f.getClientRects();b.widgetRect=a.getClientRect();return b},c),CKEDITOR.tools.array.forEach(e,function(a){function b(e){CKEDITOR.tools.array.forEach(d,function(b,f){var h=CKEDITOR.tools.objectCompare(a[e],b);h||(h=CKEDITOR.tools.objectCompare(a.widgetRect,b));h&&(Array.prototype.splice.call(d,f,a.length-e,a.widgetRect),c=!0)});c||(earguments.length||(this.range=a,this.forceBrBreak=0,this.enlargeBr=1,this.enforceRealBlocks=0,this._||(this._={}))}function d(a){var b=[];a.forEach(function(a){if("true"==a.getAttribute("contenteditable"))return b.push(a),!1},CKEDITOR.NODE_ELEMENT,!0);return b}function b(a,c,f,h){a:{null==h&&(h=d(f));for(var g;g=h.shift();)if(g.getDtd().p){h={element:g,remaining:h};break a}h=null}if(!h)return 0;if((g=CKEDITOR.filter.instances[h.element.data("cke-filter")])&&!g.check(c))return b(a, +c,f,h.remaining);c=new CKEDITOR.dom.range(h.element);c.selectNodeContents(h.element);c=c.createIterator();c.enlargeBr=a.enlargeBr;c.enforceRealBlocks=a.enforceRealBlocks;c.activeFilter=c.filter=g;a._.nestedEditable={element:h.element,container:f,remaining:h.remaining,iterator:c};return 1}function c(a,b,c){if(!b)return!1;a=a.clone();a.collapse(!c);return a.checkBoundaryOfElement(b,c?CKEDITOR.START:CKEDITOR.END)}var f=/^[\r\n\t ]+$/,h=CKEDITOR.dom.walker.bookmark(!1,!0),k=CKEDITOR.dom.walker.whitespaces(!0), +g=function(a){return h(a)&&k(a)},l={dd:1,dt:1,li:1};a.prototype={getNextParagraph:function(a){var d,k,t,z,I;a=a||"p";if(this._.nestedEditable){if(d=this._.nestedEditable.iterator.getNextParagraph(a))return this.activeFilter=this._.nestedEditable.iterator.activeFilter,d;this.activeFilter=this.filter;if(b(this,a,this._.nestedEditable.container,this._.nestedEditable.remaining))return this.activeFilter=this._.nestedEditable.iterator.activeFilter,this._.nestedEditable.iterator.getNextParagraph(a);this._.nestedEditable= +null}if(!this.range.root.getDtd()[a])return null;if(!this._.started){var r=this.range.clone();k=r.startPath();var m=r.endPath(),M=!r.collapsed&&c(r,k.block),w=!r.collapsed&&c(r,m.block,1);r.shrink(CKEDITOR.SHRINK_ELEMENT,!0);M&&r.setStartAt(k.block,CKEDITOR.POSITION_BEFORE_END);w&&r.setEndAt(m.block,CKEDITOR.POSITION_AFTER_START);k=r.endContainer.hasAscendant("pre",!0)||r.startContainer.hasAscendant("pre",!0);r.enlarge(this.forceBrBreak&&!k||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS); +r.collapsed||(k=new CKEDITOR.dom.walker(r.clone()),m=CKEDITOR.dom.walker.bookmark(!0,!0),k.evaluator=m,this._.nextNode=k.next(),k=new CKEDITOR.dom.walker(r.clone()),k.evaluator=m,k=k.previous(),this._.lastNode=k.getNextSourceNode(!0,null,r.root),this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()&&(m=this.range.clone(),m.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END),m.checkEndOfBlock()&& +(m=new CKEDITOR.dom.elementPath(m.endContainer,m.root),this._.lastNode=(m.block||m.blockLimit).getNextSourceNode(!0))),this._.lastNode&&r.root.contains(this._.lastNode)||(this._.lastNode=this._.docEndMarker=r.document.createText(""),this._.lastNode.insertAfter(k)),r=null);this._.started=1;k=r}m=this._.nextNode;r=this._.lastNode;for(this._.nextNode=null;m;){var M=0,w=m.hasAscendant("pre"),J=m.type!=CKEDITOR.NODE_ELEMENT,F=0;if(J)m.type==CKEDITOR.NODE_TEXT&&f.test(m.getText())&&(J=0);else{var p=m.getName(); +if(CKEDITOR.dtd.$block[p]&&"false"==m.getAttribute("contenteditable")){d=m;b(this,a,d);break}else if(m.isBlockBoundary(this.forceBrBreak&&!w&&{br:1})){if("br"==p)J=1;else if(!k&&!m.getChildCount()&&"hr"!=p){d=m;t=m.equals(r);break}k&&(k.setEndAt(m,CKEDITOR.POSITION_BEFORE_START),"br"!=p&&(this._.nextNode=m));M=1}else{if(m.getFirst()){k||(k=this.range.clone(),k.setStartAt(m,CKEDITOR.POSITION_BEFORE_START));m=m.getFirst();continue}J=1}}J&&!k&&(k=this.range.clone(),k.setStartAt(m,CKEDITOR.POSITION_BEFORE_START)); +t=(!M||J)&&m.equals(r);if(k&&!M)for(;!m.getNext(g)&&!t;){p=m.getParent();if(p.isBlockBoundary(this.forceBrBreak&&!w&&{br:1})){M=1;J=0;t||p.equals(r);k.setEndAt(p,CKEDITOR.POSITION_BEFORE_END);break}m=p;J=1;t=m.equals(r);F=1}J&&k.setEndAt(m,CKEDITOR.POSITION_AFTER_END);m=this._getNextSourceNode(m,F,r);if((t=!m)||M&&k)break}if(!d){if(!k)return this._.docEndMarker&&this._.docEndMarker.remove(),this._.nextNode=null;d=new CKEDITOR.dom.elementPath(k.startContainer,k.root);m=d.blockLimit;M={div:1,th:1,td:1}; +d=d.block;!d&&m&&!this.enforceRealBlocks&&M[m.getName()]&&k.checkStartOfBlock()&&k.checkEndOfBlock()&&!m.equals(k.root)?d=m:!d||this.enforceRealBlocks&&d.is(l)?(d=this.range.document.createElement(a),k.extractContents().appendTo(d),d.trim(),k.insertNode(d),z=I=!0):"li"!=d.getName()?k.checkStartOfBlock()&&k.checkEndOfBlock()||(d=d.clone(!1),k.extractContents().appendTo(d),d.trim(),I=k.splitBlock(),z=!I.wasStartOfBlock,I=!I.wasEndOfBlock,k.insertNode(d)):t||(this._.nextNode=d.equals(r)?null:this._getNextSourceNode(k.getBoundaryNodes().endNode, +1,r))}z&&(z=d.getPrevious())&&z.type==CKEDITOR.NODE_ELEMENT&&("br"==z.getName()?z.remove():z.getLast()&&"br"==z.getLast().$.nodeName.toLowerCase()&&z.getLast().remove());I&&(z=d.getLast())&&z.type==CKEDITOR.NODE_ELEMENT&&"br"==z.getName()&&(!CKEDITOR.env.needsBrFiller||z.getPrevious(h)||z.getNext(h))&&z.remove();this._.nextNode||(this._.nextNode=t||d.equals(r)||!r?null:this._getNextSourceNode(d,1,r));return d},_getNextSourceNode:function(a,b,c){function d(a){return!(a.equals(c)||a.equals(f))}var f= +this.range.root;for(a=a.getNextSourceNode(b,null,d);!h(a);)a=a.getNextSourceNode(b,null,d);return a}};CKEDITOR.dom.range.prototype.createIterator=function(){return new a(this)}})(); +CKEDITOR.command=function(a,d){this.uiItems=[];this.exec=function(b){if(this.state==CKEDITOR.TRISTATE_DISABLED||!this.checkAllowed())return!1;this.editorFocus&&a.focus();return!1===this.fire("exec")?!0:!1!==d.exec.call(this,a,b)};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return!0;if(this.context&&!b.isContextFor(this.context)||!this.checkAllowed(!0))return this.disable(),!0;this.startDisabled||this.enable();this.modes&&!this.modes[a.mode]&&this.disable();return!1===this.fire("refresh", +{editor:a,path:b})?!0:d.refresh&&!1!==d.refresh.apply(this,arguments)};var b;this.checkAllowed=function(c){return c||"boolean"!=typeof b?b=a.activeFilter.checkFeature(this):b};CKEDITOR.tools.extend(this,d,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!d.context,state:CKEDITOR.TRISTATE_DISABLED});CKEDITOR.event.call(this)}; +CKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.checkAllowed()&&this.setState(this.preserveState&&"undefined"!=typeof this.previousState?this.previousState:CKEDITOR.TRISTATE_OFF)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(a){if(this.state==a||a!=CKEDITOR.TRISTATE_DISABLED&&!this.checkAllowed())return!1;this.previousState=this.state;this.state=a;this.fire("state");return!0},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF? +this.setState(CKEDITOR.TRISTATE_ON):this.state==CKEDITOR.TRISTATE_ON&&this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3; +CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"\x3c!DOCTYPE html\x3e",bodyId:"",bodyClass:"",fullPage:!1,height:200,contentsCss:CKEDITOR.getUrl("contents.css"),extraPlugins:"",removePlugins:"",protectedSource:[],tabIndex:0,width:"",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]}; +(function(){function a(a,b,c,d,e){var f,p;a=[];for(f in b){p=b[f];p="boolean"==typeof p?{}:"function"==typeof p?{match:p}:D(p);"$"!=f.charAt(0)&&(p.elements=f);c&&(p.featureName=c.toLowerCase());var n=p;n.elements=k(n.elements,/\s+/)||null;n.propertiesOnly=n.propertiesOnly||!0===n.elements;var v=/\s*,\s*/,q=void 0;for(q in Q){n[q]=k(n[q],v)||null;var m=n,h=S[q],g=k(n[S[q]],v),G=n[q],y=[],P=!0,B=void 0;g?P=!1:g={};for(B in G)"!"==B.charAt(0)&&(B=B.slice(1),y.push(B),g[B]=!0,P=!1);for(;B=y.pop();)G[B]= +G["!"+B],delete G["!"+B];m[h]=(P?!1:g)||null}n.match=n.match||null;d.push(p);a.push(p)}b=e.elements;e=e.generic;var E;c=0;for(d=a.length;c=--g&&(h&&CKEDITOR.document.getDocumentElement().removeStyle("cursor"),e(b))},t=function(b,c){a[b]=1;var f=d[b];delete d[b];for(var e=0;e=CKEDITOR.env.version||CKEDITOR.env.ie9Compat)?e.$.onreadystatechange=function(){if("loaded"==e.$.readyState||"complete"==e.$.readyState)e.$.onreadystatechange=null,t(b,!0)}:(e.$.onload=function(){setTimeout(function(){e.$.onload=null;e.$.onerror=null;t(b,!0)},0)},e.$.onerror=function(){e.$.onload=null;e.$.onerror=null;t(b,!1)}));e.appendTo(CKEDITOR.document.getHead())}}};h&&CKEDITOR.document.getDocumentElement().setStyle("cursor", +"wait");for(var I=0;I]+)>)|(?:!--([\S|\s]*?)--\x3e)|(?:([^\/\s>]+)((?:\s+[\w\-:.]+(?:\s*=\s*?(?:(?:"[^"]*")|(?:'[^']*')|[^\s"'\/>]+))?)*)[\S\s]*?(\/?)>))/g}}; +(function(){var a=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,d={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(b){for(var c,f,h=0,k;c=this._.htmlPartsRegex.exec(b);){f=c.index;if(f>h)if(h=b.substring(h,f),k)k.push(h);else this.onText(h); +h=this._.htmlPartsRegex.lastIndex;if(f=c[1])if(f=f.toLowerCase(),k&&CKEDITOR.dtd.$cdata[f]&&(this.onCDATA(k.join("")),k=null),!k){this.onTagClose(f);continue}if(k)k.push(c[0]);else if(f=c[3]){if(f=f.toLowerCase(),!/="/.test(f)){var g={},l,u=c[4];c=!!c[5];if(u)for(;l=a.exec(u);){var e=l[1].toLowerCase();l=l[2]||l[3]||l[4]||"";g[e]=!l&&d[e]?e:CKEDITOR.tools.htmlDecodeAttr(l)}this.onTagOpen(f,g,c);!k&&CKEDITOR.dtd.$cdata[f]&&(k=[])}}else if(f=c[2])this.onComment(f)}if(b.length>h)this.onText(b.substring(h, +b.length))}}})(); +CKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(a){this._.output.push("\x3c",a)},openTagClose:function(a,d){d?this._.output.push(" /\x3e"):this._.output.push("\x3e")},attribute:function(a,d){"string"==typeof d&&(d=CKEDITOR.tools.htmlEncodeAttr(d));this._.output.push(" ",a,'\x3d"',d,'"')},closeTag:function(a){this._.output.push("\x3c/",a,"\x3e")},text:function(a){this._.output.push(a)},comment:function(a){this._.output.push("\x3c!--",a, +"--\x3e")},write:function(a){this._.output.push(a)},reset:function(){this._.output=[];this._.indent=!1},getHtml:function(a){var d=this._.output.join("");a&&this.reset();return d}}});"use strict"; +(function(){CKEDITOR.htmlParser.node=function(){};CKEDITOR.htmlParser.node.prototype={remove:function(){var a=this.parent.children,d=CKEDITOR.tools.indexOf(a,this),b=this.previous,c=this.next;b&&(b.next=c);c&&(c.previous=b);a.splice(d,1);this.parent=null},replaceWith:function(a){var d=this.parent.children,b=CKEDITOR.tools.indexOf(d,this),c=a.previous=this.previous,f=a.next=this.next;c&&(c.next=a);f&&(f.previous=a);d[b]=a;a.parent=this.parent;this.parent=null},insertAfter:function(a){var d=a.parent.children, +b=CKEDITOR.tools.indexOf(d,a),c=a.next;d.splice(b+1,0,this);this.next=a.next;this.previous=a;a.next=this;c&&(c.previous=this);this.parent=a.parent},insertBefore:function(a){var d=a.parent.children,b=CKEDITOR.tools.indexOf(d,a);d.splice(b,0,this);this.next=a;(this.previous=a.previous)&&(a.previous.next=this);a.previous=this;this.parent=a.parent},getAscendant:function(a){var d="function"==typeof a?a:"string"==typeof a?function(b){return b.name==a}:function(b){return b.name in a},b=this.parent;for(;b&& +b.type==CKEDITOR.NODE_ELEMENT;){if(d(b))return b;b=b.parent}return null},wrapWith:function(a){this.replaceWith(a);a.add(this);return a},getIndex:function(){return CKEDITOR.tools.indexOf(this.parent.children,this)},getFilterContext:function(a){return a||{}}}})();"use strict";CKEDITOR.htmlParser.comment=function(a){this.value=a;this._={isBlockLike:!1}}; +CKEDITOR.htmlParser.comment.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_COMMENT,filter:function(a,d){var b=this.value;if(!(b=a.onComment(d,b,this)))return this.remove(),!1;if("string"!=typeof b)return this.replaceWith(b),!1;this.value=b;return!0},writeHtml:function(a,d){d&&this.filter(d);a.comment(this.value)}});"use strict"; +(function(){CKEDITOR.htmlParser.text=function(a){this.value=a;this._={isBlockLike:!1}};CKEDITOR.htmlParser.text.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(a,d){if(!(this.value=a.onText(d,this.value,this)))return this.remove(),!1},writeHtml:function(a,d){d&&this.filter(d);a.text(this.value)}})})();"use strict"; +(function(){CKEDITOR.htmlParser.cdata=function(a){this.value=a};CKEDITOR.htmlParser.cdata.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(){},writeHtml:function(a){a.write(this.value)}})})();"use strict";CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:!0,hasInlineStarted:!1}}; +(function(){function a(a){return a.attributes["data-cke-survive"]?!1:"a"==a.name&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var d=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),b={ol:1,ul:1},c=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1}),f={ul:"li",ol:"li",dl:"dd",table:"tbody",tbody:"tr",thead:"tr",tfoot:"tr",tr:"td"};CKEDITOR.htmlParser.fragment.fromHtml= +function(h,k,g){function l(a){var b;if(0k;k++)if(h=d[k]){h=h.exec(a,c,this);if(!1===h)return null;if(h&&h!=c)return this.onNode(a,h);if(c.parent&&!c.name)break}return c}, +onNode:function(a,c){var d=c.type;return d==CKEDITOR.NODE_ELEMENT?this.onElement(a,c):d==CKEDITOR.NODE_TEXT?new CKEDITOR.htmlParser.text(this.onText(a,c.value)):d==CKEDITOR.NODE_COMMENT?new CKEDITOR.htmlParser.comment(this.onComment(a,c.value)):null},onAttribute:function(a,c,d,h){return(d=this.attributesRules[d])?d.exec(a,h,c,this):h}}});CKEDITOR.htmlParser.filterRulesGroup=a;a.prototype={add:function(a,c,d){this.rules.splice(this.findIndex(c),0,{value:a,priority:c,options:d})},addMany:function(a, +c,d){for(var h=[this.findIndex(c),0],k=0,g=a.length;k/g,"\x26gt;")+"\x3c/textarea\x3e");return"\x3ccke:encoded\x3e"+encodeURIComponent(a)+"\x3c/cke:encoded\x3e"})}function x(a){return a.replace(n,function(a,b){return decodeURIComponent(b)})}function t(a){return a.replace(/\x3c!--(?!{cke_protected})[\s\S]+?--\x3e/g, +function(a){return"\x3c!--"+J+"{C}"+encodeURIComponent(a).replace(/--/g,"%2D%2D")+"--\x3e"})}function z(a){return CKEDITOR.tools.array.reduce(a.split(""),function(a,b){var c=b.toLowerCase(),d=b.toUpperCase(),e=I(c);c!==d&&(e+="|"+I(d));return a+("("+e+")")},"")}function I(a){var b;b=a.charCodeAt(0);var c=b.toString(16);b={htmlCode:"\x26#"+b+";?",hex:"\x26#x0*"+c+";?",entity:{"\x3c":"\x26lt;","\x3e":"\x26gt;",":":"\x26colon;"}[a]};for(var d in b)b[d]&&(a+="|"+b[d]);return a}function r(a){return a.replace(/\x3c!--\{cke_protected\}\{C\}([\s\S]+?)--\x3e/g, +function(a,b){return decodeURIComponent(b)})}function m(a,b){var c=b._.dataStore;return a.replace(/\x3c!--\{cke_protected\}([\s\S]+?)--\x3e/g,function(a,b){return decodeURIComponent(b)}).replace(/\{cke_protected_(\d+)\}/g,function(a,b){return c&&c[b]||""})}function M(a,b){var c=[],d=b.config.protectedSource,e=b._.dataStore||(b._.dataStore={id:1}),f=/<\!--\{cke_temp(comment)?\}(\d*?)--\x3e/g,d=[/|$)/gi,//gi,//gi].concat(d);a=a.replace(/\x3c!--[\s\S]*?--\x3e/g, +function(a){return"\x3c!--{cke_tempcomment}"+(c.push(a)-1)+"--\x3e"});for(var n=0;n]+\s*=\s*(?:[^'"\s>]+|'[^']*'|"[^"]*"))|[^\s=\/>]+))+\s*\/?>/g,function(a){return a.replace(/\x3c!--\{cke_protected\}([^>]*)--\x3e/g, +function(a,b){e[e.id]=decodeURIComponent(b);return"{cke_protected_"+e.id++ +"}"})});return a=a.replace(/<(title|iframe|textarea)([^>]*)>([\s\S]*?)<\/\1>/g,function(a,c,d,e){return"\x3c"+c+d+"\x3e"+m(r(e),b)+"\x3c/"+c+"\x3e"})}CKEDITOR.htmlDataProcessor=function(b){var c,f,n=this;this.editor=b;this.dataFilter=c=new CKEDITOR.htmlParser.filter;this.htmlFilter=f=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;c.addRules(H);c.addRules(C,{applyToAll:!0});c.addRules(a(b,"data"), +{applyToAll:!0});f.addRules(N);f.addRules(q,{applyToAll:!0});f.addRules(a(b,"html"),{applyToAll:!0});b.on("toHtml",function(a){a=a.data;var c=a.dataValue,f,c=c.replace(P,""),c=M(c,b),c=e(c,S),c=u(c),c=e(c,Q),c=c.replace(G,"$1cke:$2"),c=c.replace(K,"\x3ccke:$1$2\x3e\x3c/cke:$1\x3e"),c=c.replace(/(]*>)(\r\n|\n)/g,"$1$2$2"),c=c.replace(/([^a-z0-9<\-])(on\w{3,})(?!>)/gi,"$1data-cke-"+CKEDITOR.rnd+"-$2");f=a.context||b.editable().getName();var n;CKEDITOR.env.ie&&9>CKEDITOR.env.version&&"pre"== +f&&(f="div",c="\x3cpre\x3e"+c+"\x3c/pre\x3e",n=1);f=b.document.createElement(f);f.setHtml("a"+c);c=f.getHtml().substr(1);c=c.replace(new RegExp("data-cke-"+CKEDITOR.rnd+"-","ig"),"");n&&(c=c.replace(/^