@whitesev/utils 2.7.8 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -176
- package/dist/index.amd.js +896 -877
- package/dist/index.amd.js.map +1 -1
- package/dist/index.cjs.js +896 -877
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +896 -877
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +896 -877
- package/dist/index.iife.js.map +1 -1
- package/dist/index.system.js +896 -877
- package/dist/index.system.js.map +1 -1
- package/dist/index.umd.js +896 -877
- package/dist/index.umd.js.map +1 -1
- package/dist/types/src/CommonUtil.d.ts +59 -59
- package/dist/types/src/DOMUtils.d.ts +1 -1
- package/dist/types/src/Dictionary.d.ts +1 -1
- package/dist/types/src/Httpx.d.ts +2 -2
- package/dist/types/src/Progress.d.ts +0 -4
- package/dist/types/src/TryCatch.d.ts +2 -2
- package/dist/types/src/Utils.d.ts +365 -365
- package/dist/types/src/UtilsGMCookie.d.ts +2 -2
- package/dist/types/src/UtilsGMMenu.d.ts +1 -1
- package/dist/types/src/indexedDB.d.ts +3 -3
- package/dist/types/src/types/Event.d.ts +188 -188
- package/dist/types/src/types/Httpx.d.ts +1344 -1343
- package/dist/types/src/types/Log.d.ts +19 -19
- package/dist/types/src/types/Progress.d.ts +20 -20
- package/dist/types/src/types/React.d.ts +119 -119
- package/dist/types/src/types/TryCatch.d.ts +9 -9
- package/dist/types/src/types/UtilsGMCookie.d.ts +93 -93
- package/dist/types/src/types/UtilsGMMenu.d.ts +77 -77
- package/dist/types/src/types/Vue2.d.ts +166 -166
- package/dist/types/src/types/WindowApi.d.ts +14 -14
- package/dist/types/src/types/ajaxHooker.d.ts +151 -151
- package/dist/types/src/types/env.d.ts +7 -2
- package/dist/types/src/types/global.d.ts +31 -31
- package/package.json +16 -7
- package/src/ColorConversion.ts +105 -106
- package/src/CommonUtil.ts +280 -279
- package/src/DOMUtils.ts +251 -272
- package/src/Dictionary.ts +153 -154
- package/src/GBKEncoder.ts +108 -112
- package/src/Hooks.ts +73 -81
- package/src/Httpx.ts +1457 -1466
- package/src/LockFunction.ts +62 -62
- package/src/Log.ts +258 -259
- package/src/ModuleRaid.js +1 -0
- package/src/Progress.ts +108 -114
- package/src/TryCatch.ts +86 -86
- package/src/Utils.ts +4772 -4825
- package/src/UtilsCommon.ts +14 -14
- package/src/UtilsGMCookie.ts +254 -261
- package/src/UtilsGMMenu.ts +445 -454
- package/src/Vue.ts +233 -229
- package/src/WindowApi.ts +59 -59
- package/src/ajaxHooker/ajaxHooker.js +1 -0
- package/src/indexedDB.ts +497 -502
- package/src/types/Event.d.ts +188 -188
- package/src/types/Httpx.d.ts +1344 -1343
- package/src/types/Log.d.ts +19 -19
- package/src/types/Progress.d.ts +20 -20
- package/src/types/React.d.ts +119 -119
- package/src/types/TryCatch.d.ts +9 -9
- package/src/types/UtilsGMCookie.d.ts +93 -93
- package/src/types/UtilsGMMenu.d.ts +77 -77
- package/src/types/Vue2.d.ts +166 -166
- package/src/types/WindowApi.d.ts +14 -14
- package/src/types/ajaxHooker.d.ts +151 -151
- package/src/types/env.d.ts +7 -2
- package/src/types/global.d.ts +31 -31
package/dist/index.esm.js
CHANGED
|
@@ -7,7 +7,7 @@ class ColorConversion {
|
|
|
7
7
|
if (typeof str !== "string") {
|
|
8
8
|
return false;
|
|
9
9
|
}
|
|
10
|
-
if (!str.match(/^(
|
|
10
|
+
if (!str.match(/^(#|)[0-9a-fA-F]{6}$/)) {
|
|
11
11
|
return false;
|
|
12
12
|
}
|
|
13
13
|
return true;
|
|
@@ -21,18 +21,10 @@ class ColorConversion {
|
|
|
21
21
|
*/
|
|
22
22
|
hexToRgba(hex, opacity) {
|
|
23
23
|
if (!this.isHex(hex)) {
|
|
24
|
-
throw new TypeError(
|
|
24
|
+
throw new TypeError(`输入错误的hex:${hex}`);
|
|
25
25
|
}
|
|
26
26
|
return hex && hex.replace(/\s+/g, "").length === 7
|
|
27
|
-
?
|
|
28
|
-
parseInt("0x" + hex.slice(1, 3)) +
|
|
29
|
-
"," +
|
|
30
|
-
parseInt("0x" + hex.slice(3, 5)) +
|
|
31
|
-
"," +
|
|
32
|
-
parseInt("0x" + hex.slice(5, 7)) +
|
|
33
|
-
"," +
|
|
34
|
-
opacity +
|
|
35
|
-
")"
|
|
27
|
+
? `rgba(${parseInt(`0x${hex.slice(1, 3)}`)},${parseInt(`0x${hex.slice(3, 5)}`)},${parseInt(`0x${hex.slice(5, 7)}`)},${opacity})`
|
|
36
28
|
: "";
|
|
37
29
|
}
|
|
38
30
|
/**
|
|
@@ -41,14 +33,15 @@ class ColorConversion {
|
|
|
41
33
|
*/
|
|
42
34
|
hexToRgb(str) {
|
|
43
35
|
if (!this.isHex(str)) {
|
|
44
|
-
throw new TypeError(
|
|
36
|
+
throw new TypeError(`输入错误的hex:${str}`);
|
|
45
37
|
}
|
|
46
38
|
/* replace替换查找的到的字符串 */
|
|
47
39
|
str = str.replace("#", "");
|
|
48
40
|
/* match得到查询数组 */
|
|
49
|
-
|
|
41
|
+
const hxs = str.match(/../g);
|
|
50
42
|
for (let index = 0; index < 3; index++) {
|
|
51
|
-
|
|
43
|
+
const value = parseInt(hxs[index], 16);
|
|
44
|
+
Reflect.set(hxs, index, value);
|
|
52
45
|
}
|
|
53
46
|
return hxs;
|
|
54
47
|
}
|
|
@@ -60,16 +53,16 @@ class ColorConversion {
|
|
|
60
53
|
*/
|
|
61
54
|
rgbToHex(redValue, greenValue, blueValue) {
|
|
62
55
|
/* 验证输入的rgb值是否合法 */
|
|
63
|
-
|
|
56
|
+
const validPattern = /^\d{1,3}$/;
|
|
64
57
|
if (!validPattern.test(redValue.toString()) ||
|
|
65
58
|
!validPattern.test(greenValue.toString()) ||
|
|
66
59
|
!validPattern.test(blueValue.toString()))
|
|
67
60
|
throw new TypeError("输入错误的rgb颜色值");
|
|
68
|
-
|
|
61
|
+
const hexs = [redValue.toString(16), greenValue.toString(16), blueValue.toString(16)];
|
|
69
62
|
for (let index = 0; index < 3; index++)
|
|
70
63
|
if (hexs[index].length == 1)
|
|
71
|
-
hexs[index] =
|
|
72
|
-
return
|
|
64
|
+
hexs[index] = `0${hexs[index]}`;
|
|
65
|
+
return `#${hexs.join("")}`;
|
|
73
66
|
}
|
|
74
67
|
/**
|
|
75
68
|
* 获取颜色变暗或亮
|
|
@@ -78,11 +71,13 @@ class ColorConversion {
|
|
|
78
71
|
*/
|
|
79
72
|
getDarkColor(color, level) {
|
|
80
73
|
if (!this.isHex(color)) {
|
|
81
|
-
throw new TypeError(
|
|
74
|
+
throw new TypeError(`输入错误的hex:${color}`);
|
|
82
75
|
}
|
|
83
|
-
|
|
76
|
+
const rgbc = this.hexToRgb(color);
|
|
84
77
|
for (let index = 0; index < 3; index++) {
|
|
85
|
-
|
|
78
|
+
const rgbcItemValue = rgbc[index];
|
|
79
|
+
const value = Math.floor(Number(rgbcItemValue) * (1 - Number(level)));
|
|
80
|
+
Reflect.set(rgbc, index, value);
|
|
86
81
|
}
|
|
87
82
|
return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
|
|
88
83
|
}
|
|
@@ -93,40 +88,43 @@ class ColorConversion {
|
|
|
93
88
|
*/
|
|
94
89
|
getLightColor(color, level) {
|
|
95
90
|
if (!this.isHex(color)) {
|
|
96
|
-
throw new TypeError(
|
|
91
|
+
throw new TypeError(`输入错误的hex:${color}`);
|
|
97
92
|
}
|
|
98
|
-
|
|
93
|
+
const rgbc = this.hexToRgb(color);
|
|
99
94
|
for (let index = 0; index < 3; index++) {
|
|
100
|
-
|
|
95
|
+
const rgbcItemValue = Number(rgbc[index]);
|
|
96
|
+
const value = Math.floor(255 - rgbcItemValue * level + rgbcItemValue);
|
|
97
|
+
Reflect.set(rgbc, index, value);
|
|
101
98
|
}
|
|
102
99
|
return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
|
|
103
100
|
}
|
|
104
101
|
}
|
|
105
102
|
|
|
106
103
|
class GBKEncoder {
|
|
107
|
-
#data
|
|
104
|
+
#data;
|
|
108
105
|
#U2Ghash = {};
|
|
109
106
|
#G2Uhash = {};
|
|
110
107
|
constructor() {
|
|
111
|
-
let dataText = this.handleText("4e:020405060f12171f20212326292e2f313335373c40414244464a5155575a5b6263646567686a6b6c6d6e6f727475767778797a7b7c7d7f808182838485878a#909697999c9d9ea3aaafb0b1b4b6b7b8b9bcbdbec8cccfd0d2dadbdce0e2e6e7e9edeeeff1f4f8f9fafcfe,4f:00020304050607080b0c12131415161c1d212328292c2d2e31333537393b3e3f40414244454748494a4b4c525456616266686a6b6d6e7172757778797a7d8081828586878a8c8e909293959698999a9c9e9fa1a2a4abadb0b1b2b3b4b6b7b8b9babbbcbdbec0c1c2c6c7c8c9cbcccdd2d3d4d5d6d9dbe0e2e4e5e7ebecf0f2f4f5f6f7f9fbfcfdff,50:000102030405060708090a#0b0e1011131516171b1d1e20222324272b2f303132333435363738393b3d3f404142444546494a4b4d5051525354565758595b5d5e5f6061626364666768696a6b6d6e6f70717273747578797a7c7d818283848687898a8b8c8e8f909192939495969798999a9b9c9d9e9fa0a1a2a4a6aaabadaeafb0b1b3b4b5b6b7b8b9bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdced0d1d2d3d4d5d7d8d9dbdcdddedfe0e1e2e3e4e5e8e9eaebeff0f1f2f4f6f7f8f9fafcfdfeff,51:00010203040508#090a0c0d0e0f1011131415161718191a1b1c1d1e1f2022232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e42474a4c4e4f5052535758595b5d5e5f606163646667696a6f727a7e7f838486878a8b8e8f90919394989a9d9e9fa1a3a6a7a8a9aaadaeb4b8b9babebfc1c2c3c5c8cacdced0d2d3d4d5d6d7d8d9dadcdedfe2e3e5e6e7e8e9eaeceef1f2f4f7fe,52:0405090b0c0f101314151c1e1f2122232526272a2c2f313234353c3e4445464748494b4e4f5253555758#595a5b5d5f6062636466686b6c6d6e7071737475767778797a7b7c7e808384858687898a8b8c8d8e8f91929495969798999a9ca4a5a6a7aeafb0b4b5b6b7b8b9babbbcbdc0c1c2c4c5c6c8cacccdcecfd1d3d4d5d7d9dadbdcdddee0e1e2e3e5e6e7e8e9eaebecedeeeff1f2f3f4f5f6f7f8fbfcfd,53:0102030407090a0b0c0e11121314181b1c1e1f2224252728292b2c2d2f3031323334353637383c3d404244464b4c4d505458595b5d65686a6c6d7276797b7c7d7e80818387888a8e8f#90919293949697999b9c9ea0a1a4a7aaabacadafb0b1b2b3b4b5b7b8b9babcbdbec0c3c4c5c6c7cecfd0d2d3d5dadcdddee1e2e7f4fafeff,54:000205070b1418191a1c2224252a303336373a3d3f4142444547494c4d4e4f515a5d5e5f6061636567696a6b6c6d6e6f7074797a7e7f8183858788898a8d919397989c9e9fa0a1a2a5aeb0b2b5b6b7b9babcbec3c5cacbd6d8dbe0e1e2e3e4ebeceff0f1f4f5f6f7f8f9fbfe,55:0002030405080a0b0c0d0e121315161718191a1c1d1e1f212526#28292b2d3234353638393a3b3d40424547484b4c4d4e4f515253545758595a5b5d5e5f60626368696b6f7071727374797a7d7f85868c8d8e9092939596979a9b9ea0a1a2a3a4a5a6a8a9aaabacadaeafb0b2b4b6b8babcbfc0c1c2c3c6c7c8cacbcecfd0d5d7d8d9dadbdee0e2e7e9edeef0f1f4f6f8f9fafbfcff,56:0203040506070a0b0d1011121314151617191a1c1d202122252628292a2b2e2f30333537383a3c3d3e404142434445464748494a4b4f5051525355565a5b5d5e5f6061#636566676d6e6f70727374757778797a7d7e7f80818283848788898a8b8c8d9091929495969798999a9b9c9d9e9fa0a1a2a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b8b9babbbdbebfc0c1c2c3c4c5c6c7c8c9cbcccdcecfd0d1d2d3d5d6d8d9dce3e5e6e7e8e9eaeceeeff2f3f6f7f8fbfc,57:00010205070b0c0d0e0f101112131415161718191a1b1d1e202122242526272b313234353637383c3d3f414344454648494b52535455565859626365676c6e707172747578797a7d7e7f80#818788898a8d8e8f90919495969798999a9c9d9e9fa5a8aaacafb0b1b3b5b6b7b9babbbcbdbebfc0c1c4c5c6c7c8c9cacccdd0d1d3d6d7dbdcdee1e2e3e5e6e7e8e9eaebeceef0f1f2f3f5f6f7fbfcfeff,58:0103040508090a0c0e0f101213141617181a1b1c1d1f222325262728292b2c2d2e2f31323334363738393a3b3c3d3e3f4041424345464748494a4b4e4f505253555657595a5b5c5d5f6061626364666768696a6d6e6f707172737475767778797a7b7c7d7f82848687888a8b8c#8d8e8f909194959697989b9c9da0a1a2a3a4a5a6a7aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbdbebfc0c2c3c4c6c7c8c9cacbcccdcecfd0d2d3d4d6d7d8d9dadbdcdddedfe0e1e2e3e5e6e7e8e9eaedeff1f2f4f5f7f8fafbfcfdfeff,59:000103050608090a0b0c0e1011121317181b1d1e2021222326282c30323335363b3d3e3f404345464a4c4d505253595b5c5d5e5f616364666768696a6b6c6d6e6f70717275777a7b7c7e7f8085898b8c8e8f90919495989a9b9c9d9fa0a1a2a6#a7acadb0b1b3b4b5b6b7b8babcbdbfc0c1c2c3c4c5c7c8c9cccdcecfd5d6d9dbdedfe0e1e2e4e6e7e9eaebedeeeff0f1f2f3f4f5f6f7f8fafcfdfe,5a:00020a0b0d0e0f101214151617191a1b1d1e2122242627282a2b2c2d2e2f3033353738393a3b3d3e3f414243444547484b4c4d4e4f5051525354565758595b5c5d5e5f60616364656668696b6c6d6e6f7071727378797b7c7d7e808182838485868788898a8b8c8d8e8f9091939495969798999c9d9e9fa0a1a2a3a4a5a6a7a8a9abac#adaeafb0b1b4b6b7b9babbbcbdbfc0c3c4c5c6c7c8cacbcdcecfd0d1d3d5d7d9dadbdddedfe2e4e5e7e8eaecedeeeff0f2f3f4f5f6f7f8f9fafbfcfdfeff,5b:0001020304050607080a0b0c0d0e0f10111213141518191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303133353638393a3b3c3d3e3f4142434445464748494a4b4c4d4e4f52565e606167686b6d6e6f7274767778797b7c7e7f82868a8d8e90919294969fa7a8a9acadaeafb1b2b7babbbcc0c1c3c8c9cacbcdcecf#d1d4d5d6d7d8d9dadbdce0e2e3e6e7e9eaebecedeff1f2f3f4f5f6f7fdfe,5c:0002030507080b0c0d0e10121317191b1e1f2021232628292a2b2d2e2f303233353637434446474c4d5253545657585a5b5c5d5f62646768696a6b6c6d70727374757677787b7c7d7e808384858687898a8b8e8f9293959d9e9fa0a1a4a5a6a7a8aaaeafb0b2b4b6b9babbbcbec0c2c3c5c6c7c8c9cacccdcecfd0d1d3d4d5d6d7d8dadbdcdddedfe0e2e3e7e9ebeceeeff1f2f3f4f5f6f7f8f9fafcfdfeff,5d:00#01040508090a0b0c0d0f10111213151718191a1c1d1f2021222325282a2b2c2f3031323335363738393a3b3c3f4041424344454648494d4e4f5051525354555657595a5c5e5f6061626364656667686a6d6e7071727375767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f9091929394959697989a9b9c9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b8b9babbbcbdbebfc0c1c2c3c4c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d7d8d9dadcdfe0e3e4eaeced#f0f5f6f8f9fafbfcff,5e:000407090a0b0d0e1213171e1f20212223242528292a2b2c2f303233343536393a3e3f404143464748494a4b4d4e4f50515253565758595a5c5d5f60636465666768696a6b6c6d6e6f70717577797e8182838588898c8d8e92989b9da1a2a3a4a8a9aaabacaeafb0b1b2b4babbbcbdbfc0c1c2c3c4c5c6c7c8cbcccdcecfd0d4d5d7d8d9dadcdddedfe0e1e2e3e4e5e6e7e9ebecedeeeff0f1f2f3f5f8f9fbfcfd,5f:050607090c0d0e10121416191a1c1d1e21222324#282b2c2e30323334353637383b3d3e3f4142434445464748494a4b4c4d4e4f5154595a5b5c5e5f60636567686b6e6f72747576787a7d7e7f83868d8e8f919394969a9b9d9e9fa0a2a3a4a5a6a7a9abacafb0b1b2b3b4b6b8b9babbbebfc0c1c2c7c8cacbced3d4d5dadbdcdedfe2e3e5e6e8e9eceff0f2f3f4f6f7f9fafc,60:0708090b0c10111317181a1e1f2223242c2d2e3031323334363738393a3d3e404445464748494a4c4e4f5153545657585b5c5e5f606165666e71727475777e80#8182858687888a8b8e8f909193959798999c9ea1a2a4a5a7a9aaaeb0b3b5b6b7b9babdbebfc0c1c2c3c4c7c8c9cccdcecfd0d2d3d4d6d7d9dbdee1e2e3e4e5eaf1f2f5f7f8fbfcfdfeff,61:02030405070a0b0c1011121314161718191b1c1d1e21222528292a2c2d2e2f303132333435363738393a3b3c3d3e4041424344454647494b4d4f50525354565758595a5b5c5e5f606163646566696a6b6c6d6e6f717273747678797a7b7c7d7e7f808182838485868788898a8c8d8f9091929395#969798999a9b9c9e9fa0a1a2a3a4a5a6aaabadaeafb0b1b2b3b4b5b6b8b9babbbcbdbfc0c1c3c4c5c6c7c9cccdcecfd0d3d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e7e8e9eaebecedeeeff0f1f2f3f4f6f7f8f9fafbfcfdfe,62:00010203040507091314191c1d1e2023262728292b2d2f303132353638393a3b3c424445464a4f50555657595a5c5d5e5f6061626465687172747577787a7b7d818283858687888b8c8d8e8f9094999c9d9ea3a6a7a9aaadaeafb0b2b3b4b6b7b8babec0c1#c3cbcfd1d5dddee0e1e4eaebf0f2f5f8f9fafb,63:00030405060a0b0c0d0f10121314151718191c2627292c2d2e30313334353637383b3c3e3f40414447484a51525354565758595a5b5c5d60646566686a6b6c6f707273747578797c7d7e7f81838485868b8d9193949597999a9b9c9d9e9fa1a4a6abafb1b2b5b6b9bbbdbfc0c1c2c3c5c7c8cacbccd1d3d4d5d7d8d9dadbdcdddfe2e4e5e6e7e8ebeceeeff0f1f3f5f7f9fafbfcfe,64:0304060708090a0d0e111215161718191a1d1f222324#252728292b2e2f3031323335363738393b3c3e404243494b4c4d4e4f505153555657595a5b5c5d5f60616263646566686a6b6c6e6f70717273747576777b7c7d7e7f8081838688898a8b8c8d8e8f90939497989a9b9c9d9fa0a1a2a3a5a6a7a8aaabafb1b2b3b4b6b9bbbdbebfc1c3c4c6c7c8c9cacbcccfd1d3d4d5d6d9dadbdcdddfe0e1e3e5e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,65:01020304050607080a0b0c0d0e0f10111314151617191a1b1c1d1e1f2021#222324262728292a2c2d30313233373a3c3d404142434446474a4b4d4e5052535457585a5c5f606164656768696a6d6e6f7173757678797a7b7c7d7e7f8081828384858688898a8d8e8f92949596989a9d9ea0a2a3a6a8aaacaeb1b2b3b4b5b6b7b8babbbebfc0c2c7c8c9cacdd0d1d3d4d5d8d9dadbdcdddedfe1e3e4eaebf2f3f4f5f8f9fbfcfdfeff,66:0104050708090b0d1011121617181a1b1c1e2122232426292a2b2c2e3032333738393a3b3d3f40424445464748494a4d4e505158#595b5c5d5e6062636567696a6b6c6d7172737578797b7c7d7f808183858688898a8b8d8e8f909293949598999a9b9c9e9fa0a1a2a3a4a5a6a9aaabacadafb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8dadedfe0e1e2e3e4e5e7e8eaebecedeeeff1f5f6f8fafbfd,67:010203040506070c0e0f1112131618191a1c1e20212223242527292e303233363738393b3c3e3f414445474a4b4d5254555758595a5b5d62636466676b6c6e717476#78797a7b7d8082838586888a8c8d8e8f9192939496999b9fa0a1a4a6a9acaeb1b2b4b9babbbcbdbebfc0c2c5c6c7c8c9cacbcccdced5d6d7dbdfe1e3e4e6e7e8eaebedeef2f5f6f7f8f9fafbfcfe,68:01020304060d1012141518191a1b1c1e1f20222324252627282b2c2d2e2f30313435363a3b3f474b4d4f52565758595a5b5c5d5e5f6a6c6d6e6f707172737578797a7b7c7d7e7f8082848788898a8b8c8d8e90919294959698999a9b9c9d9e9fa0a1a3a4a5a9aaabacaeb1b2b4b6b7b8#b9babbbcbdbebfc1c3c4c5c6c7c8cacccecfd0d1d3d4d6d7d9dbdcdddedfe1e2e4e5e6e7e8e9eaebecedeff2f3f4f6f7f8fbfdfeff,69:00020304060708090a0c0f11131415161718191a1b1c1d1e21222325262728292a2b2c2e2f313233353637383a3b3c3e4041434445464748494a4b4c4d4e4f50515253555658595b5c5f616264656768696a6c6d6f7072737475767a7b7d7e7f8183858a8b8c8e8f909192939697999a9d9e9fa0a1a2a3a4a5a6a9aaacaeafb0b2b3b5b6b8b9babcbd#bebfc0c2c3c4c5c6c7c8c9cbcdcfd1d2d3d5d6d7d8d9dadcdddee1e2e3e4e5e6e7e8e9eaebeceeeff0f1f3f4f5f6f7f8f9fafbfcfe,6a:000102030405060708090b0c0d0e0f10111213141516191a1b1c1d1e20222324252627292b2c2d2e30323334363738393a3b3c3f40414243454648494a4b4c4d4e4f515253545556575a5c5d5e5f60626364666768696a6b6c6d6e6f70727374757677787a7b7d7e7f81828385868788898a8b8c8d8f929394959698999a9b9c9d9e9fa1a2a3a4a5a6#a7a8aaadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,6b:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f252628292a2b2c2d2e2f303133343536383b3c3d3f4041424445484a4b4d4e4f5051525354555657585a5b5c5d5e5f606168696b6c6d6e6f7071727374757677787a7d7e7f808588#8c8e8f909194959798999c9d9e9fa0a2a3a4a5a6a7a8a9abacadaeafb0b1b2b6b8b9babbbcbdbec0c3c4c6c7c8c9caccced0d1d8dadcdddedfe0e2e3e4e5e6e7e8e9ecedeef0f1f2f4f6f7f8fafbfcfeff,6c:000102030408090a0b0c0e12171c1d1e2023252b2c2d31333637393a3b3c3e3f434445484b4c4d4e4f5152535658595a62636566676b6c6d6e6f71737577787a7b7c7f8084878a8b8d8e9192959697989a9c9d9ea0a2a8acafb0b4b5b6b7bac0c1c2c3c6c7c8cbcdcecfd1d2d8#d9dadcdddfe4e6e7e9ecedf2f4f9ff,6d:000203050608090a0d0f101113141516181c1d1f20212223242628292c2d2f30343637383a3f404244494c50555657585b5d5f6162646567686b6c6d707172737576797a7b7d7e7f8081838486878a8b8d8f9092969798999a9ca2a5acadb0b1b3b4b6b7b9babbbcbdbec1c2c3c8c9cacdcecfd0d2d3d4d5d7dadbdcdfe2e3e5e7e8e9eaedeff0f2f4f5f6f8fafdfeff,6e:0001020304060708090b0f12131518191b1c1e1f222627282a2c2e30313335#3637393b3c3d3e3f40414245464748494a4b4c4f5051525557595a5c5d5e606162636465666768696a6c6d6f707172737475767778797a7b7c7d8081828487888a8b8c8d8e91929394959697999a9b9d9ea0a1a3a4a6a8a9abacadaeb0b3b5b8b9bcbebfc0c3c4c5c6c8c9cacccdced0d2d6d8d9dbdcdde3e7eaebecedeeeff0f1f2f3f5f6f7f8fafbfcfdfeff,6f:000103040507080a0b0c0d0e101112161718191a1b1c1d1e1f212223252627282c2e303234353738393a3b3c3d3f404142#43444548494a4c4e4f5051525354555657595a5b5d5f60616364656768696a6b6c6f707173757677797b7d7e7f808182838586878a8b8f909192939495969798999a9b9d9e9fa0a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b7b8babbbcbdbebfc1c3c4c5c6c7c8cacbcccdcecfd0d3d4d5d6d7d8d9dadbdcdddfe2e3e4e5e6e7e8e9eaebecedf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,70:000102030405060708090a0b0c0d0e0f1012131415161718191c1d1e1f2021222425262728292a#2b2c2d2e2f30313233343637383a3b3c3d3e3f404142434445464748494a4b4d4e505152535455565758595a5b5c5d5f606162636465666768696a6e7172737477797a7b7d818283848687888b8c8d8f90919397989a9b9e9fa0a1a2a3a4a5a6a7a8a9aab0b2b4b5b6babebfc4c5c6c7c9cbcccdcecfd0d1d2d3d4d5d6d7dadcdddee0e1e2e3e5eaeef0f1f2f3f4f5f6f8fafbfcfeff,71:0001020304050607080b0c0d0e0f111214171b1c1d1e1f2021222324252728292a2b2c2d2e323334#353738393a3b3c3d3e3f4041424344464748494b4d4f505152535455565758595a5b5d5f6061626365696a6b6c6d6f707174757677797b7c7e7f8081828385868788898b8c8d8e909192939596979a9b9c9d9ea1a2a3a4a5a6a7a9aaabadaeafb0b1b2b4b6b7b8babbbcbdbebfc0c1c2c4c5c6c7c8c9cacbcccdcfd0d1d2d3d6d7d8d9dadbdcdddedfe1e2e3e4e6e8e9eaebecedeff0f1f2f3f4f5f6f7f8fafbfcfdfeff,72:0001020304050708090a0b0c0d0e0f101112131415161718191a#1b1c1e1f2021222324252627292b2d2e2f3233343a3c3e40414243444546494a4b4e4f505153545557585a5c5e60636465686a6b6c6d707173747677787b7c7d828385868788898c8e9091939495969798999a9b9c9d9ea0a1a2a3a4a5a6a7a8a9aaabaeb1b2b3b5babbbcbdbebfc0c5c6c7c9cacbcccfd1d3d4d5d6d8dadb#95$,30:000102,00b702:c9c7,00a830:0305,2014ff5e20:162618191c1d,30:141508090a0b0c0d0e0f16171011,00:b1d7f7,22:362728110f2a2908371aa52520,231222:992b2e614c483d1d606e6f64651e3534,26:4240,00b020:3233,2103ff0400a4ff:e0e1,203000a7211626:0605,25:cbcfcec7c6a1a0b3b2,203b21:92909193,30:13#95$,21:70717273747576777879#4$,24:88898a8b8c8d8e8f909192939495969798999a9b7475767778797a7b7c7d7e7f808182838485868760616263646566676869##,32:20212223242526272829##,21:606162636465666768696a6b#97$,ff:010203e505060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5de3#95$,30:4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293#106$a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6#103$,03:9192939495969798999a9b9c9d9e9fa0a1a3a4a5a6a7a8a9#6$b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c3c4c5c6c7c8c9#5$,fe:3536393a3f403d3e41424344##3b3c373831#3334#104$,04:10111213141501161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f#13$30313233343551363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f#11$,02:cacbd9,20:13152535,21:050996979899,22:151f23526667bf,25:505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727381828384858687#88898a8b8c8d8e8f939495bcbde2e3e4e5,2609229530:121d1e#9$,010100e101ce00e0011300e9011b00e8012b00ed01d000ec014d00f301d200f2016b00fa01d400f901:d6d8dadc,00:fcea,0251e7c701:4448,e7c802:61#2$,31:05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829#19$,30:212223242526272829,32a333:8e8f9c9d9ea1c4ced1d2d5,fe30ff:e2e4#,212132:31#,20:10#1$,30:fc9b9cfdfe069d9e,fe:494a4b4c4d4e4f50515254555657595a5b5c5d5e5f6061#626364656668696a6b,e7:e7e8e9eaebecedeeeff0f1f2f3,30:07#11$,25:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b#13$,72:dcdddfe2e3e4e5e6e7eaebf5f6f9fdfeff,73:00020405060708090b0c0d0f1011121418191a1f2023242627282d2f30323335363a3b3c3d404142434445464748#494a4b4c4e4f515354555658595a5b5c5d5e5f6162636465666768696a6b6e7071#92$72737475767778797a7b7c7d7f808182838586888a8c8d8f90929394959798999a9c9d9ea0a1a3a4a5a6a7a8aaacadb1b4b5b6b8b9bcbdbebfc1c3c4c5c6c7#cbccced2d3d4d5d6d7d8dadbdcdddfe1e2e3e4e6e8eaebeceeeff0f1f3f4f5f6f7#92$f8f9fafbfcfdfeff,74:0001020407080b0c0d0e1112131415161718191c1d1e1f2021232427292b2d2f31323738393a3b3d3e3f4042434445464748494a4b4c4d#4e4f505152535456585d606162636465666768696a6b6c6e6f717273747578797a#92$7b7c7d7f8284858688898a8c8d8f9192939495969798999a9b9d9fa0a1a2a3a4a5a6aaabacadaeafb0b1b2b3b4b5b6b7b8b9bbbcbdbebfc0c1c2c3c4c5c6c7#c8c9cacbcccdcecfd0d1d3d4d5d6d7d8d9dadbdddfe1e5e7e8e9eaebecedf0f1f2#92$f3f5f8f9fafbfcfdfe,75:0001020305060708090a0b0c0e1012141516171b1d1e202122232426272a2e3436393c3d3f414243444647494a4d5051525355565758#5d5e5f60616263646768696b6c6d6e6f7071737576777a7b7c7d7e808182848587#92$88898a8c8d8e909395989b9c9ea2a6a7a8a9aaadb6b7babbbfc0c1c6cbcccecfd0d1d3d7d9dadcdddfe0e1e5e9ecedeeeff2f3f5f6f7f8fafbfdfe,76:02040607#08090b0d0e0f11121314161a1c1d1e212327282c2e2f31323637393a3b3d414244#92$45464748494a4b4e4f50515253555758595a5b5d5f6061626465666768696a6c6d6e7071727374757677797a7c7f80818385898a8c8d8f9092949597989a9b#9c9d9e9fa0a1a2a3a5a6a7a8a9aaabacadafb0b3b5b6b7b8b9babbbcbdbec0c1c3,554a963f57c3632854ce550954c076:914c,853c77ee827e788d72319698978d6c285b894ffa630966975cb880fa684880ae660276ce51f9655671ac7ff1888450b2596561ca6fb382ad634c625253ed54277b06516b75a45df462d48dcb9776628a8019575d97387f627238767d67cf767e64464f708d2562dc7a17659173ed642c6273822c9881677f724862:6ecc,4f3474e3534a529e7eca90a65e2e6886699c81807ed168d278c5868c9551508d8c2482de80de53058912526576:c4c7c9cbccd3d5d9dadcdddee0e1e2e3e4e6e7e8e9eaebecedf0f3f5f6f7fafbfdff,77:00020305060a0c0e0f1011121314151617181b1c1d1e21232425272a2b#2c2e3031323334393b3d3e3f4244454648494a4b4c4d4e4f52535455565758595c,858496f94fdd582199715b9d62:b1a5,66b48c799c8d7206676f789160b253:5117,8f8880cc8d1d94a1500d72c8590760eb711988ab595482ef672c7b285d297ef7752d6cf58e668ff8903c9f3b6bd491197b145f7c78a784d6853d6b:d5d9d6,5e:0187,75f995ed655d5f:0ac5,8f9f58c181c2907f965b97ad8fb97f168d2c62414fbf53:d85e,8f:a8a9ab,904d68075f6a819888689cd6618b522b762a5f6c658c6fd26ee85bbe644851:75b0,67c44e1979c9997c70b377:5d5e5f606467696a6d6e6f7071727374757677787a7b7c818283868788898a8b8f90939495969798999a9b9c9d9ea1a3a4a6a8abadaeafb1b2b4b6b7b8b9ba#bcbec0c1c2c3c4c5c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d8d9dadddedfe0e1e4,75c55e7673bb83e064ad62e894b56ce2535a52c3640f94c27b944f2f5e1b823681:168a,6e246cca9a736355535c54fa886557e04e0d5e036b657c3f90e8601664e6731c88c16750624d8d22776c8e2991c75f6983dc8521991053c286956b8b60:ede8,707f82:cd31,4ed36ca785cf64cd7cd969fd66f9834953957b564fa7518c6d4b5c428e6d63d253c983:2c36,67e578b4643d5bdf5c945dee8be762c667f48c7a640063ba8749998b8c177f2094f24ea7961098a4660c731677:e6e8eaeff0f1f2f4f5f7f9fafbfc,78:0304050607080a0b0e0f101315191b1e20212224282a2b2e2f31323335363d3f414243444648494a4b4d4f51535458595a#5b5c5e5f606162636465666768696f7071727374757678797a7b7d7e7f80818283,573a5c1d5e38957f507f80a05382655e7545553150218d856284949e671d56326f6e5de2543570928f66626f64a463a35f7b6f8890f481e38fb05c1866685ff16c8996488d81886c649179f057ce6a59621054484e587a0b60e96f848bda627f901e9a8b79e4540375f4630153196c608fdf5f1b9a70803b9f7f4f885c3a8d647fc565a570bd51:45b2,866b5d075ba062bd916c75748e0c7a2061017b794ec77ef877854e1181ed521d51fa6a7153a88e87950496cf6ec19664695a78:848586888a8b8f9092949596999d9ea0a2a4a6a8a9aaabacadaeafb5b6b7b8babbbcbdbfc0c2c3c4c6c7c8cccdcecfd1d2d3d6d7d8dadbdcdddedfe0e1e2e3#e4e5e6e7e9eaebedeeeff0f1f3f5f6f8f9fbfcfdfeff,79:00020304060708090a0b0c,784050a877d7641089e6590463e35ddd7a7f693d4f20823955984e3275ae7a975e:628a,95ef521b5439708a6376952457826625693f918755076df37eaf882262337ef075b5832878c196cc8f9e614874f78bcd6b64523a8d506b21806a847156f153064e:ce1b,51d17c97918b7c074fc38e7f7be17a9c64675d1450ac810676017cb96dec7fe067515b:58f8,78cb64:ae13,63:aa2b,9519642d8fbe7b5476296253592754466b7950a362345e266b864ee38d37888b5f85902e79:0d0e0f1011121415161718191a1b1c1d1f2021222325262728292a2b2c2d2e2f3031323335363738393d3f42434445474a4b4c4d4e4f505152545558596163#6466696a6b6c6e70717273747576797b7c7d7e7f8283868788898b8c8d8e909192,6020803d62c54e39535590f863b880c665e66c2e4f4660ee6de18bde5f3986cb5f536321515a83616863520063638e4850125c9b79775bfc52307a3b60bc905376d75f:b797,76848e6c706f767b7b4977aa51f3909358244f4e6ef48fea654c7b1b72c46da47fdf5ae162b55e95573084827b2c5e1d5f1f90127f1498a063826ec7789870b95178975b57ab75354f4375385e9760e659606dc06bbf788953fc96d551cb52016389540a94938c038dcc7239789f87768fed8c0d53e079:939495969798999b9c9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b6b7b8bcbfc2c4c5c7c8cacccecfd0d3d4d6d7d9dadbdcdddee0e1e2e5e8ea#eceef1f2f3f4f5f6f7f9fafcfeff,7a:0104050708090a0c0f10111213151618191b1c,4e0176ef53ee948998769f0e952d5b9a8ba24e:221c,51ac846361c252a8680b4f97606b51bb6d1e515c6296659796618c46901775d890fd77636bd272:8aec,8bfb583577798d4c675c9540809a5ea66e2159927aef77ed953b6bb565ad7f0e58065151961f5bf958a954288e726566987f56e4949d76fe9041638754c659:1a3a,579b8eb267358dfa8235524160f0581586fe5ce89e454fc4989d8bb95a2560765384627c904f9102997f6069800c513f80335c1499756d314e8c7a:1d1f21222425262728292a2b2c2d2e2f303132343536383a3e4041424344454748494a4b4c4d4e4f50525354555658595a5b5c5d5e5f606162636465666768#696a6b6c6d6e6f717273757b7c7d7e828587898a8b8c8e8f909394999a9b9ea1a2,8d3053d17f5a7b4f4f104e4f96006cd573d085e95e06756a7ffb6a0a77fe94927e4151e170e653cd8fd483038d2972af996d6cdb574a82b365b980aa623f963259a84eff8bbf7eba653e83f2975e556198de80a5532a8bfd542080ba5e9f6cb88d3982ac915a54296c1b52067eb7575f711a6c7e7c89594b4efd5fff61247caa4e305c0167ab87025cf0950b98ce75af70fd902251af7f1d8bbd594951e44f5b5426592b657780a45b7562:76c2,8f905e456c1f7b264f:0fd8,670d7a:a3a4a7a9aaabaeafb0b1b2b4b5b6b7b8b9babbbcbdbec0c1c2c3c4c5c6c7c8c9cacccdcecfd0d1d2d3d4d5d7d8dadbdcdde1e2e4e7e8e9eaebeceef0f1f2f3#f4f5f6f7f8fbfcfe,7b:0001020507090c0d0e1012131617181a1c1d1f21222327292d,6d:6eaa,798f88b15f17752b629a8f854fef91dc65a781:2f51,5e9c81508d74526f89868d4b590d50854ed8961c723681798d1f5bcc8ba3964459877f1a549056:760e,8be565396982949976d66e895e72751867:46d1,7aff809d8d76611f79c665628d635188521a94a27f38809b7eb25c976e2f67607bd9768b9ad8818f7f947cd5641e95507a3f54:4ae5,6b4c640162089e3d80f3759952729769845b683c86e496:0194,94ec4e2a54047ed968398ddf801566f45e9a7fb97b:2f303234353637393b3d3f404142434446484a4d4e535557595c5e5f61636465666768696a6b6c6d6f70737476787a7c7d7f81828384868788898a8b8c8e8f#9192939698999a9b9e9fa0a3a4a5aeafb0b2b3b5b6b7b9babbbcbdbebfc0c2c3c4,57c2803f68975de5653b529f606d9f9a4f9b8eac516c5bab5f135de96c5e62f18d21517194a952fe6c9f82df72d757a267848d2d591f8f9c83c754957b8d4f306cbd5b6459d19f1353e486ca9aa88c3780a16545987e56fa96c7522e74dc52505be1630289024e5662d0602a68fa51735b9851a089c27ba199867f5060ef704c8d2f51495e7f901b747089c4572d78455f529f9f95fa8f689b3c8be17678684267dc8d:ea35,523d8f8a6eda68cd950590ed56fd679c88f98fc754c87b:c5c8c9cacbcdcecfd0d2d4d5d6d7d8dbdcdedfe0e2e3e4e7e8e9ebecedeff0f2f3f4f5f6f8f9fafbfdff,7c:0001020304050608090a0d0e101112131415171819#1a1b1c1d1e20212223242528292b2c2d2e2f3031323334353637393a3b3c3d3e42,9ab85b696d776c264ea55bb39a87916361a890af97e9542b6db55bd251fd558a7f:55f0,64bc634d65f161be608d710a6c:5749,592f676d822a58d5568e8c6a6beb90dd597d801753f76d695475559d83:77cf,683879be548c4f55540876d28c8996026cb36db88d6b89109e648d3a563f9ed175d55f8872e0606854fc4ea86a2a886160528f7054c470d886799e3f6d2a5b8f5f187ea255894faf7334543c539a501954:0e7c,4e4e5ffd745a58f6846b80e1877472d07cca6e567c:434445464748494a4b4c4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717275767778797a7e7f8081828384858687#888a8b8c8d8e8f90939496999a9ba0a1a3a6a7a8a9abacadafb0b4b5b6b7b8babb,5f27864e552c62a44e926caa623782b154d7534e733e6ed1753b521253168bdd69d05f8a60006dee574f6b2273af68538fd87f13636260a3552475ea8c6271156da35ba65e7b8352614c9ec478fa87577c27768751f060f6714c66435e4c604d8c0e707063258f895fbd606286d456de6bc160946167534960e066668d3f79fd4f1a70e96c478b:b3f2,7ed88364660f5a5a9b426d:51f7,8c416d3b4f19706b83b7621660d1970d8d27797851fb57:3efa,673a75787a3d79ef7b957c:bfc0c2c3c4c6c9cbcecfd0d1d2d3d4d8dadbdddee1e2e3e4e5e6e7e9eaebecedeef0f1f2f3f4f5f6f7f9fafcfdfeff,7d:000102030405060708090b0c0d0e0f10#1112131415161718191a1b1c1d1e1f212324252628292a2c2d2e30313233343536,808c99658ff96fc08ba59e2159ec7ee97f095409678168d88f917c4d96c653ca602575be6c7253735ac97ea7632451e0810a5df184df628051805b634f0e796d524260b86d4e5b:c4c2,8b:a1b0,65e25fcc964559937e:e7aa,560967b759394f735bb652a0835a988a8d3e753294be50477a3c4ef767b69a7e5ac16b7c76d1575a5c167b3a95f4714e517c80a9827059787f04832768c067ec78:b177,62e363617b804fed526a51cf835069db92748d:f531,89c1952e7bad4ef67d:3738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6f70717273747576#78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798,506582305251996f6e:1085,6da75efa50f559dc5c066d466c5f7586848b686859568bb253209171964d854969127901712680f64ea490ca6d479a845a0756bc640594f077eb4fa5811a72e189d2997a7f347ede527f655991758f:7f83,53eb7a9663:eda5,768679f888579636622a52ab8282685467706377776b7aed6d017ed389e359d0621285c982a5754c501f4ecb75a58beb5c4a5dfe7b4b65a491d14eca6d25895f7d2795264ec58c288fdb9773664b79818fd170ec6d787d:999a9b9c9d9e9fa0a1a2a3a4a5a7a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9#dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa,5c3d52b283465162830e775b66769cb84eac60ca7c:beb3,7ecf4e958b66666f988897595883656c955c5f8475c997567a:dfde,51c070af7a9863ea7a767ea0739697ed4e4570784e5d915253a965:51e7,81fc8205548e5c31759a97a062d872d975bd5c459a7983ca5c40548077e94e3e6cae805a62d2636e5de851778ddd8e1e952f4ff153e560e770ac526763509e435a1f5026773753777ee26485652b628963985014723589c951b38bc07edd574783cc94a7519b541b5cfb7d:fbfcfdfeff,7e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839#3a3c3d3e3f40424344454648494a4b4c4d4e4f505152535455565758595a5b5c5d,4fca7ae36d5a90e19a8f55805496536154af5f0063e9697751ef6168520a582a52d8574e780d770b5eb761777ce062:5b97,4ea27095800362f770e49760577782db67ef68f578d5989779d158f354b353ef6e34514b523b5ba28bfe80af554357a660735751542d7a7a60505b5463a762a053e362635bc767af54ed7a9f82e691775e9388e4593857ae630e8de880ef57577b774fa95feb5bbd6b3e53217b5072c2684677:ff36,65f751b54e8f76d45cbf7aa58475594e9b4150807e:5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f909192939495969798999a9c9d9e#aeb4bbbcd6e4ecf9,7f:0a101e37393b3c3d3e3f404143464748494a4b4c4d4e4f5253,998861276e8357646606634656f062:ec69,5ed39614578362c955878721814a8fa3556683b167658d5684dd5a6a680f62e67bee961151706f9c8c3063fd89c861d27f0670c26ee57405699472fc5eca90ce67176d6a635e52b3726280014f6c59e5916a70d96d9d52d24e5096f7956d857e78ca7d2f5121579264c2808b7c7b6cea68f1695e51b7539868a872819ece7bf172f879bb6f137406674e91cc9ca4793c83:8954,540f68174e3d538952b1783e5386522950884f:8bd0,7f:56595b5c5d5e6063646566676b6c6d6f7073757677787a7b7c7d7f8082838485868788898b8d8f9091929395969798999b9ca0a2a3a5a6a8a9aaabacadaeb1#b3b4b5b6b7babbbec0c2c3c4c6c7c8c9cbcdcfd0d1d2d3d6d7d9dadbdcdddee2e3,75e27acb7c926ca596b6529b748354e94fe9805483b28fde95705ec9601c6d9f5e18655b813894fe604b70bc7ec37cae51c968817cb1826f4e248f8691cf667e4eae8c0564a9804a50da759771ce5be58fbd6f664e86648295635ed66599521788c270c852a3730e7433679778f797164e3490bb9cde6dcb51db8d41541d62ce73b283f196f69f8494c34f367f9a51cc707596755cad988653e64ee46e9c740969b4786b998f7559521876246d4167f3516d9f99804b54997b3c7abf7f:e4e7e8eaebecedeff2f4f5f6f7f8f9fafdfeff,80:020708090a0e0f11131a1b1d1e1f2123242b2c2d2e2f303234393a3c3e404144454748494e4f505153555657#595b5c5d5e5f6061626364656667686b6c6d6e6f7072737475767778797a7b7c7d,9686578462e29647697c5a0464027bd36f0f964b82a6536298855e90708963b35364864f9c819e93788c97328d:ef42,9e7f6f5e79845f559646622e9a74541594dd4fa365c55c:6561,7f1586516c2f5f8b73876ee47eff5ce6631b5b6a6ee653754e7163a0756562a18f6e4f264ed16ca67eb68bba841d87ba7f57903b95237ba99aa188f8843d6d1b9a867edc59889ebb739b780186829a:6c82,561b541757cb4e709ea653568fc881097792999286ee6ee1851366fc61626f2b80:7e818285888a8d8e8f909192949597999ea3a6a7a8acb0b3b5b6b8b9bbc5c7c8c9cacbcfd0d1d2d3d4d5d8dfe0e2e3e6eef5f7f9fbfeff,81:000103040507080b#0c1517191b1c1d1f202122232425262728292a2b2d2e3033343537393a3b3c3d3f,8c298292832b76f26c135fd983bd732b8305951a6bdb77db94c6536f830251925e3d8c8c8d384e4873ab679a68859176970971646ca177095a9295416bcf7f8e66275bd059b95a9a95:e8f7,4eec84:0c99,6aac76df9530731b68a65b5f772f919a97617cdc8ff78c1c5f257c7379d889c56ccc871c5bc65e4268c977207ef551:954d,52c95a297f05976282d763cf778485d079d26e3a5e9959998511706d6c1162bf76bf654f60af95fd660e879f9e2394ed54:0d7d,8c2c647881:40414243444547494d4e4f525657585b5c5d5e5f6162636466686a6b6c6f727375767778818384858687898b8c8d8e90929394959697999a9e9fa0a1a2a4a5#a7a9abacadaeafb0b1b2b4b5b6b7b8b9bcbdbebfc4c5c7c8c9cbcdcecfd0d1d2d3,647986116a21819c78e864699b5462b9672b83ab58a89ed86cab6f205bde964c8c0b725f67d062c772614ea959c66bcd589366ae5e5552df6155672876ee776672677a4662ff54:ea50,94a090a35a1c7eb36c164e435976801059485357753796be56ca63208111607c95f96dd65462998151855ae980fd59ae9713502a6ce55c3c62df4f60533f817b90066eba852b62c85e7478be64b5637b5ff55a18917f9e1f5c3f634f80425b7d556e95:4a4d,6d8560a867e072de51dd5b8181:d4d5d6d7d8d9dadbdcdddedfe0e1e2e4e5e6e8e9ebeeeff0f1f2f5f6f7f8f9fafdff,82:030708090a0b0e0f111315161718191a1d2024252627292e323a3c3d3f#404142434546484a4c4d4e5051525354555657595b5c5d5e606162636465666769,62e76cde725b626d94ae7ebd81136d53519c5f04597452aa6012597366968650759f632a61e67cef8bfa54e66b279e256bb485d5545550766ca4556a8db4722c5e156015743662cd6392724c5f986e436d3e65006f5876d878d076fc7554522453db4e535e9e65c180:2ad6,629b5486522870ae888d8dd16ce1547880da57f988f48d54966a914d4f696c9b55b776c6783062a870f96f8e5f6d84ec68da787c7bf781a8670b9e4f636778b0576f7812973962:79ab,528874356bd782:6a6b6c6d71757677787b7c808183858687898c90939495969a9b9ea0a2a3a7b2b5b6babbbcbfc0c2c3c5c6c9d0d6d9dadde2e7e8e9eaecedeef0f2f3f5f6f8#fafcfdfeff,83:000a0b0d1012131618191d1e1f20212223242526292a2e3032373b3d,5564813e75b276ae533975de50fb5c418b6c7bc7504f72479a9798d86f0274e27968648777a562fc98918d2b54c180584e52576a82f9840d5e7351ed74f68bc45c4f57616cfc98875a4678349b448feb7c955256625194fa4ec68386846183e984b257d467345703666e6d668c3166dd7011671f6b3a6816621a59bb4e0351c46f0667d26c8f517668cb59476b6775665d0e81109f5065d779:4841,9a918d775c824e5e4f01542f5951780c56686c148fc45f036c:7de3,8bab639083:3e3f41424445484a4b4c4d4e5355565758595d6270717273747576797a7e7f808182838487888a8b8c8d8f909194959697999a9d9fa1a2a3a4a5a6a7acadae#afb5bbbebfc2c3c4c6c8c9cbcdced0d1d2d3d5d7d9dadbdee2e3e4e6e7e8ebeced,60706d3d7275626694:8ec5,53438fc17b7e4edf8c264e7e9ed494:b1b3,524d6f5c90636d458c3458115d4c6b:2049,67aa545b81547f8c589985375f3a62a26a47953965726084686577a74e544fa85de7979864ac7fd85ced4fcf7a8d520783044e14602f7a8394a64fb54eb279e6743452e482b964d279bd5bdd6c8197528f7b6c22503e537f6e0564ce66746c3060c598778bf75e86743c7a7779cb4e1890b174036c4256da914b6cc58d8b533a86c666f28eaf5c489a716e2083:eeeff3f4f5f6f7fafbfcfeff,84:0002050708090a10121314151617191a1b1e1f20212223292a2b2c2d2e2f30323334353637393a3b3e3f404142434445474849#4a4b4c4d4e4f505253545556585d5e5f606264656667686a6e6f70727477797b7c,53d65a369f8b8da353bb570898a76743919b6cc9516875ca62f372ac52:389d,7f3a7094763853749e4a69b7786e96c088d97fa471:36c3,518967d374e458e4651856b78ba9997662707ed560f970ed58ec4e:c1ba,5fcd97e74efb8ba45203598a7eab62544ecd65e5620e833884c98363878d71946eb65bb97ed2519763c967d480898339881551125b7a59828fb14e736c5d516589258f6f962e854a745e95:10f0,6da682e55f3164926d128428816e9cc3585e8d5b4e0953c184:7d7e7f8081838485868a8d8f90919293949596989a9b9d9e9fa0a2a3a4a5a6a7a8a9aaabacadaeb0b1b3b5b6b7bbbcbec0c2c3c5c6c7c8cbcccecfd2d4d5d7#d8d9dadbdcdee1e2e4e7e8e9eaebedeeeff1f2f3f4f5f6f7f8f9fafbfdfe,85:000102,4f1e6563685155d34e2764149a9a626b5ac2745f82726da968ee50e7838e7802674052396c997eb150bb5565715e7b5b665273ca82eb67495c715220717d886b95ea965564c58d6181b355846c5562477f2e58924f2455468d4f664c4e0a5c1a88f368a2634e7a0d70e7828d52fa97f65c1154e890b57ecd59628d4a86c782:0c0d,8d6664445c0461516d89793e8bbe78377533547b4f388eab6df15a207ec5795e6c885ba15a76751a80be614e6e1758f075:1f25,727253477ef385:030405060708090a0b0d0e0f101214151618191b1c1d1e2022232425262728292a2d2e2f303132333435363e3f404142444546474b4c4d4e4f505152535455#57585a5b5c5d5f60616263656667696a6b6c6d6e6f707173757677787c7d7f8081,770176db526980dc57235e08593172ee65bd6e7f8bd75c388671534177f362fe65f64ec098df86805b9e8bc653f277e24f7f5c4e9a7659cb5f0f793a58eb4e1667ff4e8b62ed8a93901d52bf662f55dc566c90024ed54f8d91ca99706c0f5e0260435ba489c68bd56536624b99965b:88ff,6388552e53d77626517d852c67a268b36b8a62928f9353d482126dd1758f4e668d4e5b70719f85af66:91d9,7f7287009ecd9f205c5e672f8ff06811675f620d7ad658855eb665706f3185:82838688898a8b8c8d8e909192939495969798999a9d9e9fa0a1a2a3a5a6a7a9abacadb1b2b3b4b5b6b8babbbcbdbebfc0c2c3c4c5c6c7c8cacbcccdced1d2#d4d6d7d8d9dadbdddedfe0e1e2e3e5e6e7e8eaebecedeeeff0f1f2f3f4f5f6f7f8,60555237800d6454887075295e05681362f4971c53cc723d8c016c3477617a0e542e77ac987a821c8bf47855671470c165af64955636601d79c153f84e1d6b7b80865bfa55e356db4f:3a3c,99725df3677e80386002988290015b8b8b:bcf5,641c825864de55fd82cf91654fd77d20901f7c9f50f358516eaf5bbf8bc980839178849c7b97867d96:8b8f,7ee59ad3788e5c817a57904296a7795f5b59635f7b0b84d168ad55067f2974107d2295016240584c4ed65b835979585485:f9fafcfdfe,86:0001020304060708090a0b0c0d0e0f10121314151718191a1b1c1d1e1f20212223242526282a2b2c2d2e2f3031323334353637393a3b3d3e3f40#4142434445464748494a4b4c525355565758595b5c5d5f6061636465666768696a,736d631e8e:4b0f,80ce82d462ac53f06cf0915e592a60016c70574d644a8d2a762b6ee9575b6a8075f06f6d8c:2d08,57666bef889278b363a253f970ad6c645858642a580268e0819b55107cd650188eba6dcc8d9f70eb638f6d9b6ed47ee68404684390036dd896768ba85957727985e4817e75bc8a8a68af52548e22951163d098988e44557c4f5366ff568f60d56d9552435c4959296dfb586b75:301c,606c82148146631167618fe2773a8d:f334,94c15e165385542c70c386:6d6f7072737475767778838485868788898e8f90919294969798999a9b9e9fa0a1a2a5a6abadaeb2b3b7b8b9bbbcbdbebfc1c2c3c5c8cccdd2d3d5d6d7dadc#dde0e1e2e3e5e6e7e8eaebeceff5f6f7fafbfcfdff,87:010405060b0c0e0f10111416,6c405ef7505c4ead5ead633a8247901a6850916e77b3540c94dc5f647ae5687663457b527edf75db507762955934900f51f879c37a8156fe5f9290146d825c60571f541051546e4d56e263a89893817f8715892a9000541e5c6f81c062:d658,81319e3596409a:6e7c,692d59a562d3553e631654c786d96d3c5a0374e6889c6b6a59168c4c5f2f6e7e73a9987d4e3870f75b8c7897633d665a769660cb5b9b5a494e0781556c6a738b4ea167897f515f8065fa671b5fd859845a0187:191b1d1f20242627282a2b2c2d2f303233353638393a3c3d404142434445464a4b4d4f505152545556585a5b5c5d5e5f6162666768696a6b6c6d6f71727375#7778797a7f8081848687898a8c8e8f90919294959698999a9b9c9d9ea0a1a2a3a4,5dcd5fae537197e68fdd684556f4552f60df4e3a6f4d7ef482c7840e59d44f:1f2a,5c3e7eac672a851a5473754f80c355829b4f4f4d6e2d8c135c096170536b761f6e29868a658795fb7eb9543b7a337d0a95ee55e17fc174ee631d87176da17a9d621165a1536763e16c835deb545c94a84e4c6c618bec5c4b65e0829c68a754:3e34,6b:cb66,4e9463425348821e4f:0dae,575e620a96fe6664726952:ffa1,609f8bef661471996790897f785277fd6670563b54389521727a87:a5a6a7a9aaaeb0b1b2b4b6b7b8b9bbbcbebfc1c2c3c4c5c7c8c9cccdcecfd0d4d5d6d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedeff0f1f2f3f4f5f6f7f8#fafbfcfdff,88:0001020405060708090b0c0d0e0f101112141718191a1c1d1e1f2023,7a00606f5e0c6089819d591560dc718470ef6eaa6c5072806a8488ad5e2d4e605ab3559c94e36d177cfb9699620f7ec6778e867e5323971e8f9666875ce14fa072ed4e0b53a6590f54136380952851484ed99c9c7ea454b88d248854823795f26d8e5f265acc663e966973:b02e,53bf817a99857fa15baa96:7750,7ebf76f853a2957699997bb189446e584e617fd479658be660f354cd4eab98795df76a6150cf54118c618427785d9704524a54ee56a395006d885bb56dc6665388:2425262728292a2b2c2d2e2f30313334353637383a3b3d3e3f414243464748494a4b4e4f505152535556585a5b5c5d5e5f6066676a6d6f717374757678797a#7b7c80838687898a8c8e8f90919394959798999a9b9d9e9fa0a1a3a5a6a7a8a9aa,5c0f5b5d6821809655787b11654869544e9b6b47874e978b534f631f643a90aa659c80c18c10519968b0537887f961c86c:c4fb,8c225c5185aa82af950c6b238f9b65b05f:fbc3,4fe18845661f8165732960fa51745211578b5f6290a2884c91925e78674f602759d351:44f6,80f853086c7996c4718a4f:11ee,7f9e673d55c5950879c088967ee3589f620c9700865a5618987b5f908bb884c4915753d965ed5e8f755c60647d6e5a7f7e:eaed,8f6955a75ba360ac65cb738488:acaeafb0b2b3b4b5b6b8b9babbbdbebfc0c3c4c7c8cacbcccdcfd0d1d3d6d7dadbdcdddee0e1e6e7e9eaebecedeeeff2f5f6f7fafbfdff,89:0001030405060708#090b0c0d0e0f1114151617181c1d1e1f20222324262728292c2d2e2f3132333537,9009766377297eda9774859b5b667a7496ea884052cb718f5faa65ec8be25bfb9a6f5de16b896c5b8b:adaf,900a8fc5538b62bc9e:262d,54404e2b82bd7259869c5d1688596daf96c554d14e9a8bb6710954bd960970df6df976d04e25781487125ca95ef68a00989c960e708e6cbf594463a9773c884d6f148273583071d5538c781a96c155015f6671305bb48c1a9a8c6b83592e9e2f79e76768626c4f6f75a17f8a6d0b96336c274ef075d2517b68376f3e908081705996747689:38393a3b3c3d3e3f40424345464748494a4b4c4d4e4f505152535455565758595a5b5c5d6061626364656768696a6b6c6d6e6f707172737475767778797a7c#7d7e808284858788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1,64475c2790657a918c2359da54ac8200836f898180006930564e8036723791ce51b64e5f987563964e1a53f666f3814b591c6db24e0058f9533b63d694f14f:9d0a,886398905937905779fb4eea80f075916c825b9c59e85f5d69058681501a5df24e5977e34ee5827a6291661390915c794ebf5f7981c69038808475ab4ea688d4610f6bc55fc64e4976ca6ea28b:e3ae,8c0a8bd15f027f:fccc,7ece83:356b,56e06bb797f3963459fb541f94f66deb5bc5996e5c395f15969089:a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c3cdd3d4d5d7d8d9dbdddfe0e1e2e4e7e8e9eaecedeef0f1f2f4f5f6f7f8f9fa#fbfcfdfeff,8a:01020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d,537082f16a315a749e705e947f2883b984:2425,836787478fce8d6276c85f719896786c662054df62e54f6381c375c85eb896cd8e0a86f9548f6cf36d8c6c38607f52c775285e7d4f1860a05fe75c24753190ae94c072b96cb96e389149670953:cbf3,4f5191c98bf153c85e7c8fc26de44e8e76c26986865e611a82064f:59de,903e9c7c61096e:1d14,96854e885a3196e84e0e5c7f79b95b878bed7fbd738957df828b90c15401904755bb5cea5fa161086b3272f180b28a:891e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f4041424344454647494a4b4c4d4e4f505152535455565758595a5b5c5d5e#5f606162636465666768696a6b6c6d6e6f7071727374757677787a7b7c7d7e7f80,6d745bd388d598848c6b9a6d9e336e0a51:a443,57a38881539f63f48f9556ed54585706733f6e907f188fdc82d1613f6028966266f07ea68d:8ac3,94a55cb37ca4670860a6960580184e9190e75300966851418fd08574915d665597f55b55531d78386742683d54c9707e5bb08f7d518d572854b1651266828d:5e43,810f846c906d7cdf51ff85fb67a365e96fa186a48e81566a90207682707671e58d2362e952196cfd8d3c600e589e618e66fe8d60624e55b36e23672d8f678a:81828384858687888b8c8d8e8f9091929495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3,94e195f87728680569a8548b4e4d70b88bc86458658b5b857a84503a5be877bb6be18a797c986cbe76cf65a98f975d2d5c5586386808536062187ad96e5b7efd6a1f7ae05f706f335f20638c6da867564e085e108d264ed780c07634969c62db662d627e6cbc8d7571677f695146808753ec906e629854f286f08f998005951785178fd96d5973cd659f771f7504782781fb8d1e94884fa6679575b98bca9707632f9547963584b8632377415f8172f04e896014657462ef6b63653f8a:e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8b:0001020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#24252728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,5e2775c790d18bc1829d679d652f5431871877e580a281026c414e4b7ec7804c76f4690d6b966267503c4f84574063076b628dbe53ea65e87eb85fd763:1ab7,81:f3f4,7f6e5e1c5cd95236667a79e97a1a8d28709975d46ede6cbb7a924e2d76c55fe0949f88777ec879cd80bf91cd4ef24f17821f54685dde6d328bcc7ca58f7480985e1a549276b15b99663c9aa473e0682a86db6731732a8b:f8db,90107af970db716e62c477a956314e3b845767f152a986c08d2e94f87b518b:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656768696a6b6d6e6f707172737475767778797a7b7c7d7e7f80818283848586#8788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9facb1bbc7d0ea,8c:091e,4f4f6ce8795d9a7b6293722a62fd4e1378168f6c64b08d5a7bc668695e8488c55986649e58ee72b6690e95258ffd8d5857607f008c0651c6634962d95353684c74228301914c55447740707c6d4a517954a88d4459ff6ecb6dc45b5c7d2b4ed47c7d6ed35b5081ea6e0d5b579b0368d58e2a5b977efc603b7eb590b98d70594f63cd79df8db3535265cf79568bc5963b7ec494bb7e825634918967007f6a5c0a907566285de64f5067de505a4f5c57505e:a7#3$,8c:38393a3b3c3d3e3f4042434445484a4b4d4e4f5051525354565758595b5c5d5e5f60636465666768696c6d6e6f707172747576777b7c7d7e7f808183848687#888b8d8e8f90919293959697999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacad,4e:8d0c,51404e105eff53454e:15981e,9b325b6c56694e2879ba4e3f53154e47592d723b536e6c1056df80e499976bd3777e9f174e:369f,9f104e:5c6993,82885b5b556c560f4ec453:8d9da3a5ae,97658d5d53:1af5262e3e,8d5c53:6663,52:02080e2d333f404c5e615c,84af52:7d82819093,51827f544e:bbc3c9c2e8e1ebde,4f1b4ef34f:2264,4ef54f:2527092b5e67,65384f:5a5d,8c:aeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebec#edeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8d:000102030405060708090a0b0c0d,4f:5f57323d76749189838f7e7baa7cac94e6e8eac5dae3dcd1dff8,50:294c,4ff350:2c0f2e2d,4ffe50:1c0c25287e4355484e6c7ba5a7a9bad6,510650:edece6ee,51:070b,4edd6c3d4f:5865ce,9fa06c467c74516e5dfd9ec999985181591452f9530d8a07531051eb591951554ea051564eb388:6ea4,4eb5811488d279805b3488037fb851:abb1bdbc,8d:0e0f101112131415161718191a1b1c205152575f6568696a6c6e6f717278797a7b7c7d7e7f808283868788898c8d8e8f90929395969798999a9b9c9d9ea0a1#a2a4a5a6a7a8a9aaabacadaeafb0b2b6b7b9bbbdc0c1c2c5c7c8c9cacdd0d2d3d4,51:c796a2a5,8b:a0a6a7aab4b5b7c2c3cbcfced2d3d4d6d8d9dcdfe0e4e8e9eef0f3f6f9fcff,8c:000204070c0f1112141516191b181d1f202125272a2b2e2f32333536,53:697a,96:1d2221312a3d3c4249545f676c7274888d97b0,90:979b9d99aca1b4b3b6ba,8d:d5d8d9dce0e1e2e5e6e7e9edeef0f1f2f4f6fcfeff,8e:00010203040607080b0d0e1011121315161718191a1b1c202124252627282b2d303233343637383b3c3e#3f4345464c4d4e4f505354555657585a5b5c5d5e5f60616263646567686a6b6e71,90:b8b0cfc5bed0c4c7d3e6e2dcd7dbebeffe,91:04221e23312f394346,520d594252:a2acadbe,54ff52:d0d6f0,53df71ee77cd5ef451:f5fc,9b2f53b65f01755a5def57:4ca9a1,58:7ebcc5d1,57:292c2a33392e2f5c3b4269856b867c7b686d7673ada48cb2cfa7b493a0d5d8dad9d2b8f4eff8e4dd,8e:73757778797a7b7d7e808283848688898a8b8c8d8e91929395969798999a9b9d9fa0a1a2a3a4a5a6a7a8a9aaadaeb0b1b3b4b5b6b7b8b9bbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4,58:0b0d,57:fded,58:001e194420656c81899a80,99a89f1961ff82:797d7f8f8aa8848e919799abb8beb0c8cae398b7aecbccc1a9b4a1aa9fc4cea4e1,830982:f7e4,83:0f07,82:dcf4d2d8,830c82:fbd3,83:111a061415,82:e0d5,83:1c515b5c08923c34319b5e2f4f47435f4017602d3a336665,8e:e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8f:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344,83:681b696c6a6d6eb078b3b4a0aa939c857cb6a97db87b989ea8babcc1,840183:e5d8,580784:180b,83:ddfdd6,84:1c381106,83:d4df,84:0f03,83:f8f9eac5c0,842683:f0e1,84:5c515a597387887a89783c4669768c8e316dc1cdd0e6bdd3cabfbae0a1b9b497e5e3,850c750d853884f085:391f3a,8f:45464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656a808c929da0a1a2a4a5a6a7aaacadaeafb2b3b4b5b7b8babbbcbfc0c3c6#c9cacbcccdcfd2d6d7dae0e1e3e7eceff1f2f4f5f6fafbfcfeff,90:07080c0e131518,85:563b,84:fffc,85:594868645e7a,77a285:43727ba4a8878f79ae9c85b9b7b0d3c1dcff,86:270529163c,5efe5f0859:3c41,803759:555a58,530f5c:22252c34,62:4c6a9fbbcadad7ee,632262f663:394b43adf6717a8eb46dac8a69aebcf2f8e0ffc4dece,645263:c6be,64:45410b1b200c26215e846d96,90:191c2324252728292a2b2c303132333437393a3d3f4043454648494a4b4c4e545556595a5c5d5e5f6061646667696a6b6c6f70717273767778797a7b7c7e81#84858687898a8c8d8e8f90929496989a9c9e9fa0a4a5a7a8a9abadb2b7bcbdbfc0,64:7ab7b899bac0d0d7e4e2,65:09252e,5f:0bd2,75195f1153:5ff1fde9e8fb,54:1216064b5253545643215759233282947771649a9b8476669dd0adc2b4d2a7a6d3d472a3d5bbbfccd9dadca9aaa4ddcfde,551b54e7552054fd551454f355:22230f11272a678fb5496d41553f503c,90:c2c3c6c8c9cbcccdd2d4d5d6d8d9dadedfe0e3e4e5e9eaeceef0f1f2f3f5f6f7f9fafbfcff,91:00010305060708090a0b0c0d0e0f1011121314151617181a1b1c#1d1f20212425262728292a2b2c2d2e30323334353637383a3b3c3d3e3f40414244,55:375675767733305c8bd283b1b988819f7ed6917bdfbdbe9499eaf7c9,561f55:d1ebecd4e6ddc4efe5f2f3cccde8f5e4,8f9456:1e080c012423,55fe56:00272d5839572c4d62595c4c548664716b7b7c8593afd4d7dde1f5ebf9ff,57:040a091c,5e:0f191411313b3c,91:454748515354555658595b5c5f606667686b6d737a7b7c808182838486888a8e8f939495969798999c9d9e9fa0a1a4a5a6a7a8a9abacb0b1b2b3b6b7b8b9bb#bcbdbebfc0c1c2c3c4c5c6c8cbd0d2d3d4d5d6d7d8d9dadbdddedfe0e1e2e3e4e5,5e:3744545b5e61,5c:8c7a8d9096889899919a9cb5a2bdacabb1a3c1b7c4d2e4cbe5,5d:020327262e241e061b583e343d6c5b6f5d6b4b4a697482999d,8c735d:b7c5,5f:73778287898c95999ca8adb5bc,88625f6172:adb0b4b7b8c3c1cecdd2e8efe9f2f4f7,730172f3730372fa91:e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,92:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324#25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,72fb73:1713210a1e1d152239252c3831504d57606c6f7e,821b592598e759:2402,99:636768696a6b6c74777d8084878a8d9091939495,5e:80918b96a5a0b9b5beb3,8d535e:d2d1dbe8ea,81ba5f:c4c9d6cf,60035fee60045f:e1e4fe,60:0506,5f:eaedf8,60:1935261b0f0d292b0a3f2178797b7a42,92:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727375767778797a7b7c7d7e7f808182838485#868788898a8b8c8d8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7,60:6a7d969aad9d83928c9becbbb1ddd8c6dab4,61:20261523,60f461:000e2b4a75ac94a7b7d4f5,5fdd96b395:e9ebf1f3f5f6fcfe,96:030406080a0b0c0d0f12151617191a,4e2c723f62156c:35545c4aa38590948c6869747686a9d0d4adf7f8f1d7b2e0d6faebeeb1d3effe,92:a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8#e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,93:00010203040506070809,6d:39270c43480704190e2b4d2e351a4f525433916f9ea05e93945c607c63,6e1a6d:c7c5de,6e0e6d:bfe0,6e116d:e6ddd9,6e166dab6e0c6dae6e:2b6e4e6bb25f865354322544dfb198e0,6f2d6e:e2a5a7bdbbb7d7b4cf8fc29f,6f:6246472415,6ef96f:2f364b742a0929898d8c78727c7ad1,93:0a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f40414243444546474849#4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696b,6f:c9a7b9b6c2e1eedee0ef,70:1a231b39354f5e,5b:80849593a5b8,752f9a9e64345b:e4ee,89305bf08e478b078f:b6d3d5e5eee4e9e6f3e8,90:05040b26110d162135362d2f445152506858625b,66b990:747d8288838b,5f:50575658,5c3b54ab5c:5059,5b715c:6366,7fbc5f:2a292d,82745f3c9b3b5c6e59:81838da9aaa3,93:6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab#acadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cbcccd,59:97caab9ea4d2b2afd7be,5a:0506,59dd5a0859:e3d8f9,5a:0c09323411231340674a553c6275,80ec5a:aa9b777abeebb2d2d4b8e0e3f1d6e6d8dc,5b:091716323740,5c:151c,5b:5a6573515362,9a:7577787a7f7d808185888a90929396989b9c9d9fa0a2a3a5a7,7e:9fa1a3a5a8a9,93:cecfd0d1d2d3d4d5d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,94:000102030405060708090a0b0c0d#0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e,7e:adb0bec0c1c2c9cbccd0d4d7dbe0e1e8ebeeeff1f2,7f0d7e:f6fafbfe,7f:01020307080b0c0f111217191c1b1f212223242526272a2b2c2d2f3031323335,5e7a757f5ddb753e909573:8e91aea29fcfc2d1b7b3c0c9c8e5d9,987c740a73:e9e7debaf2,74:0f2a5b262528302e2c,94:2f303132333435363738393a3b3c3d3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6c6d6e6f#707172737475767778797a7b7c7d7e7f8081828384919698c7cfd3d4dae6fb,95:1c20,74:1b1a415c575559776d7e9c8e8081878b9ea8a990a7d2ba,97:eaebec,67:4c535e4869a5876a7398a775a89ead8b777cf0,680967d8680a67:e9b0,680c67:d9b5dab3dd,680067:c3b8e2,680e67:c1fd,68:323360614e624464831d55664167403e4a4929b58f7477936bc2,696e68fc69:1f20,68f995:27333d43484b555a606e74757778797a7b7c7d7e808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aa#abacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacb,692468f069:0b0157,68e369:10713960425d846b80987834cc8788ce896663799ba7bbabadd4b1c1cadf95e08dff,6a2f69ed6a:171865,69f26a:443ea0505b358e793d28587c9190a997ab,73:3752,6b:8182878492938d9a9ba1aa,8f:6b6d71727375767877797a7c7e818284878b,95:cccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7ecff,96:0713181b1e20232425262728292b2c2d2f303738393a3e41434a4e4f5152535657#58595a5c5d5e606365666b6d6e6f70717378797a7b7c7d7e7f808182838487898a,8f:8d8e8f989a,8ece62:0b171b1f222125242c,81e774:eff4ff,75:0f1113,65:34eeeff0,66:0a19,677266:031500,708566:f71d34313635,800666:5f54414f56615777848ca79dbedbdce6e9,8d:3233363b3d4045464849474d5559,89:c7cacbcccecfd0d1,72:6e9f5d666f7e7f848b8d8f92,63:0832b0,96:8c8e91929395969a9b9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb1b2b4b5b7b8babbbfc2c3c8cacbd0d1d3d4d6d7d8d9dadbdcdddedfe1e2e3e4e5e6e7eb#ecedeef0f1f2f4f5f8fafbfcfdff,97:0203050a0b0c10111214151718191a1b1d1f20,64:3fd8,80046b:eaf3fdf5f9,6c:0507060d1518191a2129242a32,65:35556b,72:4d525630,8662521680:9f9c93bc,670a80:bdb1abadb4b7e7e8e9eadbc2c4d9cdd7,671080:ddebf1f4ed,81:0d0e,80:f2fc,671581128c5a81:361e2c1832484c5374595a7160697c7d6d67,584d5ab581:888291,6ed581:a3aacc,672681:cabb,97:2122232425262728292b2c2e2f3133343536373a3b3c3d3f404142434445464748494a4b4c4d4e4f5051545557585a5c5d5f63646667686a6b6c6d6e6f7071#72757778797a7b7d7e7f8081828384868788898a8c8e8f9093959697999a9b9c9d,81:c1a6,6b:243739434659,98:d1d2d3d5d9da,6bb35f406bc289f365909f5165:93bcc6c4c3ccced2d6,70:809c969dbbc0b7abb1e8ca,71:1013162f31735c6845724a787a98b3b5a8a0e0d4e7f9,72:1d28,706c71:1866b9,62:3e3d434849,79:3b4046495b5c535a6257606f677a858a9aa7b3,5f:d1d0,97:9e9fa1a2a4a5a6a7a8a9aaacaeb0b1b3b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3#e4e5e8eeeff0f1f2f4f7f8f9fafbfcfdfeff,98:000102030405060708090a0b0c0d0e,60:3c5d5a67415963ab,61:060d5da99dcbd1,620680:807f,6c:93f6,6dfc77:f6f8,78:0009171811,65ab78:2d1c1d393a3b1f3c252c23294e6d56572650474c6a9b939a879ca1a3b2b9a5d4d9c9ecf2,790578f479:13241e34,9f9b9e:f9fbfc,76f177:040d,76f977:07081a22192d263538505147435a68,98:0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d#4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e,77:62657f8d7d808c919fa0b0b5bd,75:3a404e4b485b727983,7f:58615f,8a487f:68747179817e,76:cde5,883294:8586878b8a8c8d8f909497959a9b9ca3a4abaaadacafb0b2b4b6b7b8b9babcbdbfc4c8c9cacbcccdced0d1d2d5d6d7d9d8dbdedfe0e2e4e5e7e8ea,98:6f70717273748b8e929599a3a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcfd0d4d6d7dbdcdde0e1e2e3e4#e5e6e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,99:0001020304050607,94:e9ebeeeff3f4f5f7f9fcfdff,95:03020607090a0d0e0f1213141516181b1d1e1f222a2b292c3132343637383c3e3f4235444546494c4e4f525354565758595b5e5f5d61626465666768696a6b6c6f7172733a,77:e7ec,96c979:d5ede3eb,7a065d477a:03021e14,99:08090a0b0c0e0f1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2f303132333435363738393a3b3c3d3e3f40414243444546474849#4a4b4c4d4e4f50515253565758595a5b5c5d5e5f60616264667378797b7e828389,7a:393751,9ecf99a57a7076:888e9399a4,74:dee0,752c9e:202228292a2b2c3231363837393a3e414244464748494b4c4e5155575a5b5c5e63666768696a6b6c716d73,75:929496a09daca3b3b4b8c4b1b0c3c2d6cde3e8e6e4ebe7,760375:f1fcff,76:1000050c170a25181519,99:8c8e9a9b9c9d9e9fa0a1a2a3a4a6a7a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8#d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9,76:1b3c2220402d303f35433e334d5e545c566b6f,7fca7a:e6787980868895a6a0aca8adb3,88:6469727d7f82a2c6b7bcc9e2cee3e5f1,891a88:fce8fef0,89:2119131b0a342b3641667b,758b80e576:b2b4,77dc80:1214161c20222526272928310b3543464d526971,898398:788083,99:fafbfcfdfeff,9a:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738#393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859,98:898c8d8f949a9b9e9fa1a2a5a6,86:4d546c6e7f7a7c7ba88d8bac9da7a3aa93a9b6c4b5ceb0bab1afc9cfb4e9f1f2edf3d0,871386:def4dfd8d1,87:0307,86f887:080a0d09233b1e252e1a3e48343129373f82227d7e7b60704c6e8b53637c64596593afa8d2,9a:5a5b5c5d5e5f606162636465666768696a6b7283898d8e949599a6a9aaabacadaeafb2b3b4b5b9bbbdbebfc3c4c6c7c8c9cacdcecfd0d2d4d5d6d7d9dadbdc#dddee0e2e3e4e5e7e8e9eaeceef0f1f2f3f4f5f6f7f8fafcfdfeff,9b:000102040506,87:c68885ad9783abe5acb5b3cbd3bdd1c0cadbeae0ee,88:1613,87fe88:0a1b21393c,7f:36424445,82107a:fafd,7b:080304150a2b0f47382a192e31202524333e1e585a45754c5d606e7b62727190a6a7b8ac9da885aa9ca2abb4d1c1ccdddae5e6ea,7c0c7b:fefc,7c:0f160b,9b:07090a0b0c0d0e1011121415161718191a1b1c1d1e2021222425262728292a2b2c2d2e3031333435363738393a3d3e3f40464a4b4c4e50525355565758595a#5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b,7c:1f2a26384140,81fe82:010204,81ec884482:2122232d2f282b383b33343e44494b4f5a5f68,88:7e8588d8df,895e7f:9d9fa7afb0b2,7c7c65497c:919d9c9ea2b2bcbdc1c7cccdc8c5d7e8,826e66a87f:bfced5e5e1e6e9eef3,7cf87d:77a6ae,7e:479b,9e:b8b4,8d:73849491b1676d,8c:4749,91:4a504e4f64,9b:7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9ba#bbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadb,91:626170696f7d7e7274798c85908d91a2a3aaadaeafb5b4ba,8c559e7e8d:b8eb,8e:055969,8d:b5bfbcbac4d6d7dadececfdbc6ecf7f8e3f9fbe4,8e098dfd8e:141d1f2c2e232f3a4039353d3149414251524a70767c6f74858f94909c9e,8c:78828a859894,659b89:d6dedadc,9b:dcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9c:000102030405060708090a0b0c0d0e0f101112131415161718191a#1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b,89:e5ebef,8a3e8b26975396:e9f3ef,97:0601080f0e2a2d303e,9f:808385868788898a8c,9efe9f:0b0d,96:b9bcbdced2,77bf96e092:8eaec8,93:3e6aca8f,94:3e6b,9c:7f8285868788,7a239c:8b8e90919294959a9b9e9fa0a1a2a3a5a6a7a8a9abadaeb0b1b2b3b4b5b6b7babbbcbdc4c5c6c7cacb3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a#7b7d7e808384898a8c8f93969798999daaacafb9bebfc0c1c2c8c9d1d2dadbe0e1cccdcecfd0d3d4d5d7d8d9dcdddfe2,97:7c85919294afaba3b2b4,9a:b1b0b7,9e589a:b6babcc1c0c5c2cbccd1,9b:45434749484d51,98e899:0d2e5554,9a:dfe1e6efebfbedf9,9b:080f131f23,9e:bdbe,7e3b9e:8287888b92,93d69e:9d9fdbdcdde0dfe2e9e7e5eaef,9f:222c2f39373d3e44,9c:e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9d:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021#22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142#92$434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081#82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2#92$a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1#e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9e:000102#92$030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e24272e30343b3c404d5052535456595d5f606162656e6f727475767778797a7b7c7d80#8183848586898a8c8d8e8f90919495969798999a9b9c9ea0a1a2a3a4a5a7a8a9aa#92$abacadaeafb0b1b2b3b5b6b7b9babcbfc0c1c2c3c5c6c7c8cacbccd0d2d3d5d6d7d9dadee1e3e4e6e8ebecedeef0f1f2f3f4f5f6f7f8fafdff,9f:000102030405#060708090a0c0f1112141516181a1b1c1d1e1f21232425262728292a2b2d2e3031#92$3233343536383a3c3f4041424345464748494a4b4c4d4e4f52535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778#797a7b7c7d7e81828d8e8f9091929394959697989c9d9ea1a2a3a4a5,f9:2c7995e7f1#92$,fa:0c0d0e0f111314181f20212324272829,e8:15161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243#4445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364");
|
|
108
|
+
const dataText = this.handleText("4e:020405060f12171f20212326292e2f313335373c40414244464a5155575a5b6263646567686a6b6c6d6e6f727475767778797a7b7c7d7f808182838485878a#909697999c9d9ea3aaafb0b1b4b6b7b8b9bcbdbec8cccfd0d2dadbdce0e2e6e7e9edeeeff1f4f8f9fafcfe,4f:00020304050607080b0c12131415161c1d212328292c2d2e31333537393b3e3f40414244454748494a4b4c525456616266686a6b6d6e7172757778797a7d8081828586878a8c8e909293959698999a9c9e9fa1a2a4abadb0b1b2b3b4b6b7b8b9babbbcbdbec0c1c2c6c7c8c9cbcccdd2d3d4d5d6d9dbe0e2e4e5e7ebecf0f2f4f5f6f7f9fbfcfdff,50:000102030405060708090a#0b0e1011131516171b1d1e20222324272b2f303132333435363738393b3d3f404142444546494a4b4d5051525354565758595b5d5e5f6061626364666768696a6b6d6e6f70717273747578797a7c7d818283848687898a8b8c8e8f909192939495969798999a9b9c9d9e9fa0a1a2a4a6aaabadaeafb0b1b3b4b5b6b7b8b9bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdced0d1d2d3d4d5d7d8d9dbdcdddedfe0e1e2e3e4e5e8e9eaebeff0f1f2f4f6f7f8f9fafcfdfeff,51:00010203040508#090a0c0d0e0f1011131415161718191a1b1c1d1e1f2022232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e42474a4c4e4f5052535758595b5d5e5f606163646667696a6f727a7e7f838486878a8b8e8f90919394989a9d9e9fa1a3a6a7a8a9aaadaeb4b8b9babebfc1c2c3c5c8cacdced0d2d3d4d5d6d7d8d9dadcdedfe2e3e5e6e7e8e9eaeceef1f2f4f7fe,52:0405090b0c0f101314151c1e1f2122232526272a2c2f313234353c3e4445464748494b4e4f5253555758#595a5b5d5f6062636466686b6c6d6e7071737475767778797a7b7c7e808384858687898a8b8c8d8e8f91929495969798999a9ca4a5a6a7aeafb0b4b5b6b7b8b9babbbcbdc0c1c2c4c5c6c8cacccdcecfd1d3d4d5d7d9dadbdcdddee0e1e2e3e5e6e7e8e9eaebecedeeeff1f2f3f4f5f6f7f8fbfcfd,53:0102030407090a0b0c0e11121314181b1c1e1f2224252728292b2c2d2f3031323334353637383c3d404244464b4c4d505458595b5d65686a6c6d7276797b7c7d7e80818387888a8e8f#90919293949697999b9c9ea0a1a4a7aaabacadafb0b1b2b3b4b5b7b8b9babcbdbec0c3c4c5c6c7cecfd0d2d3d5dadcdddee1e2e7f4fafeff,54:000205070b1418191a1c2224252a303336373a3d3f4142444547494c4d4e4f515a5d5e5f6061636567696a6b6c6d6e6f7074797a7e7f8183858788898a8d919397989c9e9fa0a1a2a5aeb0b2b5b6b7b9babcbec3c5cacbd6d8dbe0e1e2e3e4ebeceff0f1f4f5f6f7f8f9fbfe,55:0002030405080a0b0c0d0e121315161718191a1c1d1e1f212526#28292b2d3234353638393a3b3d40424547484b4c4d4e4f515253545758595a5b5d5e5f60626368696b6f7071727374797a7d7f85868c8d8e9092939596979a9b9ea0a1a2a3a4a5a6a8a9aaabacadaeafb0b2b4b6b8babcbfc0c1c2c3c6c7c8cacbcecfd0d5d7d8d9dadbdee0e2e7e9edeef0f1f4f6f8f9fafbfcff,56:0203040506070a0b0d1011121314151617191a1c1d202122252628292a2b2e2f30333537383a3c3d3e404142434445464748494a4b4f5051525355565a5b5d5e5f6061#636566676d6e6f70727374757778797a7d7e7f80818283848788898a8b8c8d9091929495969798999a9b9c9d9e9fa0a1a2a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b8b9babbbdbebfc0c1c2c3c4c5c6c7c8c9cbcccdcecfd0d1d2d3d5d6d8d9dce3e5e6e7e8e9eaeceeeff2f3f6f7f8fbfc,57:00010205070b0c0d0e0f101112131415161718191a1b1d1e202122242526272b313234353637383c3d3f414344454648494b52535455565859626365676c6e707172747578797a7d7e7f80#818788898a8d8e8f90919495969798999a9c9d9e9fa5a8aaacafb0b1b3b5b6b7b9babbbcbdbebfc0c1c4c5c6c7c8c9cacccdd0d1d3d6d7dbdcdee1e2e3e5e6e7e8e9eaebeceef0f1f2f3f5f6f7fbfcfeff,58:0103040508090a0c0e0f101213141617181a1b1c1d1f222325262728292b2c2d2e2f31323334363738393a3b3c3d3e3f4041424345464748494a4b4e4f505253555657595a5b5c5d5f6061626364666768696a6d6e6f707172737475767778797a7b7c7d7f82848687888a8b8c#8d8e8f909194959697989b9c9da0a1a2a3a4a5a6a7aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbdbebfc0c2c3c4c6c7c8c9cacbcccdcecfd0d2d3d4d6d7d8d9dadbdcdddedfe0e1e2e3e5e6e7e8e9eaedeff1f2f4f5f7f8fafbfcfdfeff,59:000103050608090a0b0c0e1011121317181b1d1e2021222326282c30323335363b3d3e3f404345464a4c4d505253595b5c5d5e5f616364666768696a6b6c6d6e6f70717275777a7b7c7e7f8085898b8c8e8f90919495989a9b9c9d9fa0a1a2a6#a7acadb0b1b3b4b5b6b7b8babcbdbfc0c1c2c3c4c5c7c8c9cccdcecfd5d6d9dbdedfe0e1e2e4e6e7e9eaebedeeeff0f1f2f3f4f5f6f7f8fafcfdfe,5a:00020a0b0d0e0f101214151617191a1b1d1e2122242627282a2b2c2d2e2f3033353738393a3b3d3e3f414243444547484b4c4d4e4f5051525354565758595b5c5d5e5f60616364656668696b6c6d6e6f7071727378797b7c7d7e808182838485868788898a8b8c8d8e8f9091939495969798999c9d9e9fa0a1a2a3a4a5a6a7a8a9abac#adaeafb0b1b4b6b7b9babbbcbdbfc0c3c4c5c6c7c8cacbcdcecfd0d1d3d5d7d9dadbdddedfe2e4e5e7e8eaecedeeeff0f2f3f4f5f6f7f8f9fafbfcfdfeff,5b:0001020304050607080a0b0c0d0e0f10111213141518191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303133353638393a3b3c3d3e3f4142434445464748494a4b4c4d4e4f52565e606167686b6d6e6f7274767778797b7c7e7f82868a8d8e90919294969fa7a8a9acadaeafb1b2b7babbbcc0c1c3c8c9cacbcdcecf#d1d4d5d6d7d8d9dadbdce0e2e3e6e7e9eaebecedeff1f2f3f4f5f6f7fdfe,5c:0002030507080b0c0d0e10121317191b1e1f2021232628292a2b2d2e2f303233353637434446474c4d5253545657585a5b5c5d5f62646768696a6b6c6d70727374757677787b7c7d7e808384858687898a8b8e8f9293959d9e9fa0a1a4a5a6a7a8aaaeafb0b2b4b6b9babbbcbec0c2c3c5c6c7c8c9cacccdcecfd0d1d3d4d5d6d7d8dadbdcdddedfe0e2e3e7e9ebeceeeff1f2f3f4f5f6f7f8f9fafcfdfeff,5d:00#01040508090a0b0c0d0f10111213151718191a1c1d1f2021222325282a2b2c2f3031323335363738393a3b3c3f4041424344454648494d4e4f5051525354555657595a5c5e5f6061626364656667686a6d6e7071727375767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f9091929394959697989a9b9c9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b8b9babbbcbdbebfc0c1c2c3c4c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d7d8d9dadcdfe0e3e4eaeced#f0f5f6f8f9fafbfcff,5e:000407090a0b0d0e1213171e1f20212223242528292a2b2c2f303233343536393a3e3f404143464748494a4b4d4e4f50515253565758595a5c5d5f60636465666768696a6b6c6d6e6f70717577797e8182838588898c8d8e92989b9da1a2a3a4a8a9aaabacaeafb0b1b2b4babbbcbdbfc0c1c2c3c4c5c6c7c8cbcccdcecfd0d4d5d7d8d9dadcdddedfe0e1e2e3e4e5e6e7e9ebecedeeeff0f1f2f3f5f8f9fbfcfd,5f:050607090c0d0e10121416191a1c1d1e21222324#282b2c2e30323334353637383b3d3e3f4142434445464748494a4b4c4d4e4f5154595a5b5c5e5f60636567686b6e6f72747576787a7d7e7f83868d8e8f919394969a9b9d9e9fa0a2a3a4a5a6a7a9abacafb0b1b2b3b4b6b8b9babbbebfc0c1c2c7c8cacbced3d4d5dadbdcdedfe2e3e5e6e8e9eceff0f2f3f4f6f7f9fafc,60:0708090b0c10111317181a1e1f2223242c2d2e3031323334363738393a3d3e404445464748494a4c4e4f5153545657585b5c5e5f606165666e71727475777e80#8182858687888a8b8e8f909193959798999c9ea1a2a4a5a7a9aaaeb0b3b5b6b7b9babdbebfc0c1c2c3c4c7c8c9cccdcecfd0d2d3d4d6d7d9dbdee1e2e3e4e5eaf1f2f5f7f8fbfcfdfeff,61:02030405070a0b0c1011121314161718191b1c1d1e21222528292a2c2d2e2f303132333435363738393a3b3c3d3e4041424344454647494b4d4f50525354565758595a5b5c5e5f606163646566696a6b6c6d6e6f717273747678797a7b7c7d7e7f808182838485868788898a8c8d8f9091929395#969798999a9b9c9e9fa0a1a2a3a4a5a6aaabadaeafb0b1b2b3b4b5b6b8b9babbbcbdbfc0c1c3c4c5c6c7c9cccdcecfd0d3d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e7e8e9eaebecedeeeff0f1f2f3f4f6f7f8f9fafbfcfdfe,62:00010203040507091314191c1d1e2023262728292b2d2f303132353638393a3b3c424445464a4f50555657595a5c5d5e5f6061626465687172747577787a7b7d818283858687888b8c8d8e8f9094999c9d9ea3a6a7a9aaadaeafb0b2b3b4b6b7b8babec0c1#c3cbcfd1d5dddee0e1e4eaebf0f2f5f8f9fafb,63:00030405060a0b0c0d0f10121314151718191c2627292c2d2e30313334353637383b3c3e3f40414447484a51525354565758595a5b5c5d60646566686a6b6c6f707273747578797c7d7e7f81838485868b8d9193949597999a9b9c9d9e9fa1a4a6abafb1b2b5b6b9bbbdbfc0c1c2c3c5c7c8cacbccd1d3d4d5d7d8d9dadbdcdddfe2e4e5e6e7e8ebeceeeff0f1f3f5f7f9fafbfcfe,64:0304060708090a0d0e111215161718191a1d1f222324#252728292b2e2f3031323335363738393b3c3e404243494b4c4d4e4f505153555657595a5b5c5d5f60616263646566686a6b6c6e6f70717273747576777b7c7d7e7f8081838688898a8b8c8d8e8f90939497989a9b9c9d9fa0a1a2a3a5a6a7a8aaabafb1b2b3b4b6b9bbbdbebfc1c3c4c6c7c8c9cacbcccfd1d3d4d5d6d9dadbdcdddfe0e1e3e5e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,65:01020304050607080a0b0c0d0e0f10111314151617191a1b1c1d1e1f2021#222324262728292a2c2d30313233373a3c3d404142434446474a4b4d4e5052535457585a5c5f606164656768696a6d6e6f7173757678797a7b7c7d7e7f8081828384858688898a8d8e8f92949596989a9d9ea0a2a3a6a8aaacaeb1b2b3b4b5b6b7b8babbbebfc0c2c7c8c9cacdd0d1d3d4d5d8d9dadbdcdddedfe1e3e4eaebf2f3f4f5f8f9fbfcfdfeff,66:0104050708090b0d1011121617181a1b1c1e2122232426292a2b2c2e3032333738393a3b3d3f40424445464748494a4d4e505158#595b5c5d5e6062636567696a6b6c6d7172737578797b7c7d7f808183858688898a8b8d8e8f909293949598999a9b9c9e9fa0a1a2a3a4a5a6a9aaabacadafb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8dadedfe0e1e2e3e4e5e7e8eaebecedeeeff1f5f6f8fafbfd,67:010203040506070c0e0f1112131618191a1c1e20212223242527292e303233363738393b3c3e3f414445474a4b4d5254555758595a5b5d62636466676b6c6e717476#78797a7b7d8082838586888a8c8d8e8f9192939496999b9fa0a1a4a6a9acaeb1b2b4b9babbbcbdbebfc0c2c5c6c7c8c9cacbcccdced5d6d7dbdfe1e3e4e6e7e8eaebedeef2f5f6f7f8f9fafbfcfe,68:01020304060d1012141518191a1b1c1e1f20222324252627282b2c2d2e2f30313435363a3b3f474b4d4f52565758595a5b5c5d5e5f6a6c6d6e6f707172737578797a7b7c7d7e7f8082848788898a8b8c8d8e90919294959698999a9b9c9d9e9fa0a1a3a4a5a9aaabacaeb1b2b4b6b7b8#b9babbbcbdbebfc1c3c4c5c6c7c8cacccecfd0d1d3d4d6d7d9dbdcdddedfe1e2e4e5e6e7e8e9eaebecedeff2f3f4f6f7f8fbfdfeff,69:00020304060708090a0c0f11131415161718191a1b1c1d1e21222325262728292a2b2c2e2f313233353637383a3b3c3e4041434445464748494a4b4c4d4e4f50515253555658595b5c5f616264656768696a6c6d6f7072737475767a7b7d7e7f8183858a8b8c8e8f909192939697999a9d9e9fa0a1a2a3a4a5a6a9aaacaeafb0b2b3b5b6b8b9babcbd#bebfc0c2c3c4c5c6c7c8c9cbcdcfd1d2d3d5d6d7d8d9dadcdddee1e2e3e4e5e6e7e8e9eaebeceeeff0f1f3f4f5f6f7f8f9fafbfcfe,6a:000102030405060708090b0c0d0e0f10111213141516191a1b1c1d1e20222324252627292b2c2d2e30323334363738393a3b3c3f40414243454648494a4b4c4d4e4f515253545556575a5c5d5e5f60626364666768696a6b6c6d6e6f70727374757677787a7b7d7e7f81828385868788898a8b8c8d8f929394959698999a9b9c9d9e9fa1a2a3a4a5a6#a7a8aaadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,6b:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f252628292a2b2c2d2e2f303133343536383b3c3d3f4041424445484a4b4d4e4f5051525354555657585a5b5c5d5e5f606168696b6c6d6e6f7071727374757677787a7d7e7f808588#8c8e8f909194959798999c9d9e9fa0a2a3a4a5a6a7a8a9abacadaeafb0b1b2b6b8b9babbbcbdbec0c3c4c6c7c8c9caccced0d1d8dadcdddedfe0e2e3e4e5e6e7e8e9ecedeef0f1f2f4f6f7f8fafbfcfeff,6c:000102030408090a0b0c0e12171c1d1e2023252b2c2d31333637393a3b3c3e3f434445484b4c4d4e4f5152535658595a62636566676b6c6d6e6f71737577787a7b7c7f8084878a8b8d8e9192959697989a9c9d9ea0a2a8acafb0b4b5b6b7bac0c1c2c3c6c7c8cbcdcecfd1d2d8#d9dadcdddfe4e6e7e9ecedf2f4f9ff,6d:000203050608090a0d0f101113141516181c1d1f20212223242628292c2d2f30343637383a3f404244494c50555657585b5d5f6162646567686b6c6d707172737576797a7b7d7e7f8081838486878a8b8d8f9092969798999a9ca2a5acadb0b1b3b4b6b7b9babbbcbdbec1c2c3c8c9cacdcecfd0d2d3d4d5d7dadbdcdfe2e3e5e7e8e9eaedeff0f2f4f5f6f8fafdfeff,6e:0001020304060708090b0f12131518191b1c1e1f222627282a2c2e30313335#3637393b3c3d3e3f40414245464748494a4b4c4f5051525557595a5c5d5e606162636465666768696a6c6d6f707172737475767778797a7b7c7d8081828487888a8b8c8d8e91929394959697999a9b9d9ea0a1a3a4a6a8a9abacadaeb0b3b5b8b9bcbebfc0c3c4c5c6c8c9cacccdced0d2d6d8d9dbdcdde3e7eaebecedeeeff0f1f2f3f5f6f7f8fafbfcfdfeff,6f:000103040507080a0b0c0d0e101112161718191a1b1c1d1e1f212223252627282c2e303234353738393a3b3c3d3f404142#43444548494a4c4e4f5051525354555657595a5b5d5f60616364656768696a6b6c6f707173757677797b7d7e7f808182838586878a8b8f909192939495969798999a9b9d9e9fa0a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b7b8babbbcbdbebfc1c3c4c5c6c7c8cacbcccdcecfd0d3d4d5d6d7d8d9dadbdcdddfe2e3e4e5e6e7e8e9eaebecedf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,70:000102030405060708090a0b0c0d0e0f1012131415161718191c1d1e1f2021222425262728292a#2b2c2d2e2f30313233343637383a3b3c3d3e3f404142434445464748494a4b4d4e505152535455565758595a5b5c5d5f606162636465666768696a6e7172737477797a7b7d818283848687888b8c8d8f90919397989a9b9e9fa0a1a2a3a4a5a6a7a8a9aab0b2b4b5b6babebfc4c5c6c7c9cbcccdcecfd0d1d2d3d4d5d6d7dadcdddee0e1e2e3e5eaeef0f1f2f3f4f5f6f8fafbfcfeff,71:0001020304050607080b0c0d0e0f111214171b1c1d1e1f2021222324252728292a2b2c2d2e323334#353738393a3b3c3d3e3f4041424344464748494b4d4f505152535455565758595a5b5d5f6061626365696a6b6c6d6f707174757677797b7c7e7f8081828385868788898b8c8d8e909192939596979a9b9c9d9ea1a2a3a4a5a6a7a9aaabadaeafb0b1b2b4b6b7b8babbbcbdbebfc0c1c2c4c5c6c7c8c9cacbcccdcfd0d1d2d3d6d7d8d9dadbdcdddedfe1e2e3e4e6e8e9eaebecedeff0f1f2f3f4f5f6f7f8fafbfcfdfeff,72:0001020304050708090a0b0c0d0e0f101112131415161718191a#1b1c1e1f2021222324252627292b2d2e2f3233343a3c3e40414243444546494a4b4e4f505153545557585a5c5e60636465686a6b6c6d707173747677787b7c7d828385868788898c8e9091939495969798999a9b9c9d9ea0a1a2a3a4a5a6a7a8a9aaabaeb1b2b3b5babbbcbdbebfc0c5c6c7c9cacbcccfd1d3d4d5d6d8dadb#95$,30:000102,00b702:c9c7,00a830:0305,2014ff5e20:162618191c1d,30:141508090a0b0c0d0e0f16171011,00:b1d7f7,22:362728110f2a2908371aa52520,231222:992b2e614c483d1d606e6f64651e3534,26:4240,00b020:3233,2103ff0400a4ff:e0e1,203000a7211626:0605,25:cbcfcec7c6a1a0b3b2,203b21:92909193,30:13#95$,21:70717273747576777879#4$,24:88898a8b8c8d8e8f909192939495969798999a9b7475767778797a7b7c7d7e7f808182838485868760616263646566676869##,32:20212223242526272829##,21:606162636465666768696a6b#97$,ff:010203e505060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5de3#95$,30:4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293#106$a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6#103$,03:9192939495969798999a9b9c9d9e9fa0a1a3a4a5a6a7a8a9#6$b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c3c4c5c6c7c8c9#5$,fe:3536393a3f403d3e41424344##3b3c373831#3334#104$,04:10111213141501161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f#13$30313233343551363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f#11$,02:cacbd9,20:13152535,21:050996979899,22:151f23526667bf,25:505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727381828384858687#88898a8b8c8d8e8f939495bcbde2e3e4e5,2609229530:121d1e#9$,010100e101ce00e0011300e9011b00e8012b00ed01d000ec014d00f301d200f2016b00fa01d400f901:d6d8dadc,00:fcea,0251e7c701:4448,e7c802:61#2$,31:05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829#19$,30:212223242526272829,32a333:8e8f9c9d9ea1c4ced1d2d5,fe30ff:e2e4#,212132:31#,20:10#1$,30:fc9b9cfdfe069d9e,fe:494a4b4c4d4e4f50515254555657595a5b5c5d5e5f6061#626364656668696a6b,e7:e7e8e9eaebecedeeeff0f1f2f3,30:07#11$,25:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b#13$,72:dcdddfe2e3e4e5e6e7eaebf5f6f9fdfeff,73:00020405060708090b0c0d0f1011121418191a1f2023242627282d2f30323335363a3b3c3d404142434445464748#494a4b4c4e4f515354555658595a5b5c5d5e5f6162636465666768696a6b6e7071#92$72737475767778797a7b7c7d7f808182838586888a8c8d8f90929394959798999a9c9d9ea0a1a3a4a5a6a7a8aaacadb1b4b5b6b8b9bcbdbebfc1c3c4c5c6c7#cbccced2d3d4d5d6d7d8dadbdcdddfe1e2e3e4e6e8eaebeceeeff0f1f3f4f5f6f7#92$f8f9fafbfcfdfeff,74:0001020407080b0c0d0e1112131415161718191c1d1e1f2021232427292b2d2f31323738393a3b3d3e3f4042434445464748494a4b4c4d#4e4f505152535456585d606162636465666768696a6b6c6e6f717273747578797a#92$7b7c7d7f8284858688898a8c8d8f9192939495969798999a9b9d9fa0a1a2a3a4a5a6aaabacadaeafb0b1b2b3b4b5b6b7b8b9bbbcbdbebfc0c1c2c3c4c5c6c7#c8c9cacbcccdcecfd0d1d3d4d5d6d7d8d9dadbdddfe1e5e7e8e9eaebecedf0f1f2#92$f3f5f8f9fafbfcfdfe,75:0001020305060708090a0b0c0e1012141516171b1d1e202122232426272a2e3436393c3d3f414243444647494a4d5051525355565758#5d5e5f60616263646768696b6c6d6e6f7071737576777a7b7c7d7e808182848587#92$88898a8c8d8e909395989b9c9ea2a6a7a8a9aaadb6b7babbbfc0c1c6cbcccecfd0d1d3d7d9dadcdddfe0e1e5e9ecedeeeff2f3f5f6f7f8fafbfdfe,76:02040607#08090b0d0e0f11121314161a1c1d1e212327282c2e2f31323637393a3b3d414244#92$45464748494a4b4e4f50515253555758595a5b5d5f6061626465666768696a6c6d6e7071727374757677797a7c7f80818385898a8c8d8f9092949597989a9b#9c9d9e9fa0a1a2a3a5a6a7a8a9aaabacadafb0b3b5b6b7b8b9babbbcbdbec0c1c3,554a963f57c3632854ce550954c076:914c,853c77ee827e788d72319698978d6c285b894ffa630966975cb880fa684880ae660276ce51f9655671ac7ff1888450b2596561ca6fb382ad634c625253ed54277b06516b75a45df462d48dcb9776628a8019575d97387f627238767d67cf767e64464f708d2562dc7a17659173ed642c6273822c9881677f724862:6ecc,4f3474e3534a529e7eca90a65e2e6886699c81807ed168d278c5868c9551508d8c2482de80de53058912526576:c4c7c9cbccd3d5d9dadcdddee0e1e2e3e4e6e7e8e9eaebecedf0f3f5f6f7fafbfdff,77:00020305060a0c0e0f1011121314151617181b1c1d1e21232425272a2b#2c2e3031323334393b3d3e3f4244454648494a4b4c4d4e4f52535455565758595c,858496f94fdd582199715b9d62:b1a5,66b48c799c8d7206676f789160b253:5117,8f8880cc8d1d94a1500d72c8590760eb711988ab595482ef672c7b285d297ef7752d6cf58e668ff8903c9f3b6bd491197b145f7c78a784d6853d6b:d5d9d6,5e:0187,75f995ed655d5f:0ac5,8f9f58c181c2907f965b97ad8fb97f168d2c62414fbf53:d85e,8f:a8a9ab,904d68075f6a819888689cd6618b522b762a5f6c658c6fd26ee85bbe644851:75b0,67c44e1979c9997c70b377:5d5e5f606467696a6d6e6f7071727374757677787a7b7c818283868788898a8b8f90939495969798999a9b9c9d9ea1a3a4a6a8abadaeafb1b2b4b6b7b8b9ba#bcbec0c1c2c3c4c5c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d8d9dadddedfe0e1e4,75c55e7673bb83e064ad62e894b56ce2535a52c3640f94c27b944f2f5e1b823681:168a,6e246cca9a736355535c54fa886557e04e0d5e036b657c3f90e8601664e6731c88c16750624d8d22776c8e2991c75f6983dc8521991053c286956b8b60:ede8,707f82:cd31,4ed36ca785cf64cd7cd969fd66f9834953957b564fa7518c6d4b5c428e6d63d253c983:2c36,67e578b4643d5bdf5c945dee8be762c667f48c7a640063ba8749998b8c177f2094f24ea7961098a4660c731677:e6e8eaeff0f1f2f4f5f7f9fafbfc,78:0304050607080a0b0e0f101315191b1e20212224282a2b2e2f31323335363d3f414243444648494a4b4d4f51535458595a#5b5c5e5f606162636465666768696f7071727374757678797a7b7d7e7f80818283,573a5c1d5e38957f507f80a05382655e7545553150218d856284949e671d56326f6e5de2543570928f66626f64a463a35f7b6f8890f481e38fb05c1866685ff16c8996488d81886c649179f057ce6a59621054484e587a0b60e96f848bda627f901e9a8b79e4540375f4630153196c608fdf5f1b9a70803b9f7f4f885c3a8d647fc565a570bd51:45b2,866b5d075ba062bd916c75748e0c7a2061017b794ec77ef877854e1181ed521d51fa6a7153a88e87950496cf6ec19664695a78:848586888a8b8f9092949596999d9ea0a2a4a6a8a9aaabacadaeafb5b6b7b8babbbcbdbfc0c2c3c4c6c7c8cccdcecfd1d2d3d6d7d8dadbdcdddedfe0e1e2e3#e4e5e6e7e9eaebedeeeff0f1f3f5f6f8f9fbfcfdfeff,79:00020304060708090a0b0c,784050a877d7641089e6590463e35ddd7a7f693d4f20823955984e3275ae7a975e:628a,95ef521b5439708a6376952457826625693f918755076df37eaf882262337ef075b5832878c196cc8f9e614874f78bcd6b64523a8d506b21806a847156f153064e:ce1b,51d17c97918b7c074fc38e7f7be17a9c64675d1450ac810676017cb96dec7fe067515b:58f8,78cb64:ae13,63:aa2b,9519642d8fbe7b5476296253592754466b7950a362345e266b864ee38d37888b5f85902e79:0d0e0f1011121415161718191a1b1c1d1f2021222325262728292a2b2c2d2e2f3031323335363738393d3f42434445474a4b4c4d4e4f505152545558596163#6466696a6b6c6e70717273747576797b7c7d7e7f8283868788898b8c8d8e909192,6020803d62c54e39535590f863b880c665e66c2e4f4660ee6de18bde5f3986cb5f536321515a83616863520063638e4850125c9b79775bfc52307a3b60bc905376d75f:b797,76848e6c706f767b7b4977aa51f3909358244f4e6ef48fea654c7b1b72c46da47fdf5ae162b55e95573084827b2c5e1d5f1f90127f1498a063826ec7789870b95178975b57ab75354f4375385e9760e659606dc06bbf788953fc96d551cb52016389540a94938c038dcc7239789f87768fed8c0d53e079:939495969798999b9c9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b6b7b8bcbfc2c4c5c7c8cacccecfd0d3d4d6d7d9dadbdcdddee0e1e2e5e8ea#eceef1f2f3f4f5f6f7f9fafcfeff,7a:0104050708090a0c0f10111213151618191b1c,4e0176ef53ee948998769f0e952d5b9a8ba24e:221c,51ac846361c252a8680b4f97606b51bb6d1e515c6296659796618c46901775d890fd77636bd272:8aec,8bfb583577798d4c675c9540809a5ea66e2159927aef77ed953b6bb565ad7f0e58065151961f5bf958a954288e726566987f56e4949d76fe9041638754c659:1a3a,579b8eb267358dfa8235524160f0581586fe5ce89e454fc4989d8bb95a2560765384627c904f9102997f6069800c513f80335c1499756d314e8c7a:1d1f21222425262728292a2b2c2d2e2f303132343536383a3e4041424344454748494a4b4c4d4e4f50525354555658595a5b5c5d5e5f606162636465666768#696a6b6c6d6e6f717273757b7c7d7e828587898a8b8c8e8f909394999a9b9ea1a2,8d3053d17f5a7b4f4f104e4f96006cd573d085e95e06756a7ffb6a0a77fe94927e4151e170e653cd8fd483038d2972af996d6cdb574a82b365b980aa623f963259a84eff8bbf7eba653e83f2975e556198de80a5532a8bfd542080ba5e9f6cb88d3982ac915a54296c1b52067eb7575f711a6c7e7c89594b4efd5fff61247caa4e305c0167ab87025cf0950b98ce75af70fd902251af7f1d8bbd594951e44f5b5426592b657780a45b7562:76c2,8f905e456c1f7b264f:0fd8,670d7a:a3a4a7a9aaabaeafb0b1b2b4b5b6b7b8b9babbbcbdbec0c1c2c3c4c5c6c7c8c9cacccdcecfd0d1d2d3d4d5d7d8dadbdcdde1e2e4e7e8e9eaebeceef0f1f2f3#f4f5f6f7f8fbfcfe,7b:0001020507090c0d0e1012131617181a1c1d1f21222327292d,6d:6eaa,798f88b15f17752b629a8f854fef91dc65a781:2f51,5e9c81508d74526f89868d4b590d50854ed8961c723681798d1f5bcc8ba3964459877f1a549056:760e,8be565396982949976d66e895e72751867:46d1,7aff809d8d76611f79c665628d635188521a94a27f38809b7eb25c976e2f67607bd9768b9ad8818f7f947cd5641e95507a3f54:4ae5,6b4c640162089e3d80f3759952729769845b683c86e496:0194,94ec4e2a54047ed968398ddf801566f45e9a7fb97b:2f303234353637393b3d3f404142434446484a4d4e535557595c5e5f61636465666768696a6b6c6d6f70737476787a7c7d7f81828384868788898a8b8c8e8f#9192939698999a9b9e9fa0a3a4a5aeafb0b2b3b5b6b7b9babbbcbdbebfc0c2c3c4,57c2803f68975de5653b529f606d9f9a4f9b8eac516c5bab5f135de96c5e62f18d21517194a952fe6c9f82df72d757a267848d2d591f8f9c83c754957b8d4f306cbd5b6459d19f1353e486ca9aa88c3780a16545987e56fa96c7522e74dc52505be1630289024e5662d0602a68fa51735b9851a089c27ba199867f5060ef704c8d2f51495e7f901b747089c4572d78455f529f9f95fa8f689b3c8be17678684267dc8d:ea35,523d8f8a6eda68cd950590ed56fd679c88f98fc754c87b:c5c8c9cacbcdcecfd0d2d4d5d6d7d8dbdcdedfe0e2e3e4e7e8e9ebecedeff0f2f3f4f5f6f8f9fafbfdff,7c:0001020304050608090a0d0e101112131415171819#1a1b1c1d1e20212223242528292b2c2d2e2f3031323334353637393a3b3c3d3e42,9ab85b696d776c264ea55bb39a87916361a890af97e9542b6db55bd251fd558a7f:55f0,64bc634d65f161be608d710a6c:5749,592f676d822a58d5568e8c6a6beb90dd597d801753f76d695475559d83:77cf,683879be548c4f55540876d28c8996026cb36db88d6b89109e648d3a563f9ed175d55f8872e0606854fc4ea86a2a886160528f7054c470d886799e3f6d2a5b8f5f187ea255894faf7334543c539a501954:0e7c,4e4e5ffd745a58f6846b80e1877472d07cca6e567c:434445464748494a4b4c4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717275767778797a7e7f8081828384858687#888a8b8c8d8e8f90939496999a9ba0a1a3a6a7a8a9abacadafb0b4b5b6b7b8babb,5f27864e552c62a44e926caa623782b154d7534e733e6ed1753b521253168bdd69d05f8a60006dee574f6b2273af68538fd87f13636260a3552475ea8c6271156da35ba65e7b8352614c9ec478fa87577c27768751f060f6714c66435e4c604d8c0e707063258f895fbd606286d456de6bc160946167534960e066668d3f79fd4f1a70e96c478b:b3f2,7ed88364660f5a5a9b426d:51f7,8c416d3b4f19706b83b7621660d1970d8d27797851fb57:3efa,673a75787a3d79ef7b957c:bfc0c2c3c4c6c9cbcecfd0d1d2d3d4d8dadbdddee1e2e3e4e5e6e7e9eaebecedeef0f1f2f3f4f5f6f7f9fafcfdfeff,7d:000102030405060708090b0c0d0e0f10#1112131415161718191a1b1c1d1e1f212324252628292a2c2d2e30313233343536,808c99658ff96fc08ba59e2159ec7ee97f095409678168d88f917c4d96c653ca602575be6c7253735ac97ea7632451e0810a5df184df628051805b634f0e796d524260b86d4e5b:c4c2,8b:a1b0,65e25fcc964559937e:e7aa,560967b759394f735bb652a0835a988a8d3e753294be50477a3c4ef767b69a7e5ac16b7c76d1575a5c167b3a95f4714e517c80a9827059787f04832768c067ec78:b177,62e363617b804fed526a51cf835069db92748d:f531,89c1952e7bad4ef67d:3738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6f70717273747576#78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798,506582305251996f6e:1085,6da75efa50f559dc5c066d466c5f7586848b686859568bb253209171964d854969127901712680f64ea490ca6d479a845a0756bc640594f077eb4fa5811a72e189d2997a7f347ede527f655991758f:7f83,53eb7a9663:eda5,768679f888579636622a52ab8282685467706377776b7aed6d017ed389e359d0621285c982a5754c501f4ecb75a58beb5c4a5dfe7b4b65a491d14eca6d25895f7d2795264ec58c288fdb9773664b79818fd170ec6d787d:999a9b9c9d9e9fa0a1a2a3a4a5a7a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9#dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa,5c3d52b283465162830e775b66769cb84eac60ca7c:beb3,7ecf4e958b66666f988897595883656c955c5f8475c997567a:dfde,51c070af7a9863ea7a767ea0739697ed4e4570784e5d915253a965:51e7,81fc8205548e5c31759a97a062d872d975bd5c459a7983ca5c40548077e94e3e6cae805a62d2636e5de851778ddd8e1e952f4ff153e560e770ac526763509e435a1f5026773753777ee26485652b628963985014723589c951b38bc07edd574783cc94a7519b541b5cfb7d:fbfcfdfeff,7e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839#3a3c3d3e3f40424344454648494a4b4c4d4e4f505152535455565758595a5b5c5d,4fca7ae36d5a90e19a8f55805496536154af5f0063e9697751ef6168520a582a52d8574e780d770b5eb761777ce062:5b97,4ea27095800362f770e49760577782db67ef68f578d5989779d158f354b353ef6e34514b523b5ba28bfe80af554357a660735751542d7a7a60505b5463a762a053e362635bc767af54ed7a9f82e691775e9388e4593857ae630e8de880ef57577b774fa95feb5bbd6b3e53217b5072c2684677:ff36,65f751b54e8f76d45cbf7aa58475594e9b4150807e:5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f909192939495969798999a9c9d9e#aeb4bbbcd6e4ecf9,7f:0a101e37393b3c3d3e3f404143464748494a4b4c4d4e4f5253,998861276e8357646606634656f062:ec69,5ed39614578362c955878721814a8fa3556683b167658d5684dd5a6a680f62e67bee961151706f9c8c3063fd89c861d27f0670c26ee57405699472fc5eca90ce67176d6a635e52b3726280014f6c59e5916a70d96d9d52d24e5096f7956d857e78ca7d2f5121579264c2808b7c7b6cea68f1695e51b7539868a872819ece7bf172f879bb6f137406674e91cc9ca4793c83:8954,540f68174e3d538952b1783e5386522950884f:8bd0,7f:56595b5c5d5e6063646566676b6c6d6f7073757677787a7b7c7d7f8082838485868788898b8d8f9091929395969798999b9ca0a2a3a5a6a8a9aaabacadaeb1#b3b4b5b6b7babbbec0c2c3c4c6c7c8c9cbcdcfd0d1d2d3d6d7d9dadbdcdddee2e3,75e27acb7c926ca596b6529b748354e94fe9805483b28fde95705ec9601c6d9f5e18655b813894fe604b70bc7ec37cae51c968817cb1826f4e248f8691cf667e4eae8c0564a9804a50da759771ce5be58fbd6f664e86648295635ed66599521788c270c852a3730e7433679778f797164e3490bb9cde6dcb51db8d41541d62ce73b283f196f69f8494c34f367f9a51cc707596755cad988653e64ee46e9c740969b4786b998f7559521876246d4167f3516d9f99804b54997b3c7abf7f:e4e7e8eaebecedeff2f4f5f6f7f8f9fafdfeff,80:020708090a0e0f11131a1b1d1e1f2123242b2c2d2e2f303234393a3c3e404144454748494e4f505153555657#595b5c5d5e5f6061626364656667686b6c6d6e6f7072737475767778797a7b7c7d,9686578462e29647697c5a0464027bd36f0f964b82a6536298855e90708963b35364864f9c819e93788c97328d:ef42,9e7f6f5e79845f559646622e9a74541594dd4fa365c55c:6561,7f1586516c2f5f8b73876ee47eff5ce6631b5b6a6ee653754e7163a0756562a18f6e4f264ed16ca67eb68bba841d87ba7f57903b95237ba99aa188f8843d6d1b9a867edc59889ebb739b780186829a:6c82,561b541757cb4e709ea653568fc881097792999286ee6ee1851366fc61626f2b80:7e818285888a8d8e8f909192949597999ea3a6a7a8acb0b3b5b6b8b9bbc5c7c8c9cacbcfd0d1d2d3d4d5d8dfe0e2e3e6eef5f7f9fbfeff,81:000103040507080b#0c1517191b1c1d1f202122232425262728292a2b2d2e3033343537393a3b3c3d3f,8c298292832b76f26c135fd983bd732b8305951a6bdb77db94c6536f830251925e3d8c8c8d384e4873ab679a68859176970971646ca177095a9295416bcf7f8e66275bd059b95a9a95:e8f7,4eec84:0c99,6aac76df9530731b68a65b5f772f919a97617cdc8ff78c1c5f257c7379d889c56ccc871c5bc65e4268c977207ef551:954d,52c95a297f05976282d763cf778485d079d26e3a5e9959998511706d6c1162bf76bf654f60af95fd660e879f9e2394ed54:0d7d,8c2c647881:40414243444547494d4e4f525657585b5c5d5e5f6162636466686a6b6c6f727375767778818384858687898b8c8d8e90929394959697999a9e9fa0a1a2a4a5#a7a9abacadaeafb0b1b2b4b5b6b7b8b9bcbdbebfc4c5c7c8c9cbcdcecfd0d1d2d3,647986116a21819c78e864699b5462b9672b83ab58a89ed86cab6f205bde964c8c0b725f67d062c772614ea959c66bcd589366ae5e5552df6155672876ee776672677a4662ff54:ea50,94a090a35a1c7eb36c164e435976801059485357753796be56ca63208111607c95f96dd65462998151855ae980fd59ae9713502a6ce55c3c62df4f60533f817b90066eba852b62c85e7478be64b5637b5ff55a18917f9e1f5c3f634f80425b7d556e95:4a4d,6d8560a867e072de51dd5b8181:d4d5d6d7d8d9dadbdcdddedfe0e1e2e4e5e6e8e9ebeeeff0f1f2f5f6f7f8f9fafdff,82:030708090a0b0e0f111315161718191a1d2024252627292e323a3c3d3f#404142434546484a4c4d4e5051525354555657595b5c5d5e606162636465666769,62e76cde725b626d94ae7ebd81136d53519c5f04597452aa6012597366968650759f632a61e67cef8bfa54e66b279e256bb485d5545550766ca4556a8db4722c5e156015743662cd6392724c5f986e436d3e65006f5876d878d076fc7554522453db4e535e9e65c180:2ad6,629b5486522870ae888d8dd16ce1547880da57f988f48d54966a914d4f696c9b55b776c6783062a870f96f8e5f6d84ec68da787c7bf781a8670b9e4f636778b0576f7812973962:79ab,528874356bd782:6a6b6c6d71757677787b7c808183858687898c90939495969a9b9ea0a2a3a7b2b5b6babbbcbfc0c2c3c5c6c9d0d6d9dadde2e7e8e9eaecedeef0f2f3f5f6f8#fafcfdfeff,83:000a0b0d1012131618191d1e1f20212223242526292a2e3032373b3d,5564813e75b276ae533975de50fb5c418b6c7bc7504f72479a9798d86f0274e27968648777a562fc98918d2b54c180584e52576a82f9840d5e7351ed74f68bc45c4f57616cfc98875a4678349b448feb7c955256625194fa4ec68386846183e984b257d467345703666e6d668c3166dd7011671f6b3a6816621a59bb4e0351c46f0667d26c8f517668cb59476b6775665d0e81109f5065d779:4841,9a918d775c824e5e4f01542f5951780c56686c148fc45f036c:7de3,8bab639083:3e3f41424445484a4b4c4d4e5355565758595d6270717273747576797a7e7f808182838487888a8b8c8d8f909194959697999a9d9fa1a2a3a4a5a6a7acadae#afb5bbbebfc2c3c4c6c8c9cbcdced0d1d2d3d5d7d9dadbdee2e3e4e6e7e8ebeced,60706d3d7275626694:8ec5,53438fc17b7e4edf8c264e7e9ed494:b1b3,524d6f5c90636d458c3458115d4c6b:2049,67aa545b81547f8c589985375f3a62a26a47953965726084686577a74e544fa85de7979864ac7fd85ced4fcf7a8d520783044e14602f7a8394a64fb54eb279e6743452e482b964d279bd5bdd6c8197528f7b6c22503e537f6e0564ce66746c3060c598778bf75e86743c7a7779cb4e1890b174036c4256da914b6cc58d8b533a86c666f28eaf5c489a716e2083:eeeff3f4f5f6f7fafbfcfeff,84:0002050708090a10121314151617191a1b1e1f20212223292a2b2c2d2e2f30323334353637393a3b3e3f404142434445474849#4a4b4c4d4e4f505253545556585d5e5f606264656667686a6e6f70727477797b7c,53d65a369f8b8da353bb570898a76743919b6cc9516875ca62f372ac52:389d,7f3a7094763853749e4a69b7786e96c088d97fa471:36c3,518967d374e458e4651856b78ba9997662707ed560f970ed58ec4e:c1ba,5fcd97e74efb8ba45203598a7eab62544ecd65e5620e833884c98363878d71946eb65bb97ed2519763c967d480898339881551125b7a59828fb14e736c5d516589258f6f962e854a745e95:10f0,6da682e55f3164926d128428816e9cc3585e8d5b4e0953c184:7d7e7f8081838485868a8d8f90919293949596989a9b9d9e9fa0a2a3a4a5a6a7a8a9aaabacadaeb0b1b3b5b6b7bbbcbec0c2c3c5c6c7c8cbcccecfd2d4d5d7#d8d9dadbdcdee1e2e4e7e8e9eaebedeeeff1f2f3f4f5f6f7f8f9fafbfdfe,85:000102,4f1e6563685155d34e2764149a9a626b5ac2745f82726da968ee50e7838e7802674052396c997eb150bb5565715e7b5b665273ca82eb67495c715220717d886b95ea965564c58d6181b355846c5562477f2e58924f2455468d4f664c4e0a5c1a88f368a2634e7a0d70e7828d52fa97f65c1154e890b57ecd59628d4a86c782:0c0d,8d6664445c0461516d89793e8bbe78377533547b4f388eab6df15a207ec5795e6c885ba15a76751a80be614e6e1758f075:1f25,727253477ef385:030405060708090a0b0d0e0f101214151618191b1c1d1e2022232425262728292a2d2e2f303132333435363e3f404142444546474b4c4d4e4f505152535455#57585a5b5c5d5f60616263656667696a6b6c6d6e6f707173757677787c7d7f8081,770176db526980dc57235e08593172ee65bd6e7f8bd75c388671534177f362fe65f64ec098df86805b9e8bc653f277e24f7f5c4e9a7659cb5f0f793a58eb4e1667ff4e8b62ed8a93901d52bf662f55dc566c90024ed54f8d91ca99706c0f5e0260435ba489c68bd56536624b99965b:88ff,6388552e53d77626517d852c67a268b36b8a62928f9353d482126dd1758f4e668d4e5b70719f85af66:91d9,7f7287009ecd9f205c5e672f8ff06811675f620d7ad658855eb665706f3185:82838688898a8b8c8d8e909192939495969798999a9d9e9fa0a1a2a3a5a6a7a9abacadb1b2b3b4b5b6b8babbbcbdbebfc0c2c3c4c5c6c7c8cacbcccdced1d2#d4d6d7d8d9dadbdddedfe0e1e2e3e5e6e7e8eaebecedeeeff0f1f2f3f4f5f6f7f8,60555237800d6454887075295e05681362f4971c53cc723d8c016c3477617a0e542e77ac987a821c8bf47855671470c165af64955636601d79c153f84e1d6b7b80865bfa55e356db4f:3a3c,99725df3677e80386002988290015b8b8b:bcf5,641c825864de55fd82cf91654fd77d20901f7c9f50f358516eaf5bbf8bc980839178849c7b97867d96:8b8f,7ee59ad3788e5c817a57904296a7795f5b59635f7b0b84d168ad55067f2974107d2295016240584c4ed65b835979585485:f9fafcfdfe,86:0001020304060708090a0b0c0d0e0f10121314151718191a1b1c1d1e1f20212223242526282a2b2c2d2e2f3031323334353637393a3b3d3e3f40#4142434445464748494a4b4c525355565758595b5c5d5f6061636465666768696a,736d631e8e:4b0f,80ce82d462ac53f06cf0915e592a60016c70574d644a8d2a762b6ee9575b6a8075f06f6d8c:2d08,57666bef889278b363a253f970ad6c645858642a580268e0819b55107cd650188eba6dcc8d9f70eb638f6d9b6ed47ee68404684390036dd896768ba85957727985e4817e75bc8a8a68af52548e22951163d098988e44557c4f5366ff568f60d56d9552435c4959296dfb586b75:301c,606c82148146631167618fe2773a8d:f334,94c15e165385542c70c386:6d6f7072737475767778838485868788898e8f90919294969798999a9b9e9fa0a1a2a5a6abadaeb2b3b7b8b9bbbcbdbebfc1c2c3c5c8cccdd2d3d5d6d7dadc#dde0e1e2e3e5e6e7e8eaebeceff5f6f7fafbfcfdff,87:010405060b0c0e0f10111416,6c405ef7505c4ead5ead633a8247901a6850916e77b3540c94dc5f647ae5687663457b527edf75db507762955934900f51f879c37a8156fe5f9290146d825c60571f541051546e4d56e263a89893817f8715892a9000541e5c6f81c062:d658,81319e3596409a:6e7c,692d59a562d3553e631654c786d96d3c5a0374e6889c6b6a59168c4c5f2f6e7e73a9987d4e3870f75b8c7897633d665a769660cb5b9b5a494e0781556c6a738b4ea167897f515f8065fa671b5fd859845a0187:191b1d1f20242627282a2b2c2d2f303233353638393a3c3d404142434445464a4b4d4f505152545556585a5b5c5d5e5f6162666768696a6b6c6d6f71727375#7778797a7f8081848687898a8c8e8f90919294959698999a9b9c9d9ea0a1a2a3a4,5dcd5fae537197e68fdd684556f4552f60df4e3a6f4d7ef482c7840e59d44f:1f2a,5c3e7eac672a851a5473754f80c355829b4f4f4d6e2d8c135c096170536b761f6e29868a658795fb7eb9543b7a337d0a95ee55e17fc174ee631d87176da17a9d621165a1536763e16c835deb545c94a84e4c6c618bec5c4b65e0829c68a754:3e34,6b:cb66,4e9463425348821e4f:0dae,575e620a96fe6664726952:ffa1,609f8bef661471996790897f785277fd6670563b54389521727a87:a5a6a7a9aaaeb0b1b2b4b6b7b8b9bbbcbebfc1c2c3c4c5c7c8c9cccdcecfd0d4d5d6d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedeff0f1f2f3f4f5f6f7f8#fafbfcfdff,88:0001020405060708090b0c0d0e0f101112141718191a1c1d1e1f2023,7a00606f5e0c6089819d591560dc718470ef6eaa6c5072806a8488ad5e2d4e605ab3559c94e36d177cfb9699620f7ec6778e867e5323971e8f9666875ce14fa072ed4e0b53a6590f54136380952851484ed99c9c7ea454b88d248854823795f26d8e5f265acc663e966973:b02e,53bf817a99857fa15baa96:7750,7ebf76f853a2957699997bb189446e584e617fd479658be660f354cd4eab98795df76a6150cf54118c618427785d9704524a54ee56a395006d885bb56dc6665388:2425262728292a2b2c2d2e2f30313334353637383a3b3d3e3f414243464748494a4b4e4f505152535556585a5b5c5d5e5f6066676a6d6f717374757678797a#7b7c80838687898a8c8e8f90919394959798999a9b9d9e9fa0a1a3a5a6a7a8a9aa,5c0f5b5d6821809655787b11654869544e9b6b47874e978b534f631f643a90aa659c80c18c10519968b0537887f961c86c:c4fb,8c225c5185aa82af950c6b238f9b65b05f:fbc3,4fe18845661f8165732960fa51745211578b5f6290a2884c91925e78674f602759d351:44f6,80f853086c7996c4718a4f:11ee,7f9e673d55c5950879c088967ee3589f620c9700865a5618987b5f908bb884c4915753d965ed5e8f755c60647d6e5a7f7e:eaed,8f6955a75ba360ac65cb738488:acaeafb0b2b3b4b5b6b8b9babbbdbebfc0c3c4c7c8cacbcccdcfd0d1d3d6d7dadbdcdddee0e1e6e7e9eaebecedeeeff2f5f6f7fafbfdff,89:0001030405060708#090b0c0d0e0f1114151617181c1d1e1f20222324262728292c2d2e2f3132333537,9009766377297eda9774859b5b667a7496ea884052cb718f5faa65ec8be25bfb9a6f5de16b896c5b8b:adaf,900a8fc5538b62bc9e:262d,54404e2b82bd7259869c5d1688596daf96c554d14e9a8bb6710954bd960970df6df976d04e25781487125ca95ef68a00989c960e708e6cbf594463a9773c884d6f148273583071d5538c781a96c155015f6671305bb48c1a9a8c6b83592e9e2f79e76768626c4f6f75a17f8a6d0b96336c274ef075d2517b68376f3e908081705996747689:38393a3b3c3d3e3f40424345464748494a4b4c4d4e4f505152535455565758595a5b5c5d6061626364656768696a6b6c6d6e6f707172737475767778797a7c#7d7e808284858788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1,64475c2790657a918c2359da54ac8200836f898180006930564e8036723791ce51b64e5f987563964e1a53f666f3814b591c6db24e0058f9533b63d694f14f:9d0a,886398905937905779fb4eea80f075916c825b9c59e85f5d69058681501a5df24e5977e34ee5827a6291661390915c794ebf5f7981c69038808475ab4ea688d4610f6bc55fc64e4976ca6ea28b:e3ae,8c0a8bd15f027f:fccc,7ece83:356b,56e06bb797f3963459fb541f94f66deb5bc5996e5c395f15969089:a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c3cdd3d4d5d7d8d9dbdddfe0e1e2e4e7e8e9eaecedeef0f1f2f4f5f6f7f8f9fa#fbfcfdfeff,8a:01020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d,537082f16a315a749e705e947f2883b984:2425,836787478fce8d6276c85f719896786c662054df62e54f6381c375c85eb896cd8e0a86f9548f6cf36d8c6c38607f52c775285e7d4f1860a05fe75c24753190ae94c072b96cb96e389149670953:cbf3,4f5191c98bf153c85e7c8fc26de44e8e76c26986865e611a82064f:59de,903e9c7c61096e:1d14,96854e885a3196e84e0e5c7f79b95b878bed7fbd738957df828b90c15401904755bb5cea5fa161086b3272f180b28a:891e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f4041424344454647494a4b4c4d4e4f505152535455565758595a5b5c5d5e#5f606162636465666768696a6b6c6d6e6f7071727374757677787a7b7c7d7e7f80,6d745bd388d598848c6b9a6d9e336e0a51:a443,57a38881539f63f48f9556ed54585706733f6e907f188fdc82d1613f6028966266f07ea68d:8ac3,94a55cb37ca4670860a6960580184e9190e75300966851418fd08574915d665597f55b55531d78386742683d54c9707e5bb08f7d518d572854b1651266828d:5e43,810f846c906d7cdf51ff85fb67a365e96fa186a48e81566a90207682707671e58d2362e952196cfd8d3c600e589e618e66fe8d60624e55b36e23672d8f678a:81828384858687888b8c8d8e8f9091929495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3,94e195f87728680569a8548b4e4d70b88bc86458658b5b857a84503a5be877bb6be18a797c986cbe76cf65a98f975d2d5c5586386808536062187ad96e5b7efd6a1f7ae05f706f335f20638c6da867564e085e108d264ed780c07634969c62db662d627e6cbc8d7571677f695146808753ec906e629854f286f08f998005951785178fd96d5973cd659f771f7504782781fb8d1e94884fa6679575b98bca9707632f9547963584b8632377415f8172f04e896014657462ef6b63653f8a:e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8b:0001020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#24252728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,5e2775c790d18bc1829d679d652f5431871877e580a281026c414e4b7ec7804c76f4690d6b966267503c4f84574063076b628dbe53ea65e87eb85fd763:1ab7,81:f3f4,7f6e5e1c5cd95236667a79e97a1a8d28709975d46ede6cbb7a924e2d76c55fe0949f88777ec879cd80bf91cd4ef24f17821f54685dde6d328bcc7ca58f7480985e1a549276b15b99663c9aa473e0682a86db6731732a8b:f8db,90107af970db716e62c477a956314e3b845767f152a986c08d2e94f87b518b:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656768696a6b6d6e6f707172737475767778797a7b7c7d7e7f80818283848586#8788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9facb1bbc7d0ea,8c:091e,4f4f6ce8795d9a7b6293722a62fd4e1378168f6c64b08d5a7bc668695e8488c55986649e58ee72b6690e95258ffd8d5857607f008c0651c6634962d95353684c74228301914c55447740707c6d4a517954a88d4459ff6ecb6dc45b5c7d2b4ed47c7d6ed35b5081ea6e0d5b579b0368d58e2a5b977efc603b7eb590b98d70594f63cd79df8db3535265cf79568bc5963b7ec494bb7e825634918967007f6a5c0a907566285de64f5067de505a4f5c57505e:a7#3$,8c:38393a3b3c3d3e3f4042434445484a4b4d4e4f5051525354565758595b5c5d5e5f60636465666768696c6d6e6f707172747576777b7c7d7e7f808183848687#888b8d8e8f90919293959697999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacad,4e:8d0c,51404e105eff53454e:15981e,9b325b6c56694e2879ba4e3f53154e47592d723b536e6c1056df80e499976bd3777e9f174e:369f,9f104e:5c6993,82885b5b556c560f4ec453:8d9da3a5ae,97658d5d53:1af5262e3e,8d5c53:6663,52:02080e2d333f404c5e615c,84af52:7d82819093,51827f544e:bbc3c9c2e8e1ebde,4f1b4ef34f:2264,4ef54f:2527092b5e67,65384f:5a5d,8c:aeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebec#edeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8d:000102030405060708090a0b0c0d,4f:5f57323d76749189838f7e7baa7cac94e6e8eac5dae3dcd1dff8,50:294c,4ff350:2c0f2e2d,4ffe50:1c0c25287e4355484e6c7ba5a7a9bad6,510650:edece6ee,51:070b,4edd6c3d4f:5865ce,9fa06c467c74516e5dfd9ec999985181591452f9530d8a07531051eb591951554ea051564eb388:6ea4,4eb5811488d279805b3488037fb851:abb1bdbc,8d:0e0f101112131415161718191a1b1c205152575f6568696a6c6e6f717278797a7b7c7d7e7f808283868788898c8d8e8f90929395969798999a9b9c9d9ea0a1#a2a4a5a6a7a8a9aaabacadaeafb0b2b6b7b9bbbdc0c1c2c5c7c8c9cacdd0d2d3d4,51:c796a2a5,8b:a0a6a7aab4b5b7c2c3cbcfced2d3d4d6d8d9dcdfe0e4e8e9eef0f3f6f9fcff,8c:000204070c0f1112141516191b181d1f202125272a2b2e2f32333536,53:697a,96:1d2221312a3d3c4249545f676c7274888d97b0,90:979b9d99aca1b4b3b6ba,8d:d5d8d9dce0e1e2e5e6e7e9edeef0f1f2f4f6fcfeff,8e:00010203040607080b0d0e1011121315161718191a1b1c202124252627282b2d303233343637383b3c3e#3f4345464c4d4e4f505354555657585a5b5c5d5e5f60616263646567686a6b6e71,90:b8b0cfc5bed0c4c7d3e6e2dcd7dbebeffe,91:04221e23312f394346,520d594252:a2acadbe,54ff52:d0d6f0,53df71ee77cd5ef451:f5fc,9b2f53b65f01755a5def57:4ca9a1,58:7ebcc5d1,57:292c2a33392e2f5c3b4269856b867c7b686d7673ada48cb2cfa7b493a0d5d8dad9d2b8f4eff8e4dd,8e:73757778797a7b7d7e808283848688898a8b8c8d8e91929395969798999a9b9d9fa0a1a2a3a4a5a6a7a8a9aaadaeb0b1b3b4b5b6b7b8b9bbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4,58:0b0d,57:fded,58:001e194420656c81899a80,99a89f1961ff82:797d7f8f8aa8848e919799abb8beb0c8cae398b7aecbccc1a9b4a1aa9fc4cea4e1,830982:f7e4,83:0f07,82:dcf4d2d8,830c82:fbd3,83:111a061415,82:e0d5,83:1c515b5c08923c34319b5e2f4f47435f4017602d3a336665,8e:e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8f:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344,83:681b696c6a6d6eb078b3b4a0aa939c857cb6a97db87b989ea8babcc1,840183:e5d8,580784:180b,83:ddfdd6,84:1c381106,83:d4df,84:0f03,83:f8f9eac5c0,842683:f0e1,84:5c515a597387887a89783c4669768c8e316dc1cdd0e6bdd3cabfbae0a1b9b497e5e3,850c750d853884f085:391f3a,8f:45464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656a808c929da0a1a2a4a5a6a7aaacadaeafb2b3b4b5b7b8babbbcbfc0c3c6#c9cacbcccdcfd2d6d7dae0e1e3e7eceff1f2f4f5f6fafbfcfeff,90:07080c0e131518,85:563b,84:fffc,85:594868645e7a,77a285:43727ba4a8878f79ae9c85b9b7b0d3c1dcff,86:270529163c,5efe5f0859:3c41,803759:555a58,530f5c:22252c34,62:4c6a9fbbcadad7ee,632262f663:394b43adf6717a8eb46dac8a69aebcf2f8e0ffc4dece,645263:c6be,64:45410b1b200c26215e846d96,90:191c2324252728292a2b2c303132333437393a3d3f4043454648494a4b4c4e545556595a5c5d5e5f6061646667696a6b6c6f70717273767778797a7b7c7e81#84858687898a8c8d8e8f90929496989a9c9e9fa0a4a5a7a8a9abadb2b7bcbdbfc0,64:7ab7b899bac0d0d7e4e2,65:09252e,5f:0bd2,75195f1153:5ff1fde9e8fb,54:1216064b5253545643215759233282947771649a9b8476669dd0adc2b4d2a7a6d3d472a3d5bbbfccd9dadca9aaa4ddcfde,551b54e7552054fd551454f355:22230f11272a678fb5496d41553f503c,90:c2c3c6c8c9cbcccdd2d4d5d6d8d9dadedfe0e3e4e5e9eaeceef0f1f2f3f5f6f7f9fafbfcff,91:00010305060708090a0b0c0d0e0f1011121314151617181a1b1c#1d1f20212425262728292a2b2c2d2e30323334353637383a3b3c3d3e3f40414244,55:375675767733305c8bd283b1b988819f7ed6917bdfbdbe9499eaf7c9,561f55:d1ebecd4e6ddc4efe5f2f3cccde8f5e4,8f9456:1e080c012423,55fe56:00272d5839572c4d62595c4c548664716b7b7c8593afd4d7dde1f5ebf9ff,57:040a091c,5e:0f191411313b3c,91:454748515354555658595b5c5f606667686b6d737a7b7c808182838486888a8e8f939495969798999c9d9e9fa0a1a4a5a6a7a8a9abacb0b1b2b3b6b7b8b9bb#bcbdbebfc0c1c2c3c4c5c6c8cbd0d2d3d4d5d6d7d8d9dadbdddedfe0e1e2e3e4e5,5e:3744545b5e61,5c:8c7a8d9096889899919a9cb5a2bdacabb1a3c1b7c4d2e4cbe5,5d:020327262e241e061b583e343d6c5b6f5d6b4b4a697482999d,8c735d:b7c5,5f:73778287898c95999ca8adb5bc,88625f6172:adb0b4b7b8c3c1cecdd2e8efe9f2f4f7,730172f3730372fa91:e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,92:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324#25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,72fb73:1713210a1e1d152239252c3831504d57606c6f7e,821b592598e759:2402,99:636768696a6b6c74777d8084878a8d9091939495,5e:80918b96a5a0b9b5beb3,8d535e:d2d1dbe8ea,81ba5f:c4c9d6cf,60035fee60045f:e1e4fe,60:0506,5f:eaedf8,60:1935261b0f0d292b0a3f2178797b7a42,92:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727375767778797a7b7c7d7e7f808182838485#868788898a8b8c8d8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7,60:6a7d969aad9d83928c9becbbb1ddd8c6dab4,61:20261523,60f461:000e2b4a75ac94a7b7d4f5,5fdd96b395:e9ebf1f3f5f6fcfe,96:030406080a0b0c0d0f12151617191a,4e2c723f62156c:35545c4aa38590948c6869747686a9d0d4adf7f8f1d7b2e0d6faebeeb1d3effe,92:a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8#e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,93:00010203040506070809,6d:39270c43480704190e2b4d2e351a4f525433916f9ea05e93945c607c63,6e1a6d:c7c5de,6e0e6d:bfe0,6e116d:e6ddd9,6e166dab6e0c6dae6e:2b6e4e6bb25f865354322544dfb198e0,6f2d6e:e2a5a7bdbbb7d7b4cf8fc29f,6f:6246472415,6ef96f:2f364b742a0929898d8c78727c7ad1,93:0a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f40414243444546474849#4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696b,6f:c9a7b9b6c2e1eedee0ef,70:1a231b39354f5e,5b:80849593a5b8,752f9a9e64345b:e4ee,89305bf08e478b078f:b6d3d5e5eee4e9e6f3e8,90:05040b26110d162135362d2f445152506858625b,66b990:747d8288838b,5f:50575658,5c3b54ab5c:5059,5b715c:6366,7fbc5f:2a292d,82745f3c9b3b5c6e59:81838da9aaa3,93:6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab#acadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cbcccd,59:97caab9ea4d2b2afd7be,5a:0506,59dd5a0859:e3d8f9,5a:0c09323411231340674a553c6275,80ec5a:aa9b777abeebb2d2d4b8e0e3f1d6e6d8dc,5b:091716323740,5c:151c,5b:5a6573515362,9a:7577787a7f7d808185888a90929396989b9c9d9fa0a2a3a5a7,7e:9fa1a3a5a8a9,93:cecfd0d1d2d3d4d5d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,94:000102030405060708090a0b0c0d#0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e,7e:adb0bec0c1c2c9cbccd0d4d7dbe0e1e8ebeeeff1f2,7f0d7e:f6fafbfe,7f:01020307080b0c0f111217191c1b1f212223242526272a2b2c2d2f3031323335,5e7a757f5ddb753e909573:8e91aea29fcfc2d1b7b3c0c9c8e5d9,987c740a73:e9e7debaf2,74:0f2a5b262528302e2c,94:2f303132333435363738393a3b3c3d3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6c6d6e6f#707172737475767778797a7b7c7d7e7f8081828384919698c7cfd3d4dae6fb,95:1c20,74:1b1a415c575559776d7e9c8e8081878b9ea8a990a7d2ba,97:eaebec,67:4c535e4869a5876a7398a775a89ead8b777cf0,680967d8680a67:e9b0,680c67:d9b5dab3dd,680067:c3b8e2,680e67:c1fd,68:323360614e624464831d55664167403e4a4929b58f7477936bc2,696e68fc69:1f20,68f995:27333d43484b555a606e74757778797a7b7c7d7e808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aa#abacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacb,692468f069:0b0157,68e369:10713960425d846b80987834cc8788ce896663799ba7bbabadd4b1c1cadf95e08dff,6a2f69ed6a:171865,69f26a:443ea0505b358e793d28587c9190a997ab,73:3752,6b:8182878492938d9a9ba1aa,8f:6b6d71727375767877797a7c7e818284878b,95:cccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7ecff,96:0713181b1e20232425262728292b2c2d2f303738393a3e41434a4e4f5152535657#58595a5c5d5e606365666b6d6e6f70717378797a7b7c7d7e7f808182838487898a,8f:8d8e8f989a,8ece62:0b171b1f222125242c,81e774:eff4ff,75:0f1113,65:34eeeff0,66:0a19,677266:031500,708566:f71d34313635,800666:5f54414f56615777848ca79dbedbdce6e9,8d:3233363b3d4045464849474d5559,89:c7cacbcccecfd0d1,72:6e9f5d666f7e7f848b8d8f92,63:0832b0,96:8c8e91929395969a9b9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb1b2b4b5b7b8babbbfc2c3c8cacbd0d1d3d4d6d7d8d9dadbdcdddedfe1e2e3e4e5e6e7eb#ecedeef0f1f2f4f5f8fafbfcfdff,97:0203050a0b0c10111214151718191a1b1d1f20,64:3fd8,80046b:eaf3fdf5f9,6c:0507060d1518191a2129242a32,65:35556b,72:4d525630,8662521680:9f9c93bc,670a80:bdb1abadb4b7e7e8e9eadbc2c4d9cdd7,671080:ddebf1f4ed,81:0d0e,80:f2fc,671581128c5a81:361e2c1832484c5374595a7160697c7d6d67,584d5ab581:888291,6ed581:a3aacc,672681:cabb,97:2122232425262728292b2c2e2f3133343536373a3b3c3d3f404142434445464748494a4b4c4d4e4f5051545557585a5c5d5f63646667686a6b6c6d6e6f7071#72757778797a7b7d7e7f8081828384868788898a8c8e8f9093959697999a9b9c9d,81:c1a6,6b:243739434659,98:d1d2d3d5d9da,6bb35f406bc289f365909f5165:93bcc6c4c3ccced2d6,70:809c969dbbc0b7abb1e8ca,71:1013162f31735c6845724a787a98b3b5a8a0e0d4e7f9,72:1d28,706c71:1866b9,62:3e3d434849,79:3b4046495b5c535a6257606f677a858a9aa7b3,5f:d1d0,97:9e9fa1a2a4a5a6a7a8a9aaacaeb0b1b3b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3#e4e5e8eeeff0f1f2f4f7f8f9fafbfcfdfeff,98:000102030405060708090a0b0c0d0e,60:3c5d5a67415963ab,61:060d5da99dcbd1,620680:807f,6c:93f6,6dfc77:f6f8,78:0009171811,65ab78:2d1c1d393a3b1f3c252c23294e6d56572650474c6a9b939a879ca1a3b2b9a5d4d9c9ecf2,790578f479:13241e34,9f9b9e:f9fbfc,76f177:040d,76f977:07081a22192d263538505147435a68,98:0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d#4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e,77:62657f8d7d808c919fa0b0b5bd,75:3a404e4b485b727983,7f:58615f,8a487f:68747179817e,76:cde5,883294:8586878b8a8c8d8f909497959a9b9ca3a4abaaadacafb0b2b4b6b7b8b9babcbdbfc4c8c9cacbcccdced0d1d2d5d6d7d9d8dbdedfe0e2e4e5e7e8ea,98:6f70717273748b8e929599a3a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcfd0d4d6d7dbdcdde0e1e2e3e4#e5e6e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,99:0001020304050607,94:e9ebeeeff3f4f5f7f9fcfdff,95:03020607090a0d0e0f1213141516181b1d1e1f222a2b292c3132343637383c3e3f4235444546494c4e4f525354565758595b5e5f5d61626465666768696a6b6c6f7172733a,77:e7ec,96c979:d5ede3eb,7a065d477a:03021e14,99:08090a0b0c0e0f1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2f303132333435363738393a3b3c3d3e3f40414243444546474849#4a4b4c4d4e4f50515253565758595a5b5c5d5e5f60616264667378797b7e828389,7a:393751,9ecf99a57a7076:888e9399a4,74:dee0,752c9e:202228292a2b2c3231363837393a3e414244464748494b4c4e5155575a5b5c5e63666768696a6b6c716d73,75:929496a09daca3b3b4b8c4b1b0c3c2d6cde3e8e6e4ebe7,760375:f1fcff,76:1000050c170a25181519,99:8c8e9a9b9c9d9e9fa0a1a2a3a4a6a7a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8#d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9,76:1b3c2220402d303f35433e334d5e545c566b6f,7fca7a:e6787980868895a6a0aca8adb3,88:6469727d7f82a2c6b7bcc9e2cee3e5f1,891a88:fce8fef0,89:2119131b0a342b3641667b,758b80e576:b2b4,77dc80:1214161c20222526272928310b3543464d526971,898398:788083,99:fafbfcfdfeff,9a:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738#393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859,98:898c8d8f949a9b9e9fa1a2a5a6,86:4d546c6e7f7a7c7ba88d8bac9da7a3aa93a9b6c4b5ceb0bab1afc9cfb4e9f1f2edf3d0,871386:def4dfd8d1,87:0307,86f887:080a0d09233b1e252e1a3e48343129373f82227d7e7b60704c6e8b53637c64596593afa8d2,9a:5a5b5c5d5e5f606162636465666768696a6b7283898d8e949599a6a9aaabacadaeafb2b3b4b5b9bbbdbebfc3c4c6c7c8c9cacdcecfd0d2d4d5d6d7d9dadbdc#dddee0e2e3e4e5e7e8e9eaeceef0f1f2f3f4f5f6f7f8fafcfdfeff,9b:000102040506,87:c68885ad9783abe5acb5b3cbd3bdd1c0cadbeae0ee,88:1613,87fe88:0a1b21393c,7f:36424445,82107a:fafd,7b:080304150a2b0f47382a192e31202524333e1e585a45754c5d606e7b62727190a6a7b8ac9da885aa9ca2abb4d1c1ccdddae5e6ea,7c0c7b:fefc,7c:0f160b,9b:07090a0b0c0d0e1011121415161718191a1b1c1d1e2021222425262728292a2b2c2d2e3031333435363738393a3d3e3f40464a4b4c4e50525355565758595a#5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b,7c:1f2a26384140,81fe82:010204,81ec884482:2122232d2f282b383b33343e44494b4f5a5f68,88:7e8588d8df,895e7f:9d9fa7afb0b2,7c7c65497c:919d9c9ea2b2bcbdc1c7cccdc8c5d7e8,826e66a87f:bfced5e5e1e6e9eef3,7cf87d:77a6ae,7e:479b,9e:b8b4,8d:73849491b1676d,8c:4749,91:4a504e4f64,9b:7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9ba#bbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadb,91:626170696f7d7e7274798c85908d91a2a3aaadaeafb5b4ba,8c559e7e8d:b8eb,8e:055969,8d:b5bfbcbac4d6d7dadececfdbc6ecf7f8e3f9fbe4,8e098dfd8e:141d1f2c2e232f3a4039353d3149414251524a70767c6f74858f94909c9e,8c:78828a859894,659b89:d6dedadc,9b:dcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9c:000102030405060708090a0b0c0d0e0f101112131415161718191a#1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b,89:e5ebef,8a3e8b26975396:e9f3ef,97:0601080f0e2a2d303e,9f:808385868788898a8c,9efe9f:0b0d,96:b9bcbdced2,77bf96e092:8eaec8,93:3e6aca8f,94:3e6b,9c:7f8285868788,7a239c:8b8e90919294959a9b9e9fa0a1a2a3a5a6a7a8a9abadaeb0b1b2b3b4b5b6b7babbbcbdc4c5c6c7cacb3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a#7b7d7e808384898a8c8f93969798999daaacafb9bebfc0c1c2c8c9d1d2dadbe0e1cccdcecfd0d3d4d5d7d8d9dcdddfe2,97:7c85919294afaba3b2b4,9a:b1b0b7,9e589a:b6babcc1c0c5c2cbccd1,9b:45434749484d51,98e899:0d2e5554,9a:dfe1e6efebfbedf9,9b:080f131f23,9e:bdbe,7e3b9e:8287888b92,93d69e:9d9fdbdcdde0dfe2e9e7e5eaef,9f:222c2f39373d3e44,9c:e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9d:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021#22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142#92$434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081#82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2#92$a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1#e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9e:000102#92$030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e24272e30343b3c404d5052535456595d5f606162656e6f727475767778797a7b7c7d80#8183848586898a8c8d8e8f90919495969798999a9b9c9ea0a1a2a3a4a5a7a8a9aa#92$abacadaeafb0b1b2b3b5b6b7b9babcbfc0c1c2c3c5c6c7c8cacbccd0d2d3d5d6d7d9dadee1e3e4e6e8ebecedeef0f1f2f3f4f5f6f7f8fafdff,9f:000102030405#060708090a0c0f1112141516181a1b1c1d1e1f21232425262728292a2b2d2e3031#92$3233343536383a3c3f4041424345464748494a4b4c4d4e4f52535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778#797a7b7c7d7e81828d8e8f9091929394959697989c9d9ea1a2a3a4a5,f9:2c7995e7f1#92$,fa:0c0d0e0f111314181f20212324272829,e8:15161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243#4445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364");
|
|
112
109
|
let index = 0;
|
|
113
110
|
this.#data = dataText.match(/..../g);
|
|
114
111
|
for (let i = 0x81; i <= 0xfe; i++) {
|
|
115
112
|
for (let j = 0x40; j <= 0xfe; j++) {
|
|
116
|
-
this.#U2Ghash[this.#data[index++]] =
|
|
113
|
+
this.#U2Ghash[this.#data[index++]] = `%${i.toString(16)}%${j.toString(16)}`.toUpperCase();
|
|
117
114
|
}
|
|
118
115
|
}
|
|
119
|
-
for (
|
|
120
|
-
this.#
|
|
116
|
+
for (const key in this.#U2Ghash) {
|
|
117
|
+
const u2ghashValue = Reflect.get(this.#U2Ghash, key);
|
|
118
|
+
Reflect.set(this.#G2Uhash, u2ghashValue, key);
|
|
121
119
|
}
|
|
122
120
|
}
|
|
123
121
|
handleText(text) {
|
|
124
122
|
text = text
|
|
125
|
-
.replace(/#(\d+)\$/g, function (
|
|
123
|
+
.replace(/#(\d+)\$/g, function (_, b) {
|
|
126
124
|
return Array(+b + 3).join("#");
|
|
127
125
|
})
|
|
128
126
|
.replace(/#/g, "####")
|
|
129
|
-
.replace(/(\w\w):([\w#]+)(?:,|$)/g, function (
|
|
127
|
+
.replace(/(\w\w):([\w#]+)(?:,|$)/g, function (_, hd, dt) {
|
|
130
128
|
return dt.replace(/../g, function (a) {
|
|
131
129
|
if (a != "##") {
|
|
132
130
|
return hd + a;
|
|
@@ -146,8 +144,8 @@ class GBKEncoder {
|
|
|
146
144
|
* @param str
|
|
147
145
|
*/
|
|
148
146
|
encode(str) {
|
|
149
|
-
|
|
150
|
-
return [...str].reduce((result, val
|
|
147
|
+
const that = this;
|
|
148
|
+
return [...str].reduce((result, val) => {
|
|
151
149
|
return result + toGBK(val);
|
|
152
150
|
}, "");
|
|
153
151
|
function toGBK(val) {
|
|
@@ -156,7 +154,7 @@ class GBKEncoder {
|
|
|
156
154
|
const codePoint = val.codePointAt(i);
|
|
157
155
|
const code = String.fromCodePoint(codePoint);
|
|
158
156
|
let key = codePoint.toString(16);
|
|
159
|
-
key.length != 4 && (key =
|
|
157
|
+
key.length != 4 && (key = `000${key}`.match(/....$/)?.[0]);
|
|
160
158
|
/* Add up i by code.length */
|
|
161
159
|
i += code.length - 1;
|
|
162
160
|
/* If code is in ascii range */
|
|
@@ -170,9 +168,9 @@ class GBKEncoder {
|
|
|
170
168
|
continue;
|
|
171
169
|
}
|
|
172
170
|
/*
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
171
|
+
If 2 or more char combines to one visible code,
|
|
172
|
+
or just this code is not in GBK
|
|
173
|
+
*/
|
|
176
174
|
result += toGBK(`&#${codePoint};`);
|
|
177
175
|
}
|
|
178
176
|
return result;
|
|
@@ -183,18 +181,18 @@ class GBKEncoder {
|
|
|
183
181
|
* @param str
|
|
184
182
|
*/
|
|
185
183
|
decode(str) {
|
|
186
|
-
|
|
187
|
-
|
|
184
|
+
const GBKMatcher = /%[0-9A-F]{2}%[0-9A-F]{2}/;
|
|
185
|
+
const UTFMatcher = /%[0-9A-F]{2}/;
|
|
188
186
|
// let gbk = true;
|
|
189
187
|
let utf = true;
|
|
190
188
|
const that = this;
|
|
191
189
|
while (utf) {
|
|
192
|
-
|
|
193
|
-
|
|
190
|
+
const gbkMatch = str.match(GBKMatcher);
|
|
191
|
+
const utfMatch = str.match(UTFMatcher);
|
|
194
192
|
// gbk = Boolean(gbkMatch);
|
|
195
193
|
utf = Boolean(utfMatch);
|
|
196
194
|
if (gbkMatch && gbkMatch in that.#G2Uhash) {
|
|
197
|
-
str = str.replace(gbkMatch, String.fromCharCode(
|
|
195
|
+
str = str.replace(gbkMatch, String.fromCharCode(`0x${that.#G2Uhash[gbkMatch]}`));
|
|
198
196
|
}
|
|
199
197
|
else {
|
|
200
198
|
str = str.replace(utfMatch, decodeURIComponent(utfMatch));
|
|
@@ -208,7 +206,7 @@ const TryCatch = function (...args) {
|
|
|
208
206
|
/* 定义变量和函数 */
|
|
209
207
|
let callbackFunction = null;
|
|
210
208
|
let context = null;
|
|
211
|
-
let handleError = (
|
|
209
|
+
let handleError = () => { };
|
|
212
210
|
let defaultDetails = {
|
|
213
211
|
log: true,
|
|
214
212
|
};
|
|
@@ -240,7 +238,7 @@ const TryCatch = function (...args) {
|
|
|
240
238
|
run(callback, __context__) {
|
|
241
239
|
callbackFunction = callback;
|
|
242
240
|
context = __context__ || this;
|
|
243
|
-
|
|
241
|
+
const result = executeTryCatch(callbackFunction, handleError, context);
|
|
244
242
|
return result !== void 0 ? result : TryCatchCore;
|
|
245
243
|
},
|
|
246
244
|
};
|
|
@@ -264,8 +262,8 @@ const TryCatch = function (...args) {
|
|
|
264
262
|
catch (error) {
|
|
265
263
|
if (defaultDetails.log) {
|
|
266
264
|
callback = callback;
|
|
267
|
-
console.log(`%c ${callback?.name ? callback?.name : callback
|
|
268
|
-
console.log(`%c
|
|
265
|
+
console.log(`%c ${callback?.name ? callback?.name : `${callback}`} `, "color: #f20000");
|
|
266
|
+
console.log(`%c ${error}`, "color: #f20000");
|
|
269
267
|
console.trace(callback);
|
|
270
268
|
}
|
|
271
269
|
if (handleErrorFunc) {
|
|
@@ -284,9 +282,9 @@ const TryCatch = function (...args) {
|
|
|
284
282
|
|
|
285
283
|
class CommonUtil {
|
|
286
284
|
assign(target = {}, source = {}, isAdd = false) {
|
|
287
|
-
|
|
285
|
+
const UtilsContext = this;
|
|
288
286
|
if (Array.isArray(source)) {
|
|
289
|
-
|
|
287
|
+
const canTraverse = source.filter((item) => {
|
|
290
288
|
return typeof item === "object";
|
|
291
289
|
});
|
|
292
290
|
if (!canTraverse.length) {
|
|
@@ -302,34 +300,34 @@ class CommonUtil {
|
|
|
302
300
|
if (isAdd) {
|
|
303
301
|
for (const sourceKeyName in source) {
|
|
304
302
|
const targetKeyName = sourceKeyName;
|
|
305
|
-
|
|
306
|
-
|
|
303
|
+
const targetValue = Reflect.get(target, targetKeyName);
|
|
304
|
+
const sourceValue = Reflect.get(source, sourceKeyName);
|
|
307
305
|
if (typeof sourceValue === "object" &&
|
|
308
306
|
sourceValue != null &&
|
|
309
307
|
sourceKeyName in target &&
|
|
310
308
|
!UtilsContext.isDOM(sourceValue)) {
|
|
311
309
|
/* 源端的值是object类型,且不是元素节点 */
|
|
312
|
-
target
|
|
310
|
+
Reflect.set(target, sourceKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
|
|
313
311
|
continue;
|
|
314
312
|
}
|
|
315
|
-
target
|
|
313
|
+
Reflect.set(target, sourceKeyName, sourceValue);
|
|
316
314
|
}
|
|
317
315
|
}
|
|
318
316
|
else {
|
|
319
317
|
for (const targetKeyName in target) {
|
|
320
318
|
if (targetKeyName in source) {
|
|
321
|
-
|
|
322
|
-
|
|
319
|
+
const targetValue = Reflect.get(target, targetKeyName);
|
|
320
|
+
const sourceValue = Reflect.get(source, targetKeyName);
|
|
323
321
|
if (typeof sourceValue === "object" &&
|
|
324
322
|
sourceValue != null &&
|
|
325
323
|
!UtilsContext.isDOM(sourceValue) &&
|
|
326
324
|
Object.keys(sourceValue).length) {
|
|
327
325
|
/* 源端的值是object类型,且不是元素节点 */
|
|
328
|
-
target
|
|
326
|
+
Reflect.set(target, targetKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
|
|
329
327
|
continue;
|
|
330
328
|
}
|
|
331
329
|
/* 直接赋值 */
|
|
332
|
-
target
|
|
330
|
+
Reflect.set(target, targetKeyName, sourceValue);
|
|
333
331
|
}
|
|
334
332
|
}
|
|
335
333
|
}
|
|
@@ -337,7 +335,7 @@ class CommonUtil {
|
|
|
337
335
|
}
|
|
338
336
|
isNull(...args) {
|
|
339
337
|
let result = true;
|
|
340
|
-
|
|
338
|
+
const checkList = [...args];
|
|
341
339
|
for (const objItem of checkList) {
|
|
342
340
|
let itemResult = false;
|
|
343
341
|
if (objItem === null || objItem === undefined) {
|
|
@@ -363,11 +361,12 @@ class CommonUtil {
|
|
|
363
361
|
case "boolean":
|
|
364
362
|
itemResult = !objItem;
|
|
365
363
|
break;
|
|
366
|
-
case "function":
|
|
367
|
-
|
|
364
|
+
case "function": {
|
|
365
|
+
const funcStr = objItem.toString().replace(/\s/g, "");
|
|
368
366
|
/* 排除()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){} */
|
|
369
367
|
itemResult = Boolean(funcStr.match(/^\(.*?\)=>\{\}$|^function.*?\(.*?\)\{\}$/));
|
|
370
368
|
break;
|
|
369
|
+
}
|
|
371
370
|
}
|
|
372
371
|
}
|
|
373
372
|
result = result && itemResult;
|
|
@@ -388,18 +387,23 @@ class CommonUtil {
|
|
|
388
387
|
return target instanceof Node;
|
|
389
388
|
}
|
|
390
389
|
isNotNull(...args) {
|
|
391
|
-
|
|
390
|
+
const UtilsContext = this;
|
|
392
391
|
return !UtilsContext.isNull.apply(this, args);
|
|
393
392
|
}
|
|
394
393
|
deepClone(obj) {
|
|
395
|
-
|
|
394
|
+
const UtilsContext = this;
|
|
396
395
|
if (obj === void 0)
|
|
397
396
|
return void 0;
|
|
398
397
|
if (obj === null)
|
|
399
398
|
return null;
|
|
400
|
-
|
|
399
|
+
const clone = obj instanceof Array ? [] : {};
|
|
401
400
|
for (const [key, value] of Object.entries(obj)) {
|
|
402
|
-
|
|
401
|
+
if (typeof value === "object") {
|
|
402
|
+
Reflect.set(clone, key, UtilsContext.deepClone(value));
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
Reflect.set(clone, key, value);
|
|
406
|
+
}
|
|
403
407
|
}
|
|
404
408
|
return clone;
|
|
405
409
|
}
|
|
@@ -426,11 +430,11 @@ class CommonUtil {
|
|
|
426
430
|
}
|
|
427
431
|
TryCatch()
|
|
428
432
|
.config({ log: false })
|
|
429
|
-
.error((
|
|
433
|
+
.error(() => {
|
|
430
434
|
TryCatch()
|
|
431
435
|
.error(() => {
|
|
432
436
|
try {
|
|
433
|
-
result = new Function(
|
|
437
|
+
result = new Function(`return ${data}`)();
|
|
434
438
|
}
|
|
435
439
|
catch (error2) {
|
|
436
440
|
if (typeof errorCallBack === "function") {
|
|
@@ -441,14 +445,14 @@ class CommonUtil {
|
|
|
441
445
|
.run(() => {
|
|
442
446
|
if (data &&
|
|
443
447
|
/^[\],:{}\s]*$/.test(data
|
|
444
|
-
.replace(/\\(?:["
|
|
445
|
-
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][
|
|
448
|
+
.replace(/\\(?:["\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
|
|
449
|
+
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?/g, "]")
|
|
446
450
|
.replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
|
|
447
|
-
result = new Function(
|
|
451
|
+
result = new Function(`return ${data}`)();
|
|
448
452
|
}
|
|
449
453
|
else {
|
|
450
454
|
if (typeof errorCallBack === "function") {
|
|
451
|
-
errorCallBack(new Error("target is not
|
|
455
|
+
errorCallBack(new Error("target is not JSON object"));
|
|
452
456
|
}
|
|
453
457
|
}
|
|
454
458
|
});
|
|
@@ -460,7 +464,7 @@ class CommonUtil {
|
|
|
460
464
|
return result;
|
|
461
465
|
}
|
|
462
466
|
}
|
|
463
|
-
|
|
467
|
+
const commonUtil = new CommonUtil();
|
|
464
468
|
|
|
465
469
|
class UtilsGMCookie {
|
|
466
470
|
windowApi = {
|
|
@@ -489,14 +493,14 @@ class UtilsGMCookie {
|
|
|
489
493
|
if (typeof cookieName !== "string") {
|
|
490
494
|
throw new TypeError("Utils.GMCookie.get 参数cookieName 必须为字符串");
|
|
491
495
|
}
|
|
492
|
-
|
|
496
|
+
const cookies = this.getCookiesList();
|
|
493
497
|
let findValue = void 0;
|
|
494
498
|
for (const cookieItem of cookies) {
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
499
|
+
const item = cookieItem.trim();
|
|
500
|
+
const itemSplit = item.split("=");
|
|
501
|
+
const itemName = itemSplit[0];
|
|
498
502
|
itemSplit.splice(0, 1);
|
|
499
|
-
|
|
503
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
500
504
|
if (itemName === cookieName) {
|
|
501
505
|
findValue = {
|
|
502
506
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -526,7 +530,7 @@ class UtilsGMCookie {
|
|
|
526
530
|
if (option == null) {
|
|
527
531
|
throw new Error("Utils.GMCookie.list 参数不能为空");
|
|
528
532
|
}
|
|
529
|
-
|
|
533
|
+
const resultData = [];
|
|
530
534
|
try {
|
|
531
535
|
let defaultOption = {
|
|
532
536
|
url: this.windowApi.window.location.href,
|
|
@@ -535,16 +539,16 @@ class UtilsGMCookie {
|
|
|
535
539
|
path: "/",
|
|
536
540
|
};
|
|
537
541
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
538
|
-
|
|
542
|
+
const cookies = this.getCookiesList();
|
|
539
543
|
cookies.forEach((item) => {
|
|
540
544
|
item = item.trim();
|
|
541
|
-
|
|
542
|
-
|
|
545
|
+
const itemSplit = item.split("=");
|
|
546
|
+
const itemName = itemSplit[0];
|
|
543
547
|
itemSplit.splice(0, 1);
|
|
544
|
-
|
|
545
|
-
|
|
548
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
549
|
+
const nameRegexp = defaultOption.name instanceof RegExp
|
|
546
550
|
? defaultOption.name
|
|
547
|
-
: new RegExp(
|
|
551
|
+
: new RegExp(`^${defaultOption.name}`, "g");
|
|
548
552
|
if (itemName.match(nameRegexp)) {
|
|
549
553
|
resultData.push({
|
|
550
554
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -578,7 +582,7 @@ class UtilsGMCookie {
|
|
|
578
582
|
if (option == null) {
|
|
579
583
|
throw new Error("Utils.GMCookie.list 参数不能为空");
|
|
580
584
|
}
|
|
581
|
-
|
|
585
|
+
const resultData = [];
|
|
582
586
|
let defaultOption = {
|
|
583
587
|
url: this.windowApi.window.location.href,
|
|
584
588
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -586,16 +590,16 @@ class UtilsGMCookie {
|
|
|
586
590
|
path: "/",
|
|
587
591
|
};
|
|
588
592
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
589
|
-
|
|
593
|
+
const cookies = this.getCookiesList();
|
|
590
594
|
cookies.forEach((item) => {
|
|
591
595
|
item = item.trim();
|
|
592
|
-
|
|
593
|
-
|
|
596
|
+
const itemSplit = item.split("=");
|
|
597
|
+
const itemName = itemSplit[0];
|
|
594
598
|
itemSplit.splice(0, 1);
|
|
595
|
-
|
|
596
|
-
|
|
599
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
600
|
+
const nameRegexp = defaultOption.name instanceof RegExp
|
|
597
601
|
? defaultOption.name
|
|
598
|
-
: new RegExp(
|
|
602
|
+
: new RegExp(`^${defaultOption.name}`, "g");
|
|
599
603
|
if (itemName.match(nameRegexp)) {
|
|
600
604
|
resultData.push({
|
|
601
605
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -635,17 +639,12 @@ class UtilsGMCookie {
|
|
|
635
639
|
expirationDate: Math.floor(Date.now()) + 60 * 60 * 24 * 30,
|
|
636
640
|
};
|
|
637
641
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
638
|
-
|
|
642
|
+
const life = defaultOption.expirationDate
|
|
639
643
|
? defaultOption.expirationDate
|
|
640
644
|
: Math.floor(Date.now()) + 60 * 60 * 24 * 30;
|
|
641
|
-
let cookieStr = defaultOption.name
|
|
642
|
-
"=" +
|
|
643
|
-
decodeURIComponent(defaultOption.value) +
|
|
644
|
-
";expires=" +
|
|
645
|
-
new Date(life).toGMTString() +
|
|
646
|
-
"; path=/";
|
|
645
|
+
let cookieStr = `${defaultOption.name}=${decodeURIComponent(defaultOption.value)};expires=${new Date(life).toGMTString()}; path=/`;
|
|
647
646
|
if (commonUtil.isNull(defaultOption.domain)) {
|
|
648
|
-
cookieStr +=
|
|
647
|
+
cookieStr += `; domain=${defaultOption.domain}`;
|
|
649
648
|
}
|
|
650
649
|
this.windowApi.document.cookie = cookieStr;
|
|
651
650
|
}
|
|
@@ -697,14 +696,14 @@ class UtilsGMCookie {
|
|
|
697
696
|
if (cookieStr.trim() === "") {
|
|
698
697
|
return [];
|
|
699
698
|
}
|
|
700
|
-
|
|
701
|
-
|
|
699
|
+
const cookies = cookieStr.split(";");
|
|
700
|
+
const result = [];
|
|
702
701
|
for (const cookieItem of cookies) {
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
702
|
+
const item = cookieItem.trim();
|
|
703
|
+
const itemSplit = item.split("=");
|
|
704
|
+
const itemName = itemSplit[0];
|
|
706
705
|
itemSplit.splice(0, 1);
|
|
707
|
-
|
|
706
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
708
707
|
result.push({
|
|
709
708
|
key: itemName,
|
|
710
709
|
value: itemValue,
|
|
@@ -714,6 +713,7 @@ class UtilsGMCookie {
|
|
|
714
713
|
}
|
|
715
714
|
}
|
|
716
715
|
|
|
716
|
+
/* eslint-disable */
|
|
717
717
|
// ==UserScript==
|
|
718
718
|
// @name ajaxHooker
|
|
719
719
|
// @author cxxjackie
|
|
@@ -1764,15 +1764,15 @@ class GMMenu {
|
|
|
1764
1764
|
*/
|
|
1765
1765
|
init() {
|
|
1766
1766
|
for (let index = 0; index < this.$data.data.length; index++) {
|
|
1767
|
-
|
|
1767
|
+
const menuOption = this.$data.data[index]["data"];
|
|
1768
1768
|
menuOption.enable = Boolean(this.getLocalMenuData(menuOption.key, menuOption.enable));
|
|
1769
1769
|
if (typeof menuOption.showText !== "function") {
|
|
1770
1770
|
menuOption.showText = (menuText, menuEnable) => {
|
|
1771
1771
|
if (menuEnable) {
|
|
1772
|
-
return this.$emoji.success
|
|
1772
|
+
return `${this.$emoji.success} ${menuText}`;
|
|
1773
1773
|
}
|
|
1774
1774
|
else {
|
|
1775
|
-
return this.$emoji.error
|
|
1775
|
+
return `${this.$emoji.error} ${menuText}`;
|
|
1776
1776
|
}
|
|
1777
1777
|
};
|
|
1778
1778
|
}
|
|
@@ -1783,7 +1783,7 @@ class GMMenu {
|
|
|
1783
1783
|
* @param menuOptions 如果存在,使用它
|
|
1784
1784
|
*/
|
|
1785
1785
|
register(menuOptions) {
|
|
1786
|
-
|
|
1786
|
+
const that = this;
|
|
1787
1787
|
if (menuOptions == null) {
|
|
1788
1788
|
throw new TypeError("register菜单数据不能为空");
|
|
1789
1789
|
}
|
|
@@ -1791,9 +1791,9 @@ class GMMenu {
|
|
|
1791
1791
|
menuOptions = [menuOptions];
|
|
1792
1792
|
}
|
|
1793
1793
|
for (let index = 0; index < menuOptions.length; index++) {
|
|
1794
|
-
|
|
1794
|
+
const cloneMenuOptionData = commonUtil.deepClone(menuOptions[index].data);
|
|
1795
1795
|
const { showText, clickCallBack } = this.handleMenuData(cloneMenuOptionData);
|
|
1796
|
-
|
|
1796
|
+
const menuId = that.context.GM_Api.registerMenuCommand(showText, clickCallBack);
|
|
1797
1797
|
menuOptions[index].id = menuId;
|
|
1798
1798
|
cloneMenuOptionData.deleteMenu = function () {
|
|
1799
1799
|
that.context.GM_Api.unregisterMenuCommand(menuId);
|
|
@@ -1807,7 +1807,7 @@ class GMMenu {
|
|
|
1807
1807
|
* @param {string} key 键
|
|
1808
1808
|
*/
|
|
1809
1809
|
getLocalMenuData(key, defaultValue) {
|
|
1810
|
-
|
|
1810
|
+
const localData = this.context.GM_Api.getValue(this.$data.key, {});
|
|
1811
1811
|
if (key in localData) {
|
|
1812
1812
|
return localData[key];
|
|
1813
1813
|
}
|
|
@@ -1821,7 +1821,7 @@ class GMMenu {
|
|
|
1821
1821
|
* @param value 值
|
|
1822
1822
|
*/
|
|
1823
1823
|
setLocalMenuData(key, value) {
|
|
1824
|
-
|
|
1824
|
+
const localData = this.context.GM_Api.getValue(this.$data.key, {});
|
|
1825
1825
|
localData[key] = value;
|
|
1826
1826
|
this.context.GM_Api.setValue(this.$data.key, localData);
|
|
1827
1827
|
},
|
|
@@ -1834,10 +1834,10 @@ class GMMenu {
|
|
|
1834
1834
|
if (typeof menuOption.showText !== "function") {
|
|
1835
1835
|
menuOption.showText = (menuText, menuEnable) => {
|
|
1836
1836
|
if (menuEnable) {
|
|
1837
|
-
return this.$emoji.success
|
|
1837
|
+
return `${this.$emoji.success} ${menuText}`;
|
|
1838
1838
|
}
|
|
1839
1839
|
else {
|
|
1840
|
-
return this.$emoji.error
|
|
1840
|
+
return `${this.$emoji.error} ${menuText}`;
|
|
1841
1841
|
}
|
|
1842
1842
|
};
|
|
1843
1843
|
}
|
|
@@ -1848,12 +1848,12 @@ class GMMenu {
|
|
|
1848
1848
|
* @param menuOption
|
|
1849
1849
|
*/
|
|
1850
1850
|
handleMenuData(menuOption) {
|
|
1851
|
-
|
|
1852
|
-
|
|
1851
|
+
const that = this;
|
|
1852
|
+
const menuLocalDataItemKey = menuOption.key;
|
|
1853
1853
|
/* 菜单默认开启的状态 */
|
|
1854
|
-
|
|
1854
|
+
const defaultEnable = Boolean(this.getLocalMenuData(menuLocalDataItemKey, menuOption.enable));
|
|
1855
1855
|
/** 油猴菜单上显示的文本 */
|
|
1856
|
-
|
|
1856
|
+
const showText = menuOption.showText(menuOption.text, defaultEnable);
|
|
1857
1857
|
// const GMMenuOptions = {
|
|
1858
1858
|
// /**
|
|
1859
1859
|
// * 菜单的id
|
|
@@ -1883,7 +1883,7 @@ class GMMenu {
|
|
|
1883
1883
|
* @param event
|
|
1884
1884
|
*/
|
|
1885
1885
|
function clickCallBack(event) {
|
|
1886
|
-
|
|
1886
|
+
const localEnable = Boolean(that.getLocalMenuData(menuLocalDataItemKey, defaultEnable));
|
|
1887
1887
|
if (menuOption.isStoreValue) {
|
|
1888
1888
|
that.setLocalMenuData(menuLocalDataItemKey, !localEnable);
|
|
1889
1889
|
}
|
|
@@ -1996,7 +1996,7 @@ class GMMenu {
|
|
|
1996
1996
|
menuOptionList = [...menuOptionList, options];
|
|
1997
1997
|
}
|
|
1998
1998
|
menuOptionList.forEach((menuOption) => {
|
|
1999
|
-
|
|
1999
|
+
const oldMenuOption = this.MenuHandle.getMenuOption(menuOption.key);
|
|
2000
2000
|
if (oldMenuOption) {
|
|
2001
2001
|
// 覆盖
|
|
2002
2002
|
Object.assign(oldMenuOption, menuOption);
|
|
@@ -2164,42 +2164,42 @@ class Hooks {
|
|
|
2164
2164
|
* 在Function原型上添加自定义方法.hook和.unhook
|
|
2165
2165
|
*/
|
|
2166
2166
|
initEnv() {
|
|
2167
|
-
Function.prototype.hook = function (
|
|
2167
|
+
Function.prototype.hook = function (_, hookFunc, context) {
|
|
2168
2168
|
let _context = null; //函数上下文
|
|
2169
2169
|
let _funcName = null; //函数名
|
|
2170
2170
|
_context = context || window;
|
|
2171
2171
|
_funcName = getFuncName(this);
|
|
2172
|
-
_context[
|
|
2172
|
+
_context[`realFunc_${_funcName}`] = this;
|
|
2173
2173
|
if (_context[_funcName].prototype && _context[_funcName].prototype.isHooked) {
|
|
2174
2174
|
console.log("Already has been hooked,unhook first");
|
|
2175
2175
|
return false;
|
|
2176
2176
|
}
|
|
2177
2177
|
function getFuncName(fn) {
|
|
2178
2178
|
// 获取函数名
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2179
|
+
const strFunc = fn.toString();
|
|
2180
|
+
const _regex = /function\s+(\w+)\s*\(/;
|
|
2181
|
+
const patten = strFunc.match(_regex);
|
|
2182
2182
|
if (patten) {
|
|
2183
2183
|
return patten[1];
|
|
2184
2184
|
}
|
|
2185
2185
|
return "";
|
|
2186
2186
|
}
|
|
2187
2187
|
try {
|
|
2188
|
-
new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
|
|
2189
|
-
let args = Array.prototype.slice.call(arguments, 0);
|
|
2190
|
-
let obj = this;
|
|
2191
|
-
hookFunc.apply(obj, args);
|
|
2192
|
-
return _context['realFunc_${_funcName}'].apply(obj, args);
|
|
2188
|
+
new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
|
|
2189
|
+
let args = Array.prototype.slice.call(arguments, 0);
|
|
2190
|
+
let obj = this;
|
|
2191
|
+
hookFunc.apply(obj, args);
|
|
2192
|
+
return _context['realFunc_${_funcName}'].apply(obj, args);
|
|
2193
2193
|
};`)(_context, _funcName, hookFunc);
|
|
2194
2194
|
_context[_funcName].prototype.isHooked = true;
|
|
2195
2195
|
return true;
|
|
2196
2196
|
}
|
|
2197
2197
|
catch (e) {
|
|
2198
|
-
console.log("Hook failed,check the params.");
|
|
2198
|
+
console.log("Hook failed,check the params.", e);
|
|
2199
2199
|
return false;
|
|
2200
2200
|
}
|
|
2201
2201
|
};
|
|
2202
|
-
Function.prototype.unhook = function (
|
|
2202
|
+
Function.prototype.unhook = function (_, funcName, context) {
|
|
2203
2203
|
let _context = null;
|
|
2204
2204
|
let _funcName = null;
|
|
2205
2205
|
_context = context || window;
|
|
@@ -2208,8 +2208,8 @@ class Hooks {
|
|
|
2208
2208
|
console.log("No function is hooked on");
|
|
2209
2209
|
return false;
|
|
2210
2210
|
}
|
|
2211
|
-
_context[_funcName] = _context[
|
|
2212
|
-
Reflect.deleteProperty(_context,
|
|
2211
|
+
_context[_funcName] = _context[`realFunc${_funcName}`];
|
|
2212
|
+
Reflect.deleteProperty(_context, `realFunc_${_funcName}`);
|
|
2213
2213
|
return true;
|
|
2214
2214
|
};
|
|
2215
2215
|
}
|
|
@@ -2217,10 +2217,10 @@ class Hooks {
|
|
|
2217
2217
|
* 删除在Function原型上添加的自定义方法.hook和.unhook
|
|
2218
2218
|
*/
|
|
2219
2219
|
cleanEnv() {
|
|
2220
|
-
if (
|
|
2220
|
+
if (Object.prototype.hasOwnProperty.call(Function.prototype, "hook")) {
|
|
2221
2221
|
Reflect.deleteProperty(Function.prototype, "hook");
|
|
2222
2222
|
}
|
|
2223
|
-
if (
|
|
2223
|
+
if (Object.prototype.hasOwnProperty.call(Function.prototype, "unhook")) {
|
|
2224
2224
|
Reflect.deleteProperty(Function.prototype, "unhook");
|
|
2225
2225
|
}
|
|
2226
2226
|
return true;
|
|
@@ -2236,7 +2236,7 @@ const GenerateUUID = function () {
|
|
|
2236
2236
|
}
|
|
2237
2237
|
else {
|
|
2238
2238
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (charStr) {
|
|
2239
|
-
|
|
2239
|
+
const randomValue = (Math.random() * 16) | 0, randomCharValue = charStr === "x" ? randomValue : (randomValue & 0x3) | 0x8;
|
|
2240
2240
|
return randomCharValue.toString(16);
|
|
2241
2241
|
});
|
|
2242
2242
|
}
|
|
@@ -2278,9 +2278,9 @@ class Httpx {
|
|
|
2278
2278
|
}
|
|
2279
2279
|
}
|
|
2280
2280
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2281
|
-
|
|
2281
|
+
const item = this.$config.configList[index];
|
|
2282
2282
|
if (typeof item.fn === "function") {
|
|
2283
|
-
|
|
2283
|
+
const result = await item.fn(details);
|
|
2284
2284
|
if (result == null) {
|
|
2285
2285
|
return;
|
|
2286
2286
|
}
|
|
@@ -2293,7 +2293,7 @@ class Httpx {
|
|
|
2293
2293
|
*/
|
|
2294
2294
|
add(fn) {
|
|
2295
2295
|
if (typeof fn === "function") {
|
|
2296
|
-
|
|
2296
|
+
const uuid = GenerateUUID();
|
|
2297
2297
|
this.$config.configList.push({
|
|
2298
2298
|
id: uuid,
|
|
2299
2299
|
fn: fn,
|
|
@@ -2310,7 +2310,7 @@ class Httpx {
|
|
|
2310
2310
|
*/
|
|
2311
2311
|
delete(id) {
|
|
2312
2312
|
if (typeof id === "string") {
|
|
2313
|
-
|
|
2313
|
+
const findIndex = this.$config.configList.findIndex((item) => item.id === id);
|
|
2314
2314
|
if (findIndex !== -1) {
|
|
2315
2315
|
this.$config.configList.splice(findIndex, 1);
|
|
2316
2316
|
return true;
|
|
@@ -2356,9 +2356,9 @@ class Httpx {
|
|
|
2356
2356
|
}
|
|
2357
2357
|
}
|
|
2358
2358
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2359
|
-
|
|
2359
|
+
const item = this.$config.configList[index];
|
|
2360
2360
|
if (typeof item.successFn === "function") {
|
|
2361
|
-
|
|
2361
|
+
const result = await item.successFn(response, details);
|
|
2362
2362
|
if (result == null) {
|
|
2363
2363
|
return;
|
|
2364
2364
|
}
|
|
@@ -2391,9 +2391,9 @@ class Httpx {
|
|
|
2391
2391
|
}
|
|
2392
2392
|
}
|
|
2393
2393
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2394
|
-
|
|
2394
|
+
const item = this.$config.configList[index];
|
|
2395
2395
|
if (typeof item.errorFn === "function") {
|
|
2396
|
-
|
|
2396
|
+
const result = await item.errorFn(data);
|
|
2397
2397
|
if (result == null) {
|
|
2398
2398
|
return;
|
|
2399
2399
|
}
|
|
@@ -2405,7 +2405,7 @@ class Httpx {
|
|
|
2405
2405
|
* 添加请求前的回调处理配置
|
|
2406
2406
|
*/
|
|
2407
2407
|
add(successFn, errorFn) {
|
|
2408
|
-
|
|
2408
|
+
const id = GenerateUUID();
|
|
2409
2409
|
this.$config.configList.push({
|
|
2410
2410
|
id: id,
|
|
2411
2411
|
successFn: successFn,
|
|
@@ -2419,7 +2419,7 @@ class Httpx {
|
|
|
2419
2419
|
*/
|
|
2420
2420
|
delete(id) {
|
|
2421
2421
|
if (typeof id === "string") {
|
|
2422
|
-
|
|
2422
|
+
const findIndex = this.$config.configList.findIndex((item) => item.id === id);
|
|
2423
2423
|
if (findIndex !== -1) {
|
|
2424
2424
|
this.$config.configList.splice(findIndex, 1);
|
|
2425
2425
|
return true;
|
|
@@ -2440,23 +2440,23 @@ class Httpx {
|
|
|
2440
2440
|
* 对请求的参数进行合并处理
|
|
2441
2441
|
*/
|
|
2442
2442
|
handleBeforeRequestOptionArgs(...args) {
|
|
2443
|
-
|
|
2443
|
+
const option = {
|
|
2444
2444
|
url: void 0,
|
|
2445
2445
|
};
|
|
2446
2446
|
if (typeof args[0] === "string") {
|
|
2447
2447
|
/* 传入的是url,转为配置 */
|
|
2448
|
-
|
|
2448
|
+
const url = args[0];
|
|
2449
2449
|
option.url = url;
|
|
2450
2450
|
if (typeof args[1] === "object") {
|
|
2451
2451
|
/* 处理第二个参数details */
|
|
2452
|
-
|
|
2452
|
+
const optionArg = args[1];
|
|
2453
2453
|
commonUtil.assign(option, optionArg, true);
|
|
2454
2454
|
option.url = url;
|
|
2455
2455
|
}
|
|
2456
2456
|
}
|
|
2457
2457
|
else {
|
|
2458
2458
|
/* 传入的是配置 */
|
|
2459
|
-
|
|
2459
|
+
const optionArg = args[0];
|
|
2460
2460
|
commonUtil.assign(option, optionArg, true);
|
|
2461
2461
|
}
|
|
2462
2462
|
return option;
|
|
@@ -2469,7 +2469,7 @@ class Httpx {
|
|
|
2469
2469
|
* @param reject promise抛出错误回调
|
|
2470
2470
|
*/
|
|
2471
2471
|
getRequestOption(method, userRequestOption, resolve, reject) {
|
|
2472
|
-
|
|
2472
|
+
const that = this;
|
|
2473
2473
|
let url = userRequestOption.url || this.context.#defaultRequestOption.url;
|
|
2474
2474
|
if (typeof url === "string") {
|
|
2475
2475
|
// 去除左右空格
|
|
@@ -2482,7 +2482,7 @@ class Httpx {
|
|
|
2482
2482
|
}
|
|
2483
2483
|
}
|
|
2484
2484
|
}
|
|
2485
|
-
|
|
2485
|
+
const requestOption = {
|
|
2486
2486
|
url: url,
|
|
2487
2487
|
method: (method || "GET").toString().toUpperCase().trim(),
|
|
2488
2488
|
timeout: userRequestOption.timeout || this.context.#defaultRequestOption.timeout,
|
|
@@ -2504,9 +2504,12 @@ class Httpx {
|
|
|
2504
2504
|
/* 对象使用深拷贝 */
|
|
2505
2505
|
fetchInit: commonUtil.deepClone(this.context.#defaultRequestOption.fetchInit),
|
|
2506
2506
|
allowInterceptConfig: {
|
|
2507
|
-
beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2508
|
-
|
|
2509
|
-
|
|
2507
|
+
beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2508
|
+
.beforeRequest,
|
|
2509
|
+
afterResponseSuccess: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2510
|
+
.afterResponseSuccess,
|
|
2511
|
+
afterResponseError: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2512
|
+
.afterResponseError,
|
|
2510
2513
|
},
|
|
2511
2514
|
user: userRequestOption.user || this.context.#defaultRequestOption.user,
|
|
2512
2515
|
password: userRequestOption.password || this.context.#defaultRequestOption.password,
|
|
@@ -2534,15 +2537,17 @@ class Httpx {
|
|
|
2534
2537
|
};
|
|
2535
2538
|
// 补全allowInterceptConfig参数
|
|
2536
2539
|
if (typeof userRequestOption.allowInterceptConfig === "boolean") {
|
|
2537
|
-
Object.keys(requestOption.allowInterceptConfig)
|
|
2540
|
+
const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
|
|
2541
|
+
allowInterceptConfigKeys.forEach((keyName) => {
|
|
2538
2542
|
Reflect.set(requestOption.allowInterceptConfig, keyName, userRequestOption.allowInterceptConfig);
|
|
2539
2543
|
});
|
|
2540
2544
|
}
|
|
2541
2545
|
else {
|
|
2542
2546
|
if (typeof userRequestOption.allowInterceptConfig === "object" &&
|
|
2543
2547
|
userRequestOption.allowInterceptConfig != null) {
|
|
2544
|
-
Object.keys(
|
|
2545
|
-
|
|
2548
|
+
const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
|
|
2549
|
+
allowInterceptConfigKeys.forEach((keyName) => {
|
|
2550
|
+
const value = Reflect.get(userRequestOption.allowInterceptConfig, keyName);
|
|
2546
2551
|
if (typeof value === "boolean" &&
|
|
2547
2552
|
Reflect.has(requestOption.allowInterceptConfig, keyName)) {
|
|
2548
2553
|
Reflect.set(requestOption.allowInterceptConfig, keyName, value);
|
|
@@ -2556,7 +2561,8 @@ class Httpx {
|
|
|
2556
2561
|
}
|
|
2557
2562
|
if (typeof requestOption.headers === "object") {
|
|
2558
2563
|
if (typeof userRequestOption.headers === "object") {
|
|
2559
|
-
Object.keys(
|
|
2564
|
+
const headerKeys = Object.keys(requestOption.headers);
|
|
2565
|
+
headerKeys.forEach((keyName) => {
|
|
2560
2566
|
if (keyName in requestOption.headers && userRequestOption.headers?.[keyName] == null) {
|
|
2561
2567
|
/* 在默认的header中存在,且设置它新的值为空,那么就是默认的值 */
|
|
2562
2568
|
Reflect.deleteProperty(requestOption.headers, keyName);
|
|
@@ -2574,8 +2580,9 @@ class Httpx {
|
|
|
2574
2580
|
if (typeof requestOption.fetchInit === "object") {
|
|
2575
2581
|
/* 使用assign替换且添加 */
|
|
2576
2582
|
if (typeof userRequestOption.fetchInit === "object") {
|
|
2577
|
-
Object.keys(
|
|
2578
|
-
|
|
2583
|
+
const fetchInitKeys = Object.keys(requestOption.fetchInit);
|
|
2584
|
+
fetchInitKeys.forEach((keyName) => {
|
|
2585
|
+
if (keyName in requestOption.fetchInit && Reflect.get(userRequestOption.fetchInit ?? {}, keyName) == null) {
|
|
2579
2586
|
/* 在默认的fetchInit中存在,且设置它新的值为空,那么就是默认的值 */
|
|
2580
2587
|
Reflect.deleteProperty(requestOption.fetchInit, keyName);
|
|
2581
2588
|
}
|
|
@@ -2600,7 +2607,7 @@ class Httpx {
|
|
|
2600
2607
|
try {
|
|
2601
2608
|
new URL(requestOption.url);
|
|
2602
2609
|
}
|
|
2603
|
-
catch
|
|
2610
|
+
catch {
|
|
2604
2611
|
if (requestOption.url.startsWith("//")) {
|
|
2605
2612
|
// 补充https:
|
|
2606
2613
|
requestOption.url = globalThis.location.protocol + requestOption.url;
|
|
@@ -2611,7 +2618,7 @@ class Httpx {
|
|
|
2611
2618
|
}
|
|
2612
2619
|
else {
|
|
2613
2620
|
// 补充origin+/
|
|
2614
|
-
requestOption.url = globalThis.location.origin
|
|
2621
|
+
requestOption.url = `${globalThis.location.origin}/${requestOption.url}`;
|
|
2615
2622
|
}
|
|
2616
2623
|
}
|
|
2617
2624
|
if (requestOption.fetchInit && !requestOption.fetch) {
|
|
@@ -2621,12 +2628,12 @@ class Httpx {
|
|
|
2621
2628
|
// 转换data类型
|
|
2622
2629
|
try {
|
|
2623
2630
|
/** 是否对数据进行处理 */
|
|
2624
|
-
|
|
2631
|
+
const processData = userRequestOption.processData ?? true;
|
|
2625
2632
|
if (requestOption.data != null && processData) {
|
|
2626
|
-
|
|
2633
|
+
const method = requestOption.method;
|
|
2627
2634
|
if (method === "GET" || method === "HEAD") {
|
|
2628
2635
|
// GET类型,data如果有,那么需要转为searchParams
|
|
2629
|
-
|
|
2636
|
+
const urlObj = new URL(requestOption.url);
|
|
2630
2637
|
let urlSearch = "";
|
|
2631
2638
|
let isHandler = false;
|
|
2632
2639
|
if (typeof requestOption.data === "string") {
|
|
@@ -2636,7 +2643,7 @@ class Httpx {
|
|
|
2636
2643
|
else if (typeof requestOption.data === "object") {
|
|
2637
2644
|
isHandler = true;
|
|
2638
2645
|
// URLSearchParams参数可以转普通的string:string,包括FormData
|
|
2639
|
-
|
|
2646
|
+
const searchParams = new URLSearchParams(requestOption.data);
|
|
2640
2647
|
urlSearch = searchParams.toString();
|
|
2641
2648
|
}
|
|
2642
2649
|
if (isHandler) {
|
|
@@ -2657,7 +2664,7 @@ class Httpx {
|
|
|
2657
2664
|
}
|
|
2658
2665
|
else {
|
|
2659
2666
|
// xxx=xxx&xxx=
|
|
2660
|
-
urlObj.search = urlObj.search
|
|
2667
|
+
urlObj.search = `${urlObj.search}&${urlSearch}`;
|
|
2661
2668
|
}
|
|
2662
2669
|
}
|
|
2663
2670
|
}
|
|
@@ -2665,14 +2672,14 @@ class Httpx {
|
|
|
2665
2672
|
}
|
|
2666
2673
|
else if (method === "POST" && requestOption.headers != null) {
|
|
2667
2674
|
// POST类型,data如果是FormData,那么需要转为string
|
|
2668
|
-
|
|
2669
|
-
|
|
2675
|
+
const headersKeyList = Object.keys(requestOption.headers);
|
|
2676
|
+
const ContentTypeIndex = headersKeyList.findIndex((headerKey) => {
|
|
2670
2677
|
return (headerKey.trim().toLowerCase() === "content-type" &&
|
|
2671
2678
|
typeof requestOption.headers[headerKey] === "string");
|
|
2672
2679
|
});
|
|
2673
2680
|
if (ContentTypeIndex !== -1) {
|
|
2674
|
-
|
|
2675
|
-
|
|
2681
|
+
const ContentTypeKey = headersKeyList[ContentTypeIndex];
|
|
2682
|
+
const ContentType = requestOption.headers[ContentTypeKey];
|
|
2676
2683
|
// 设置了Content-Type
|
|
2677
2684
|
if (ContentType.includes("application/json")) {
|
|
2678
2685
|
// application/json
|
|
@@ -2713,10 +2720,10 @@ class Httpx {
|
|
|
2713
2720
|
* @param option 请求配置
|
|
2714
2721
|
*/
|
|
2715
2722
|
removeRequestNullOption(option) {
|
|
2716
|
-
Object.keys(option)
|
|
2717
|
-
|
|
2718
|
-
|
|
2719
|
-
|
|
2723
|
+
const optionKeys = Object.keys(option);
|
|
2724
|
+
optionKeys.forEach((keyName) => {
|
|
2725
|
+
const optionValue = option[keyName];
|
|
2726
|
+
if (optionValue == null || (optionValue instanceof Function && commonUtil.isNull(optionValue))) {
|
|
2720
2727
|
Reflect.deleteProperty(option, keyName);
|
|
2721
2728
|
return;
|
|
2722
2729
|
}
|
|
@@ -2734,14 +2741,14 @@ class Httpx {
|
|
|
2734
2741
|
/**
|
|
2735
2742
|
* fetch的请求配置
|
|
2736
2743
|
**/
|
|
2737
|
-
|
|
2744
|
+
const fetchRequestOption = {};
|
|
2738
2745
|
if ((option.method === "GET" || option.method === "HEAD") && option.data != null) {
|
|
2739
2746
|
/* GET 或 HEAD 方法的请求不能包含 body 信息 */
|
|
2740
2747
|
Reflect.deleteProperty(option, "data");
|
|
2741
2748
|
}
|
|
2742
2749
|
/* 中止信号控制器 */
|
|
2743
|
-
|
|
2744
|
-
|
|
2750
|
+
const abortController = new AbortController();
|
|
2751
|
+
const signal = abortController.signal;
|
|
2745
2752
|
signal.onabort = () => {
|
|
2746
2753
|
option.onabort({
|
|
2747
2754
|
isFetch: true,
|
|
@@ -2786,10 +2793,10 @@ class Httpx {
|
|
|
2786
2793
|
* onabort请求被取消-触发
|
|
2787
2794
|
* @param details 配置
|
|
2788
2795
|
* @param resolve promise回调
|
|
2789
|
-
* @param
|
|
2796
|
+
* @param _reject promise抛出错误回调
|
|
2790
2797
|
* @param argsResult 返回的参数列表
|
|
2791
2798
|
*/
|
|
2792
|
-
async onAbort(details, resolve,
|
|
2799
|
+
async onAbort(details, resolve, _reject, argsResult) {
|
|
2793
2800
|
// console.log(argsResult);
|
|
2794
2801
|
if (typeof details?.onabort === "function") {
|
|
2795
2802
|
details.onabort.apply(this, argsResult);
|
|
@@ -2826,7 +2833,7 @@ class Httpx {
|
|
|
2826
2833
|
* @param reject 抛出错误
|
|
2827
2834
|
* @param argsResult 返回的参数列表
|
|
2828
2835
|
*/
|
|
2829
|
-
async onTimeout(details, resolve,
|
|
2836
|
+
async onTimeout(details, resolve, _reject, argsResult) {
|
|
2830
2837
|
// console.log(argsResult);
|
|
2831
2838
|
if (typeof details?.ontimeout === "function") {
|
|
2832
2839
|
// 执行配置中的ontime回调
|
|
@@ -2864,10 +2871,10 @@ class Httpx {
|
|
|
2864
2871
|
* onerror请求异常-触发
|
|
2865
2872
|
* @param details 配置
|
|
2866
2873
|
* @param resolve 回调
|
|
2867
|
-
* @param
|
|
2874
|
+
* @param _reject 抛出错误
|
|
2868
2875
|
* @param argsResult 返回的参数列表
|
|
2869
2876
|
*/
|
|
2870
|
-
async onError(details, resolve,
|
|
2877
|
+
async onError(details, resolve, _reject, argsResult) {
|
|
2871
2878
|
// console.log(argsResult);
|
|
2872
2879
|
if (typeof details?.onerror === "function") {
|
|
2873
2880
|
details.onerror.apply(this, argsResult);
|
|
@@ -2901,16 +2908,15 @@ class Httpx {
|
|
|
2901
2908
|
* onload加载完毕-触发
|
|
2902
2909
|
* @param details 请求的配置
|
|
2903
2910
|
* @param resolve 回调
|
|
2904
|
-
* @param
|
|
2911
|
+
* @param _reject 抛出错误
|
|
2905
2912
|
* @param argsResult 返回的参数列表
|
|
2906
2913
|
*/
|
|
2907
|
-
async onLoad(details, resolve,
|
|
2914
|
+
async onLoad(details, resolve, _reject, argsResult) {
|
|
2908
2915
|
// console.log(argsResult);
|
|
2909
2916
|
/* X浏览器会因为设置了responseType导致不返回responseText */
|
|
2910
|
-
|
|
2917
|
+
const originResponse = argsResult[0];
|
|
2911
2918
|
/* responseText为空,response不为空的情况 */
|
|
2912
|
-
if (commonUtil.isNull(originResponse["responseText"]) &&
|
|
2913
|
-
commonUtil.isNotNull(originResponse["response"])) {
|
|
2919
|
+
if (commonUtil.isNull(originResponse["responseText"]) && commonUtil.isNotNull(originResponse["response"])) {
|
|
2914
2920
|
if (typeof originResponse["response"] === "object") {
|
|
2915
2921
|
TryCatch().run(() => {
|
|
2916
2922
|
originResponse["responseText"] = JSON.stringify(originResponse["response"]);
|
|
@@ -2925,51 +2931,51 @@ class Httpx {
|
|
|
2925
2931
|
typeof originResponse["responseText"] === "string" &&
|
|
2926
2932
|
originResponse["responseText"].trim() !== "") {
|
|
2927
2933
|
/** 原始的请求text */
|
|
2928
|
-
|
|
2934
|
+
const httpxResponseText = originResponse.responseText;
|
|
2929
2935
|
// 自定义个新的response
|
|
2930
2936
|
let httpxResponse = httpxResponseText;
|
|
2931
2937
|
if (details.responseType === "json") {
|
|
2932
2938
|
httpxResponse = commonUtil.toJSON(httpxResponseText);
|
|
2933
2939
|
}
|
|
2934
2940
|
else if (details.responseType === "document") {
|
|
2935
|
-
|
|
2941
|
+
const parser = new DOMParser();
|
|
2936
2942
|
httpxResponse = parser.parseFromString(httpxResponseText, "text/html");
|
|
2937
2943
|
}
|
|
2938
2944
|
else if (details.responseType === "arraybuffer") {
|
|
2939
|
-
|
|
2940
|
-
|
|
2945
|
+
const encoder = new TextEncoder();
|
|
2946
|
+
const arrayBuffer = encoder.encode(httpxResponseText);
|
|
2941
2947
|
httpxResponse = arrayBuffer;
|
|
2942
2948
|
}
|
|
2943
2949
|
else if (details.responseType === "blob") {
|
|
2944
|
-
|
|
2945
|
-
|
|
2950
|
+
const encoder = new TextEncoder();
|
|
2951
|
+
const arrayBuffer = encoder.encode(httpxResponseText);
|
|
2946
2952
|
httpxResponse = new Blob([arrayBuffer]);
|
|
2947
2953
|
}
|
|
2948
2954
|
// 尝试覆盖原response
|
|
2949
2955
|
try {
|
|
2950
|
-
|
|
2956
|
+
const setStatus = Reflect.set(originResponse, "response", httpxResponse);
|
|
2951
2957
|
if (!setStatus) {
|
|
2952
2958
|
console.warn("[Httpx-HttpxCallBack.oonLoad] 覆盖原始 response 失败,尝试添加新的httpxResponse");
|
|
2953
2959
|
try {
|
|
2954
2960
|
Reflect.set(originResponse, "httpxResponse", httpxResponse);
|
|
2955
2961
|
}
|
|
2956
|
-
catch
|
|
2962
|
+
catch {
|
|
2957
2963
|
console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
|
|
2958
2964
|
}
|
|
2959
2965
|
}
|
|
2960
2966
|
}
|
|
2961
|
-
catch
|
|
2967
|
+
catch {
|
|
2962
2968
|
console.warn("[Httpx-HttpxCallBack.oonLoad] 原始 response 无法被覆盖,尝试添加新的httpxResponse");
|
|
2963
2969
|
try {
|
|
2964
2970
|
Reflect.set(originResponse, "httpxResponse", httpxResponse);
|
|
2965
2971
|
}
|
|
2966
|
-
catch
|
|
2972
|
+
catch {
|
|
2967
2973
|
console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
|
|
2968
2974
|
}
|
|
2969
2975
|
}
|
|
2970
2976
|
}
|
|
2971
2977
|
/* Stay扩展中没有finalUrl,对应的是responseURL */
|
|
2972
|
-
|
|
2978
|
+
const originResponseURL = Reflect.get(originResponse, "responseURL");
|
|
2973
2979
|
if (originResponse["finalUrl"] == null && originResponseURL != null) {
|
|
2974
2980
|
Reflect.set(originResponse, "finalUrl", originResponseURL);
|
|
2975
2981
|
}
|
|
@@ -2989,7 +2995,7 @@ class Httpx {
|
|
|
2989
2995
|
});
|
|
2990
2996
|
}
|
|
2991
2997
|
else {
|
|
2992
|
-
this.context.HttpxResponseCallBack.onError(details, resolve,
|
|
2998
|
+
this.context.HttpxResponseCallBack.onError(details, resolve, _reject, argsResult);
|
|
2993
2999
|
}
|
|
2994
3000
|
},
|
|
2995
3001
|
/**
|
|
@@ -3046,7 +3052,7 @@ class Httpx {
|
|
|
3046
3052
|
console.log("[Httpx-HttpxRequest.request] 请求前的配置👇", details);
|
|
3047
3053
|
}
|
|
3048
3054
|
if (typeof this.context.HttpxRequestHook.beforeRequestCallBack === "function") {
|
|
3049
|
-
|
|
3055
|
+
const hookResult = await this.context.HttpxRequestHook.beforeRequestCallBack(details);
|
|
3050
3056
|
if (hookResult == null) {
|
|
3051
3057
|
return;
|
|
3052
3058
|
}
|
|
@@ -3078,7 +3084,7 @@ class Httpx {
|
|
|
3078
3084
|
fetch(option.url, fetchRequestOption)
|
|
3079
3085
|
.then(async (fetchResponse) => {
|
|
3080
3086
|
/** 自定义的response */
|
|
3081
|
-
|
|
3087
|
+
const httpxResponse = {
|
|
3082
3088
|
isFetch: true,
|
|
3083
3089
|
finalUrl: fetchResponse.url,
|
|
3084
3090
|
readyState: 4,
|
|
@@ -3093,9 +3099,9 @@ class Httpx {
|
|
|
3093
3099
|
};
|
|
3094
3100
|
Object.assign(httpxResponse, option.context || {});
|
|
3095
3101
|
// 把headers转为字符串
|
|
3096
|
-
|
|
3102
|
+
fetchResponse.headers.forEach((value, key) => {
|
|
3097
3103
|
httpxResponse.responseHeaders += `${key}: ${value}\n`;
|
|
3098
|
-
}
|
|
3104
|
+
});
|
|
3099
3105
|
/** 请求返回的类型 */
|
|
3100
3106
|
const fetchResponseType = fetchResponse.headers.get("Content-Type");
|
|
3101
3107
|
/* 如果需要stream,且获取到的是stream,那直接返回 */
|
|
@@ -3116,11 +3122,11 @@ class Httpx {
|
|
|
3116
3122
|
/** 响应xml文档 */
|
|
3117
3123
|
let responseXML = "";
|
|
3118
3124
|
/** 先获取二进制数据 */
|
|
3119
|
-
|
|
3125
|
+
const arrayBuffer = await fetchResponse.arrayBuffer();
|
|
3120
3126
|
/** 数据编码 */
|
|
3121
3127
|
let encoding = "utf-8";
|
|
3122
3128
|
if (fetchResponse.headers.has("Content-Type")) {
|
|
3123
|
-
|
|
3129
|
+
const charsetMatched = fetchResponse.headers.get("Content-Type")?.match(/charset=(.+)/);
|
|
3124
3130
|
if (charsetMatched) {
|
|
3125
3131
|
encoding = charsetMatched[1];
|
|
3126
3132
|
encoding = encoding.toLowerCase();
|
|
@@ -3130,7 +3136,7 @@ class Httpx {
|
|
|
3130
3136
|
// 去除引号
|
|
3131
3137
|
encoding = encoding.replace(/('|")/gi, "");
|
|
3132
3138
|
// 编码
|
|
3133
|
-
|
|
3139
|
+
const textDecoder = new TextDecoder(encoding);
|
|
3134
3140
|
responseText = textDecoder.decode(arrayBuffer);
|
|
3135
3141
|
response = responseText;
|
|
3136
3142
|
if (option.responseType === "arraybuffer") {
|
|
@@ -3148,11 +3154,11 @@ class Httpx {
|
|
|
3148
3154
|
}
|
|
3149
3155
|
else if (option.responseType === "document" || option.responseType == null) {
|
|
3150
3156
|
// response返回格式是文档格式
|
|
3151
|
-
|
|
3157
|
+
const parser = new DOMParser();
|
|
3152
3158
|
response = parser.parseFromString(responseText, "text/html");
|
|
3153
3159
|
}
|
|
3154
3160
|
// 转为XML结构
|
|
3155
|
-
|
|
3161
|
+
const parser = new DOMParser();
|
|
3156
3162
|
responseXML = parser.parseFromString(responseText, "text/xml");
|
|
3157
3163
|
httpxResponse.response = response;
|
|
3158
3164
|
httpxResponse.responseText = responseText;
|
|
@@ -3226,6 +3232,9 @@ class Httpx {
|
|
|
3226
3232
|
onreadystatechange() { },
|
|
3227
3233
|
onprogress() { },
|
|
3228
3234
|
};
|
|
3235
|
+
/**
|
|
3236
|
+
* 实例化的默认配置
|
|
3237
|
+
*/
|
|
3229
3238
|
#defaultInitOption = {
|
|
3230
3239
|
/**
|
|
3231
3240
|
* `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
|
|
@@ -3341,7 +3350,7 @@ class Httpx {
|
|
|
3341
3350
|
* @param details 配置
|
|
3342
3351
|
*/
|
|
3343
3352
|
get(...args) {
|
|
3344
|
-
|
|
3353
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3345
3354
|
useRequestOption.method = "GET";
|
|
3346
3355
|
return this.request(useRequestOption, (option) => {
|
|
3347
3356
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3351,7 +3360,7 @@ class Httpx {
|
|
|
3351
3360
|
* POST 请求
|
|
3352
3361
|
*/
|
|
3353
3362
|
post(...args) {
|
|
3354
|
-
|
|
3363
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3355
3364
|
useRequestOption.method = "POST";
|
|
3356
3365
|
return this.request(useRequestOption);
|
|
3357
3366
|
}
|
|
@@ -3359,7 +3368,7 @@ class Httpx {
|
|
|
3359
3368
|
* HEAD 请求
|
|
3360
3369
|
*/
|
|
3361
3370
|
head(...args) {
|
|
3362
|
-
|
|
3371
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3363
3372
|
useRequestOption.method = "HEAD";
|
|
3364
3373
|
return this.request(useRequestOption, (option) => {
|
|
3365
3374
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3369,7 +3378,7 @@ class Httpx {
|
|
|
3369
3378
|
* OPTIONS 请求
|
|
3370
3379
|
*/
|
|
3371
3380
|
options(...args) {
|
|
3372
|
-
|
|
3381
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3373
3382
|
useRequestOption.method = "OPTIONS";
|
|
3374
3383
|
return this.request(useRequestOption, (option) => {
|
|
3375
3384
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3379,7 +3388,7 @@ class Httpx {
|
|
|
3379
3388
|
* DELETE 请求
|
|
3380
3389
|
*/
|
|
3381
3390
|
delete(...args) {
|
|
3382
|
-
|
|
3391
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3383
3392
|
useRequestOption.method = "DELETE";
|
|
3384
3393
|
return this.request(useRequestOption, (option) => {
|
|
3385
3394
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3389,7 +3398,7 @@ class Httpx {
|
|
|
3389
3398
|
* PUT 请求
|
|
3390
3399
|
*/
|
|
3391
3400
|
put(...args) {
|
|
3392
|
-
|
|
3401
|
+
const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3393
3402
|
userRequestOption.method = "PUT";
|
|
3394
3403
|
return this.request(userRequestOption);
|
|
3395
3404
|
}
|
|
@@ -3399,18 +3408,30 @@ class Httpx {
|
|
|
3399
3408
|
* @param beforeRequestOption 处理请求前的配置
|
|
3400
3409
|
*/
|
|
3401
3410
|
request(details, beforeRequestOption) {
|
|
3402
|
-
|
|
3403
|
-
|
|
3411
|
+
// 对请求的参数进行合并处理
|
|
3412
|
+
const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(details);
|
|
3413
|
+
/**
|
|
3414
|
+
* 取消请求
|
|
3415
|
+
*/
|
|
3404
3416
|
let abortFn = null;
|
|
3405
|
-
|
|
3406
|
-
|
|
3417
|
+
const promise = new globalThis.Promise(async (resolve, reject) => {
|
|
3418
|
+
// 请求配置
|
|
3419
|
+
let requestOption = this.HttpxRequestOption.getRequestOption(userRequestOption.method, userRequestOption, (resultOption) => {
|
|
3420
|
+
resolve(resultOption);
|
|
3421
|
+
}, (...args) => {
|
|
3422
|
+
reject(...args);
|
|
3423
|
+
});
|
|
3424
|
+
requestOption = this.HttpxRequestOption.removeRequestNullOption(requestOption);
|
|
3407
3425
|
if (typeof beforeRequestOption === "function") {
|
|
3408
3426
|
beforeRequestOption(requestOption);
|
|
3409
3427
|
}
|
|
3410
|
-
|
|
3428
|
+
// 处理重试逻辑
|
|
3411
3429
|
const requestResult = await this.HttpxRequest.request(requestOption);
|
|
3412
3430
|
if (requestResult != null && typeof requestResult.abort === "function") {
|
|
3413
|
-
abortFn =
|
|
3431
|
+
abortFn = () => {
|
|
3432
|
+
// 取消请求
|
|
3433
|
+
requestResult.abort();
|
|
3434
|
+
};
|
|
3414
3435
|
}
|
|
3415
3436
|
});
|
|
3416
3437
|
promise.abort = () => {
|
|
@@ -3429,10 +3450,7 @@ class indexedDB {
|
|
|
3429
3450
|
/* websql的版本号,由于ios的问题,版本号的写法不一样 */
|
|
3430
3451
|
// #slqVersion = "1";
|
|
3431
3452
|
/* 监听IndexDB */
|
|
3432
|
-
#indexedDB =
|
|
3433
|
-
window.mozIndexedDB ||
|
|
3434
|
-
window.webkitIndexedDB ||
|
|
3435
|
-
window.msIndexedDB;
|
|
3453
|
+
#indexedDB = globalThis.indexedDB || globalThis.mozIndexedDB || globalThis.webkitIndexedDB || globalThis.msIndexedDB;
|
|
3436
3454
|
/* 缓存数据库,避免同一个页面重复创建和销毁 */
|
|
3437
3455
|
#db = {};
|
|
3438
3456
|
// #store: IDBObjectStore = null as any;
|
|
@@ -3467,7 +3485,7 @@ class indexedDB {
|
|
|
3467
3485
|
this.#storeName = storeName;
|
|
3468
3486
|
this.#dbVersion = dbVersion;
|
|
3469
3487
|
if (!this.#indexedDB) {
|
|
3470
|
-
alert("很抱歉,您的浏览器不支持indexedDB");
|
|
3488
|
+
window.alert("很抱歉,您的浏览器不支持indexedDB");
|
|
3471
3489
|
throw new TypeError("很抱歉,您的浏览器不支持indexedDB");
|
|
3472
3490
|
}
|
|
3473
3491
|
}
|
|
@@ -3476,10 +3494,9 @@ class indexedDB {
|
|
|
3476
3494
|
* @param dbName 表名
|
|
3477
3495
|
*/
|
|
3478
3496
|
createStore(dbName) {
|
|
3479
|
-
|
|
3480
|
-
txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
|
|
3497
|
+
const txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
|
|
3481
3498
|
/* IndexDB的读写权限 */
|
|
3482
|
-
store = txn.objectStore(this.#storeName);
|
|
3499
|
+
const store = txn.objectStore(this.#storeName);
|
|
3483
3500
|
// this.#store = store;
|
|
3484
3501
|
return store;
|
|
3485
3502
|
}
|
|
@@ -3489,12 +3506,12 @@ class indexedDB {
|
|
|
3489
3506
|
* @param dbName 数据库名
|
|
3490
3507
|
*/
|
|
3491
3508
|
open(callback, dbName) {
|
|
3492
|
-
|
|
3509
|
+
const that = this;
|
|
3493
3510
|
/* 打开数据库 */
|
|
3494
3511
|
/* 如果支持IndexDB */
|
|
3495
3512
|
if (!that.#db[dbName]) {
|
|
3496
3513
|
/* 如果缓存中没有,则进行数据库的创建或打开,提高效率 */
|
|
3497
|
-
|
|
3514
|
+
const request = that.#indexedDB.open(dbName, that.#dbVersion);
|
|
3498
3515
|
request.onerror = function (event) {
|
|
3499
3516
|
callback(null, {
|
|
3500
3517
|
code: that.#statusCode.openFailed.code,
|
|
@@ -3504,26 +3521,26 @@ class indexedDB {
|
|
|
3504
3521
|
};
|
|
3505
3522
|
request.onsuccess = function (event) {
|
|
3506
3523
|
if (!that.#db[dbName]) {
|
|
3507
|
-
|
|
3524
|
+
const target = event.target;
|
|
3508
3525
|
that.#db[dbName] = target.result;
|
|
3509
3526
|
}
|
|
3510
|
-
|
|
3527
|
+
const store = that.createStore(dbName);
|
|
3511
3528
|
callback(store);
|
|
3512
3529
|
};
|
|
3513
3530
|
request.onupgradeneeded = function (event) {
|
|
3514
|
-
|
|
3531
|
+
const target = event.target;
|
|
3515
3532
|
that.#db[dbName] = target.result;
|
|
3516
|
-
|
|
3533
|
+
const store = that.#db[dbName].createObjectStore(that.#storeName, {
|
|
3517
3534
|
keyPath: "key",
|
|
3518
3535
|
});
|
|
3519
|
-
store.transaction.oncomplete = function (
|
|
3536
|
+
store.transaction.oncomplete = function () {
|
|
3520
3537
|
callback(store);
|
|
3521
3538
|
};
|
|
3522
3539
|
};
|
|
3523
3540
|
}
|
|
3524
3541
|
else {
|
|
3525
3542
|
/* 如果缓存中已经打开了数据库,就直接使用 */
|
|
3526
|
-
|
|
3543
|
+
const store = this.createStore(dbName);
|
|
3527
3544
|
callback(store);
|
|
3528
3545
|
}
|
|
3529
3546
|
}
|
|
@@ -3533,10 +3550,10 @@ class indexedDB {
|
|
|
3533
3550
|
* @param value 数据值
|
|
3534
3551
|
*/
|
|
3535
3552
|
async save(key, value) {
|
|
3536
|
-
|
|
3553
|
+
const that = this;
|
|
3537
3554
|
return new Promise((resolve) => {
|
|
3538
|
-
|
|
3539
|
-
|
|
3555
|
+
const dbName = this.#dbName;
|
|
3556
|
+
const inData = {
|
|
3540
3557
|
key: key,
|
|
3541
3558
|
value: value,
|
|
3542
3559
|
};
|
|
@@ -3549,7 +3566,7 @@ class indexedDB {
|
|
|
3549
3566
|
});
|
|
3550
3567
|
}
|
|
3551
3568
|
else {
|
|
3552
|
-
|
|
3569
|
+
const request = idbStore.put(inData);
|
|
3553
3570
|
request.onsuccess = function (event) {
|
|
3554
3571
|
/* 保存成功有success 字段 */
|
|
3555
3572
|
resolve({
|
|
@@ -3576,9 +3593,9 @@ class indexedDB {
|
|
|
3576
3593
|
* @param key 数据key
|
|
3577
3594
|
*/
|
|
3578
3595
|
async has(key) {
|
|
3579
|
-
|
|
3596
|
+
const that = this;
|
|
3580
3597
|
return new Promise((resolve) => {
|
|
3581
|
-
|
|
3598
|
+
const dbName = this.#dbName;
|
|
3582
3599
|
this.open(function (idbStore) {
|
|
3583
3600
|
/* 判断返回的数据中是否有error字段 */
|
|
3584
3601
|
if (idbStore == null) {
|
|
@@ -3589,7 +3606,7 @@ class indexedDB {
|
|
|
3589
3606
|
});
|
|
3590
3607
|
}
|
|
3591
3608
|
else {
|
|
3592
|
-
|
|
3609
|
+
const request = idbStore.get(key);
|
|
3593
3610
|
request.onsuccess = function (event) {
|
|
3594
3611
|
/* result 返回的是 {key: string, value: any} */
|
|
3595
3612
|
/* 键值对存储 */
|
|
@@ -3617,9 +3634,9 @@ class indexedDB {
|
|
|
3617
3634
|
* @param key 数据key
|
|
3618
3635
|
*/
|
|
3619
3636
|
async get(key) {
|
|
3620
|
-
|
|
3637
|
+
const that = this;
|
|
3621
3638
|
return new Promise((resolve) => {
|
|
3622
|
-
|
|
3639
|
+
const dbName = this.#dbName;
|
|
3623
3640
|
this.open(function (idbStore) {
|
|
3624
3641
|
/* 判断返回的数据中是否有error字段 */
|
|
3625
3642
|
if (idbStore == null) {
|
|
@@ -3631,13 +3648,13 @@ class indexedDB {
|
|
|
3631
3648
|
});
|
|
3632
3649
|
}
|
|
3633
3650
|
else {
|
|
3634
|
-
|
|
3651
|
+
const request = idbStore.get(key);
|
|
3635
3652
|
request.onsuccess = function (event) {
|
|
3636
|
-
|
|
3637
|
-
|
|
3653
|
+
const target = event.target;
|
|
3654
|
+
const result = target.result;
|
|
3638
3655
|
/* result 返回的是 {key: string, value: any} */
|
|
3639
3656
|
/* 键值对存储 */
|
|
3640
|
-
|
|
3657
|
+
const data = result ? result.value : void 0;
|
|
3641
3658
|
if (data == null) {
|
|
3642
3659
|
resolve({
|
|
3643
3660
|
success: true,
|
|
@@ -3678,10 +3695,10 @@ class indexedDB {
|
|
|
3678
3695
|
*/
|
|
3679
3696
|
async regexpGet(key) {
|
|
3680
3697
|
let list = [];
|
|
3681
|
-
|
|
3698
|
+
const that = this;
|
|
3682
3699
|
return new Promise((resolve) => {
|
|
3683
3700
|
/* 正则查询 */
|
|
3684
|
-
|
|
3701
|
+
const dbName = that.#dbName;
|
|
3685
3702
|
this.open(function (idbStore) {
|
|
3686
3703
|
/* 判断返回的数据中是否有error字段 */
|
|
3687
3704
|
if (idbStore == null) {
|
|
@@ -3693,16 +3710,16 @@ class indexedDB {
|
|
|
3693
3710
|
});
|
|
3694
3711
|
}
|
|
3695
3712
|
else {
|
|
3696
|
-
|
|
3713
|
+
const request = idbStore.getAll();
|
|
3697
3714
|
request.onsuccess = function (event) {
|
|
3698
|
-
|
|
3699
|
-
|
|
3715
|
+
const target = event.target;
|
|
3716
|
+
const result = target.result;
|
|
3700
3717
|
if (result.length !== 0) {
|
|
3701
|
-
result.forEach((dataItem
|
|
3718
|
+
result.forEach((dataItem) => {
|
|
3702
3719
|
// 当前项的key
|
|
3703
|
-
|
|
3720
|
+
const __key = dataItem["key"];
|
|
3704
3721
|
// 当前项的value
|
|
3705
|
-
|
|
3722
|
+
const __value = dataItem["value"];
|
|
3706
3723
|
if (__key.match(key)) {
|
|
3707
3724
|
list = list.concat(__value);
|
|
3708
3725
|
}
|
|
@@ -3734,10 +3751,10 @@ class indexedDB {
|
|
|
3734
3751
|
* @param key 数据key
|
|
3735
3752
|
*/
|
|
3736
3753
|
async delete(key) {
|
|
3737
|
-
|
|
3754
|
+
const that = this;
|
|
3738
3755
|
return new Promise((resolve) => {
|
|
3739
3756
|
/* 根据key删除某条数据 */
|
|
3740
|
-
|
|
3757
|
+
const dbName = that.#dbName;
|
|
3741
3758
|
this.open(function (idbStore) {
|
|
3742
3759
|
if (idbStore == null) {
|
|
3743
3760
|
resolve({
|
|
@@ -3748,7 +3765,7 @@ class indexedDB {
|
|
|
3748
3765
|
}
|
|
3749
3766
|
else {
|
|
3750
3767
|
// 删除键
|
|
3751
|
-
|
|
3768
|
+
const request = idbStore.delete(key);
|
|
3752
3769
|
request.onsuccess = function (event) {
|
|
3753
3770
|
resolve({
|
|
3754
3771
|
success: true,
|
|
@@ -3773,10 +3790,10 @@ class indexedDB {
|
|
|
3773
3790
|
* 删除所有数据
|
|
3774
3791
|
*/
|
|
3775
3792
|
async deleteAll() {
|
|
3776
|
-
|
|
3793
|
+
const that = this;
|
|
3777
3794
|
return new Promise((resolve) => {
|
|
3778
3795
|
/* 清空数据库 */
|
|
3779
|
-
|
|
3796
|
+
const dbName = that.#dbName;
|
|
3780
3797
|
this.open(function (idbStore) {
|
|
3781
3798
|
if (idbStore == null) {
|
|
3782
3799
|
resolve({
|
|
@@ -3787,7 +3804,7 @@ class indexedDB {
|
|
|
3787
3804
|
}
|
|
3788
3805
|
else {
|
|
3789
3806
|
// 清空
|
|
3790
|
-
|
|
3807
|
+
const operateResult = idbStore.clear();
|
|
3791
3808
|
operateResult.onsuccess = function (event) {
|
|
3792
3809
|
resolve({
|
|
3793
3810
|
success: true,
|
|
@@ -3820,7 +3837,7 @@ class LockFunction {
|
|
|
3820
3837
|
run;
|
|
3821
3838
|
isLock;
|
|
3822
3839
|
constructor(callback, context, delayTime) {
|
|
3823
|
-
|
|
3840
|
+
const that = this;
|
|
3824
3841
|
this.#callback = callback;
|
|
3825
3842
|
if (typeof context === "number") {
|
|
3826
3843
|
this.#delayTime = context;
|
|
@@ -3910,14 +3927,14 @@ class Log {
|
|
|
3910
3927
|
* @param stack
|
|
3911
3928
|
*/
|
|
3912
3929
|
parseErrorStack(stack) {
|
|
3913
|
-
|
|
3930
|
+
const result = {
|
|
3914
3931
|
name: "",
|
|
3915
3932
|
position: "",
|
|
3916
3933
|
};
|
|
3917
3934
|
for (let stackString of stack) {
|
|
3918
3935
|
stackString = stackString.trim();
|
|
3919
|
-
|
|
3920
|
-
|
|
3936
|
+
const stackFunctionNameMatch = stackString.match(/^at[\s]+(.+?)[\s]+/i);
|
|
3937
|
+
const stackFunctionNamePositionMatch = stackString.match(/^at[\s]+.+[\s]+\((.+?)\)/i);
|
|
3921
3938
|
if (stackFunctionNameMatch == null) {
|
|
3922
3939
|
continue;
|
|
3923
3940
|
}
|
|
@@ -3925,8 +3942,8 @@ class Log {
|
|
|
3925
3942
|
continue;
|
|
3926
3943
|
}
|
|
3927
3944
|
/* 获取最后一个,因为第一个是包含了at */
|
|
3928
|
-
|
|
3929
|
-
|
|
3945
|
+
const stackFunctionName = stackFunctionNameMatch[stackFunctionNameMatch.length - 1];
|
|
3946
|
+
const stackFunctionNamePosition = stackFunctionNamePositionMatch[stackFunctionNamePositionMatch.length - 1];
|
|
3930
3947
|
if (stackFunctionName === "" ||
|
|
3931
3948
|
stackFunctionName.match(/^(Utils\.|)Log(\.|)|.<anonymous>$|^Function.each|^NodeList.forEach|^k.fn.init.each/g)) {
|
|
3932
3949
|
continue;
|
|
@@ -3938,9 +3955,9 @@ class Log {
|
|
|
3938
3955
|
}
|
|
3939
3956
|
}
|
|
3940
3957
|
if (result.position === "") {
|
|
3941
|
-
|
|
3958
|
+
const lastStackString = stack[stack.length - 1].trim();
|
|
3942
3959
|
if (lastStackString.startsWith("at chrome-extension://")) {
|
|
3943
|
-
|
|
3960
|
+
const lastStackMatch = lastStackString.match(/^at[\s]+(.+)/);
|
|
3944
3961
|
if (lastStackMatch) {
|
|
3945
3962
|
result.position = lastStackMatch[lastStackMatch.length - 1];
|
|
3946
3963
|
}
|
|
@@ -3970,16 +3987,18 @@ class Log {
|
|
|
3970
3987
|
printContent(msg, color, otherStyle) {
|
|
3971
3988
|
this.checkClearConsole();
|
|
3972
3989
|
otherStyle = otherStyle || "";
|
|
3973
|
-
|
|
3990
|
+
const stackSplit = new Error().stack.split("\n");
|
|
3974
3991
|
stackSplit.splice(0, 2);
|
|
3975
|
-
|
|
3976
|
-
|
|
3977
|
-
|
|
3992
|
+
const { name: callerName, position: callerPosition } = this.parseErrorStack(stackSplit);
|
|
3993
|
+
const tagName = this.tag;
|
|
3994
|
+
const that = this;
|
|
3978
3995
|
/** tag的html输出格式 */
|
|
3979
|
-
|
|
3996
|
+
const tagNameHTML = `%c[${tagName}%c`;
|
|
3980
3997
|
/** 调用的函数名的html输出格式 */
|
|
3981
3998
|
let callerNameHTML = `%c${callerName}%c]%c`;
|
|
3982
|
-
callerName.trim()
|
|
3999
|
+
if (callerName.trim() === "") {
|
|
4000
|
+
callerNameHTML = `-${callerNameHTML}`;
|
|
4001
|
+
}
|
|
3983
4002
|
/**
|
|
3984
4003
|
* 输出消息到控制台
|
|
3985
4004
|
* @param message
|
|
@@ -4065,14 +4084,14 @@ class Log {
|
|
|
4065
4084
|
if (this.#disable)
|
|
4066
4085
|
return;
|
|
4067
4086
|
this.checkClearConsole();
|
|
4068
|
-
|
|
4087
|
+
const stack = new Error().stack.split("\n");
|
|
4069
4088
|
stack.splice(0, 1);
|
|
4070
|
-
|
|
4089
|
+
const errorStackParse = this.parseErrorStack(stack);
|
|
4071
4090
|
/** 堆栈函数名 */
|
|
4072
|
-
|
|
4091
|
+
const stackFunctionName = errorStackParse.name;
|
|
4073
4092
|
/** 堆栈位置 */
|
|
4074
|
-
|
|
4075
|
-
|
|
4093
|
+
const stackFunctionNamePosition = errorStackParse.position;
|
|
4094
|
+
const callerName = stackFunctionName;
|
|
4076
4095
|
this.#console.log(`%c[${this.tag}%c-%c${callerName}%c]%c`, ...this.#msgColorDetails, `color: ${this.#details.infoColor};`);
|
|
4077
4096
|
this.#console.table(msg);
|
|
4078
4097
|
if (this.#details.debug) {
|
|
@@ -4135,9 +4154,9 @@ class Progress {
|
|
|
4135
4154
|
*/
|
|
4136
4155
|
circleRadius: 50,
|
|
4137
4156
|
};
|
|
4138
|
-
#ctx
|
|
4139
|
-
#width
|
|
4140
|
-
#height
|
|
4157
|
+
#ctx;
|
|
4158
|
+
#width;
|
|
4159
|
+
#height;
|
|
4141
4160
|
/**
|
|
4142
4161
|
*
|
|
4143
4162
|
* @param paramConfig 配置信息
|
|
@@ -4147,14 +4166,8 @@ class Progress {
|
|
|
4147
4166
|
if (!(this.#config.canvasNode instanceof HTMLCanvasElement)) {
|
|
4148
4167
|
throw new Error("Utils.Progress 参数 canvasNode 必须是 HTMLCanvasElement");
|
|
4149
4168
|
}
|
|
4150
|
-
this.init();
|
|
4151
|
-
}
|
|
4152
|
-
/**
|
|
4153
|
-
* 初始化
|
|
4154
|
-
*/
|
|
4155
|
-
init() {
|
|
4156
4169
|
/* 获取画笔 */
|
|
4157
|
-
|
|
4170
|
+
const ctx = this.#config.canvasNode.getContext("2d");
|
|
4158
4171
|
if (ctx == null) {
|
|
4159
4172
|
throw new Error("Utils.Progress 获取画笔失败");
|
|
4160
4173
|
}
|
|
@@ -4165,8 +4178,8 @@ class Progress {
|
|
|
4165
4178
|
this.#height = this.#config.canvasNode.height;
|
|
4166
4179
|
/* 清除锯齿 */
|
|
4167
4180
|
if (window.devicePixelRatio) {
|
|
4168
|
-
this.#config.canvasNode.style.width = this.#width
|
|
4169
|
-
this.#config.canvasNode.style.height = this.#height
|
|
4181
|
+
this.#config.canvasNode.style.width = `${this.#width}px`;
|
|
4182
|
+
this.#config.canvasNode.style.height = `${this.#height}px`;
|
|
4170
4183
|
this.#config.canvasNode.height = this.#height * window.devicePixelRatio;
|
|
4171
4184
|
this.#config.canvasNode.width = this.#width * window.devicePixelRatio;
|
|
4172
4185
|
this.#ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
|
|
@@ -4178,7 +4191,7 @@ class Progress {
|
|
|
4178
4191
|
* 绘制
|
|
4179
4192
|
*/
|
|
4180
4193
|
draw() {
|
|
4181
|
-
|
|
4194
|
+
const degActive = (this.#config.progress * 360) / 100;
|
|
4182
4195
|
/* 清除画布 */
|
|
4183
4196
|
this.#ctx.clearRect(0, 0, this.#width, this.#height);
|
|
4184
4197
|
/* 开始绘制底圆 */
|
|
@@ -4192,11 +4205,11 @@ class Progress {
|
|
|
4192
4205
|
this.#ctx.strokeStyle = this.#config.lineColor;
|
|
4193
4206
|
this.#ctx.stroke();
|
|
4194
4207
|
/* 获取百分比 */
|
|
4195
|
-
|
|
4196
|
-
this.#ctx.font = this.#config.fontSize
|
|
4208
|
+
const txt = `${parseInt(this.#config.progress.toString())}%`;
|
|
4209
|
+
this.#ctx.font = `${this.#config.fontSize}px SimHei`;
|
|
4197
4210
|
/* 获取文本宽度 */
|
|
4198
|
-
|
|
4199
|
-
|
|
4211
|
+
const w = this.#ctx.measureText(txt).width;
|
|
4212
|
+
const h = this.#config.fontSize / 2;
|
|
4200
4213
|
this.#ctx.fillStyle = this.#config.textColor;
|
|
4201
4214
|
this.#ctx.fillText(txt, this.#width / 2 - w / 2, this.#height / 2 + h / 2);
|
|
4202
4215
|
}
|
|
@@ -4220,9 +4233,9 @@ class UtilsDictionary {
|
|
|
4220
4233
|
* 迭代器
|
|
4221
4234
|
*/
|
|
4222
4235
|
get entries() {
|
|
4223
|
-
|
|
4236
|
+
const that = this;
|
|
4224
4237
|
return function* () {
|
|
4225
|
-
|
|
4238
|
+
const itemKeys = Object.keys(that.getItems());
|
|
4226
4239
|
for (const keyName of itemKeys) {
|
|
4227
4240
|
yield [keyName, that.get(keyName)];
|
|
4228
4241
|
}
|
|
@@ -4232,9 +4245,8 @@ class UtilsDictionary {
|
|
|
4232
4245
|
* 是否可遍历
|
|
4233
4246
|
*/
|
|
4234
4247
|
get [Symbol.iterator]() {
|
|
4235
|
-
|
|
4236
|
-
|
|
4237
|
-
return that.entries();
|
|
4248
|
+
return () => {
|
|
4249
|
+
return this.entries();
|
|
4238
4250
|
};
|
|
4239
4251
|
}
|
|
4240
4252
|
/**
|
|
@@ -4281,13 +4293,13 @@ class UtilsDictionary {
|
|
|
4281
4293
|
* 获取字典所有的键
|
|
4282
4294
|
*/
|
|
4283
4295
|
keys() {
|
|
4284
|
-
return this.items.keys()
|
|
4296
|
+
return Array.from(this.items.keys());
|
|
4285
4297
|
}
|
|
4286
4298
|
/**
|
|
4287
4299
|
* 返回字典中的所有值
|
|
4288
4300
|
*/
|
|
4289
4301
|
values() {
|
|
4290
|
-
return this.items.values()
|
|
4302
|
+
return Array.from(this.items.values());
|
|
4291
4303
|
}
|
|
4292
4304
|
/**
|
|
4293
4305
|
* 清空字典
|
|
@@ -4321,7 +4333,7 @@ class UtilsDictionary {
|
|
|
4321
4333
|
* @param callbackfn 回调函数
|
|
4322
4334
|
*/
|
|
4323
4335
|
forEach(callbackfn) {
|
|
4324
|
-
this.items.forEach((value, key
|
|
4336
|
+
this.items.forEach((value, key) => {
|
|
4325
4337
|
callbackfn(value, key, this);
|
|
4326
4338
|
});
|
|
4327
4339
|
}
|
|
@@ -4413,6 +4425,7 @@ class WindowApi {
|
|
|
4413
4425
|
}
|
|
4414
4426
|
}
|
|
4415
4427
|
|
|
4428
|
+
// @ts-nocheck
|
|
4416
4429
|
const VueUtils = {
|
|
4417
4430
|
/** 标签 */
|
|
4418
4431
|
ReactiveFlags: {
|
|
@@ -4451,10 +4464,10 @@ class ReactiveEffect {
|
|
|
4451
4464
|
deps = [];
|
|
4452
4465
|
active = true;
|
|
4453
4466
|
fn;
|
|
4454
|
-
|
|
4467
|
+
scheduler;
|
|
4455
4468
|
constructor(fn, scheduler) {
|
|
4456
4469
|
this.fn = fn;
|
|
4457
|
-
|
|
4470
|
+
this.scheduler = scheduler;
|
|
4458
4471
|
}
|
|
4459
4472
|
run(cb) {
|
|
4460
4473
|
if (!this.active) {
|
|
@@ -4526,7 +4539,7 @@ class Vue {
|
|
|
4526
4539
|
if (VueUtils.isReactive(target)) {
|
|
4527
4540
|
return target;
|
|
4528
4541
|
}
|
|
4529
|
-
|
|
4542
|
+
const exisProxy = this.reactMap.get(target);
|
|
4530
4543
|
if (exisProxy) {
|
|
4531
4544
|
return exisProxy;
|
|
4532
4545
|
}
|
|
@@ -4539,8 +4552,8 @@ class Vue {
|
|
|
4539
4552
|
return Reflect.get(target, key, receiver);
|
|
4540
4553
|
},
|
|
4541
4554
|
set(target, key, value, receiver) {
|
|
4542
|
-
|
|
4543
|
-
|
|
4555
|
+
const oldValue = target[key];
|
|
4556
|
+
const result = Reflect.set(target, key, value, receiver);
|
|
4544
4557
|
if (oldValue !== value) {
|
|
4545
4558
|
that.trigger(target, "set", key, oldValue, value);
|
|
4546
4559
|
}
|
|
@@ -4590,11 +4603,12 @@ class Vue {
|
|
|
4590
4603
|
}
|
|
4591
4604
|
toRefs(object) {
|
|
4592
4605
|
const result = VueUtils.isArray(object) ? new Array(object.length) : {};
|
|
4593
|
-
for (
|
|
4606
|
+
for (const key in object) {
|
|
4594
4607
|
result[key] = this.toRef(object, key);
|
|
4595
4608
|
}
|
|
4596
4609
|
return result;
|
|
4597
4610
|
}
|
|
4611
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4598
4612
|
trigger(target, type, key, oldValue, value) {
|
|
4599
4613
|
const depsMap = this.targetMap.get(target);
|
|
4600
4614
|
if (!depsMap)
|
|
@@ -4602,8 +4616,9 @@ class Vue {
|
|
|
4602
4616
|
const effects = depsMap.get(key);
|
|
4603
4617
|
this.triggerEffect(effects, "effects");
|
|
4604
4618
|
}
|
|
4619
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4605
4620
|
triggerEffect(effects, name) {
|
|
4606
|
-
effects
|
|
4621
|
+
if (effects) {
|
|
4607
4622
|
effects.forEach((effect) => {
|
|
4608
4623
|
if (effect.scheduler) {
|
|
4609
4624
|
effect.scheduler();
|
|
@@ -4612,6 +4627,7 @@ class Vue {
|
|
|
4612
4627
|
effect.run();
|
|
4613
4628
|
}
|
|
4614
4629
|
});
|
|
4630
|
+
}
|
|
4615
4631
|
}
|
|
4616
4632
|
track(target, type, key) {
|
|
4617
4633
|
if (!this.activeEffect)
|
|
@@ -4628,7 +4644,7 @@ class Vue {
|
|
|
4628
4644
|
}
|
|
4629
4645
|
trackEffect(dep) {
|
|
4630
4646
|
if (this.activeEffect) {
|
|
4631
|
-
|
|
4647
|
+
const shouldTrack = !dep.has(this.activeEffect);
|
|
4632
4648
|
if (shouldTrack) {
|
|
4633
4649
|
dep.add(this.activeEffect);
|
|
4634
4650
|
this.activeEffect.deps.push(dep);
|
|
@@ -4642,7 +4658,7 @@ class Vue {
|
|
|
4642
4658
|
return value;
|
|
4643
4659
|
}
|
|
4644
4660
|
set.add(value);
|
|
4645
|
-
for (
|
|
4661
|
+
for (const key in value) {
|
|
4646
4662
|
this.traversal(value[key], set);
|
|
4647
4663
|
}
|
|
4648
4664
|
return value;
|
|
@@ -4894,6 +4910,7 @@ const clearTimeout$1 = (timerId) => loadOrReturnBroker().clearTimeout(timerId);
|
|
|
4894
4910
|
const setInterval = (...args) => loadOrReturnBroker().setInterval(...args);
|
|
4895
4911
|
const setTimeout$1 = (...args) => loadOrReturnBroker().setTimeout(...args);
|
|
4896
4912
|
|
|
4913
|
+
/* eslint-disable */
|
|
4897
4914
|
// ==UserScript==
|
|
4898
4915
|
// @name ModuleRaid.js
|
|
4899
4916
|
// @namespace http://tampermonkey.net/
|
|
@@ -5311,28 +5328,26 @@ class DOMUtils {
|
|
|
5311
5328
|
return $ele?.innerHTML?.trim() === "";
|
|
5312
5329
|
});
|
|
5313
5330
|
}
|
|
5314
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5315
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5331
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5316
5332
|
// contains 语法
|
|
5317
|
-
|
|
5318
|
-
|
|
5333
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5334
|
+
const text = textMatch[2];
|
|
5319
5335
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5320
5336
|
return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
|
|
5321
5337
|
return ($ele?.textContent || $ele?.innerText)?.includes(text);
|
|
5322
5338
|
});
|
|
5323
5339
|
}
|
|
5324
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5325
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5340
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5326
5341
|
// regexp 语法
|
|
5327
|
-
|
|
5342
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5328
5343
|
let pattern = textMatch[2];
|
|
5329
|
-
|
|
5344
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5330
5345
|
let flags = "";
|
|
5331
5346
|
if (flagMatch) {
|
|
5332
5347
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5333
5348
|
flags = flagMatch[3];
|
|
5334
5349
|
}
|
|
5335
|
-
|
|
5350
|
+
const regexp = new RegExp(pattern, flags);
|
|
5336
5351
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5337
5352
|
return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
|
|
5338
5353
|
return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
|
|
@@ -5374,11 +5389,10 @@ class DOMUtils {
|
|
|
5374
5389
|
selector = selector.replace(/:empty$/gi, "");
|
|
5375
5390
|
return $el.matches(selector) && $el?.innerHTML?.trim() === "";
|
|
5376
5391
|
}
|
|
5377
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5378
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5392
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5379
5393
|
// contains 语法
|
|
5380
|
-
|
|
5381
|
-
|
|
5394
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5395
|
+
const text = textMatch[2];
|
|
5382
5396
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5383
5397
|
let content = $el?.textContent || $el?.innerText;
|
|
5384
5398
|
if (typeof content !== "string") {
|
|
@@ -5386,18 +5400,17 @@ class DOMUtils {
|
|
|
5386
5400
|
}
|
|
5387
5401
|
return $el.matches(selector) && content?.includes(text);
|
|
5388
5402
|
}
|
|
5389
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5390
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5403
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5391
5404
|
// regexp 语法
|
|
5392
|
-
|
|
5405
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5393
5406
|
let pattern = textMatch[2];
|
|
5394
|
-
|
|
5407
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5395
5408
|
let flags = "";
|
|
5396
5409
|
if (flagMatch) {
|
|
5397
5410
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5398
5411
|
flags = flagMatch[3];
|
|
5399
5412
|
}
|
|
5400
|
-
|
|
5413
|
+
const regexp = new RegExp(pattern, flags);
|
|
5401
5414
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5402
5415
|
let content = $el?.textContent || $el?.innerText;
|
|
5403
5416
|
if (typeof content !== "string") {
|
|
@@ -5415,43 +5428,41 @@ class DOMUtils {
|
|
|
5415
5428
|
if (selector.match(/[^\s]{1}:empty$/gi)) {
|
|
5416
5429
|
// empty 语法
|
|
5417
5430
|
selector = selector.replace(/:empty$/gi, "");
|
|
5418
|
-
|
|
5431
|
+
const $closest = $el?.closest(selector);
|
|
5419
5432
|
if ($closest && $closest?.innerHTML?.trim() === "") {
|
|
5420
5433
|
return $closest;
|
|
5421
5434
|
}
|
|
5422
5435
|
return null;
|
|
5423
5436
|
}
|
|
5424
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5425
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5437
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5426
5438
|
// contains 语法
|
|
5427
|
-
|
|
5428
|
-
|
|
5439
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5440
|
+
const text = textMatch[2];
|
|
5429
5441
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5430
|
-
|
|
5442
|
+
const $closest = $el?.closest(selector);
|
|
5431
5443
|
if ($closest) {
|
|
5432
|
-
|
|
5444
|
+
const content = $el?.textContent || $el?.innerText;
|
|
5433
5445
|
if (typeof content === "string" && content.includes(text)) {
|
|
5434
5446
|
return $closest;
|
|
5435
5447
|
}
|
|
5436
5448
|
}
|
|
5437
5449
|
return null;
|
|
5438
5450
|
}
|
|
5439
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5440
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5451
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5441
5452
|
// regexp 语法
|
|
5442
|
-
|
|
5453
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5443
5454
|
let pattern = textMatch[2];
|
|
5444
|
-
|
|
5455
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5445
5456
|
let flags = "";
|
|
5446
5457
|
if (flagMatch) {
|
|
5447
5458
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5448
5459
|
flags = flagMatch[3];
|
|
5449
5460
|
}
|
|
5450
|
-
|
|
5461
|
+
const regexp = new RegExp(pattern, flags);
|
|
5451
5462
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5452
|
-
|
|
5463
|
+
const $closest = $el?.closest(selector);
|
|
5453
5464
|
if ($closest) {
|
|
5454
|
-
|
|
5465
|
+
const content = $el?.textContent || $el?.innerText;
|
|
5455
5466
|
if (typeof content === "string" && content.match(regexp)) {
|
|
5456
5467
|
return $closest;
|
|
5457
5468
|
}
|
|
@@ -5460,12 +5471,12 @@ class DOMUtils {
|
|
|
5460
5471
|
}
|
|
5461
5472
|
else {
|
|
5462
5473
|
// 普通语法
|
|
5463
|
-
|
|
5474
|
+
const $closest = $el?.closest(selector);
|
|
5464
5475
|
return $closest;
|
|
5465
5476
|
}
|
|
5466
5477
|
}
|
|
5467
5478
|
}
|
|
5468
|
-
|
|
5479
|
+
const domUtils = new DOMUtils();
|
|
5469
5480
|
|
|
5470
5481
|
class Utils {
|
|
5471
5482
|
windowApi;
|
|
@@ -5473,12 +5484,12 @@ class Utils {
|
|
|
5473
5484
|
this.windowApi = new WindowApi(option);
|
|
5474
5485
|
}
|
|
5475
5486
|
/** 版本号 */
|
|
5476
|
-
version = "2025.9.
|
|
5487
|
+
version = "2025.9.14";
|
|
5477
5488
|
addStyle(cssText) {
|
|
5478
5489
|
if (typeof cssText !== "string") {
|
|
5479
5490
|
throw new Error("Utils.addStyle 参数cssText 必须为String类型");
|
|
5480
5491
|
}
|
|
5481
|
-
|
|
5492
|
+
const cssNode = this.windowApi.document.createElement("style");
|
|
5482
5493
|
cssNode.setAttribute("type", "text/css");
|
|
5483
5494
|
cssNode.innerHTML = cssText;
|
|
5484
5495
|
if (this.windowApi.document.head) {
|
|
@@ -5500,23 +5511,23 @@ class Utils {
|
|
|
5500
5511
|
return cssNode;
|
|
5501
5512
|
}
|
|
5502
5513
|
/**
|
|
5503
|
-
|
|
5504
|
-
|
|
5505
|
-
|
|
5506
|
-
|
|
5507
|
-
|
|
5508
|
-
|
|
5509
|
-
|
|
5510
|
-
|
|
5511
|
-
|
|
5512
|
-
|
|
5513
|
-
|
|
5514
|
-
|
|
5515
|
-
|
|
5516
|
-
|
|
5514
|
+
* JSON数据从源端替换到目标端中,如果目标端存在该数据则替换,不添加,返回结果为目标端替换完毕的结果
|
|
5515
|
+
* @param target 目标数据
|
|
5516
|
+
* @param source 源数据
|
|
5517
|
+
* @param isAdd 是否可以追加键,默认false
|
|
5518
|
+
* @example
|
|
5519
|
+
* Utils.assign({"1":1,"2":{"3":3}}, {"2":{"3":4}});
|
|
5520
|
+
* >
|
|
5521
|
+
* {
|
|
5522
|
+
"1": 1,
|
|
5523
|
+
"2": {
|
|
5524
|
+
"3": 4
|
|
5525
|
+
}
|
|
5526
|
+
}
|
|
5527
|
+
*/
|
|
5517
5528
|
assign = commonUtil.assign.bind(commonUtil);
|
|
5518
5529
|
async asyncReplaceAll(string, pattern, asyncFn) {
|
|
5519
|
-
|
|
5530
|
+
const UtilsContext = this;
|
|
5520
5531
|
if (typeof string !== "string") {
|
|
5521
5532
|
throw new TypeError("string必须是字符串");
|
|
5522
5533
|
}
|
|
@@ -5588,18 +5599,18 @@ class Utils {
|
|
|
5588
5599
|
canvasElement.dispatchEvent(new MouseEvent("mouseup", eventInit));
|
|
5589
5600
|
}
|
|
5590
5601
|
checkUserClickInNode(element) {
|
|
5591
|
-
|
|
5602
|
+
const UtilsContext = this;
|
|
5592
5603
|
if (!UtilsContext.isDOM(element)) {
|
|
5593
5604
|
throw new Error("Utils.checkUserClickInNode 参数 targetNode 必须为 Element|Node 类型");
|
|
5594
5605
|
}
|
|
5595
|
-
|
|
5596
|
-
|
|
5597
|
-
|
|
5606
|
+
const clickEvent = UtilsContext.windowApi.window.event;
|
|
5607
|
+
const touchEvent = UtilsContext.windowApi.window.event;
|
|
5608
|
+
const $click = clickEvent?.composedPath()?.[0];
|
|
5598
5609
|
// 点击的x坐标
|
|
5599
|
-
|
|
5610
|
+
const clickPosX = clickEvent?.clientX != null ? clickEvent.clientX : touchEvent.touches[0].clientX;
|
|
5600
5611
|
// 点击的y坐标
|
|
5601
|
-
|
|
5602
|
-
|
|
5612
|
+
const clickPosY = clickEvent?.clientY != null ? clickEvent.clientY : touchEvent.touches[0].clientY;
|
|
5613
|
+
const {
|
|
5603
5614
|
/* 要检测的元素的相对屏幕的横坐标最左边 */
|
|
5604
5615
|
left: elementPosXLeft,
|
|
5605
5616
|
/* 要检测的元素的相对屏幕的横坐标最右边 */
|
|
@@ -5627,32 +5638,32 @@ class Utils {
|
|
|
5627
5638
|
* @param formData 需要clone的数据
|
|
5628
5639
|
*/
|
|
5629
5640
|
cloneFormData(formData, filterFn) {
|
|
5630
|
-
|
|
5631
|
-
|
|
5632
|
-
|
|
5641
|
+
const clonedFormData = new FormData();
|
|
5642
|
+
formData.forEach((value, key) => {
|
|
5643
|
+
const isFilter = typeof filterFn === "function" ? filterFn(key, value) : false;
|
|
5633
5644
|
if (typeof isFilter === "boolean" && isFilter) {
|
|
5634
|
-
|
|
5645
|
+
return;
|
|
5635
5646
|
}
|
|
5636
5647
|
clonedFormData.append(key, value);
|
|
5637
|
-
}
|
|
5648
|
+
});
|
|
5638
5649
|
return clonedFormData;
|
|
5639
5650
|
}
|
|
5640
5651
|
createOverload() {
|
|
5641
|
-
|
|
5652
|
+
const fnMap = new Map();
|
|
5642
5653
|
function overload(...args) {
|
|
5643
|
-
|
|
5644
|
-
|
|
5654
|
+
const key = args.map((it) => typeof it).join(",");
|
|
5655
|
+
const fn = fnMap.get(key);
|
|
5645
5656
|
if (!fn) {
|
|
5646
5657
|
throw new TypeError("没有找到对应的实现");
|
|
5647
5658
|
}
|
|
5648
5659
|
return fn.apply(this, args);
|
|
5649
5660
|
}
|
|
5650
5661
|
overload.addImpl = function (...args) {
|
|
5651
|
-
|
|
5662
|
+
const fn = args.pop();
|
|
5652
5663
|
if (typeof fn !== "function") {
|
|
5653
5664
|
throw new TypeError("最后一个参数必须是函数");
|
|
5654
5665
|
}
|
|
5655
|
-
|
|
5666
|
+
const key = args.join(",");
|
|
5656
5667
|
fnMap.set(key, fn);
|
|
5657
5668
|
};
|
|
5658
5669
|
return overload;
|
|
@@ -5669,7 +5680,7 @@ class Utils {
|
|
|
5669
5680
|
deepClone = commonUtil.deepClone.bind(commonUtil);
|
|
5670
5681
|
debounce(fn, delay = 0) {
|
|
5671
5682
|
let timer = null;
|
|
5672
|
-
|
|
5683
|
+
const UtilsContext = this;
|
|
5673
5684
|
return function (...args) {
|
|
5674
5685
|
UtilsContext.workerClearTimeout(timer);
|
|
5675
5686
|
timer = UtilsContext.workerSetTimeout(function () {
|
|
@@ -5678,7 +5689,7 @@ class Utils {
|
|
|
5678
5689
|
};
|
|
5679
5690
|
}
|
|
5680
5691
|
deleteParentNode(element, targetSelector) {
|
|
5681
|
-
|
|
5692
|
+
const UtilsContext = this;
|
|
5682
5693
|
if (element == null) {
|
|
5683
5694
|
return;
|
|
5684
5695
|
}
|
|
@@ -5689,7 +5700,7 @@ class Utils {
|
|
|
5689
5700
|
throw new Error("Utils.deleteParentNode 参数 targetSelector 必须为 string 类型");
|
|
5690
5701
|
}
|
|
5691
5702
|
let result = false;
|
|
5692
|
-
|
|
5703
|
+
const needRemoveDOM = domUtils.closest(element, targetSelector);
|
|
5693
5704
|
if (needRemoveDOM) {
|
|
5694
5705
|
needRemoveDOM.remove();
|
|
5695
5706
|
result = true;
|
|
@@ -5719,7 +5730,7 @@ class Utils {
|
|
|
5719
5730
|
eventNameList = [...eventName];
|
|
5720
5731
|
}
|
|
5721
5732
|
eventNameList.forEach((_eventName_) => {
|
|
5722
|
-
|
|
5733
|
+
const event = new Event(_eventName_);
|
|
5723
5734
|
if (details) {
|
|
5724
5735
|
Object.assign(event, details);
|
|
5725
5736
|
}
|
|
@@ -5727,7 +5738,7 @@ class Utils {
|
|
|
5727
5738
|
});
|
|
5728
5739
|
}
|
|
5729
5740
|
downloadBase64(base64Data, fileName, isIFrame = false) {
|
|
5730
|
-
|
|
5741
|
+
const UtilsContext = this;
|
|
5731
5742
|
if (typeof base64Data !== "string") {
|
|
5732
5743
|
throw new Error("Utils.downloadBase64 参数 base64Data 必须为 string 类型");
|
|
5733
5744
|
}
|
|
@@ -5759,7 +5770,7 @@ class Utils {
|
|
|
5759
5770
|
let strFound;
|
|
5760
5771
|
if (this.windowApi.globalThis.find) {
|
|
5761
5772
|
/* CODE FOR BROWSERS THAT SUPPORT window.find */
|
|
5762
|
-
|
|
5773
|
+
const windowFind = this.windowApi.self.find;
|
|
5763
5774
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
5764
5775
|
if (strFound && this.windowApi.self.getSelection && !this.windowApi.self.getSelection().anchorNode) {
|
|
5765
5776
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
@@ -5793,19 +5804,19 @@ class Utils {
|
|
|
5793
5804
|
return strFound ? true : false;
|
|
5794
5805
|
}
|
|
5795
5806
|
*findElementsWithText(element, text, filter) {
|
|
5796
|
-
|
|
5807
|
+
const that = this;
|
|
5797
5808
|
if (element.outerHTML.includes(text)) {
|
|
5798
5809
|
if (element.children.length === 0) {
|
|
5799
|
-
|
|
5810
|
+
const filterResult = typeof filter === "function" ? filter(element) : false;
|
|
5800
5811
|
if (!filterResult) {
|
|
5801
5812
|
yield element;
|
|
5802
5813
|
}
|
|
5803
5814
|
}
|
|
5804
5815
|
else {
|
|
5805
|
-
|
|
5806
|
-
for (
|
|
5816
|
+
const textElement = Array.from(element.childNodes).filter((ele) => ele.nodeType === Node.TEXT_NODE);
|
|
5817
|
+
for (const $child of textElement) {
|
|
5807
5818
|
if ($child.textContent.includes(text)) {
|
|
5808
|
-
|
|
5819
|
+
const filterResult = typeof filter === "function" ? filter(element) : false;
|
|
5809
5820
|
if (!filterResult) {
|
|
5810
5821
|
yield $child;
|
|
5811
5822
|
}
|
|
@@ -5814,7 +5825,7 @@ class Utils {
|
|
|
5814
5825
|
}
|
|
5815
5826
|
}
|
|
5816
5827
|
for (let index = 0; index < element.children.length; index++) {
|
|
5817
|
-
|
|
5828
|
+
const $child = element.children[index];
|
|
5818
5829
|
yield* that.findElementsWithText($child, text, filter);
|
|
5819
5830
|
}
|
|
5820
5831
|
}
|
|
@@ -5828,8 +5839,8 @@ class Utils {
|
|
|
5828
5839
|
findVisibleElement(element) {
|
|
5829
5840
|
let currentElement = element;
|
|
5830
5841
|
while (currentElement) {
|
|
5831
|
-
|
|
5832
|
-
if (
|
|
5842
|
+
const elementRect = currentElement.getBoundingClientRect();
|
|
5843
|
+
if (elementRect.length) {
|
|
5833
5844
|
return currentElement;
|
|
5834
5845
|
}
|
|
5835
5846
|
currentElement = currentElement.parentElement;
|
|
@@ -5843,7 +5854,7 @@ class Utils {
|
|
|
5843
5854
|
}
|
|
5844
5855
|
let result = 0;
|
|
5845
5856
|
let resultType = "KB";
|
|
5846
|
-
|
|
5857
|
+
const sizeData = {};
|
|
5847
5858
|
sizeData.B = 1;
|
|
5848
5859
|
sizeData.KB = 1024;
|
|
5849
5860
|
sizeData.MB = sizeData.KB * sizeData.KB;
|
|
@@ -5856,7 +5867,7 @@ class Utils {
|
|
|
5856
5867
|
sizeData.BB = sizeData.YB * sizeData.KB;
|
|
5857
5868
|
sizeData.NB = sizeData.BB * sizeData.KB;
|
|
5858
5869
|
sizeData.DB = sizeData.NB * sizeData.KB;
|
|
5859
|
-
for (
|
|
5870
|
+
for (const key in sizeData) {
|
|
5860
5871
|
result = byteSize / sizeData[key];
|
|
5861
5872
|
resultType = key;
|
|
5862
5873
|
if (sizeData.KB >= result) {
|
|
@@ -5869,7 +5880,7 @@ class Utils {
|
|
|
5869
5880
|
}
|
|
5870
5881
|
getNodeListValue(...args) {
|
|
5871
5882
|
let resultArray = [];
|
|
5872
|
-
for (
|
|
5883
|
+
for (const arg of args) {
|
|
5873
5884
|
let value = arg;
|
|
5874
5885
|
if (typeof arg === "function") {
|
|
5875
5886
|
/* 方法 */
|
|
@@ -5884,7 +5895,7 @@ class Utils {
|
|
|
5884
5895
|
}
|
|
5885
5896
|
getNonNullValue(...args) {
|
|
5886
5897
|
let resultValue = args[args.length - 1];
|
|
5887
|
-
|
|
5898
|
+
const UtilsContext = this;
|
|
5888
5899
|
for (const argValue of args) {
|
|
5889
5900
|
if (UtilsContext.isNotNull(argValue)) {
|
|
5890
5901
|
resultValue = argValue;
|
|
@@ -5894,7 +5905,7 @@ class Utils {
|
|
|
5894
5905
|
return resultValue;
|
|
5895
5906
|
}
|
|
5896
5907
|
formatTime(text = new Date(), formatType = "yyyy-MM-dd HH:mm:ss") {
|
|
5897
|
-
|
|
5908
|
+
const time = text == null ? new Date() : new Date(text);
|
|
5898
5909
|
/**
|
|
5899
5910
|
* 校验时间补0
|
|
5900
5911
|
* @param timeNum
|
|
@@ -5902,7 +5913,7 @@ class Utils {
|
|
|
5902
5913
|
*/
|
|
5903
5914
|
function checkTime(timeNum) {
|
|
5904
5915
|
if (timeNum < 10)
|
|
5905
|
-
return
|
|
5916
|
+
return `0${timeNum}`;
|
|
5906
5917
|
return timeNum;
|
|
5907
5918
|
}
|
|
5908
5919
|
/**
|
|
@@ -5913,7 +5924,7 @@ class Utils {
|
|
|
5913
5924
|
function timeSystemChange(hourNum) {
|
|
5914
5925
|
return hourNum > 12 ? hourNum - 12 : hourNum;
|
|
5915
5926
|
}
|
|
5916
|
-
|
|
5927
|
+
const timeRegexp = {
|
|
5917
5928
|
yyyy: time.getFullYear(),
|
|
5918
5929
|
/* 年 */
|
|
5919
5930
|
MM: checkTime(time.getMonth() + 1),
|
|
@@ -5930,7 +5941,7 @@ class Utils {
|
|
|
5930
5941
|
/* 秒 */
|
|
5931
5942
|
};
|
|
5932
5943
|
Object.keys(timeRegexp).forEach(function (key) {
|
|
5933
|
-
|
|
5944
|
+
const replaecRegexp = new RegExp(key, "g");
|
|
5934
5945
|
formatType = formatType.replace(replaecRegexp, timeRegexp[key]);
|
|
5935
5946
|
});
|
|
5936
5947
|
return formatType;
|
|
@@ -5942,12 +5953,12 @@ class Utils {
|
|
|
5942
5953
|
}
|
|
5943
5954
|
if (text.length === 8) {
|
|
5944
5955
|
/* 该字符串只有时分秒 */
|
|
5945
|
-
|
|
5946
|
-
text = today.getFullYear()
|
|
5956
|
+
const today = new Date();
|
|
5957
|
+
text = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()} ${text}`;
|
|
5947
5958
|
}
|
|
5948
5959
|
text = text.substring(0, 19);
|
|
5949
5960
|
text = text.replace(/-/g, "/");
|
|
5950
|
-
|
|
5961
|
+
const timestamp = new Date(text).getTime();
|
|
5951
5962
|
return timestamp;
|
|
5952
5963
|
}
|
|
5953
5964
|
/**
|
|
@@ -5997,16 +6008,16 @@ class Utils {
|
|
|
5997
6008
|
if (timestamp2.toString().length === 10) {
|
|
5998
6009
|
timestamp2 = timestamp2 * 1000;
|
|
5999
6010
|
}
|
|
6000
|
-
|
|
6001
|
-
|
|
6002
|
-
|
|
6003
|
-
|
|
6004
|
-
|
|
6005
|
-
|
|
6006
|
-
|
|
6007
|
-
|
|
6008
|
-
|
|
6009
|
-
|
|
6011
|
+
const smallTimeStamp = timestamp1 > timestamp2 ? timestamp2 : timestamp1;
|
|
6012
|
+
const bigTimeStamp = timestamp1 > timestamp2 ? timestamp1 : timestamp2;
|
|
6013
|
+
const oneSecond = 1000; /* 一秒的毫秒数 */
|
|
6014
|
+
const oneMinute = 60 * oneSecond; /* 一分钟的毫秒数 */
|
|
6015
|
+
const oneHour = 60 * oneMinute; /* 一小时的毫秒数 */
|
|
6016
|
+
const oneDay = 24 * oneHour; /* 一天的毫秒数 */
|
|
6017
|
+
const oneMonth = 30 * oneDay; /* 一个月的毫秒数(30天) */
|
|
6018
|
+
const oneYear = 12 * oneMonth; /* 一年的毫秒数 */
|
|
6019
|
+
const bigDate = new Date(bigTimeStamp);
|
|
6020
|
+
const smallDate = new Date(smallTimeStamp);
|
|
6010
6021
|
let remainderValue = 1;
|
|
6011
6022
|
if (type === "年") {
|
|
6012
6023
|
remainderValue = oneYear;
|
|
@@ -6028,30 +6039,30 @@ class Utils {
|
|
|
6028
6039
|
}
|
|
6029
6040
|
let diffValue = Math.round(Math.abs((bigDate - smallDate) / remainderValue));
|
|
6030
6041
|
if (type === "auto") {
|
|
6031
|
-
|
|
6042
|
+
const timeDifference = bigTimeStamp - smallTimeStamp;
|
|
6032
6043
|
diffValue = Math.floor(timeDifference / (24 * 3600 * 1000));
|
|
6033
6044
|
if (diffValue > 0) {
|
|
6034
|
-
diffValue = diffValue
|
|
6045
|
+
diffValue = `${diffValue}天`;
|
|
6035
6046
|
}
|
|
6036
6047
|
else {
|
|
6037
6048
|
/* 计算出小时数 */
|
|
6038
|
-
|
|
6039
|
-
|
|
6049
|
+
const leave1 = timeDifference % (24 * 3600 * 1000); /* 计算天数后剩余的毫秒数 */
|
|
6050
|
+
const hours = Math.floor(leave1 / (3600 * 1000));
|
|
6040
6051
|
if (hours > 0) {
|
|
6041
|
-
diffValue = hours
|
|
6052
|
+
diffValue = `${hours}小时`;
|
|
6042
6053
|
}
|
|
6043
6054
|
else {
|
|
6044
6055
|
/* 计算相差分钟数 */
|
|
6045
|
-
|
|
6046
|
-
|
|
6056
|
+
const leave2 = leave1 % (3600 * 1000); /* 计算小时数后剩余的毫秒数 */
|
|
6057
|
+
const minutes = Math.floor(leave2 / (60 * 1000));
|
|
6047
6058
|
if (minutes > 0) {
|
|
6048
|
-
diffValue = minutes
|
|
6059
|
+
diffValue = `${minutes}分钟`;
|
|
6049
6060
|
}
|
|
6050
6061
|
else {
|
|
6051
6062
|
/* 计算相差秒数 */
|
|
6052
|
-
|
|
6053
|
-
|
|
6054
|
-
diffValue = seconds
|
|
6063
|
+
const leave3 = leave2 % (60 * 1000); /* 计算分钟数后剩余的毫秒数 */
|
|
6064
|
+
const seconds = Math.round(leave3 / 1000);
|
|
6065
|
+
diffValue = `${seconds}秒`;
|
|
6055
6066
|
}
|
|
6056
6067
|
}
|
|
6057
6068
|
}
|
|
@@ -6059,14 +6070,14 @@ class Utils {
|
|
|
6059
6070
|
return diffValue;
|
|
6060
6071
|
}
|
|
6061
6072
|
getElementSelector(element) {
|
|
6062
|
-
|
|
6073
|
+
const UtilsContext = this;
|
|
6063
6074
|
if (!element)
|
|
6064
6075
|
return void 0;
|
|
6065
6076
|
if (!element.parentElement)
|
|
6066
6077
|
return void 0;
|
|
6067
6078
|
/* 如果元素有id属性,则直接返回id选择器 */
|
|
6068
6079
|
if (element.id)
|
|
6069
|
-
return
|
|
6080
|
+
return `#${element.id}`;
|
|
6070
6081
|
/* 递归地获取父元素的选择器 */
|
|
6071
6082
|
let selector = UtilsContext.getElementSelector(element.parentElement);
|
|
6072
6083
|
if (!selector) {
|
|
@@ -6074,11 +6085,11 @@ class Utils {
|
|
|
6074
6085
|
}
|
|
6075
6086
|
/* 如果有多个相同类型的兄弟元素,则需要添加索引 */
|
|
6076
6087
|
if (element.parentElement.querySelectorAll(element.tagName).length > 1) {
|
|
6077
|
-
|
|
6078
|
-
selector +=
|
|
6088
|
+
const index = Array.prototype.indexOf.call(element.parentElement.children, element) + 1;
|
|
6089
|
+
selector += ` > ${element.tagName.toLowerCase()}:nth-child(${index})`;
|
|
6079
6090
|
}
|
|
6080
6091
|
else {
|
|
6081
|
-
selector +=
|
|
6092
|
+
selector += ` > ${element.tagName.toLowerCase()}`;
|
|
6082
6093
|
}
|
|
6083
6094
|
return selector;
|
|
6084
6095
|
}
|
|
@@ -6089,15 +6100,15 @@ class Utils {
|
|
|
6089
6100
|
* > 2
|
|
6090
6101
|
*/
|
|
6091
6102
|
getMaxValue(...args) {
|
|
6092
|
-
|
|
6103
|
+
const result = [...args];
|
|
6093
6104
|
let newResult = [];
|
|
6094
6105
|
if (result.length === 0) {
|
|
6095
6106
|
return void 0;
|
|
6096
6107
|
}
|
|
6097
6108
|
if (result.length > 1) {
|
|
6098
6109
|
if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
|
|
6099
|
-
|
|
6100
|
-
|
|
6110
|
+
const data = result[0];
|
|
6111
|
+
const handleDataFunc = result[1];
|
|
6101
6112
|
Object.keys(data).forEach((keyName) => {
|
|
6102
6113
|
newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
|
|
6103
6114
|
});
|
|
@@ -6145,7 +6156,7 @@ class Utils {
|
|
|
6145
6156
|
*/
|
|
6146
6157
|
function queryMaxZIndex($ele) {
|
|
6147
6158
|
if (typeof ignoreCallBack === "function") {
|
|
6148
|
-
|
|
6159
|
+
const ignoreResult = ignoreCallBack($ele);
|
|
6149
6160
|
if (typeof ignoreResult === "boolean" && !ignoreResult) {
|
|
6150
6161
|
return;
|
|
6151
6162
|
}
|
|
@@ -6154,7 +6165,7 @@ class Utils {
|
|
|
6154
6165
|
const nodeStyle = UtilsContext.windowApi.window.getComputedStyle($ele);
|
|
6155
6166
|
/* 不对position为static和display为none的元素进行获取它们的z-index */
|
|
6156
6167
|
if (isVisibleNode(nodeStyle)) {
|
|
6157
|
-
|
|
6168
|
+
const nodeZIndex = parseInt(nodeStyle.zIndex);
|
|
6158
6169
|
if (!isNaN(nodeZIndex)) {
|
|
6159
6170
|
if (nodeZIndex > zIndex) {
|
|
6160
6171
|
// 赋值到全局
|
|
@@ -6170,7 +6181,7 @@ class Utils {
|
|
|
6170
6181
|
}
|
|
6171
6182
|
}
|
|
6172
6183
|
}
|
|
6173
|
-
target.querySelectorAll("*").forEach(($ele
|
|
6184
|
+
target.querySelectorAll("*").forEach(($ele) => {
|
|
6174
6185
|
queryMaxZIndex($ele);
|
|
6175
6186
|
});
|
|
6176
6187
|
zIndex += deviation;
|
|
@@ -6187,15 +6198,15 @@ class Utils {
|
|
|
6187
6198
|
return this.getMaxZIndexNodeInfo(deviation, target, ignoreCallBack).zIndex;
|
|
6188
6199
|
}
|
|
6189
6200
|
getMinValue(...args) {
|
|
6190
|
-
|
|
6201
|
+
const result = [...args];
|
|
6191
6202
|
let newResult = [];
|
|
6192
6203
|
if (result.length === 0) {
|
|
6193
6204
|
return void 0;
|
|
6194
6205
|
}
|
|
6195
6206
|
if (result.length > 1) {
|
|
6196
6207
|
if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
|
|
6197
|
-
|
|
6198
|
-
|
|
6208
|
+
const data = result[0];
|
|
6209
|
+
const handleDataFunc = result[1];
|
|
6199
6210
|
Object.keys(data).forEach((keyName) => {
|
|
6200
6211
|
newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
|
|
6201
6212
|
});
|
|
@@ -6225,8 +6236,8 @@ class Utils {
|
|
|
6225
6236
|
* > 'Mozilla/5.0 (Linux; Android 10; MI 13 Build/OPR1.170623.027; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.3490.40 Mobile Safari/537.36'
|
|
6226
6237
|
**/
|
|
6227
6238
|
getRandomAndroidUA() {
|
|
6228
|
-
|
|
6229
|
-
|
|
6239
|
+
const UtilsContext = this;
|
|
6240
|
+
const mobileNameList = [
|
|
6230
6241
|
"LDN-LX3",
|
|
6231
6242
|
"RNE-L03",
|
|
6232
6243
|
"ASUS_X00ID Build/NMF26F",
|
|
@@ -6243,14 +6254,14 @@ class Utils {
|
|
|
6243
6254
|
"MI 13 Build/OPR1.170623.027; wv",
|
|
6244
6255
|
];
|
|
6245
6256
|
/* 安卓版本 */
|
|
6246
|
-
|
|
6257
|
+
const androidVersion = UtilsContext.getRandomValue(12, 14);
|
|
6247
6258
|
/* 手机型号 */
|
|
6248
|
-
|
|
6259
|
+
const randomMobile = UtilsContext.getRandomValue(mobileNameList);
|
|
6249
6260
|
/* chrome大版本号 */
|
|
6250
|
-
|
|
6251
|
-
|
|
6252
|
-
|
|
6253
|
-
|
|
6261
|
+
const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
|
|
6262
|
+
const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
|
|
6263
|
+
const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
|
|
6264
|
+
const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
|
|
6254
6265
|
return `Mozilla/5.0 (Linux; Android ${androidVersion}; ${randomMobile}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Mobile Safari/537.36`;
|
|
6255
6266
|
}
|
|
6256
6267
|
/**
|
|
@@ -6272,20 +6283,20 @@ class Utils {
|
|
|
6272
6283
|
* > 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5068.19 Safari/537.36'
|
|
6273
6284
|
**/
|
|
6274
6285
|
getRandomPCUA() {
|
|
6275
|
-
|
|
6286
|
+
const UtilsContext = this;
|
|
6276
6287
|
/* chrome大版本号 */
|
|
6277
|
-
|
|
6278
|
-
|
|
6279
|
-
|
|
6280
|
-
|
|
6288
|
+
const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
|
|
6289
|
+
const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
|
|
6290
|
+
const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
|
|
6291
|
+
const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
|
|
6281
6292
|
return `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Safari/537.36`;
|
|
6282
6293
|
}
|
|
6283
6294
|
getRandomValue(...args) {
|
|
6284
|
-
|
|
6295
|
+
const result = [...args];
|
|
6285
6296
|
if (result.length > 1) {
|
|
6286
6297
|
if (result.length === 2 && typeof result[0] === "number" && typeof result[1] === "number") {
|
|
6287
|
-
|
|
6288
|
-
|
|
6298
|
+
const leftNumber = result[0] > result[1] ? result[1] : result[0];
|
|
6299
|
+
const rightNumber = result[0] > result[1] ? result[0] : result[1];
|
|
6289
6300
|
return Math.round(Math.random() * (rightNumber - leftNumber)) + leftNumber;
|
|
6290
6301
|
}
|
|
6291
6302
|
else {
|
|
@@ -6293,12 +6304,12 @@ class Utils {
|
|
|
6293
6304
|
}
|
|
6294
6305
|
}
|
|
6295
6306
|
else if (result.length === 1) {
|
|
6296
|
-
|
|
6307
|
+
const paramData = result[0];
|
|
6297
6308
|
if (Array.isArray(paramData)) {
|
|
6298
6309
|
return paramData[Math.floor(Math.random() * paramData.length)];
|
|
6299
6310
|
}
|
|
6300
6311
|
else if (typeof paramData === "object" && Object.keys(paramData).length > 0) {
|
|
6301
|
-
|
|
6312
|
+
const paramObjDataKey = Object.keys(paramData)[Math.floor(Math.random() * Object.keys(paramData).length)];
|
|
6302
6313
|
return paramData[paramObjDataKey];
|
|
6303
6314
|
}
|
|
6304
6315
|
else {
|
|
@@ -6314,7 +6325,7 @@ class Utils {
|
|
|
6314
6325
|
* Utils.getReactObj(document.querySelector("input"))?.reactProps?.onChange({target:{value:"123"}});
|
|
6315
6326
|
*/
|
|
6316
6327
|
getReactObj(element) {
|
|
6317
|
-
|
|
6328
|
+
const result = {};
|
|
6318
6329
|
if (element == null) {
|
|
6319
6330
|
return result;
|
|
6320
6331
|
}
|
|
@@ -6340,9 +6351,9 @@ class Utils {
|
|
|
6340
6351
|
if (typeof target !== "object") {
|
|
6341
6352
|
throw new TypeError("target不是一个对象");
|
|
6342
6353
|
}
|
|
6343
|
-
|
|
6354
|
+
const objectsSymbols = Object.getOwnPropertySymbols(target);
|
|
6344
6355
|
if (typeof keyName === "string") {
|
|
6345
|
-
|
|
6356
|
+
const findSymbol = objectsSymbols.find((key) => {
|
|
6346
6357
|
return key.toString() === keyName;
|
|
6347
6358
|
});
|
|
6348
6359
|
if (findSymbol) {
|
|
@@ -6350,7 +6361,7 @@ class Utils {
|
|
|
6350
6361
|
}
|
|
6351
6362
|
}
|
|
6352
6363
|
else if (typeof keyName === "symbol") {
|
|
6353
|
-
|
|
6364
|
+
const findSymbol = objectsSymbols.find((key) => {
|
|
6354
6365
|
return key === keyName;
|
|
6355
6366
|
});
|
|
6356
6367
|
if (findSymbol) {
|
|
@@ -6358,7 +6369,7 @@ class Utils {
|
|
|
6358
6369
|
}
|
|
6359
6370
|
}
|
|
6360
6371
|
else {
|
|
6361
|
-
|
|
6372
|
+
const result = {};
|
|
6362
6373
|
objectsSymbols.forEach((item) => {
|
|
6363
6374
|
result[item] = target[item];
|
|
6364
6375
|
});
|
|
@@ -6373,12 +6384,12 @@ class Utils {
|
|
|
6373
6384
|
* > 12
|
|
6374
6385
|
*/
|
|
6375
6386
|
getTextLength(text) {
|
|
6376
|
-
|
|
6377
|
-
|
|
6387
|
+
const encoder = new TextEncoder();
|
|
6388
|
+
const bytes = encoder.encode(text);
|
|
6378
6389
|
return bytes.length;
|
|
6379
6390
|
}
|
|
6380
6391
|
getTextStorageSize(text, addType = true) {
|
|
6381
|
-
|
|
6392
|
+
const UtilsContext = this;
|
|
6382
6393
|
return UtilsContext.formatByteToSize(UtilsContext.getTextLength(text), addType);
|
|
6383
6394
|
}
|
|
6384
6395
|
getThunderUrl(url) {
|
|
@@ -6391,88 +6402,75 @@ class Utils {
|
|
|
6391
6402
|
if (url.trim() === "") {
|
|
6392
6403
|
throw new TypeError("url不能为空字符串或纯空格");
|
|
6393
6404
|
}
|
|
6394
|
-
return `thunder://${this.windowApi.globalThis.btoa(
|
|
6405
|
+
return `thunder://${this.windowApi.globalThis.btoa(`AA${url}ZZ`)}`;
|
|
6395
6406
|
}
|
|
6396
6407
|
/**
|
|
6397
|
-
|
|
6398
|
-
|
|
6399
|
-
|
|
6400
|
-
|
|
6401
|
-
|
|
6402
|
-
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6406
|
-
|
|
6407
|
-
|
|
6408
|
-
|
|
6409
|
-
|
|
6410
|
-
|
|
6411
|
-
|
|
6412
|
-
|
|
6413
|
-
|
|
6414
|
-
|
|
6415
|
-
|
|
6416
|
-
|
|
6417
|
-
|
|
6418
|
-
|
|
6419
|
-
|
|
6420
|
-
|
|
6421
|
-
|
|
6422
|
-
|
|
6408
|
+
* 对于GM_cookie的兼容写法,当无法使用GM_cookie时可以使用这个,但是并不完全兼容,有些写不出来且限制了httponly是无法访问的
|
|
6409
|
+
* @example
|
|
6410
|
+
let GM_cookie = new Utils.GM_Cookie();
|
|
6411
|
+
GM_cookie.list({name:"xxx_cookie_xxx"},function(cookies,error){
|
|
6412
|
+
if (!error) {
|
|
6413
|
+
console.log(cookies);
|
|
6414
|
+
console.log(cookies.value);
|
|
6415
|
+
} else {
|
|
6416
|
+
console.error(error);
|
|
6417
|
+
}
|
|
6418
|
+
});
|
|
6419
|
+
GM_cookie.set({name:"xxx_cookie_test_xxx",value:"这是Cookie测试值"},function(error){
|
|
6420
|
+
if (error) {
|
|
6421
|
+
console.error(error);
|
|
6422
|
+
} else {
|
|
6423
|
+
console.log('Cookie set successfully.');
|
|
6424
|
+
}
|
|
6425
|
+
})
|
|
6426
|
+
GM_cookie.delete({name:"xxx_cookie_test_xxx"},function(error){
|
|
6427
|
+
if (error) {
|
|
6428
|
+
console.error(error);
|
|
6429
|
+
} else {
|
|
6430
|
+
console.log('Cookie set successfully.');
|
|
6431
|
+
}
|
|
6432
|
+
})
|
|
6433
|
+
**/
|
|
6423
6434
|
GM_Cookie = UtilsGMCookie;
|
|
6424
6435
|
/**
|
|
6425
|
-
|
|
6426
|
-
|
|
6427
|
-
|
|
6428
|
-
|
|
6429
|
-
|
|
6430
|
-
|
|
6431
|
-
|
|
6432
|
-
|
|
6433
|
-
|
|
6434
|
-
|
|
6435
|
-
|
|
6436
|
-
|
|
6436
|
+
* 注册油猴菜单,要求本地存储的键名不能存在其它键名`GM_Menu_Local_Map`会冲突/覆盖
|
|
6437
|
+
* @example
|
|
6438
|
+
let GM_Menu = new Utils.GM_Menu({
|
|
6439
|
+
data: [
|
|
6440
|
+
{
|
|
6441
|
+
menu_key: "menu_key",
|
|
6442
|
+
text: "测试按钮",
|
|
6443
|
+
enable: true,
|
|
6444
|
+
accessKey: "a",
|
|
6445
|
+
autoClose: false,
|
|
6446
|
+
showText(text, enable) {
|
|
6447
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6448
|
+
},
|
|
6449
|
+
callback(data) {
|
|
6450
|
+
console.log("点击菜单,值修改为", data.enable);
|
|
6451
|
+
},
|
|
6437
6452
|
},
|
|
6438
|
-
|
|
6439
|
-
|
|
6440
|
-
|
|
6441
|
-
|
|
6442
|
-
|
|
6443
|
-
|
|
6444
|
-
|
|
6445
|
-
|
|
6446
|
-
|
|
6447
|
-
|
|
6448
|
-
|
|
6449
|
-
|
|
6450
|
-
|
|
6451
|
-
|
|
6452
|
-
|
|
6453
|
-
|
|
6454
|
-
|
|
6455
|
-
|
|
6456
|
-
|
|
6457
|
-
|
|
6458
|
-
|
|
6459
|
-
// 添加键为menu_key2的菜单项
|
|
6460
|
-
GM_Menu.add({
|
|
6461
|
-
key:"menu_key2",
|
|
6462
|
-
text: "测试按钮2",
|
|
6463
|
-
enable: false,
|
|
6464
|
-
showText(text,enable){
|
|
6465
|
-
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6466
|
-
},
|
|
6467
|
-
callback(data){
|
|
6468
|
-
console.log("点击菜单,值修改为",data.enable);
|
|
6469
|
-
}
|
|
6470
|
-
});
|
|
6471
|
-
// 使用数组的方式添加多个菜单,如menu_key3、menu_key4
|
|
6472
|
-
GM_Menu.add([
|
|
6473
|
-
{
|
|
6474
|
-
key:"menu_key3",
|
|
6475
|
-
text: "测试按钮3",
|
|
6453
|
+
],
|
|
6454
|
+
autoReload: false,
|
|
6455
|
+
GM_getValue,
|
|
6456
|
+
GM_setValue,
|
|
6457
|
+
GM_registerMenuCommand,
|
|
6458
|
+
GM_unregisterMenuCommand,
|
|
6459
|
+
});
|
|
6460
|
+
|
|
6461
|
+
|
|
6462
|
+
// 获取某个菜单项的值
|
|
6463
|
+
GM_Menu.get("menu_key");
|
|
6464
|
+
> true
|
|
6465
|
+
|
|
6466
|
+
// 获取某个菜单项的开启/关闭后显示的文本
|
|
6467
|
+
GM_Menu.getShowTextValue("menu_key");
|
|
6468
|
+
> √测试按钮
|
|
6469
|
+
|
|
6470
|
+
// 添加键为menu_key2的菜单项
|
|
6471
|
+
GM_Menu.add({
|
|
6472
|
+
key:"menu_key2",
|
|
6473
|
+
text: "测试按钮2",
|
|
6476
6474
|
enable: false,
|
|
6477
6475
|
showText(text,enable){
|
|
6478
6476
|
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
@@ -6480,152 +6478,165 @@ class Utils {
|
|
|
6480
6478
|
callback(data){
|
|
6481
6479
|
console.log("点击菜单,值修改为",data.enable);
|
|
6482
6480
|
}
|
|
6483
|
-
}
|
|
6484
|
-
|
|
6485
|
-
|
|
6486
|
-
|
|
6487
|
-
|
|
6488
|
-
|
|
6489
|
-
|
|
6481
|
+
});
|
|
6482
|
+
// 使用数组的方式添加多个菜单,如menu_key3、menu_key4
|
|
6483
|
+
GM_Menu.add([
|
|
6484
|
+
{
|
|
6485
|
+
key:"menu_key3",
|
|
6486
|
+
text: "测试按钮3",
|
|
6487
|
+
enable: false,
|
|
6488
|
+
showText(text,enable){
|
|
6489
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6490
|
+
},
|
|
6491
|
+
callback(data){
|
|
6492
|
+
console.log("点击菜单,值修改为",data.enable);
|
|
6493
|
+
}
|
|
6490
6494
|
},
|
|
6491
|
-
|
|
6492
|
-
|
|
6495
|
+
{
|
|
6496
|
+
key:"menu_key4",
|
|
6497
|
+
text: "测试按钮4",
|
|
6498
|
+
enable: false,
|
|
6499
|
+
showText(text,enable){
|
|
6500
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6501
|
+
},
|
|
6502
|
+
callback(data){
|
|
6503
|
+
console.log("点击菜单,值修改为",data.enable);
|
|
6504
|
+
}
|
|
6493
6505
|
}
|
|
6494
|
-
|
|
6495
|
-
|
|
6496
|
-
|
|
6497
|
-
|
|
6498
|
-
|
|
6499
|
-
|
|
6500
|
-
|
|
6501
|
-
|
|
6502
|
-
|
|
6503
|
-
|
|
6504
|
-
|
|
6505
|
-
|
|
6506
|
-
|
|
6506
|
+
]);
|
|
6507
|
+
|
|
6508
|
+
// 更新键为menu_key的显示文字和点击回调
|
|
6509
|
+
GM_Menu.update({
|
|
6510
|
+
menu_key:{
|
|
6511
|
+
text: "更新后的测试按钮",
|
|
6512
|
+
enable: true,
|
|
6513
|
+
showText(text,enable){
|
|
6514
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6515
|
+
},
|
|
6516
|
+
callback(data){
|
|
6517
|
+
console.log("点击菜单更新后的测试按钮,新值修改为",data.enable);
|
|
6518
|
+
}
|
|
6507
6519
|
}
|
|
6508
|
-
}
|
|
6509
|
-
|
|
6510
|
-
|
|
6511
|
-
|
|
6512
|
-
|
|
6513
|
-
**/
|
|
6520
|
+
});
|
|
6521
|
+
|
|
6522
|
+
// 删除键为menu_key的菜单
|
|
6523
|
+
GM_Menu.delete("menu_key");
|
|
6524
|
+
**/
|
|
6514
6525
|
GM_Menu = GMMenu;
|
|
6515
6526
|
/**
|
|
6516
|
-
|
|
6517
|
-
|
|
6518
|
-
|
|
6519
|
-
|
|
6520
|
-
|
|
6521
|
-
|
|
6522
|
-
|
|
6523
|
-
|
|
6524
|
-
|
|
6525
|
-
|
|
6526
|
-
|
|
6527
|
-
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
|
|
6531
|
-
|
|
6532
|
-
|
|
6533
|
-
|
|
6534
|
-
|
|
6535
|
-
|
|
6536
|
-
|
|
6537
|
-
|
|
6538
|
-
|
|
6527
|
+
* 基于Function prototype,能够勾住和释放任何函数
|
|
6528
|
+
*
|
|
6529
|
+
* .hook
|
|
6530
|
+
* + realFunc {string} 用于保存原始函数的函数名称,用于unHook
|
|
6531
|
+
* + hookFunc {string} 替换的hook函数
|
|
6532
|
+
* + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
|
|
6533
|
+
* + methodName {string} 匿名函数需显式传入目标函数名eg:this.Begin = function(){....};}
|
|
6534
|
+
*
|
|
6535
|
+
* .unhook
|
|
6536
|
+
* + realFunc {string} 用于保存原始函数的函数名称,用于unHook
|
|
6537
|
+
* + funcName {string} 被Hook的函数名称
|
|
6538
|
+
* + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
|
|
6539
|
+
* @example
|
|
6540
|
+
let hook = new Utils.Hooks();
|
|
6541
|
+
hook.initEnv();
|
|
6542
|
+
function myFunction(){
|
|
6543
|
+
console.log("我自己需要执行的函数");
|
|
6544
|
+
}
|
|
6545
|
+
function testFunction(){
|
|
6546
|
+
console.log("正常执行的函数");
|
|
6547
|
+
}
|
|
6548
|
+
testFunction.hook(testFunction,myFunction,window);
|
|
6549
|
+
**/
|
|
6539
6550
|
Hooks = Hooks;
|
|
6540
6551
|
/**
|
|
6541
|
-
|
|
6542
|
-
|
|
6543
|
-
|
|
6544
|
-
|
|
6545
|
-
|
|
6546
|
-
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
|
|
6551
|
-
|
|
6552
|
-
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
|
|
6557
|
-
|
|
6558
|
-
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6563
|
-
|
|
6564
|
-
|
|
6565
|
-
|
|
6566
|
-
|
|
6567
|
-
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
|
|
6571
|
-
|
|
6572
|
-
|
|
6573
|
-
|
|
6574
|
-
|
|
6575
|
-
|
|
6576
|
-
|
|
6577
|
-
|
|
6552
|
+
* 为减少代码量和回调,把GM_xmlhttpRequest封装
|
|
6553
|
+
* 文档地址: https://www.tampermonkey.net/documentation.php?ext=iikm
|
|
6554
|
+
* 其中onloadstart、onprogress、onreadystatechange是回调形式,onabort、ontimeout、onerror可以设置全局回调函数
|
|
6555
|
+
* @param _GM_xmlHttpRequest_ 油猴中的GM_xmlhttpRequest
|
|
6556
|
+
* @example
|
|
6557
|
+
let httpx = new Utils.Httpx(GM_xmlhttpRequest);
|
|
6558
|
+
let postResp = await httpx.post({
|
|
6559
|
+
url:url,
|
|
6560
|
+
data:JSON.stringify({
|
|
6561
|
+
test:1
|
|
6562
|
+
}),
|
|
6563
|
+
timeout: 5000
|
|
6564
|
+
});
|
|
6565
|
+
console.log(postResp);
|
|
6566
|
+
> {
|
|
6567
|
+
status: true,
|
|
6568
|
+
data: {responseText: "...", response: xxx,...},
|
|
6569
|
+
msg: "请求完毕",
|
|
6570
|
+
type: "onload",
|
|
6571
|
+
}
|
|
6572
|
+
|
|
6573
|
+
if(postResp === "onload" && postResp.status){
|
|
6574
|
+
// onload
|
|
6575
|
+
}else if(postResp === "ontimeout"){
|
|
6576
|
+
// ontimeout
|
|
6577
|
+
}
|
|
6578
|
+
* @example
|
|
6579
|
+
// 也可以先配置全局参数
|
|
6580
|
+
let httpx = new Utils.Httpx(GM_xmlhttpRequest);
|
|
6581
|
+
httpx.config({
|
|
6582
|
+
timeout: 5000,
|
|
6583
|
+
async: false,
|
|
6584
|
+
responseType: "html",
|
|
6585
|
+
redirect: "follow",
|
|
6586
|
+
})
|
|
6587
|
+
// 优先级为 默认details < 全局details < 单独的details
|
|
6588
|
+
*/
|
|
6578
6589
|
Httpx = Httpx;
|
|
6579
6590
|
/**
|
|
6580
|
-
|
|
6581
|
-
|
|
6582
|
-
|
|
6583
|
-
|
|
6584
|
-
|
|
6585
|
-
|
|
6586
|
-
|
|
6587
|
-
|
|
6588
|
-
|
|
6589
|
-
|
|
6590
|
-
|
|
6591
|
-
|
|
6592
|
-
|
|
6593
|
-
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
|
|
6597
|
-
|
|
6598
|
-
|
|
6599
|
-
|
|
6600
|
-
|
|
6601
|
-
|
|
6602
|
-
|
|
6603
|
-
|
|
6591
|
+
* 浏览器端的indexedDB操作封装
|
|
6592
|
+
* @example
|
|
6593
|
+
let db = new Utils.indexedDB('web_DB', 'nav_text')
|
|
6594
|
+
let data = {name:'管理员', roleId: 1, type: 1};
|
|
6595
|
+
db.save('list',data).then((resolve)=>{
|
|
6596
|
+
console.log(resolve,'存储成功')
|
|
6597
|
+
})
|
|
6598
|
+
|
|
6599
|
+
db.get('list').then((resolve)=>{
|
|
6600
|
+
console.log(resolve,'查询成功')
|
|
6601
|
+
})
|
|
6602
|
+
|
|
6603
|
+
db.getPaging('list',20,10).then((resolve)=>{
|
|
6604
|
+
console.log(resolve,'查询分页偏移第20,一共10行成功');
|
|
6605
|
+
})
|
|
6606
|
+
|
|
6607
|
+
db.delete('list').then(resolve=>{
|
|
6608
|
+
console.log(resolve,'删除成功---->>>>>>name')
|
|
6609
|
+
})
|
|
6610
|
+
|
|
6611
|
+
db.deleteAll().then(resolve=>{
|
|
6612
|
+
console.log(resolve,'清除数据库---->>>>>>name')
|
|
6613
|
+
})
|
|
6614
|
+
**/
|
|
6604
6615
|
indexedDB = indexedDB;
|
|
6605
6616
|
isNativeFunc(target) {
|
|
6606
6617
|
return Boolean(target.toString().match(/^function .*\(\) { \[native code\] }$/));
|
|
6607
6618
|
}
|
|
6608
6619
|
isNearBottom(...args) {
|
|
6609
6620
|
let nearBottomHeight = 50;
|
|
6610
|
-
|
|
6621
|
+
const checkWindow = () => {
|
|
6611
6622
|
// 已滚动的距离
|
|
6612
|
-
|
|
6623
|
+
const scrollTop = this.windowApi.window.pageYOffset || this.windowApi.document.documentElement.scrollTop;
|
|
6613
6624
|
// 视窗高度
|
|
6614
|
-
|
|
6625
|
+
const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
|
|
6615
6626
|
// 最大滚动距离
|
|
6616
|
-
|
|
6627
|
+
const maxScrollHeight = this.windowApi.document.documentElement.scrollHeight - nearBottomHeight;
|
|
6617
6628
|
return scrollTop + viewportHeight >= maxScrollHeight;
|
|
6618
6629
|
};
|
|
6619
|
-
|
|
6630
|
+
const checkNode = ($ele) => {
|
|
6620
6631
|
// 已滚动的距离
|
|
6621
|
-
|
|
6632
|
+
const scrollTop = $ele.scrollTop;
|
|
6622
6633
|
// 视窗高度
|
|
6623
|
-
|
|
6634
|
+
const viewportHeight = $ele.clientHeight;
|
|
6624
6635
|
// 最大滚动距离
|
|
6625
|
-
|
|
6636
|
+
const maxScrollHeight = $ele.scrollHeight - viewportHeight - nearBottomHeight;
|
|
6626
6637
|
return scrollTop >= maxScrollHeight;
|
|
6627
6638
|
};
|
|
6628
|
-
|
|
6639
|
+
const firstArg = args[0];
|
|
6629
6640
|
if (args.length === 0 || typeof args[0] === "number") {
|
|
6630
6641
|
// nearBottomHeight
|
|
6631
6642
|
//
|
|
@@ -6640,7 +6651,7 @@ class Utils {
|
|
|
6640
6651
|
return checkNode(args[0]);
|
|
6641
6652
|
}
|
|
6642
6653
|
else {
|
|
6643
|
-
throw new TypeError(
|
|
6654
|
+
throw new TypeError(`参数1类型错误${typeof firstArg}`);
|
|
6644
6655
|
}
|
|
6645
6656
|
}
|
|
6646
6657
|
/**
|
|
@@ -6670,7 +6681,7 @@ class Utils {
|
|
|
6670
6681
|
}
|
|
6671
6682
|
if (typeof target === "object") {
|
|
6672
6683
|
/* 也有种可能,这个jQuery对象是1.8.3版本的,页面中的jQuery是3.4.1版本的 */
|
|
6673
|
-
|
|
6684
|
+
const jQueryProps = [
|
|
6674
6685
|
"add",
|
|
6675
6686
|
"addBack",
|
|
6676
6687
|
"addClass",
|
|
@@ -6854,50 +6865,50 @@ class Utils {
|
|
|
6854
6865
|
*/
|
|
6855
6866
|
isNotNull = commonUtil.isNotNull.bind(commonUtil);
|
|
6856
6867
|
/**
|
|
6857
|
-
|
|
6858
|
-
|
|
6859
|
-
|
|
6860
|
-
|
|
6861
|
-
|
|
6862
|
-
|
|
6863
|
-
|
|
6864
|
-
|
|
6865
|
-
|
|
6866
|
-
|
|
6867
|
-
|
|
6868
|
-
|
|
6869
|
-
|
|
6870
|
-
|
|
6871
|
-
|
|
6872
|
-
|
|
6873
|
-
|
|
6874
|
-
|
|
6875
|
-
|
|
6876
|
-
|
|
6877
|
-
|
|
6878
|
-
|
|
6879
|
-
|
|
6880
|
-
|
|
6881
|
-
|
|
6882
|
-
|
|
6883
|
-
|
|
6884
|
-
|
|
6885
|
-
|
|
6886
|
-
|
|
6887
|
-
|
|
6888
|
-
|
|
6889
|
-
|
|
6890
|
-
|
|
6891
|
-
|
|
6892
|
-
|
|
6893
|
-
|
|
6894
|
-
|
|
6895
|
-
|
|
6896
|
-
|
|
6897
|
-
|
|
6898
|
-
|
|
6899
|
-
|
|
6900
|
-
|
|
6868
|
+
* 判断对象或数据是否为空
|
|
6869
|
+
* + `String`判空的值,如 ""、"null"、"undefined"、" "
|
|
6870
|
+
* + `Number`判空的值,如 0
|
|
6871
|
+
* + `Object`判空的值,如 {}、null、undefined
|
|
6872
|
+
* + `Array`(存在属性Symbol.iterator)判空的值,如 []
|
|
6873
|
+
* + `Boolean`判空的值,如false
|
|
6874
|
+
* + `Function`判空的值,如()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){}
|
|
6875
|
+
* @returns
|
|
6876
|
+
* + true 为空
|
|
6877
|
+
* + false 不为空
|
|
6878
|
+
* @example
|
|
6879
|
+
Utils.isNull({});
|
|
6880
|
+
> true
|
|
6881
|
+
* @example
|
|
6882
|
+
Utils.isNull([]);
|
|
6883
|
+
> true
|
|
6884
|
+
* @example
|
|
6885
|
+
Utils.isNull(" ");
|
|
6886
|
+
> true
|
|
6887
|
+
* @example
|
|
6888
|
+
Utils.isNull(function(){});
|
|
6889
|
+
> true
|
|
6890
|
+
* @example
|
|
6891
|
+
Utils.isNull(()=>{}));
|
|
6892
|
+
> true
|
|
6893
|
+
* @example
|
|
6894
|
+
Utils.isNull("undefined");
|
|
6895
|
+
> true
|
|
6896
|
+
* @example
|
|
6897
|
+
Utils.isNull("null");
|
|
6898
|
+
> true
|
|
6899
|
+
* @example
|
|
6900
|
+
Utils.isNull(" ", false);
|
|
6901
|
+
> true
|
|
6902
|
+
* @example
|
|
6903
|
+
Utils.isNull([1],[]);
|
|
6904
|
+
> false
|
|
6905
|
+
* @example
|
|
6906
|
+
Utils.isNull([],[1]);
|
|
6907
|
+
> false
|
|
6908
|
+
* @example
|
|
6909
|
+
Utils.isNull(false,[123]);
|
|
6910
|
+
> false
|
|
6911
|
+
**/
|
|
6901
6912
|
isNull = commonUtil.isNull.bind(commonUtil);
|
|
6902
6913
|
isThemeDark() {
|
|
6903
6914
|
return this.windowApi.globalThis.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
@@ -6926,15 +6937,15 @@ class Utils {
|
|
|
6926
6937
|
}
|
|
6927
6938
|
let result = true;
|
|
6928
6939
|
for (const domItem of needCheckDomList) {
|
|
6929
|
-
|
|
6940
|
+
const domDisplay = this.windowApi.window.getComputedStyle(domItem);
|
|
6930
6941
|
if (domDisplay.display === "none") {
|
|
6931
6942
|
result = false;
|
|
6932
6943
|
}
|
|
6933
6944
|
else {
|
|
6934
|
-
|
|
6945
|
+
const domClientRect = domItem.getBoundingClientRect();
|
|
6935
6946
|
if (inView) {
|
|
6936
|
-
|
|
6937
|
-
|
|
6947
|
+
const viewportWidth = this.windowApi.window.innerWidth || this.windowApi.document.documentElement.clientWidth;
|
|
6948
|
+
const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
|
|
6938
6949
|
result = !(domClientRect.right < 0 ||
|
|
6939
6950
|
domClientRect.left > viewportWidth ||
|
|
6940
6951
|
domClientRect.bottom < 0 ||
|
|
@@ -6953,11 +6964,11 @@ class Utils {
|
|
|
6953
6964
|
}
|
|
6954
6965
|
isWebView_Via() {
|
|
6955
6966
|
let result = true;
|
|
6956
|
-
|
|
6967
|
+
const UtilsContext = this;
|
|
6957
6968
|
if (typeof this.windowApi.top.window.via === "object") {
|
|
6958
6969
|
for (const key in Object.values(this.windowApi.top.window.via)) {
|
|
6959
6970
|
if (Reflect.has(this.windowApi.top.window.via, key)) {
|
|
6960
|
-
|
|
6971
|
+
const objValueFunc = this.windowApi.top.window.via[key];
|
|
6961
6972
|
if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
|
|
6962
6973
|
result = true;
|
|
6963
6974
|
}
|
|
@@ -6975,11 +6986,11 @@ class Utils {
|
|
|
6975
6986
|
}
|
|
6976
6987
|
isWebView_X() {
|
|
6977
6988
|
let result = true;
|
|
6978
|
-
|
|
6989
|
+
const UtilsContext = this;
|
|
6979
6990
|
if (typeof this.windowApi.top.window.mbrowser === "object") {
|
|
6980
6991
|
for (const key in Object.values(this.windowApi.top.window.mbrowser)) {
|
|
6981
6992
|
if (Reflect.has(this.windowApi.top.window.mbrowser, key)) {
|
|
6982
|
-
|
|
6993
|
+
const objValueFunc = this.windowApi.top.window.mbrowser[key];
|
|
6983
6994
|
if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
|
|
6984
6995
|
result = true;
|
|
6985
6996
|
}
|
|
@@ -7006,46 +7017,46 @@ class Utils {
|
|
|
7006
7017
|
return result;
|
|
7007
7018
|
}
|
|
7008
7019
|
/**
|
|
7009
|
-
|
|
7010
|
-
|
|
7011
|
-
|
|
7012
|
-
|
|
7013
|
-
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
|
|
7017
|
-
|
|
7018
|
-
|
|
7020
|
+
* 自动锁对象,用于循环判断运行的函数,在循环外new后使用,注意,如果函数内部存在异步操作,需要使用await
|
|
7021
|
+
* @example
|
|
7022
|
+
let lock = new Utils.LockFunction(()=>{console.log(1)}))
|
|
7023
|
+
lock.run();
|
|
7024
|
+
> 1
|
|
7025
|
+
* @example
|
|
7026
|
+
let lock = new Utils.LockFunction(()=>{console.log(1)}),true) -- 异步操作
|
|
7027
|
+
await lock.run();
|
|
7028
|
+
> 1
|
|
7029
|
+
**/
|
|
7019
7030
|
LockFunction = LockFunction;
|
|
7020
7031
|
/**
|
|
7021
|
-
|
|
7022
|
-
|
|
7023
|
-
|
|
7024
|
-
|
|
7025
|
-
|
|
7026
|
-
|
|
7027
|
-
|
|
7028
|
-
|
|
7029
|
-
|
|
7030
|
-
|
|
7031
|
-
|
|
7032
|
-
|
|
7033
|
-
|
|
7034
|
-
|
|
7035
|
-
|
|
7036
|
-
|
|
7037
|
-
|
|
7038
|
-
|
|
7039
|
-
|
|
7040
|
-
|
|
7041
|
-
|
|
7042
|
-
|
|
7043
|
-
|
|
7044
|
-
|
|
7045
|
-
|
|
7046
|
-
|
|
7047
|
-
|
|
7048
|
-
|
|
7032
|
+
* 日志对象
|
|
7033
|
+
* @param _GM_info_ 油猴管理器的API GM_info,或者是一个对象,如{"script":{name:"Utils.Log"}}
|
|
7034
|
+
* @example
|
|
7035
|
+
let log = new Utils.Log(GM_info);
|
|
7036
|
+
log.info("普通输出");
|
|
7037
|
+
> 普通输出
|
|
7038
|
+
|
|
7039
|
+
log.success("成功输出");
|
|
7040
|
+
> 成功输出
|
|
7041
|
+
|
|
7042
|
+
log.error("错误输出");
|
|
7043
|
+
> 错误输出
|
|
7044
|
+
|
|
7045
|
+
log.warn("警告输出");
|
|
7046
|
+
> 警告输出
|
|
7047
|
+
|
|
7048
|
+
log.tag = "自定义tag信息";
|
|
7049
|
+
log.info("自定义info的颜色","#e0e0e0");
|
|
7050
|
+
> 自定义info的颜色
|
|
7051
|
+
|
|
7052
|
+
log.config({
|
|
7053
|
+
successColor: "#31dc02",
|
|
7054
|
+
errorColor: "#e02d2d",
|
|
7055
|
+
infoColor: "black",
|
|
7056
|
+
})
|
|
7057
|
+
log.success("颜色为#31dc02");
|
|
7058
|
+
> 颜色为#31dc02
|
|
7059
|
+
*/
|
|
7049
7060
|
Log = Log;
|
|
7050
7061
|
mergeArrayToString(data, handleFunc) {
|
|
7051
7062
|
if (!(data instanceof Array)) {
|
|
@@ -7074,8 +7085,8 @@ class Utils {
|
|
|
7074
7085
|
return content;
|
|
7075
7086
|
}
|
|
7076
7087
|
mutationObserver(target, observer_config) {
|
|
7077
|
-
|
|
7078
|
-
|
|
7088
|
+
const UtilsContext = this;
|
|
7089
|
+
const default_obverser_config = {
|
|
7079
7090
|
/* 监听到元素有反馈,需执行的函数 */
|
|
7080
7091
|
callback: () => { },
|
|
7081
7092
|
config: {
|
|
@@ -7117,11 +7128,11 @@ class Utils {
|
|
|
7117
7128
|
immediate: false,
|
|
7118
7129
|
};
|
|
7119
7130
|
observer_config = UtilsContext.assign(default_obverser_config, observer_config);
|
|
7120
|
-
|
|
7131
|
+
const windowMutationObserver = this.windowApi.window.MutationObserver ||
|
|
7121
7132
|
this.windowApi.window.webkitMutationObserver ||
|
|
7122
7133
|
this.windowApi.window.MozMutationObserver;
|
|
7123
7134
|
// 观察者对象
|
|
7124
|
-
|
|
7135
|
+
const mutationObserver = new windowMutationObserver(function (mutations, observer) {
|
|
7125
7136
|
if (typeof observer_config.callback === "function") {
|
|
7126
7137
|
observer_config.callback(mutations, observer);
|
|
7127
7138
|
}
|
|
@@ -7134,7 +7145,7 @@ class Utils {
|
|
|
7134
7145
|
}
|
|
7135
7146
|
else if (UtilsContext.isJQuery(target)) {
|
|
7136
7147
|
/* 传入的参数是jQuery对象 */
|
|
7137
|
-
target.each((
|
|
7148
|
+
target.each((_, item) => {
|
|
7138
7149
|
mutationObserver.observe(item, observer_config.config);
|
|
7139
7150
|
});
|
|
7140
7151
|
}
|
|
@@ -7172,7 +7183,7 @@ class Utils {
|
|
|
7172
7183
|
threshold: [0.01, 0.99],
|
|
7173
7184
|
};
|
|
7174
7185
|
defaultOptions = this.assign(defaultOptions, options || {});
|
|
7175
|
-
|
|
7186
|
+
const intersectionObserver = new IntersectionObserver((entries, observer) => {
|
|
7176
7187
|
if (entries[0].isIntersecting) {
|
|
7177
7188
|
if (typeof callback === "function") {
|
|
7178
7189
|
callback(entries, observer);
|
|
@@ -7202,7 +7213,7 @@ class Utils {
|
|
|
7202
7213
|
return utils;
|
|
7203
7214
|
}
|
|
7204
7215
|
noConflictFunc(needReleaseObject, needReleaseName, functionNameList = [], release = true) {
|
|
7205
|
-
|
|
7216
|
+
const UtilsContext = this;
|
|
7206
7217
|
if (typeof needReleaseObject !== "object") {
|
|
7207
7218
|
throw new Error("Utils.noConflictFunc 参数 needReleaseObject 必须为 object 类型");
|
|
7208
7219
|
}
|
|
@@ -7212,7 +7223,7 @@ class Utils {
|
|
|
7212
7223
|
if (!Array.isArray(functionNameList)) {
|
|
7213
7224
|
throw new Error("Utils.noConflictFunc 参数 functionNameList 必须为 Array 类型");
|
|
7214
7225
|
}
|
|
7215
|
-
|
|
7226
|
+
const needReleaseKey = `__${needReleaseName}`;
|
|
7216
7227
|
/**
|
|
7217
7228
|
* 释放所有
|
|
7218
7229
|
*/
|
|
@@ -7300,7 +7311,9 @@ class Utils {
|
|
|
7300
7311
|
if (typeof dataUri !== "string") {
|
|
7301
7312
|
throw new Error("Utils.parseBase64ToBlob 参数 dataUri 必须为 string 类型");
|
|
7302
7313
|
}
|
|
7303
|
-
|
|
7314
|
+
const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
|
|
7315
|
+
let dataUriLength = dataUriBase64Str.length;
|
|
7316
|
+
const u8arr = new Uint8Array(dataUriLength);
|
|
7304
7317
|
while (dataUriLength--) {
|
|
7305
7318
|
u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
|
|
7306
7319
|
}
|
|
@@ -7315,7 +7328,9 @@ class Utils {
|
|
|
7315
7328
|
if (typeof fileName !== "string") {
|
|
7316
7329
|
throw new Error("Utils.parseBase64ToFile 参数 fileName 必须为 string 类型");
|
|
7317
7330
|
}
|
|
7318
|
-
|
|
7331
|
+
const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
|
|
7332
|
+
let dataUriLength = dataUriBase64Str.length;
|
|
7333
|
+
const u8arr = new Uint8Array(dataUriLength);
|
|
7319
7334
|
while (dataUriLength--) {
|
|
7320
7335
|
u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
|
|
7321
7336
|
}
|
|
@@ -7349,15 +7364,15 @@ class Utils {
|
|
|
7349
7364
|
}
|
|
7350
7365
|
parseCDATA(text = "") {
|
|
7351
7366
|
let result = "";
|
|
7352
|
-
|
|
7353
|
-
|
|
7367
|
+
const cdataRegexp = /<!\[CDATA\[([\s\S]*)\]\]>/;
|
|
7368
|
+
const cdataMatch = cdataRegexp.exec(text.trim());
|
|
7354
7369
|
if (cdataMatch && cdataMatch.length > 1) {
|
|
7355
7370
|
result = cdataMatch[cdataMatch.length - 1];
|
|
7356
7371
|
}
|
|
7357
7372
|
return result;
|
|
7358
7373
|
}
|
|
7359
7374
|
async parseFileToBase64(fileObj) {
|
|
7360
|
-
|
|
7375
|
+
const reader = new FileReader();
|
|
7361
7376
|
reader.readAsDataURL(fileObj);
|
|
7362
7377
|
return new Promise((resolve) => {
|
|
7363
7378
|
reader.onload = function (event) {
|
|
@@ -7366,14 +7381,14 @@ class Utils {
|
|
|
7366
7381
|
});
|
|
7367
7382
|
}
|
|
7368
7383
|
parseFromString(text, mimeType = "text/html") {
|
|
7369
|
-
|
|
7384
|
+
const parser = new DOMParser();
|
|
7370
7385
|
return parser.parseFromString(text, mimeType);
|
|
7371
7386
|
}
|
|
7372
7387
|
parseStringToRegExpString(text) {
|
|
7373
7388
|
if (typeof text !== "string") {
|
|
7374
7389
|
throw new TypeError("string必须是字符串");
|
|
7375
7390
|
}
|
|
7376
|
-
|
|
7391
|
+
const regString = text.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&");
|
|
7377
7392
|
return regString;
|
|
7378
7393
|
}
|
|
7379
7394
|
preventEvent(element, eventNameList = [], capture) {
|
|
@@ -7388,6 +7403,7 @@ class Utils {
|
|
|
7388
7403
|
}
|
|
7389
7404
|
if (arguments.length === 1) {
|
|
7390
7405
|
/* 直接阻止事件 */
|
|
7406
|
+
// eslint-disable-next-line prefer-rest-params
|
|
7391
7407
|
return stopEvent(arguments[0]);
|
|
7392
7408
|
}
|
|
7393
7409
|
else {
|
|
@@ -7403,11 +7419,11 @@ class Utils {
|
|
|
7403
7419
|
}
|
|
7404
7420
|
}
|
|
7405
7421
|
/**
|
|
7406
|
-
|
|
7407
|
-
|
|
7408
|
-
|
|
7409
|
-
|
|
7410
|
-
|
|
7422
|
+
* 在canvas元素节点上绘制进度圆圈
|
|
7423
|
+
* @example
|
|
7424
|
+
let progress = new Utils.Process({canvasNode:document.querySelector("canvas")});
|
|
7425
|
+
progress.draw();
|
|
7426
|
+
* **/
|
|
7411
7427
|
Progress = Progress;
|
|
7412
7428
|
registerTrustClickEvent(isTrustValue = true, filter) {
|
|
7413
7429
|
function trustEvent(event) {
|
|
@@ -7429,8 +7445,8 @@ class Utils {
|
|
|
7429
7445
|
}
|
|
7430
7446
|
const originalListener = EventTarget.prototype.addEventListener;
|
|
7431
7447
|
EventTarget.prototype.addEventListener = function (...args) {
|
|
7432
|
-
|
|
7433
|
-
|
|
7448
|
+
const type = args[0];
|
|
7449
|
+
const callback = args[1];
|
|
7434
7450
|
// let options = args[2];
|
|
7435
7451
|
if (filter(type)) {
|
|
7436
7452
|
if (typeof callback === "function") {
|
|
@@ -7439,7 +7455,7 @@ class Utils {
|
|
|
7439
7455
|
};
|
|
7440
7456
|
}
|
|
7441
7457
|
else if (typeof callback === "object" && "handleEvent" in callback) {
|
|
7442
|
-
|
|
7458
|
+
const oldHandleEvent = callback["handleEvent"];
|
|
7443
7459
|
args[1]["handleEvent"] = function (event) {
|
|
7444
7460
|
if (event == null) {
|
|
7445
7461
|
return;
|
|
@@ -7450,7 +7466,7 @@ class Utils {
|
|
|
7450
7466
|
event instanceof Proxy;
|
|
7451
7467
|
oldHandleEvent.call(this, trustEvent(event));
|
|
7452
7468
|
}
|
|
7453
|
-
catch
|
|
7469
|
+
catch {
|
|
7454
7470
|
Reflect.set(event, "isTrusted", isTrustValue);
|
|
7455
7471
|
}
|
|
7456
7472
|
};
|
|
@@ -7473,7 +7489,7 @@ class Utils {
|
|
|
7473
7489
|
return isNegative ? -reversedNum : reversedNum;
|
|
7474
7490
|
}
|
|
7475
7491
|
selectElementText(element, childTextNode, startIndex, endIndex) {
|
|
7476
|
-
|
|
7492
|
+
const range = this.windowApi.document.createRange();
|
|
7477
7493
|
range.selectNodeContents(element);
|
|
7478
7494
|
if (childTextNode) {
|
|
7479
7495
|
if (childTextNode.nodeType !== Node.TEXT_NODE) {
|
|
@@ -7484,7 +7500,7 @@ class Utils {
|
|
|
7484
7500
|
range.setEnd(childTextNode, endIndex);
|
|
7485
7501
|
}
|
|
7486
7502
|
}
|
|
7487
|
-
|
|
7503
|
+
const selection = this.windowApi.globalThis.getSelection();
|
|
7488
7504
|
if (selection) {
|
|
7489
7505
|
selection.removeAllRanges();
|
|
7490
7506
|
selection.addRange(range);
|
|
@@ -7512,7 +7528,7 @@ class Utils {
|
|
|
7512
7528
|
else {
|
|
7513
7529
|
textType = "text/plain";
|
|
7514
7530
|
}
|
|
7515
|
-
|
|
7531
|
+
const UtilsContext = this;
|
|
7516
7532
|
class UtilsClipboard {
|
|
7517
7533
|
#resolve;
|
|
7518
7534
|
#copyData;
|
|
@@ -7524,7 +7540,7 @@ class Utils {
|
|
|
7524
7540
|
}
|
|
7525
7541
|
async init() {
|
|
7526
7542
|
let copyStatus = false;
|
|
7527
|
-
|
|
7543
|
+
const requestPermissionStatus = await this.requestClipboardPermission();
|
|
7528
7544
|
console.log(requestPermissionStatus);
|
|
7529
7545
|
if (this.hasClipboard() && (this.hasClipboardWrite() || this.hasClipboardWriteText())) {
|
|
7530
7546
|
try {
|
|
@@ -7563,7 +7579,7 @@ class Utils {
|
|
|
7563
7579
|
*/
|
|
7564
7580
|
copyTextByTextArea() {
|
|
7565
7581
|
try {
|
|
7566
|
-
|
|
7582
|
+
const copyElement = UtilsContext.windowApi.document.createElement("textarea");
|
|
7567
7583
|
copyElement.value = this.#copyData;
|
|
7568
7584
|
copyElement.setAttribute("type", "text");
|
|
7569
7585
|
copyElement.setAttribute("style", "opacity:0;position:absolute;");
|
|
@@ -7583,20 +7599,17 @@ class Utils {
|
|
|
7583
7599
|
* 申请剪贴板权限
|
|
7584
7600
|
*/
|
|
7585
7601
|
requestClipboardPermission() {
|
|
7586
|
-
return new Promise((resolve
|
|
7602
|
+
return new Promise((resolve) => {
|
|
7587
7603
|
if (navigator.permissions && navigator.permissions.query) {
|
|
7588
7604
|
navigator.permissions
|
|
7589
7605
|
.query({
|
|
7590
7606
|
name: "clipboard-write",
|
|
7591
7607
|
})
|
|
7592
|
-
.then((
|
|
7608
|
+
.then(() => {
|
|
7593
7609
|
resolve(true);
|
|
7594
7610
|
})
|
|
7595
7611
|
.catch((error) => {
|
|
7596
|
-
console.error([
|
|
7597
|
-
"申请剪贴板权限失败,尝试直接写入👉",
|
|
7598
|
-
error.message ?? error.name ?? error.stack,
|
|
7599
|
-
]);
|
|
7612
|
+
console.error(["申请剪贴板权限失败,尝试直接写入👉", error.message ?? error.name ?? error.stack]);
|
|
7600
7613
|
resolve(false);
|
|
7601
7614
|
});
|
|
7602
7615
|
}
|
|
@@ -7623,7 +7636,7 @@ class Utils {
|
|
|
7623
7636
|
}
|
|
7624
7637
|
else {
|
|
7625
7638
|
/* 可复制对象 */
|
|
7626
|
-
|
|
7639
|
+
const textBlob = new Blob([this.#copyData], {
|
|
7627
7640
|
type: this.#copyDataType,
|
|
7628
7641
|
});
|
|
7629
7642
|
navigator.clipboard
|
|
@@ -7655,7 +7668,7 @@ class Utils {
|
|
|
7655
7668
|
});
|
|
7656
7669
|
}
|
|
7657
7670
|
setTimeout(callback, delayTime = 0) {
|
|
7658
|
-
|
|
7671
|
+
const UtilsContext = this;
|
|
7659
7672
|
if (typeof callback !== "function" && typeof callback !== "string") {
|
|
7660
7673
|
throw new TypeError("Utils.setTimeout 参数 callback 必须为 function|string 类型");
|
|
7661
7674
|
}
|
|
@@ -7669,7 +7682,7 @@ class Utils {
|
|
|
7669
7682
|
});
|
|
7670
7683
|
}
|
|
7671
7684
|
sleep(delayTime = 0) {
|
|
7672
|
-
|
|
7685
|
+
const UtilsContext = this;
|
|
7673
7686
|
if (typeof delayTime !== "number") {
|
|
7674
7687
|
throw new Error("Utils.sleep 参数 delayTime 必须为 number 类型");
|
|
7675
7688
|
}
|
|
@@ -7680,18 +7693,18 @@ class Utils {
|
|
|
7680
7693
|
});
|
|
7681
7694
|
}
|
|
7682
7695
|
dragSlider(selector, offsetX = this.windowApi.window.innerWidth) {
|
|
7683
|
-
|
|
7696
|
+
const UtilsContext = this;
|
|
7684
7697
|
function initMouseEvent(eventName, offSetX, offSetY) {
|
|
7685
|
-
|
|
7686
|
-
|
|
7698
|
+
const win = typeof unsafeWindow === "undefined" ? globalThis : unsafeWindow;
|
|
7699
|
+
const mouseEvent = UtilsContext.windowApi.document.createEvent("MouseEvents");
|
|
7687
7700
|
mouseEvent.initMouseEvent(eventName, true, true, win, 0, offSetX, offSetY, offSetX, offSetY, false, false, false, false, 0, null);
|
|
7688
7701
|
return mouseEvent;
|
|
7689
7702
|
}
|
|
7690
|
-
|
|
7703
|
+
const sliderElement = typeof selector === "string" ? domUtils.selector(selector) : selector;
|
|
7691
7704
|
if (!(sliderElement instanceof Node) || !(sliderElement instanceof Element)) {
|
|
7692
7705
|
throw new Error("Utils.dragSlider 参数selector 必须为Node/Element类型");
|
|
7693
7706
|
}
|
|
7694
|
-
|
|
7707
|
+
const rect = sliderElement.getBoundingClientRect(), x0 = rect.x || rect.left, y0 = rect.y || rect.top, x1 = x0 + offsetX, y1 = y0;
|
|
7695
7708
|
sliderElement.dispatchEvent(initMouseEvent("mousedown", x0, y0));
|
|
7696
7709
|
sliderElement.dispatchEvent(initMouseEvent("mousemove", x1, y1));
|
|
7697
7710
|
sliderElement.dispatchEvent(initMouseEvent("mouseleave", x1, y1));
|
|
@@ -7719,34 +7732,34 @@ class Utils {
|
|
|
7719
7732
|
console.error(err);
|
|
7720
7733
|
}
|
|
7721
7734
|
}
|
|
7722
|
-
exitFullScreen(
|
|
7723
|
-
if (
|
|
7724
|
-
return
|
|
7735
|
+
exitFullScreen($el = this.windowApi.document.documentElement) {
|
|
7736
|
+
if ($el.exitFullscreen) {
|
|
7737
|
+
return $el.exitFullscreen();
|
|
7725
7738
|
}
|
|
7726
|
-
else if (
|
|
7727
|
-
return
|
|
7739
|
+
else if ($el.msExitFullscreen) {
|
|
7740
|
+
return $el.msExitFullscreen();
|
|
7728
7741
|
}
|
|
7729
|
-
else if (
|
|
7730
|
-
return
|
|
7742
|
+
else if ($el.mozCancelFullScreen) {
|
|
7743
|
+
return $el.mozCancelFullScreen();
|
|
7731
7744
|
}
|
|
7732
|
-
else if (
|
|
7733
|
-
return
|
|
7745
|
+
else if ($el.webkitCancelFullScreen) {
|
|
7746
|
+
return $el.webkitCancelFullScreen();
|
|
7734
7747
|
}
|
|
7735
7748
|
else {
|
|
7736
|
-
return new Promise((
|
|
7749
|
+
return new Promise((_, reject) => {
|
|
7737
7750
|
reject(new TypeError("该浏览器不支持全屏API"));
|
|
7738
7751
|
});
|
|
7739
7752
|
}
|
|
7740
7753
|
}
|
|
7741
7754
|
sortListByProperty(data, getPropertyValueFunc, sortByDesc = true) {
|
|
7742
|
-
|
|
7755
|
+
const UtilsContext = this;
|
|
7743
7756
|
if (typeof getPropertyValueFunc !== "function" && typeof getPropertyValueFunc !== "string") {
|
|
7744
7757
|
throw new Error("Utils.sortListByProperty 参数 getPropertyValueFunc 必须为 function|string 类型");
|
|
7745
7758
|
}
|
|
7746
7759
|
if (typeof sortByDesc !== "boolean") {
|
|
7747
7760
|
throw new Error("Utils.sortListByProperty 参数 sortByDesc 必须为 boolean 类型");
|
|
7748
7761
|
}
|
|
7749
|
-
|
|
7762
|
+
const getObjValue = function (obj) {
|
|
7750
7763
|
return typeof getPropertyValueFunc === "string" ? obj[getPropertyValueFunc] : getPropertyValueFunc(obj);
|
|
7751
7764
|
};
|
|
7752
7765
|
/**
|
|
@@ -7755,9 +7768,9 @@ class Utils {
|
|
|
7755
7768
|
* @param {any} before_obj
|
|
7756
7769
|
* @returns
|
|
7757
7770
|
*/
|
|
7758
|
-
|
|
7759
|
-
|
|
7760
|
-
|
|
7771
|
+
const sortFunc = function (after_obj, before_obj) {
|
|
7772
|
+
const beforeValue = getObjValue(before_obj); /* 前 */
|
|
7773
|
+
const afterValue = getObjValue(after_obj); /* 后 */
|
|
7761
7774
|
if (sortByDesc) {
|
|
7762
7775
|
if (afterValue > beforeValue) {
|
|
7763
7776
|
return -1;
|
|
@@ -7786,19 +7799,18 @@ class Utils {
|
|
|
7786
7799
|
* @param nodeList 元素列表
|
|
7787
7800
|
* @param getNodeListFunc 获取元素列表的函数
|
|
7788
7801
|
*/
|
|
7789
|
-
|
|
7790
|
-
|
|
7802
|
+
const sortNodeFunc = function (nodeList, getNodeListFunc) {
|
|
7803
|
+
const nodeListLength = nodeList.length;
|
|
7791
7804
|
for (let i = 0; i < nodeListLength - 1; i++) {
|
|
7792
7805
|
for (let j = 0; j < nodeListLength - 1 - i; j++) {
|
|
7793
|
-
|
|
7794
|
-
|
|
7795
|
-
|
|
7796
|
-
|
|
7797
|
-
if ((sortByDesc == true && beforeValue < afterValue) ||
|
|
7798
|
-
(sortByDesc == false && beforeValue > afterValue)) {
|
|
7806
|
+
const beforeNode = nodeList[j];
|
|
7807
|
+
const afterNode = nodeList[j + 1];
|
|
7808
|
+
const beforeValue = getObjValue(beforeNode); /* 前 */
|
|
7809
|
+
const afterValue = getObjValue(afterNode); /* 后 */
|
|
7810
|
+
if ((sortByDesc == true && beforeValue < afterValue) || (sortByDesc == false && beforeValue > afterValue)) {
|
|
7799
7811
|
/* 升序/降序 */
|
|
7800
7812
|
/* 相邻元素两两对比 */
|
|
7801
|
-
|
|
7813
|
+
const temp = beforeNode.nextElementSibling;
|
|
7802
7814
|
afterNode.after(beforeNode);
|
|
7803
7815
|
if (temp == null) {
|
|
7804
7816
|
/* 如果为空,那么是最后一个元素,使用append */
|
|
@@ -7856,7 +7868,7 @@ class Utils {
|
|
|
7856
7868
|
return newTargetString;
|
|
7857
7869
|
}
|
|
7858
7870
|
startsWith(target, searchString, position = 0) {
|
|
7859
|
-
|
|
7871
|
+
const UtilsContext = this;
|
|
7860
7872
|
if (position > target.length) {
|
|
7861
7873
|
/* 超出目标字符串的长度 */
|
|
7862
7874
|
return false;
|
|
@@ -7900,7 +7912,7 @@ class Utils {
|
|
|
7900
7912
|
*/
|
|
7901
7913
|
toJSON = commonUtil.toJSON.bind(commonUtil);
|
|
7902
7914
|
toSearchParamsStr(obj, addPrefix) {
|
|
7903
|
-
|
|
7915
|
+
const UtilsContext = this;
|
|
7904
7916
|
let searhParamsStr = "";
|
|
7905
7917
|
if (Array.isArray(obj)) {
|
|
7906
7918
|
obj.forEach((item) => {
|
|
@@ -7908,7 +7920,7 @@ class Utils {
|
|
|
7908
7920
|
searhParamsStr += UtilsContext.toSearchParamsStr(item);
|
|
7909
7921
|
}
|
|
7910
7922
|
else {
|
|
7911
|
-
searhParamsStr +=
|
|
7923
|
+
searhParamsStr += `&${UtilsContext.toSearchParamsStr(item)}`;
|
|
7912
7924
|
}
|
|
7913
7925
|
});
|
|
7914
7926
|
}
|
|
@@ -7916,7 +7928,7 @@ class Utils {
|
|
|
7916
7928
|
searhParamsStr = new URLSearchParams(Object.entries(obj)).toString();
|
|
7917
7929
|
}
|
|
7918
7930
|
if (addPrefix && !searhParamsStr.startsWith("?")) {
|
|
7919
|
-
searhParamsStr =
|
|
7931
|
+
searhParamsStr = `?${searhParamsStr}`;
|
|
7920
7932
|
}
|
|
7921
7933
|
return searhParamsStr;
|
|
7922
7934
|
}
|
|
@@ -7964,7 +7976,7 @@ class Utils {
|
|
|
7964
7976
|
}
|
|
7965
7977
|
}
|
|
7966
7978
|
waitArrayLoopToEnd(data, handleFunc) {
|
|
7967
|
-
|
|
7979
|
+
const UtilsContext = this;
|
|
7968
7980
|
if (typeof handleFunc !== "function" && typeof handleFunc !== "string") {
|
|
7969
7981
|
throw new Error("Utils.waitArrayLoopToEnd 参数 handleDataFunction 必须为 function|string 类型");
|
|
7970
7982
|
}
|
|
@@ -7974,17 +7986,17 @@ class Utils {
|
|
|
7974
7986
|
}
|
|
7975
7987
|
wait(checkFn, timeout, parent) {
|
|
7976
7988
|
const UtilsContext = this;
|
|
7977
|
-
|
|
7989
|
+
const __timeout__ = typeof timeout === "number" ? timeout : 0;
|
|
7978
7990
|
return new Promise((resolve) => {
|
|
7979
|
-
|
|
7991
|
+
const observer = UtilsContext.mutationObserver(parent || UtilsContext.windowApi.document, {
|
|
7980
7992
|
config: {
|
|
7981
7993
|
subtree: true,
|
|
7982
7994
|
childList: true,
|
|
7983
7995
|
attributes: true,
|
|
7984
7996
|
},
|
|
7985
7997
|
immediate: true,
|
|
7986
|
-
callback(
|
|
7987
|
-
|
|
7998
|
+
callback(_, __observer__) {
|
|
7999
|
+
const result = checkFn();
|
|
7988
8000
|
if (result.success) {
|
|
7989
8001
|
// 取消观察器
|
|
7990
8002
|
if (typeof __observer__?.disconnect === "function") {
|
|
@@ -8008,9 +8020,9 @@ class Utils {
|
|
|
8008
8020
|
waitNode(...args) {
|
|
8009
8021
|
// 过滤掉undefined
|
|
8010
8022
|
args = args.filter((arg) => arg !== void 0);
|
|
8011
|
-
|
|
8023
|
+
const UtilsContext = this;
|
|
8012
8024
|
// 选择器
|
|
8013
|
-
|
|
8025
|
+
const selector = args[0];
|
|
8014
8026
|
// 父元素(监听的元素)
|
|
8015
8027
|
let parent = UtilsContext.windowApi.document;
|
|
8016
8028
|
// 超时时间
|
|
@@ -8020,7 +8032,7 @@ class Utils {
|
|
|
8020
8032
|
}
|
|
8021
8033
|
if (args.length === 1) ;
|
|
8022
8034
|
else if (args.length === 2) {
|
|
8023
|
-
|
|
8035
|
+
const secondParam = args[1];
|
|
8024
8036
|
if (typeof secondParam === "number") {
|
|
8025
8037
|
// "div",10000
|
|
8026
8038
|
timeout = secondParam;
|
|
@@ -8036,9 +8048,9 @@ class Utils {
|
|
|
8036
8048
|
else if (args.length === 3) {
|
|
8037
8049
|
// "div",document,10000
|
|
8038
8050
|
// 第二个参数,parent
|
|
8039
|
-
|
|
8051
|
+
const secondParam = args[1];
|
|
8040
8052
|
// 第三个参数,timeout
|
|
8041
|
-
|
|
8053
|
+
const thirdParam = args[2];
|
|
8042
8054
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8043
8055
|
parent = secondParam;
|
|
8044
8056
|
if (typeof thirdParam === "number") {
|
|
@@ -8057,9 +8069,9 @@ class Utils {
|
|
|
8057
8069
|
}
|
|
8058
8070
|
function getNode() {
|
|
8059
8071
|
if (Array.isArray(selector)) {
|
|
8060
|
-
|
|
8072
|
+
const result = [];
|
|
8061
8073
|
for (let index = 0; index < selector.length; index++) {
|
|
8062
|
-
|
|
8074
|
+
const node = domUtils.selector(selector[index]);
|
|
8063
8075
|
if (node) {
|
|
8064
8076
|
result.push(node);
|
|
8065
8077
|
}
|
|
@@ -8076,7 +8088,7 @@ class Utils {
|
|
|
8076
8088
|
}
|
|
8077
8089
|
}
|
|
8078
8090
|
return UtilsContext.wait(() => {
|
|
8079
|
-
|
|
8091
|
+
const node = getNode();
|
|
8080
8092
|
if (node) {
|
|
8081
8093
|
return {
|
|
8082
8094
|
success: true,
|
|
@@ -8094,9 +8106,9 @@ class Utils {
|
|
|
8094
8106
|
waitAnyNode(...args) {
|
|
8095
8107
|
// 过滤掉undefined
|
|
8096
8108
|
args = args.filter((arg) => arg !== void 0);
|
|
8097
|
-
|
|
8109
|
+
const UtilsContext = this;
|
|
8098
8110
|
// 选择器
|
|
8099
|
-
|
|
8111
|
+
const selectorList = args[0];
|
|
8100
8112
|
// 父元素(监听的元素)
|
|
8101
8113
|
let parent = UtilsContext.windowApi.document;
|
|
8102
8114
|
// 超时时间
|
|
@@ -8106,7 +8118,7 @@ class Utils {
|
|
|
8106
8118
|
}
|
|
8107
8119
|
if (args.length === 1) ;
|
|
8108
8120
|
else if (args.length === 2) {
|
|
8109
|
-
|
|
8121
|
+
const secondParam = args[1];
|
|
8110
8122
|
if (typeof secondParam === "number") {
|
|
8111
8123
|
// "div",10000
|
|
8112
8124
|
timeout = secondParam;
|
|
@@ -8122,9 +8134,9 @@ class Utils {
|
|
|
8122
8134
|
else if (args.length === 3) {
|
|
8123
8135
|
// "div",document,10000
|
|
8124
8136
|
// 第二个参数,parent
|
|
8125
|
-
|
|
8137
|
+
const secondParam = args[1];
|
|
8126
8138
|
// 第三个参数,timeout
|
|
8127
|
-
|
|
8139
|
+
const thirdParam = args[2];
|
|
8128
8140
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8129
8141
|
parent = secondParam;
|
|
8130
8142
|
if (typeof thirdParam === "number") {
|
|
@@ -8141,7 +8153,7 @@ class Utils {
|
|
|
8141
8153
|
else {
|
|
8142
8154
|
throw new TypeError("Utils.waitAnyNode 参数个数错误");
|
|
8143
8155
|
}
|
|
8144
|
-
|
|
8156
|
+
const promiseList = selectorList.map((selector) => {
|
|
8145
8157
|
return UtilsContext.waitNode(selector, parent, timeout);
|
|
8146
8158
|
});
|
|
8147
8159
|
return Promise.any(promiseList);
|
|
@@ -8149,9 +8161,9 @@ class Utils {
|
|
|
8149
8161
|
waitNodeList(...args) {
|
|
8150
8162
|
// 过滤掉undefined
|
|
8151
8163
|
args = args.filter((arg) => arg !== void 0);
|
|
8152
|
-
|
|
8164
|
+
const UtilsContext = this;
|
|
8153
8165
|
// 选择器数组
|
|
8154
|
-
|
|
8166
|
+
const selector = args[0];
|
|
8155
8167
|
// 父元素(监听的元素)
|
|
8156
8168
|
let parent = UtilsContext.windowApi.document;
|
|
8157
8169
|
// 超时时间
|
|
@@ -8161,7 +8173,7 @@ class Utils {
|
|
|
8161
8173
|
}
|
|
8162
8174
|
if (args.length === 1) ;
|
|
8163
8175
|
else if (args.length === 2) {
|
|
8164
|
-
|
|
8176
|
+
const secondParam = args[1];
|
|
8165
8177
|
if (typeof secondParam === "number") {
|
|
8166
8178
|
// "div",10000
|
|
8167
8179
|
timeout = secondParam;
|
|
@@ -8177,9 +8189,9 @@ class Utils {
|
|
|
8177
8189
|
else if (args.length === 3) {
|
|
8178
8190
|
// "div",document,10000
|
|
8179
8191
|
// 第二个参数,parent
|
|
8180
|
-
|
|
8192
|
+
const secondParam = args[1];
|
|
8181
8193
|
// 第三个参数,timeout
|
|
8182
|
-
|
|
8194
|
+
const thirdParam = args[2];
|
|
8183
8195
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8184
8196
|
parent = secondParam;
|
|
8185
8197
|
if (typeof thirdParam === "number") {
|
|
@@ -8198,9 +8210,9 @@ class Utils {
|
|
|
8198
8210
|
}
|
|
8199
8211
|
function getNodeList() {
|
|
8200
8212
|
if (Array.isArray(selector)) {
|
|
8201
|
-
|
|
8213
|
+
const result = [];
|
|
8202
8214
|
for (let index = 0; index < selector.length; index++) {
|
|
8203
|
-
|
|
8215
|
+
const nodeList = domUtils.selectorAll(selector[index], parent);
|
|
8204
8216
|
if (nodeList.length) {
|
|
8205
8217
|
result.push(nodeList);
|
|
8206
8218
|
}
|
|
@@ -8210,14 +8222,14 @@ class Utils {
|
|
|
8210
8222
|
}
|
|
8211
8223
|
}
|
|
8212
8224
|
else {
|
|
8213
|
-
|
|
8225
|
+
const nodeList = domUtils.selectorAll(selector, parent);
|
|
8214
8226
|
if (nodeList.length) {
|
|
8215
8227
|
return nodeList;
|
|
8216
8228
|
}
|
|
8217
8229
|
}
|
|
8218
8230
|
}
|
|
8219
8231
|
return UtilsContext.wait(() => {
|
|
8220
|
-
|
|
8232
|
+
const node = getNodeList();
|
|
8221
8233
|
if (node) {
|
|
8222
8234
|
return {
|
|
8223
8235
|
success: true,
|
|
@@ -8235,9 +8247,9 @@ class Utils {
|
|
|
8235
8247
|
waitAnyNodeList(...args) {
|
|
8236
8248
|
// 过滤掉undefined
|
|
8237
8249
|
args = args.filter((arg) => arg !== void 0);
|
|
8238
|
-
|
|
8250
|
+
const UtilsContext = this;
|
|
8239
8251
|
// 选择器数组
|
|
8240
|
-
|
|
8252
|
+
const selectorList = args[0];
|
|
8241
8253
|
// 父元素(监听的元素)
|
|
8242
8254
|
let parent = UtilsContext.windowApi.document;
|
|
8243
8255
|
// 超时时间
|
|
@@ -8247,7 +8259,7 @@ class Utils {
|
|
|
8247
8259
|
}
|
|
8248
8260
|
if (args.length === 1) ;
|
|
8249
8261
|
else if (args.length === 2) {
|
|
8250
|
-
|
|
8262
|
+
const secondParam = args[1];
|
|
8251
8263
|
if (typeof secondParam === "number") {
|
|
8252
8264
|
// "div",10000
|
|
8253
8265
|
timeout = secondParam;
|
|
@@ -8263,9 +8275,9 @@ class Utils {
|
|
|
8263
8275
|
else if (args.length === 3) {
|
|
8264
8276
|
// "div",document,10000
|
|
8265
8277
|
// 第二个参数,parent
|
|
8266
|
-
|
|
8278
|
+
const secondParam = args[1];
|
|
8267
8279
|
// 第三个参数,timeout
|
|
8268
|
-
|
|
8280
|
+
const thirdParam = args[2];
|
|
8269
8281
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8270
8282
|
parent = secondParam;
|
|
8271
8283
|
if (typeof thirdParam === "number") {
|
|
@@ -8282,7 +8294,7 @@ class Utils {
|
|
|
8282
8294
|
else {
|
|
8283
8295
|
throw new TypeError("Utils.waitAnyNodeList 参数个数错误");
|
|
8284
8296
|
}
|
|
8285
|
-
|
|
8297
|
+
const promiseList = selectorList.map((selector) => {
|
|
8286
8298
|
return UtilsContext.waitNodeList(selector, parent, timeout);
|
|
8287
8299
|
});
|
|
8288
8300
|
return Promise.any(promiseList);
|
|
@@ -8311,13 +8323,13 @@ class Utils {
|
|
|
8311
8323
|
});
|
|
8312
8324
|
}
|
|
8313
8325
|
waitPropertyByInterval(checkObj, checkPropertyName, intervalTimer = 250, maxTime = -1) {
|
|
8314
|
-
|
|
8326
|
+
const UtilsContext = this;
|
|
8315
8327
|
if (checkObj == null) {
|
|
8316
8328
|
throw new TypeError("checkObj 不能为空对象 ");
|
|
8317
8329
|
}
|
|
8318
8330
|
let isResolve = false;
|
|
8319
8331
|
return new Promise((resolve, reject) => {
|
|
8320
|
-
|
|
8332
|
+
const interval = UtilsContext.workerSetInterval(() => {
|
|
8321
8333
|
let obj = checkObj;
|
|
8322
8334
|
if (typeof checkObj === "function") {
|
|
8323
8335
|
obj = checkObj();
|
|
@@ -8350,7 +8362,7 @@ class Utils {
|
|
|
8350
8362
|
throw new Error("Utils.waitVueByInterval 参数element 不能为空");
|
|
8351
8363
|
}
|
|
8352
8364
|
let flag = false;
|
|
8353
|
-
|
|
8365
|
+
const UtilsContext = this;
|
|
8354
8366
|
try {
|
|
8355
8367
|
await UtilsContext.waitPropertyByInterval(element, function (targetElement) {
|
|
8356
8368
|
if (targetElement == null) {
|
|
@@ -8362,7 +8374,7 @@ class Utils {
|
|
|
8362
8374
|
if (propertyName == null) {
|
|
8363
8375
|
return true;
|
|
8364
8376
|
}
|
|
8365
|
-
|
|
8377
|
+
const vueObject = targetElement[vueName];
|
|
8366
8378
|
if (typeof propertyName === "string") {
|
|
8367
8379
|
if (propertyName in vueObject) {
|
|
8368
8380
|
flag = true;
|
|
@@ -8378,6 +8390,7 @@ class Utils {
|
|
|
8378
8390
|
}
|
|
8379
8391
|
return false;
|
|
8380
8392
|
}, timer, maxTime);
|
|
8393
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8381
8394
|
}
|
|
8382
8395
|
catch (error) {
|
|
8383
8396
|
return flag;
|
|
@@ -8436,7 +8449,7 @@ class Utils {
|
|
|
8436
8449
|
if (target == null) {
|
|
8437
8450
|
return;
|
|
8438
8451
|
}
|
|
8439
|
-
|
|
8452
|
+
const handleResult = handler(target);
|
|
8440
8453
|
if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
|
|
8441
8454
|
return handleResult.data;
|
|
8442
8455
|
}
|
|
@@ -8449,10 +8462,10 @@ class Utils {
|
|
|
8449
8462
|
*/
|
|
8450
8463
|
async asyncQueryProperty(target, handler) {
|
|
8451
8464
|
if (target == null) {
|
|
8452
|
-
// @ts-
|
|
8465
|
+
// @ts-expect-error 空返回
|
|
8453
8466
|
return;
|
|
8454
8467
|
}
|
|
8455
|
-
|
|
8468
|
+
const handleResult = await handler(target);
|
|
8456
8469
|
if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
|
|
8457
8470
|
return handleResult.data;
|
|
8458
8471
|
}
|
|
@@ -8560,6 +8573,7 @@ class Utils {
|
|
|
8560
8573
|
workerSetTimeout(callback, timeout = 0) {
|
|
8561
8574
|
try {
|
|
8562
8575
|
return setTimeout$1(callback, timeout);
|
|
8576
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8563
8577
|
}
|
|
8564
8578
|
catch (error) {
|
|
8565
8579
|
return this.windowApi.setTimeout(callback, timeout);
|
|
@@ -8574,8 +8588,10 @@ class Utils {
|
|
|
8574
8588
|
if (timeId != null) {
|
|
8575
8589
|
clearTimeout$1(timeId);
|
|
8576
8590
|
}
|
|
8591
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8577
8592
|
}
|
|
8578
8593
|
catch (error) {
|
|
8594
|
+
// console.log(error);
|
|
8579
8595
|
}
|
|
8580
8596
|
finally {
|
|
8581
8597
|
this.windowApi.clearTimeout(timeId);
|
|
@@ -8589,6 +8605,7 @@ class Utils {
|
|
|
8589
8605
|
workerSetInterval(callback, timeout = 0) {
|
|
8590
8606
|
try {
|
|
8591
8607
|
return setInterval(callback, timeout);
|
|
8608
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8592
8609
|
}
|
|
8593
8610
|
catch (error) {
|
|
8594
8611
|
return this.windowApi.setInterval(callback, timeout);
|
|
@@ -8603,8 +8620,10 @@ class Utils {
|
|
|
8603
8620
|
if (timeId != null) {
|
|
8604
8621
|
clearInterval(timeId);
|
|
8605
8622
|
}
|
|
8623
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8606
8624
|
}
|
|
8607
8625
|
catch (error) {
|
|
8626
|
+
// console.log(error);
|
|
8608
8627
|
}
|
|
8609
8628
|
finally {
|
|
8610
8629
|
this.windowApi.clearInterval(timeId);
|
|
@@ -8638,10 +8657,10 @@ class Utils {
|
|
|
8638
8657
|
.query({
|
|
8639
8658
|
name: "clipboard-read",
|
|
8640
8659
|
})
|
|
8641
|
-
.then((
|
|
8660
|
+
.then(() => {
|
|
8642
8661
|
readClipboardText();
|
|
8643
8662
|
})
|
|
8644
|
-
.catch((
|
|
8663
|
+
.catch(() => {
|
|
8645
8664
|
/* 该权限申请Api可能在该环境下不生效,尝试直接读取剪贴板 */
|
|
8646
8665
|
readClipboardText();
|
|
8647
8666
|
});
|
|
@@ -8678,7 +8697,7 @@ class Utils {
|
|
|
8678
8697
|
});
|
|
8679
8698
|
}
|
|
8680
8699
|
}
|
|
8681
|
-
|
|
8700
|
+
const utils = new Utils();
|
|
8682
8701
|
|
|
8683
8702
|
export { utils as default };
|
|
8684
8703
|
//# sourceMappingURL=index.esm.js.map
|