UNPKG

17.8 kBJavaScriptView Raw
1"use strict";
2
3/**
4 * Created by wujw on 18/08/14.
5 */
6/* eslint-disable*/
7var mobileRex = /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/; // 手机号
8var codeRex = /^\d{6}$/; // 验证码
9var cnReg = /^([\u4e00-\u9fa5\·]{2,6})$/; //中文名正则
10var regEmail = /^([a-zA-Z0-9]+[_|\-|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\-|\.]?)*[a-zA-Z0-9]+(\.[a-zA-Z]{2,3})+$/; //邮箱
11var regIdCard = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/; //15位和18位身份证号码的正则表达式
12var usernameRex = /^[a-zA-Z][\da-zA-Z]{2,19}$/;
13/**
14 * 校验用户名 字母开头,3-20位
15 * @param {*} str
16 */
17var checkUserName = function checkUserName(str) {
18 return usernameRex.test(str);
19};
20/**
21 * 校验手机号格式
22 * @param {*} str
23 */
24var checkMobile = function checkMobile(str) {
25 return mobileRex.test(str);
26};
27/**
28 * 校验验证码位数
29 * @param {*} str
30 */
31var checkCode = function checkCode(str) {
32 return codeRex.test(str);
33};
34/**
35 * 校验是否是中文名
36 * @param {*} str
37 */
38var checkCN = function checkCN(str) {
39 return cnReg.test(str);
40};
41/**
42 * 密码校验大小写+数字
43 * @param {*} str
44 */
45var checkPWD = function checkPWD(str) {
46 var rule1 = /\d+/;
47 var rule2 = /[a-z]+/;
48 var rule3 = /[A-Z]+/;
49 var rule4 = /[~!@#\$%^&*\{\};,.\?\/'"]/;
50 var rule5 = /^.{6,20}$/;
51 var flag1 = rule1.test(str);
52 var flag2 = rule2.test(str);
53 var flag3 = rule3.test(str);
54 var flag4 = rule4.test(str);
55 var flag5 = rule5.test(str);
56 if (flag1 && flag5 && (flag2 || flag3)) {
57 return true;
58 } else {
59 return false;
60 }
61};
62/**
63 * 金钱格式化
64 * @param {*} money
65 */
66var formatCash = function formatCash(money) {
67 // 方法一
68 return money.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
69 // 方法二
70 // return money.split('').reverse().reduce((prev, next, index) => {
71 // return ((index % 3) ? next : (next + ',')) + prev
72 // })
73};
74
75/*
76 * 身份证15位编码规则:dddddd yymmdd xx p
77 * dddddd:6位地区编码
78 * yymmdd: 出生年(两位年)月日,如:910215
79 * xx: 顺序编码,系统产生,无法确定
80 * p: 性别,奇数为男,偶数为女
81 *
82 * 身份证18位编码规则:dddddd yyyymmdd xxx y
83 * dddddd:6位地区编码
84 * yyyymmdd: 出生年(四位年)月日,如:19910215
85 * xxx:顺序编码,系统产生,无法确定,奇数为男,偶数为女
86 * y: 校验码,该位数值可通过前17位计算获得
87 *
88 * 前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
89 * 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
90 * 如果验证码恰好是10,为了保证身份证是十八位,那么第十八位将用X来代替
91 * 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )
92 * i为身份证号码1...17 位; Y_P为校验码Y所在校验码数组位置
93 */
94var validateIdCard = function validateIdCard(idCard) {
95 var isOK = false;
96 //如果通过该验证,说明身份证格式正确,但准确性还需计算
97 if (regIdCard.test(idCard)) {
98 if (idCard.length == 18) {
99 var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); //将前17位加权因子保存在数组里
100 var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2); //这是除以11后,可能产生的11位余数、验证码,也保存成数组
101 var idCardWiSum = 0; //用来保存前17位各自乖以加权因子后的总和
102 for (var i = 0; i < 17; i++) {
103 idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i];
104 }
105
106 var idCardMod = idCardWiSum % 11; //计算出校验码所在数组的位置
107 var idCardLast = idCard.substring(17); //得到最后一位身份证号码
108
109 //如果等于2,则说明校验码是10,身份证号码最后一位应该是X
110 if (idCardMod == 2) {
111 if (idCardLast == "X" || idCardLast == "x") {
112 isOK = true;
113 } else {}
114 } else {
115 //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
116 if (idCardLast == idCardY[idCardMod]) {
117 isOK = true;
118 } else {}
119 }
120 } else {
121 isOK = true;
122 }
123 }
124 return isOK;
125};
126
127/**
128 * 通过身份证获取东西
129 * @param {*} UUserCard
130 * @param {*} type :birth,age,sex
131 */
132var getIdCardInfo = function getIdCardInfo(UUserCard, type) {
133 if (type == 'birth') {
134 //获取出生日期
135 birth = UUserCard.substring(6, 10) + "-" + UUserCard.substring(10, 12) + "-" + UUserCard.substring(12, 14);
136 return birth;
137 }
138 if (type == 'sex') {
139 //获取性别
140 if (parseInt(UUserCard.substr(16, 1)) % 2 == 1) {
141 //男
142 return "男";
143 } else {
144 //女
145 return "女";
146 }
147 }
148 if (type == 'age') {
149 //获取年龄
150 var myDate = new Date();
151 var month = myDate.getMonth() + 1;
152 var day = myDate.getDate();
153 var age = myDate.getFullYear() - UUserCard.substring(6, 10) - 1;
154 if (UUserCard.substring(10, 12) < month || UUserCard.substring(10, 12) == month && UUserCard.substring(12, 14) <= day) {
155 age++;
156 }
157 return age;
158 }
159};
160module.exports = {
161 checkIdCard: validateIdCard,
162 checkCN: checkCN
163};
164//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNoZWNrLmpzIl0sIm5hbWVzIjpbIm1vYmlsZVJleCIsImNvZGVSZXgiLCJjblJlZyIsInJlZ0VtYWlsIiwicmVnSWRDYXJkIiwidXNlcm5hbWVSZXgiLCJjaGVja1VzZXJOYW1lIiwic3RyIiwidGVzdCIsImNoZWNrTW9iaWxlIiwiY2hlY2tDb2RlIiwiY2hlY2tDTiIsImNoZWNrUFdEIiwicnVsZTEiLCJydWxlMiIsInJ1bGUzIiwicnVsZTQiLCJydWxlNSIsImZsYWcxIiwiZmxhZzIiLCJmbGFnMyIsImZsYWc0IiwiZmxhZzUiLCJmb3JtYXRDYXNoIiwibW9uZXkiLCJyZXBsYWNlIiwidmFsaWRhdGVJZENhcmQiLCJpZENhcmQiLCJpc09LIiwibGVuZ3RoIiwiaWRDYXJkV2kiLCJBcnJheSIsImlkQ2FyZFkiLCJpZENhcmRXaVN1bSIsImkiLCJzdWJzdHJpbmciLCJpZENhcmRNb2QiLCJpZENhcmRMYXN0IiwiZ2V0SWRDYXJkSW5mbyIsIlVVc2VyQ2FyZCIsInR5cGUiLCJiaXJ0aCIsInBhcnNlSW50Iiwic3Vic3RyIiwibXlEYXRlIiwiRGF0ZSIsIm1vbnRoIiwiZ2V0TW9udGgiLCJkYXkiLCJnZXREYXRlIiwiYWdlIiwiZ2V0RnVsbFllYXIiLCJtb2R1bGUiLCJleHBvcnRzIiwiY2hlY2tJZENhcmQiXSwibWFwcGluZ3MiOiI7O0FBQUE7OztBQUdBO0FBQ0EsSUFBTUEsWUFBWSx1RUFBbEIsQyxDQUEyRjtBQUMzRixJQUFNQyxVQUFVLFNBQWhCLEMsQ0FBMkI7QUFDM0IsSUFBTUMsUUFBUSw0QkFBZCxDLENBQTRDO0FBQzVDLElBQU1DLFdBQVcsaUdBQWpCLEMsQ0FBb0g7QUFDcEgsSUFBTUMsWUFBWSwySUFBbEIsQyxDQUErSjtBQUMvSixJQUFNQyxjQUFjLDRCQUFwQjtBQUNBOzs7O0FBSUEsSUFBTUMsZ0JBQWdCLFNBQWhCQSxhQUFnQixDQUFDQyxHQUFELEVBQVM7QUFDN0IsU0FBT0YsWUFBWUcsSUFBWixDQUFpQkQsR0FBakIsQ0FBUDtBQUNE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QSxRQUFJQyxNQUFNSixPQUFPSyxPQUFQLEVBQVY7QUFDQSxRQUFJQyxNQUFNTixPQUFPTyxXQUFQLEtBQXVCWixVQUFVSixTQUFWLENBQW9CLENBQXBCLEVBQXVCLEVBQXZCLENBQXZCLEdBQW9ELENBQTlEO0FBQ0EsUUFBSUksVUFBVUosU0FBVixDQUFvQixFQUFwQixFQUF3QixFQUF4QixJQUE4QlcsS0FBOUIsSUFBdUNQLFVBQVVKLFNBQVYsQ0FBb0IsRUFBcEIsRUFBd0IsRUFBeEIsS0FBK0JXLEtBQS9CLElBQXdDUCxVQUFVSixTQUFWLENBQW9CLEVBQXBCLEVBQXdCLEVBQXhCLEtBQStCYSxHQUFsSCxFQUF1SDtBQUNySEU7QUFDRDtBQUNELFdBQU9BLEdBQVA7QUFDRDtBQUNGLENBM0JEO0FBNEJBRSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2JDLGVBQWE1QixjQURBO0FBRWJmLFdBQVNBO0FBRkksQ0FBakIiLCJmaWxlIjoiY2hlY2suanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENyZWF0ZWQgYnkgd3VqdyBvbiAxOC8wOC8xNC5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUqL1xuY29uc3QgbW9iaWxlUmV4ID0gL14oMTNbMC05XXwxNFs1NzldfDE1WzAtMyw1LTldfDE2WzZdfDE3WzAxMzU2NzhdfDE4WzAtOV18MTlbODldKVxcZHs4fSQvOyAvLyDmiYvmnLrlj7dcbmNvbnN0IGNvZGVSZXggPSAvXlxcZHs2fSQvOyAvLyDpqozor4HnoIFcbmNvbnN0IGNuUmVnID0gL14oW1xcdTRlMDAtXFx1OWZhNVxcwrddezIsNn0pJC87IC8v5Lit5paH5ZCN5q2j5YiZXG5jb25zdCByZWdFbWFpbCA9IC9eKFthLXpBLVowLTldK1tffFxcLXxcXC5dPykqW2EtekEtWjAtOV0rQChbYS16QS1aMC05XStbX3xcXC18XFwuXT8pKlthLXpBLVowLTldKyhcXC5bYS16QS1aXXsyLDN9KSskLzsgLy/pgq7nrrFcbmNvbnN0IHJlZ0lkQ2FyZCA9IC9eKF5bMS05XVxcZHs3fSgoMFxcZCl8KDFbMC0yXSkpKChbMHwxfDJdXFxkKXwzWzAtMV0pXFxkezN9JCl8KF5bMS05XVxcZHs1fVsxLTldXFxkezN9KCgwXFxkKXwoMVswLTJdKSkoKFswfDF8Ml1cXGQpfDNbMC0xXSkoKFxcZHs0fSl8XFxkezN9W1h4XSkkKSQvOyAvLzE15L2N5ZKMMTjkvY3ouqvku73or4Hlj7fnoIHnmoTmraPliJnooajovr7lvI9cbmNvbnN0IHVzZXJuYW1lUmV4ID0gL15bYS16QS1aXVtcXGRhLXpBLVpdezIsMTl9JC87XG4vKipcbiAqIOagoemqjOeUqOaIt+WQjSDlrZfmr43lvIDlpLTvvIwzLTIw5L2NXG4gKiBAcGFyYW0geyp9IHN0ciBcbiAqL1xuY29uc3QgY2hlY2tVc2VyTmFtZSA9IChzdHIpID0+IHtcbiAgcmV0dXJuIHVzZXJuYW1lUmV4LnRlc3Qoc3RyKTtcbn1cbi8qKlxuICog5qCh6aqM5omL5py65Y+35qC85byPXG4gKiBAcGFyYW0geyp9IHN0ciBcbiAqL1xuY29uc3QgY2hlY2tNb2JpbGUgPShzdHIpID0+e1xuICByZXR1cm4gbW9iaWxlUmV4LnRlc3Qoc3RyKTtcbn1cbi8qKlxuICog5qCh6aqM6aqM6K+B56CB5L2N5pWwXG4gKiBAcGFyYW0geyp9IHN0ciBcbiAqL1xuY29uc3QgY2hlY2tDb2RlID0gKHN0cikgPT4ge1xuICByZXR1cm4gY29kZVJleC50ZXN0KHN0cik7XG59XG4vKipcbiAqIOagoemqjOaYr+WQpuaYr+S4reaWh+WQjVxuICogQHBhcmFtIHsqfSBzdHIgXG4gKi9cbmNvbnN0IGNoZWNrQ04gPSAoc3RyKSA9PiB7XG4gIHJldHVybiBjblJlZy50ZXN0KHN0cik7XG59XG4vKipcbiAqIOWvhueggeagoemqjOWkp+Wwj+WGmSvmlbDlrZdcbiAqIEBwYXJhbSB7Kn0gc3RyIFxuICovXG5jb25zdCBjaGVja1BXRCA9IChzdHIpID0+IHtcbiAgbGV0IHJ1bGUxID0gL1xcZCsvO1xuICBsZXQgcnVsZTIgPSAvW2Etel0rLztcbiAgbGV0IHJ1bGUzID0gL1tBLVpdKy87XG4gIGxldCBydWxlNCA9IC9bfiFAI1xcJCVeJipcXHtcXH07LC5cXD9cXC8nXCJdLztcbiAgbGV0IHJ1bGU1ID0gL14uezYsMjB9JC87XG4gIGxldCBmbGFnMSA9IHJ1bGUxLnRlc3Qoc3RyKTtcbiAgbGV0IGZsYWcyID0gcnVsZTIudGVzdChzdHIpO1xuICBsZXQgZmxhZzMgPSBydWxlMy50ZXN0KHN0cik7XG4gIGxldCBmbGFnNCA9IHJ1bGU0LnRlc3Qoc3RyKTtcbiAgbGV0IGZsYWc1ID0gcnVsZTUudGVzdChzdHIpO1xuICBpZiAoZmxhZzEgJiYgZmxhZzUgJiYgKGZsYWcyIHx8IGZsYWczKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiDph5HpkrHmoLzlvI/ljJZcbiAqIEBwYXJhbSB7Kn0gbW9uZXkgXG4gKi9cbmNvbnN0IGZvcm1hdENhc2ggPSAobW9uZXkpID0+IHtcbiAgLy8g5pa55rOV5LiAXG4gIHJldHVybiBtb25leS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpXG4gIC8vIOaWueazleS6jFxuICAvLyByZXR1cm4gbW9uZXkuc3BsaXQoJycpLnJldmVyc2UoKS5yZWR1Y2UoKHByZXYsIG5leHQsIGluZGV4KSA9PiB7XG4gIC8vICAgcmV0dXJuICgoaW5kZXggJSAzKSA/IG5leHQgOiAobmV4dCArICcsJykpICsgcHJldlxuICAvLyB9KVxufVxuXG4vKlxuICog6Lqr5Lu96K+BMTXkvY3nvJbnoIHop4TliJnvvJpkZGRkZGQgeXltbWRkIHh4IHBcbiAqIGRkZGRkZO+8mjbkvY3lnLDljLrnvJbnoIFcbiAqIHl5bW1kZDog5Ye655Sf5bm0KOS4pOS9jeW5tCnmnIjml6XvvIzlpoLvvJo5MTAyMTVcbiAqIHh4OiDpobrluo/nvJbnoIHvvIzns7vnu5/kuqfnlJ/vvIzml6Dms5Xnoa7lrppcbiAqIHA6IOaAp+WIq++8jOWlh+aVsOS4uueUt++8jOWBtuaVsOS4uuWls1xuICpcbiAqIOi6q+S7veivgTE45L2N57yW56CB6KeE5YiZ77yaZGRkZGRkIHl5eXltbWRkIHh4eCB5XG4gKiBkZGRkZGTvvJo25L2N5Zyw5Yy657yW56CBXG4gKiB5eXl5bW1kZDog5Ye655Sf5bm0KOWbm+S9jeW5tCnmnIjml6XvvIzlpoLvvJoxOTkxMDIxNVxuICogeHh477ya6aG65bqP57yW56CB77yM57O757uf5Lqn55Sf77yM5peg5rOV56Gu5a6a77yM5aWH5pWw5Li655S377yM5YG25pWw5Li65aWzXG4gKiB5OiDmoKHpqoznoIHvvIzor6XkvY3mlbDlgLzlj6/pgJrov4fliY0xN+S9jeiuoeeul+iOt+W+l1xuICpcbiAqIOWJjTE35L2N5Y+356CB5Yqg5p2D5Zug5a2Q5Li6IFdpID0gWyA3LCA5LCAxMCwgNSwgOCwgNCwgMiwgMSwgNiwgMywgNywgOSwgMTAsIDUsIDgsIDQsIDIgXVxuICog6aqM6K+B5L2NIFkgPSBbIDEsIDAsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyIF1cbiAqIOWmguaenOmqjOivgeeggeaBsOWlveaYrzEw77yM5Li65LqG5L+d6K+B6Lqr5Lu96K+B5piv5Y2B5YWr5L2N77yM6YKj5LmI56ys5Y2B5YWr5L2N5bCG55SoWOadpeS7o+abv1xuICog5qCh6aqM5L2N6K6h566X5YWs5byP77yaWV9QID0gbW9kKCDiiJEoQWnDl1dpKSwxMSApXG4gKiBp5Li66Lqr5Lu96K+B5Y+356CBMS4uLjE3IOS9jTsgWV9Q5Li65qCh6aqM56CBWeaJgOWcqOagoemqjOeggeaVsOe7hOS9jee9rlxuICovXG5jb25zdCB2YWxpZGF0ZUlkQ2FyZCA9IChpZENhcmQpID0+IHtcbiAgbGV0IGlzT0sgPSBmYWxzZTtcbiAgLy/lpoLmnpzpgJrov4for6Xpqozor4HvvIzor7TmmI7ouqvku73or4HmoLzlvI/mraPnoa7vvIzkvYblh4bnoa7mgKfov5jpnIDorqHnrpdcbiAgaWYgKHJlZ0lkQ2FyZC50ZXN0KGlkQ2FyZCkpIHtcbiAgICBpZiAoaWRDYXJkLmxlbmd0aCA9PSAxOCkge1xuICAgICAgdmFyIGlkQ2FyZFdpID0gbmV3IEFycmF5KDcsIDksIDEwLCA1LCA4LCA0LCAyLCAxLCA2LCAzLCA3LCA5LCAxMCwgNSwgOCwgNCwgMik7IC8v5bCG5YmNMTfkvY3liqDmnYPlm6DlrZDkv53lrZjlnKjmlbDnu4Tph4xcbiAgICAgIHZhciBpZENhcmRZID0gbmV3IEFycmF5KDEsIDAsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyKTsgLy/ov5nmmK/pmaTku6UxMeWQju+8jOWPr+iDveS6p+eUn+eahDEx5L2N5L2Z5pWw44CB6aqM6K+B56CB77yM5Lmf5L+d5a2Y5oiQ5pWw57uEXG4gICAgICB2YXIgaWRDYXJkV2lTdW0gPSAwOyAvL+eUqOadpeS/neWtmOWJjTE35L2N5ZCE6Ieq5LmW5Lul5Yqg5p2D5Zug5a2Q5ZCO55qE5oC75ZKMXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE3OyBpKyspIHtcbiAgICAgICAgaWRDYXJkV2lTdW0gKz0gaWRDYXJkLnN1YnN0cmluZyhpLCBpICsgMSkgKiBpZENhcmRXaVtpXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGlkQ2FyZE1vZCA9IGlkQ2FyZFdpU3VtICUgMTE7IC8v6K6h566X5Ye65qCh6aqM56CB5omA5Zyo5pWw57uE55qE5L2N572uXG4gICAgICB2YXIgaWRDYXJkTGFzdCA9IGlkQ2FyZC5zdWJzdHJpbmcoMTcpOyAvL+W+l+WIsOacgOWQjuS4gOS9jei6q+S7veivgeWPt+eggVxuXG4gICAgICAvL+WmguaenOetieS6jjLvvIzliJnor7TmmI7moKHpqoznoIHmmK8xMO+8jOi6q+S7veivgeWPt+eggeacgOWQjuS4gOS9jeW6lOivpeaYr1hcbiAgICAgIGlmIChpZENhcmRNb2QgPT0gMikge1xuICAgICAgICBpZiAoaWRDYXJkTGFzdCA9PSBcIlhcIiB8fCBpZENhcmRMYXN0ID09IFwieFwiKSB7XG4gICAgICAgICAgaXNPSyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8v55So6K6h566X5Ye655qE6aqM6K+B56CB5LiO5pyA5ZCO5LiA5L2N6Lqr5Lu96K+B5Y+356CB5Yy56YWN77yM5aaC5p6c5LiA6Ie077yM6K+05piO6YCa6L+H77yM5ZCm5YiZ5piv5peg5pWI55qE6Lqr5Lu96K+B5Y+356CBXG4gICAgICAgIGlmIChpZENhcmRMYXN0ID09IGlkQ2FyZFlbaWRDYXJkTW9kXSkge1xuICAgICAgICAgIGlzT0sgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzT0sgPSB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBpc09LO1xufVxuXG4vKipcbiAqIOmAmui/h+i6q+S7veivgeiOt+WPluS4nOilv1xuICogQHBhcmFtIHsqfSBVVXNlckNhcmQgXG4gKiBAcGFyYW0geyp9IHR5cGUgOmJpcnRoLGFnZSxzZXhcbiAqL1xuY29uc3QgZ2V0SWRDYXJkSW5mbyA9IChVVXNlckNhcmQsIHR5cGUpID0+IHtcbiAgaWYgKHR5cGUgPT0gJ2JpcnRoJykge1xuICAgIC8v6I635Y+W5Ye655Sf5pel5pyfXG4gICAgYmlydGggPSBVVXNlckNhcmQuc3Vic3RyaW5nKDYsIDEwKSArIFwiLVwiICsgVVVzZXJDYXJkLnN1YnN0cmluZygxMCwgMTIpICsgXCItXCIgKyBVVXNlckNhcmQuc3Vic3RyaW5nKDEyLCAxNCk7XG4gICAgcmV0dXJuIGJpcnRoO1xuICB9XG4gIGlmICh0eXBlID09ICdzZXgnKSB7XG4gICAgLy/ojrflj5bmgKfliKtcbiAgICBpZiAocGFyc2VJbnQoVVVzZXJDYXJkLnN1YnN0cigxNiwgMSkpICUgMiA9PSAxKSB7XG4gICAgICAvL+eUt1xuICAgICAgcmV0dXJuIFwi55S3XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8v5aWzXG4gICAgICByZXR1cm4gXCLlpbNcIjtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGUgPT0gJ2FnZScpIHtcbiAgICAvL+iOt+WPluW5tOm+hFxuICAgIHZhciBteURhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHZhciBtb250aCA9IG15RGF0ZS5nZXRNb250aCgpICsgMTtcbiAgICB2YXIgZGF5ID0gbXlEYXRlLmdldERhdGUoKTtcbiAgICB2YXIgYWdlID0gbXlEYXRlLmdldEZ1bGxZZWFyKCkgLSBVVXNlckNhcmQuc3Vic3RyaW5nKDYsIDEwKSAtIDE7XG4gICAgaWYgKFVVc2VyQ2FyZC5zdWJzdHJpbmcoMTAsIDEyKSA8IG1vbnRoIHx8IFVVc2VyQ2FyZC5zdWJzdHJpbmcoMTAsIDEyKSA9PSBtb250aCAmJiBVVXNlckNhcmQuc3Vic3RyaW5nKDEyLCAxNCkgPD0gZGF5KSB7XG4gICAgICBhZ2UrKztcbiAgICB9XG4gICAgcmV0dXJuIGFnZTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgY2hlY2tJZENhcmQ6IHZhbGlkYXRlSWRDYXJkLFxuICAgIGNoZWNrQ046IGNoZWNrQ05cbn1cbiJdfQ==
\No newline at end of file