@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.
Files changed (70) hide show
  1. package/README.md +176 -176
  2. package/dist/index.amd.js +896 -877
  3. package/dist/index.amd.js.map +1 -1
  4. package/dist/index.cjs.js +896 -877
  5. package/dist/index.cjs.js.map +1 -1
  6. package/dist/index.esm.js +896 -877
  7. package/dist/index.esm.js.map +1 -1
  8. package/dist/index.iife.js +896 -877
  9. package/dist/index.iife.js.map +1 -1
  10. package/dist/index.system.js +896 -877
  11. package/dist/index.system.js.map +1 -1
  12. package/dist/index.umd.js +896 -877
  13. package/dist/index.umd.js.map +1 -1
  14. package/dist/types/src/CommonUtil.d.ts +59 -59
  15. package/dist/types/src/DOMUtils.d.ts +1 -1
  16. package/dist/types/src/Dictionary.d.ts +1 -1
  17. package/dist/types/src/Httpx.d.ts +2 -2
  18. package/dist/types/src/Progress.d.ts +0 -4
  19. package/dist/types/src/TryCatch.d.ts +2 -2
  20. package/dist/types/src/Utils.d.ts +365 -365
  21. package/dist/types/src/UtilsGMCookie.d.ts +2 -2
  22. package/dist/types/src/UtilsGMMenu.d.ts +1 -1
  23. package/dist/types/src/indexedDB.d.ts +3 -3
  24. package/dist/types/src/types/Event.d.ts +188 -188
  25. package/dist/types/src/types/Httpx.d.ts +1344 -1343
  26. package/dist/types/src/types/Log.d.ts +19 -19
  27. package/dist/types/src/types/Progress.d.ts +20 -20
  28. package/dist/types/src/types/React.d.ts +119 -119
  29. package/dist/types/src/types/TryCatch.d.ts +9 -9
  30. package/dist/types/src/types/UtilsGMCookie.d.ts +93 -93
  31. package/dist/types/src/types/UtilsGMMenu.d.ts +77 -77
  32. package/dist/types/src/types/Vue2.d.ts +166 -166
  33. package/dist/types/src/types/WindowApi.d.ts +14 -14
  34. package/dist/types/src/types/ajaxHooker.d.ts +151 -151
  35. package/dist/types/src/types/env.d.ts +7 -2
  36. package/dist/types/src/types/global.d.ts +31 -31
  37. package/package.json +16 -7
  38. package/src/ColorConversion.ts +105 -106
  39. package/src/CommonUtil.ts +280 -279
  40. package/src/DOMUtils.ts +251 -272
  41. package/src/Dictionary.ts +153 -154
  42. package/src/GBKEncoder.ts +108 -112
  43. package/src/Hooks.ts +73 -81
  44. package/src/Httpx.ts +1457 -1466
  45. package/src/LockFunction.ts +62 -62
  46. package/src/Log.ts +258 -259
  47. package/src/ModuleRaid.js +1 -0
  48. package/src/Progress.ts +108 -114
  49. package/src/TryCatch.ts +86 -86
  50. package/src/Utils.ts +4772 -4825
  51. package/src/UtilsCommon.ts +14 -14
  52. package/src/UtilsGMCookie.ts +254 -261
  53. package/src/UtilsGMMenu.ts +445 -454
  54. package/src/Vue.ts +233 -229
  55. package/src/WindowApi.ts +59 -59
  56. package/src/ajaxHooker/ajaxHooker.js +1 -0
  57. package/src/indexedDB.ts +497 -502
  58. package/src/types/Event.d.ts +188 -188
  59. package/src/types/Httpx.d.ts +1344 -1343
  60. package/src/types/Log.d.ts +19 -19
  61. package/src/types/Progress.d.ts +20 -20
  62. package/src/types/React.d.ts +119 -119
  63. package/src/types/TryCatch.d.ts +9 -9
  64. package/src/types/UtilsGMCookie.d.ts +93 -93
  65. package/src/types/UtilsGMMenu.d.ts +77 -77
  66. package/src/types/Vue2.d.ts +166 -166
  67. package/src/types/WindowApi.d.ts +14 -14
  68. package/src/types/ajaxHooker.d.ts +151 -151
  69. package/src/types/env.d.ts +7 -2
  70. package/src/types/global.d.ts +31 -31
package/dist/index.umd.js CHANGED
@@ -13,7 +13,7 @@
13
13
  if (typeof str !== "string") {
14
14
  return false;
15
15
  }
16
- if (!str.match(/^(\#|)[0-9a-fA-F]{6}$/)) {
16
+ if (!str.match(/^(#|)[0-9a-fA-F]{6}$/)) {
17
17
  return false;
18
18
  }
19
19
  return true;
@@ -27,18 +27,10 @@
27
27
  */
28
28
  hexToRgba(hex, opacity) {
29
29
  if (!this.isHex(hex)) {
30
- throw new TypeError("输入错误的hex:" + hex);
30
+ throw new TypeError(`输入错误的hex:${hex}`);
31
31
  }
32
32
  return hex && hex.replace(/\s+/g, "").length === 7
33
- ? "rgba(" +
34
- parseInt("0x" + hex.slice(1, 3)) +
35
- "," +
36
- parseInt("0x" + hex.slice(3, 5)) +
37
- "," +
38
- parseInt("0x" + hex.slice(5, 7)) +
39
- "," +
40
- opacity +
41
- ")"
33
+ ? `rgba(${parseInt(`0x${hex.slice(1, 3)}`)},${parseInt(`0x${hex.slice(3, 5)}`)},${parseInt(`0x${hex.slice(5, 7)}`)},${opacity})`
42
34
  : "";
43
35
  }
44
36
  /**
@@ -47,14 +39,15 @@
47
39
  */
48
40
  hexToRgb(str) {
49
41
  if (!this.isHex(str)) {
50
- throw new TypeError("输入错误的hex:" + str);
42
+ throw new TypeError(`输入错误的hex:${str}`);
51
43
  }
52
44
  /* replace替换查找的到的字符串 */
53
45
  str = str.replace("#", "");
54
46
  /* match得到查询数组 */
55
- let hxs = str.match(/../g);
47
+ const hxs = str.match(/../g);
56
48
  for (let index = 0; index < 3; index++) {
57
- hxs[index] = parseInt(hxs[index], 16);
49
+ const value = parseInt(hxs[index], 16);
50
+ Reflect.set(hxs, index, value);
58
51
  }
59
52
  return hxs;
60
53
  }
@@ -66,16 +59,16 @@
66
59
  */
67
60
  rgbToHex(redValue, greenValue, blueValue) {
68
61
  /* 验证输入的rgb值是否合法 */
69
- let validPattern = /^\d{1,3}$/;
62
+ const validPattern = /^\d{1,3}$/;
70
63
  if (!validPattern.test(redValue.toString()) ||
71
64
  !validPattern.test(greenValue.toString()) ||
72
65
  !validPattern.test(blueValue.toString()))
73
66
  throw new TypeError("输入错误的rgb颜色值");
74
- let hexs = [redValue.toString(16), greenValue.toString(16), blueValue.toString(16)];
67
+ const hexs = [redValue.toString(16), greenValue.toString(16), blueValue.toString(16)];
75
68
  for (let index = 0; index < 3; index++)
76
69
  if (hexs[index].length == 1)
77
- hexs[index] = "0" + hexs[index];
78
- return "#" + hexs.join("");
70
+ hexs[index] = `0${hexs[index]}`;
71
+ return `#${hexs.join("")}`;
79
72
  }
80
73
  /**
81
74
  * 获取颜色变暗或亮
@@ -84,11 +77,13 @@
84
77
  */
85
78
  getDarkColor(color, level) {
86
79
  if (!this.isHex(color)) {
87
- throw new TypeError("输入错误的hex:" + color);
80
+ throw new TypeError(`输入错误的hex:${color}`);
88
81
  }
89
- let rgbc = this.hexToRgb(color);
82
+ const rgbc = this.hexToRgb(color);
90
83
  for (let index = 0; index < 3; index++) {
91
- rgbc[index] = Math.floor(rgbc[index] * (1 - level));
84
+ const rgbcItemValue = rgbc[index];
85
+ const value = Math.floor(Number(rgbcItemValue) * (1 - Number(level)));
86
+ Reflect.set(rgbc, index, value);
92
87
  }
93
88
  return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
94
89
  }
@@ -99,40 +94,43 @@
99
94
  */
100
95
  getLightColor(color, level) {
101
96
  if (!this.isHex(color)) {
102
- throw new TypeError("输入错误的hex:" + color);
97
+ throw new TypeError(`输入错误的hex:${color}`);
103
98
  }
104
- let rgbc = this.hexToRgb(color);
99
+ const rgbc = this.hexToRgb(color);
105
100
  for (let index = 0; index < 3; index++) {
106
- rgbc[index] = Math.floor((255 - rgbc[index]) * level + rgbc[index]);
101
+ const rgbcItemValue = Number(rgbc[index]);
102
+ const value = Math.floor(255 - rgbcItemValue * level + rgbcItemValue);
103
+ Reflect.set(rgbc, index, value);
107
104
  }
108
105
  return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
109
106
  }
110
107
  }
111
108
 
112
109
  class GBKEncoder {
113
- #data = [];
110
+ #data;
114
111
  #U2Ghash = {};
115
112
  #G2Uhash = {};
116
113
  constructor() {
117
- 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");
114
+ 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");
118
115
  let index = 0;
119
116
  this.#data = dataText.match(/..../g);
120
117
  for (let i = 0x81; i <= 0xfe; i++) {
121
118
  for (let j = 0x40; j <= 0xfe; j++) {
122
- this.#U2Ghash[this.#data[index++]] = ("%" + i.toString(16) + "%" + j.toString(16)).toUpperCase();
119
+ this.#U2Ghash[this.#data[index++]] = `%${i.toString(16)}%${j.toString(16)}`.toUpperCase();
123
120
  }
124
121
  }
125
- for (let key in this.#U2Ghash) {
126
- this.#G2Uhash[this.#U2Ghash[key]] = key;
122
+ for (const key in this.#U2Ghash) {
123
+ const u2ghashValue = Reflect.get(this.#U2Ghash, key);
124
+ Reflect.set(this.#G2Uhash, u2ghashValue, key);
127
125
  }
128
126
  }
129
127
  handleText(text) {
130
128
  text = text
131
- .replace(/#(\d+)\$/g, function (a, b) {
129
+ .replace(/#(\d+)\$/g, function (_, b) {
132
130
  return Array(+b + 3).join("#");
133
131
  })
134
132
  .replace(/#/g, "####")
135
- .replace(/(\w\w):([\w#]+)(?:,|$)/g, function (a, hd, dt) {
133
+ .replace(/(\w\w):([\w#]+)(?:,|$)/g, function (_, hd, dt) {
136
134
  return dt.replace(/../g, function (a) {
137
135
  if (a != "##") {
138
136
  return hd + a;
@@ -152,8 +150,8 @@
152
150
  * @param str
153
151
  */
154
152
  encode(str) {
155
- let that = this;
156
- return [...str].reduce((result, val, i) => {
153
+ const that = this;
154
+ return [...str].reduce((result, val) => {
157
155
  return result + toGBK(val);
158
156
  }, "");
159
157
  function toGBK(val) {
@@ -162,7 +160,7 @@
162
160
  const codePoint = val.codePointAt(i);
163
161
  const code = String.fromCodePoint(codePoint);
164
162
  let key = codePoint.toString(16);
165
- key.length != 4 && (key = ("000" + key).match(/....$/)?.[0]);
163
+ key.length != 4 && (key = `000${key}`.match(/....$/)?.[0]);
166
164
  /* Add up i by code.length */
167
165
  i += code.length - 1;
168
166
  /* If code is in ascii range */
@@ -176,9 +174,9 @@
176
174
  continue;
177
175
  }
178
176
  /*
179
- If 2 or more char combines to one visible code,
180
- or just this code is not in GBK
181
- */
177
+ If 2 or more char combines to one visible code,
178
+ or just this code is not in GBK
179
+ */
182
180
  result += toGBK(`&#${codePoint};`);
183
181
  }
184
182
  return result;
@@ -189,18 +187,18 @@
189
187
  * @param str
190
188
  */
191
189
  decode(str) {
192
- let GBKMatcher = /%[0-9A-F]{2}%[0-9A-F]{2}/;
193
- let UTFMatcher = /%[0-9A-F]{2}/;
190
+ const GBKMatcher = /%[0-9A-F]{2}%[0-9A-F]{2}/;
191
+ const UTFMatcher = /%[0-9A-F]{2}/;
194
192
  // let gbk = true;
195
193
  let utf = true;
196
194
  const that = this;
197
195
  while (utf) {
198
- let gbkMatch = str.match(GBKMatcher);
199
- let utfMatch = str.match(UTFMatcher);
196
+ const gbkMatch = str.match(GBKMatcher);
197
+ const utfMatch = str.match(UTFMatcher);
200
198
  // gbk = Boolean(gbkMatch);
201
199
  utf = Boolean(utfMatch);
202
200
  if (gbkMatch && gbkMatch in that.#G2Uhash) {
203
- str = str.replace(gbkMatch, String.fromCharCode(("0x" + that.#G2Uhash[gbkMatch])));
201
+ str = str.replace(gbkMatch, String.fromCharCode(`0x${that.#G2Uhash[gbkMatch]}`));
204
202
  }
205
203
  else {
206
204
  str = str.replace(utfMatch, decodeURIComponent(utfMatch));
@@ -214,7 +212,7 @@
214
212
  /* 定义变量和函数 */
215
213
  let callbackFunction = null;
216
214
  let context = null;
217
- let handleError = (error) => { };
215
+ let handleError = () => { };
218
216
  let defaultDetails = {
219
217
  log: true,
220
218
  };
@@ -246,7 +244,7 @@
246
244
  run(callback, __context__) {
247
245
  callbackFunction = callback;
248
246
  context = __context__ || this;
249
- let result = executeTryCatch(callbackFunction, handleError, context);
247
+ const result = executeTryCatch(callbackFunction, handleError, context);
250
248
  return result !== void 0 ? result : TryCatchCore;
251
249
  },
252
250
  };
@@ -270,8 +268,8 @@
270
268
  catch (error) {
271
269
  if (defaultDetails.log) {
272
270
  callback = callback;
273
- console.log(`%c ${callback?.name ? callback?.name : callback + "出现错误"} `, "color: #f20000");
274
- console.log(`%c 错误原因:${error}`, "color: #f20000");
271
+ console.log(`%c ${callback?.name ? callback?.name : `${callback}`} `, "color: #f20000");
272
+ console.log(`%c ${error}`, "color: #f20000");
275
273
  console.trace(callback);
276
274
  }
277
275
  if (handleErrorFunc) {
@@ -290,9 +288,9 @@
290
288
 
291
289
  class CommonUtil {
292
290
  assign(target = {}, source = {}, isAdd = false) {
293
- let UtilsContext = this;
291
+ const UtilsContext = this;
294
292
  if (Array.isArray(source)) {
295
- let canTraverse = source.filter((item) => {
293
+ const canTraverse = source.filter((item) => {
296
294
  return typeof item === "object";
297
295
  });
298
296
  if (!canTraverse.length) {
@@ -308,34 +306,34 @@
308
306
  if (isAdd) {
309
307
  for (const sourceKeyName in source) {
310
308
  const targetKeyName = sourceKeyName;
311
- let targetValue = target[targetKeyName];
312
- let sourceValue = source[sourceKeyName];
309
+ const targetValue = Reflect.get(target, targetKeyName);
310
+ const sourceValue = Reflect.get(source, sourceKeyName);
313
311
  if (typeof sourceValue === "object" &&
314
312
  sourceValue != null &&
315
313
  sourceKeyName in target &&
316
314
  !UtilsContext.isDOM(sourceValue)) {
317
315
  /* 源端的值是object类型,且不是元素节点 */
318
- target[sourceKeyName] = UtilsContext.assign(targetValue, sourceValue, isAdd);
316
+ Reflect.set(target, sourceKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
319
317
  continue;
320
318
  }
321
- target[sourceKeyName] = sourceValue;
319
+ Reflect.set(target, sourceKeyName, sourceValue);
322
320
  }
323
321
  }
324
322
  else {
325
323
  for (const targetKeyName in target) {
326
324
  if (targetKeyName in source) {
327
- let targetValue = target[targetKeyName];
328
- let sourceValue = source[targetKeyName];
325
+ const targetValue = Reflect.get(target, targetKeyName);
326
+ const sourceValue = Reflect.get(source, targetKeyName);
329
327
  if (typeof sourceValue === "object" &&
330
328
  sourceValue != null &&
331
329
  !UtilsContext.isDOM(sourceValue) &&
332
330
  Object.keys(sourceValue).length) {
333
331
  /* 源端的值是object类型,且不是元素节点 */
334
- target[targetKeyName] = UtilsContext.assign(targetValue, sourceValue, isAdd);
332
+ Reflect.set(target, targetKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
335
333
  continue;
336
334
  }
337
335
  /* 直接赋值 */
338
- target[targetKeyName] = sourceValue;
336
+ Reflect.set(target, targetKeyName, sourceValue);
339
337
  }
340
338
  }
341
339
  }
@@ -343,7 +341,7 @@
343
341
  }
344
342
  isNull(...args) {
345
343
  let result = true;
346
- let checkList = [...args];
344
+ const checkList = [...args];
347
345
  for (const objItem of checkList) {
348
346
  let itemResult = false;
349
347
  if (objItem === null || objItem === undefined) {
@@ -369,11 +367,12 @@
369
367
  case "boolean":
370
368
  itemResult = !objItem;
371
369
  break;
372
- case "function":
373
- let funcStr = objItem.toString().replace(/\s/g, "");
370
+ case "function": {
371
+ const funcStr = objItem.toString().replace(/\s/g, "");
374
372
  /* 排除()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){} */
375
373
  itemResult = Boolean(funcStr.match(/^\(.*?\)=>\{\}$|^function.*?\(.*?\)\{\}$/));
376
374
  break;
375
+ }
377
376
  }
378
377
  }
379
378
  result = result && itemResult;
@@ -394,18 +393,23 @@
394
393
  return target instanceof Node;
395
394
  }
396
395
  isNotNull(...args) {
397
- let UtilsContext = this;
396
+ const UtilsContext = this;
398
397
  return !UtilsContext.isNull.apply(this, args);
399
398
  }
400
399
  deepClone(obj) {
401
- let UtilsContext = this;
400
+ const UtilsContext = this;
402
401
  if (obj === void 0)
403
402
  return void 0;
404
403
  if (obj === null)
405
404
  return null;
406
- let clone = obj instanceof Array ? [] : {};
405
+ const clone = obj instanceof Array ? [] : {};
407
406
  for (const [key, value] of Object.entries(obj)) {
408
- clone[key] = typeof value === "object" ? UtilsContext.deepClone(value) : value;
407
+ if (typeof value === "object") {
408
+ Reflect.set(clone, key, UtilsContext.deepClone(value));
409
+ }
410
+ else {
411
+ Reflect.set(clone, key, value);
412
+ }
409
413
  }
410
414
  return clone;
411
415
  }
@@ -432,11 +436,11 @@
432
436
  }
433
437
  TryCatch()
434
438
  .config({ log: false })
435
- .error((error) => {
439
+ .error(() => {
436
440
  TryCatch()
437
441
  .error(() => {
438
442
  try {
439
- result = new Function("return " + data)();
443
+ result = new Function(`return ${data}`)();
440
444
  }
441
445
  catch (error2) {
442
446
  if (typeof errorCallBack === "function") {
@@ -447,14 +451,14 @@
447
451
  .run(() => {
448
452
  if (data &&
449
453
  /^[\],:{}\s]*$/.test(data
450
- .replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
451
- .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
454
+ .replace(/\\(?:["\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
455
+ .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?/g, "]")
452
456
  .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
453
- result = new Function("return " + data)();
457
+ result = new Function(`return ${data}`)();
454
458
  }
455
459
  else {
456
460
  if (typeof errorCallBack === "function") {
457
- errorCallBack(new Error("target is not a JSON"));
461
+ errorCallBack(new Error("target is not JSON object"));
458
462
  }
459
463
  }
460
464
  });
@@ -466,7 +470,7 @@
466
470
  return result;
467
471
  }
468
472
  }
469
- let commonUtil = new CommonUtil();
473
+ const commonUtil = new CommonUtil();
470
474
 
471
475
  class UtilsGMCookie {
472
476
  windowApi = {
@@ -495,14 +499,14 @@
495
499
  if (typeof cookieName !== "string") {
496
500
  throw new TypeError("Utils.GMCookie.get 参数cookieName 必须为字符串");
497
501
  }
498
- let cookies = this.getCookiesList();
502
+ const cookies = this.getCookiesList();
499
503
  let findValue = void 0;
500
504
  for (const cookieItem of cookies) {
501
- let item = cookieItem.trim();
502
- let itemSplit = item.split("=");
503
- let itemName = itemSplit[0];
505
+ const item = cookieItem.trim();
506
+ const itemSplit = item.split("=");
507
+ const itemName = itemSplit[0];
504
508
  itemSplit.splice(0, 1);
505
- let itemValue = decodeURIComponent(itemSplit.join(""));
509
+ const itemValue = decodeURIComponent(itemSplit.join(""));
506
510
  if (itemName === cookieName) {
507
511
  findValue = {
508
512
  domain: this.windowApi.window.location.hostname,
@@ -532,7 +536,7 @@
532
536
  if (option == null) {
533
537
  throw new Error("Utils.GMCookie.list 参数不能为空");
534
538
  }
535
- let resultData = [];
539
+ const resultData = [];
536
540
  try {
537
541
  let defaultOption = {
538
542
  url: this.windowApi.window.location.href,
@@ -541,16 +545,16 @@
541
545
  path: "/",
542
546
  };
543
547
  defaultOption = commonUtil.assign(defaultOption, option);
544
- let cookies = this.getCookiesList();
548
+ const cookies = this.getCookiesList();
545
549
  cookies.forEach((item) => {
546
550
  item = item.trim();
547
- let itemSplit = item.split("=");
548
- let itemName = itemSplit[0];
551
+ const itemSplit = item.split("=");
552
+ const itemName = itemSplit[0];
549
553
  itemSplit.splice(0, 1);
550
- let itemValue = decodeURIComponent(itemSplit.join(""));
551
- let nameRegexp = defaultOption.name instanceof RegExp
554
+ const itemValue = decodeURIComponent(itemSplit.join(""));
555
+ const nameRegexp = defaultOption.name instanceof RegExp
552
556
  ? defaultOption.name
553
- : new RegExp("^" + defaultOption.name, "g");
557
+ : new RegExp(`^${defaultOption.name}`, "g");
554
558
  if (itemName.match(nameRegexp)) {
555
559
  resultData.push({
556
560
  domain: this.windowApi.window.location.hostname,
@@ -584,7 +588,7 @@
584
588
  if (option == null) {
585
589
  throw new Error("Utils.GMCookie.list 参数不能为空");
586
590
  }
587
- let resultData = [];
591
+ const resultData = [];
588
592
  let defaultOption = {
589
593
  url: this.windowApi.window.location.href,
590
594
  domain: this.windowApi.window.location.hostname,
@@ -592,16 +596,16 @@
592
596
  path: "/",
593
597
  };
594
598
  defaultOption = commonUtil.assign(defaultOption, option);
595
- let cookies = this.getCookiesList();
599
+ const cookies = this.getCookiesList();
596
600
  cookies.forEach((item) => {
597
601
  item = item.trim();
598
- let itemSplit = item.split("=");
599
- let itemName = itemSplit[0];
602
+ const itemSplit = item.split("=");
603
+ const itemName = itemSplit[0];
600
604
  itemSplit.splice(0, 1);
601
- let itemValue = decodeURIComponent(itemSplit.join(""));
602
- let nameRegexp = defaultOption.name instanceof RegExp
605
+ const itemValue = decodeURIComponent(itemSplit.join(""));
606
+ const nameRegexp = defaultOption.name instanceof RegExp
603
607
  ? defaultOption.name
604
- : new RegExp("^" + defaultOption.name, "g");
608
+ : new RegExp(`^${defaultOption.name}`, "g");
605
609
  if (itemName.match(nameRegexp)) {
606
610
  resultData.push({
607
611
  domain: this.windowApi.window.location.hostname,
@@ -641,17 +645,12 @@
641
645
  expirationDate: Math.floor(Date.now()) + 60 * 60 * 24 * 30,
642
646
  };
643
647
  defaultOption = commonUtil.assign(defaultOption, option);
644
- let life = defaultOption.expirationDate
648
+ const life = defaultOption.expirationDate
645
649
  ? defaultOption.expirationDate
646
650
  : Math.floor(Date.now()) + 60 * 60 * 24 * 30;
647
- let cookieStr = defaultOption.name +
648
- "=" +
649
- decodeURIComponent(defaultOption.value) +
650
- ";expires=" +
651
- new Date(life).toGMTString() +
652
- "; path=/";
651
+ let cookieStr = `${defaultOption.name}=${decodeURIComponent(defaultOption.value)};expires=${new Date(life).toGMTString()}; path=/`;
653
652
  if (commonUtil.isNull(defaultOption.domain)) {
654
- cookieStr += "; domain=" + defaultOption.domain;
653
+ cookieStr += `; domain=${defaultOption.domain}`;
655
654
  }
656
655
  this.windowApi.document.cookie = cookieStr;
657
656
  }
@@ -703,14 +702,14 @@
703
702
  if (cookieStr.trim() === "") {
704
703
  return [];
705
704
  }
706
- let cookies = cookieStr.split(";");
707
- let result = [];
705
+ const cookies = cookieStr.split(";");
706
+ const result = [];
708
707
  for (const cookieItem of cookies) {
709
- let item = cookieItem.trim();
710
- let itemSplit = item.split("=");
711
- let itemName = itemSplit[0];
708
+ const item = cookieItem.trim();
709
+ const itemSplit = item.split("=");
710
+ const itemName = itemSplit[0];
712
711
  itemSplit.splice(0, 1);
713
- let itemValue = decodeURIComponent(itemSplit.join(""));
712
+ const itemValue = decodeURIComponent(itemSplit.join(""));
714
713
  result.push({
715
714
  key: itemName,
716
715
  value: itemValue,
@@ -720,6 +719,7 @@
720
719
  }
721
720
  }
722
721
 
722
+ /* eslint-disable */
723
723
  // ==UserScript==
724
724
  // @name ajaxHooker
725
725
  // @author cxxjackie
@@ -1770,15 +1770,15 @@
1770
1770
  */
1771
1771
  init() {
1772
1772
  for (let index = 0; index < this.$data.data.length; index++) {
1773
- let menuOption = this.$data.data[index]["data"];
1773
+ const menuOption = this.$data.data[index]["data"];
1774
1774
  menuOption.enable = Boolean(this.getLocalMenuData(menuOption.key, menuOption.enable));
1775
1775
  if (typeof menuOption.showText !== "function") {
1776
1776
  menuOption.showText = (menuText, menuEnable) => {
1777
1777
  if (menuEnable) {
1778
- return this.$emoji.success + " " + menuText;
1778
+ return `${this.$emoji.success} ${menuText}`;
1779
1779
  }
1780
1780
  else {
1781
- return this.$emoji.error + " " + menuText;
1781
+ return `${this.$emoji.error} ${menuText}`;
1782
1782
  }
1783
1783
  };
1784
1784
  }
@@ -1789,7 +1789,7 @@
1789
1789
  * @param menuOptions 如果存在,使用它
1790
1790
  */
1791
1791
  register(menuOptions) {
1792
- let that = this;
1792
+ const that = this;
1793
1793
  if (menuOptions == null) {
1794
1794
  throw new TypeError("register菜单数据不能为空");
1795
1795
  }
@@ -1797,9 +1797,9 @@
1797
1797
  menuOptions = [menuOptions];
1798
1798
  }
1799
1799
  for (let index = 0; index < menuOptions.length; index++) {
1800
- let cloneMenuOptionData = commonUtil.deepClone(menuOptions[index].data);
1800
+ const cloneMenuOptionData = commonUtil.deepClone(menuOptions[index].data);
1801
1801
  const { showText, clickCallBack } = this.handleMenuData(cloneMenuOptionData);
1802
- let menuId = that.context.GM_Api.registerMenuCommand(showText, clickCallBack);
1802
+ const menuId = that.context.GM_Api.registerMenuCommand(showText, clickCallBack);
1803
1803
  menuOptions[index].id = menuId;
1804
1804
  cloneMenuOptionData.deleteMenu = function () {
1805
1805
  that.context.GM_Api.unregisterMenuCommand(menuId);
@@ -1813,7 +1813,7 @@
1813
1813
  * @param {string} key 键
1814
1814
  */
1815
1815
  getLocalMenuData(key, defaultValue) {
1816
- let localData = this.context.GM_Api.getValue(this.$data.key, {});
1816
+ const localData = this.context.GM_Api.getValue(this.$data.key, {});
1817
1817
  if (key in localData) {
1818
1818
  return localData[key];
1819
1819
  }
@@ -1827,7 +1827,7 @@
1827
1827
  * @param value 值
1828
1828
  */
1829
1829
  setLocalMenuData(key, value) {
1830
- let localData = this.context.GM_Api.getValue(this.$data.key, {});
1830
+ const localData = this.context.GM_Api.getValue(this.$data.key, {});
1831
1831
  localData[key] = value;
1832
1832
  this.context.GM_Api.setValue(this.$data.key, localData);
1833
1833
  },
@@ -1840,10 +1840,10 @@
1840
1840
  if (typeof menuOption.showText !== "function") {
1841
1841
  menuOption.showText = (menuText, menuEnable) => {
1842
1842
  if (menuEnable) {
1843
- return this.$emoji.success + " " + menuText;
1843
+ return `${this.$emoji.success} ${menuText}`;
1844
1844
  }
1845
1845
  else {
1846
- return this.$emoji.error + " " + menuText;
1846
+ return `${this.$emoji.error} ${menuText}`;
1847
1847
  }
1848
1848
  };
1849
1849
  }
@@ -1854,12 +1854,12 @@
1854
1854
  * @param menuOption
1855
1855
  */
1856
1856
  handleMenuData(menuOption) {
1857
- let that = this;
1858
- let menuLocalDataItemKey = menuOption.key;
1857
+ const that = this;
1858
+ const menuLocalDataItemKey = menuOption.key;
1859
1859
  /* 菜单默认开启的状态 */
1860
- let defaultEnable = Boolean(this.getLocalMenuData(menuLocalDataItemKey, menuOption.enable));
1860
+ const defaultEnable = Boolean(this.getLocalMenuData(menuLocalDataItemKey, menuOption.enable));
1861
1861
  /** 油猴菜单上显示的文本 */
1862
- let showText = menuOption.showText(menuOption.text, defaultEnable);
1862
+ const showText = menuOption.showText(menuOption.text, defaultEnable);
1863
1863
  // const GMMenuOptions = {
1864
1864
  // /**
1865
1865
  // * 菜单的id
@@ -1889,7 +1889,7 @@
1889
1889
  * @param event
1890
1890
  */
1891
1891
  function clickCallBack(event) {
1892
- let localEnable = Boolean(that.getLocalMenuData(menuLocalDataItemKey, defaultEnable));
1892
+ const localEnable = Boolean(that.getLocalMenuData(menuLocalDataItemKey, defaultEnable));
1893
1893
  if (menuOption.isStoreValue) {
1894
1894
  that.setLocalMenuData(menuLocalDataItemKey, !localEnable);
1895
1895
  }
@@ -2002,7 +2002,7 @@
2002
2002
  menuOptionList = [...menuOptionList, options];
2003
2003
  }
2004
2004
  menuOptionList.forEach((menuOption) => {
2005
- let oldMenuOption = this.MenuHandle.getMenuOption(menuOption.key);
2005
+ const oldMenuOption = this.MenuHandle.getMenuOption(menuOption.key);
2006
2006
  if (oldMenuOption) {
2007
2007
  // 覆盖
2008
2008
  Object.assign(oldMenuOption, menuOption);
@@ -2170,42 +2170,42 @@
2170
2170
  * 在Function原型上添加自定义方法.hook和.unhook
2171
2171
  */
2172
2172
  initEnv() {
2173
- Function.prototype.hook = function (realFunc, hookFunc, context) {
2173
+ Function.prototype.hook = function (_, hookFunc, context) {
2174
2174
  let _context = null; //函数上下文
2175
2175
  let _funcName = null; //函数名
2176
2176
  _context = context || window;
2177
2177
  _funcName = getFuncName(this);
2178
- _context["realFunc_" + _funcName] = this;
2178
+ _context[`realFunc_${_funcName}`] = this;
2179
2179
  if (_context[_funcName].prototype && _context[_funcName].prototype.isHooked) {
2180
2180
  console.log("Already has been hooked,unhook first");
2181
2181
  return false;
2182
2182
  }
2183
2183
  function getFuncName(fn) {
2184
2184
  // 获取函数名
2185
- let strFunc = fn.toString();
2186
- let _regex = /function\s+(\w+)\s*\(/;
2187
- let patten = strFunc.match(_regex);
2185
+ const strFunc = fn.toString();
2186
+ const _regex = /function\s+(\w+)\s*\(/;
2187
+ const patten = strFunc.match(_regex);
2188
2188
  if (patten) {
2189
2189
  return patten[1];
2190
2190
  }
2191
2191
  return "";
2192
2192
  }
2193
2193
  try {
2194
- new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
2195
- let args = Array.prototype.slice.call(arguments, 0);
2196
- let obj = this;
2197
- hookFunc.apply(obj, args);
2198
- return _context['realFunc_${_funcName}'].apply(obj, args);
2194
+ new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
2195
+ let args = Array.prototype.slice.call(arguments, 0);
2196
+ let obj = this;
2197
+ hookFunc.apply(obj, args);
2198
+ return _context['realFunc_${_funcName}'].apply(obj, args);
2199
2199
  };`)(_context, _funcName, hookFunc);
2200
2200
  _context[_funcName].prototype.isHooked = true;
2201
2201
  return true;
2202
2202
  }
2203
2203
  catch (e) {
2204
- console.log("Hook failed,check the params.");
2204
+ console.log("Hook failed,check the params.", e);
2205
2205
  return false;
2206
2206
  }
2207
2207
  };
2208
- Function.prototype.unhook = function (realFunc, funcName, context) {
2208
+ Function.prototype.unhook = function (_, funcName, context) {
2209
2209
  let _context = null;
2210
2210
  let _funcName = null;
2211
2211
  _context = context || window;
@@ -2214,8 +2214,8 @@
2214
2214
  console.log("No function is hooked on");
2215
2215
  return false;
2216
2216
  }
2217
- _context[_funcName] = _context["realFunc" + _funcName];
2218
- Reflect.deleteProperty(_context, "realFunc_" + _funcName);
2217
+ _context[_funcName] = _context[`realFunc${_funcName}`];
2218
+ Reflect.deleteProperty(_context, `realFunc_${_funcName}`);
2219
2219
  return true;
2220
2220
  };
2221
2221
  }
@@ -2223,10 +2223,10 @@
2223
2223
  * 删除在Function原型上添加的自定义方法.hook和.unhook
2224
2224
  */
2225
2225
  cleanEnv() {
2226
- if (Function.prototype.hasOwnProperty("hook")) {
2226
+ if (Object.prototype.hasOwnProperty.call(Function.prototype, "hook")) {
2227
2227
  Reflect.deleteProperty(Function.prototype, "hook");
2228
2228
  }
2229
- if (Function.prototype.hasOwnProperty("unhook")) {
2229
+ if (Object.prototype.hasOwnProperty.call(Function.prototype, "unhook")) {
2230
2230
  Reflect.deleteProperty(Function.prototype, "unhook");
2231
2231
  }
2232
2232
  return true;
@@ -2242,7 +2242,7 @@
2242
2242
  }
2243
2243
  else {
2244
2244
  return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (charStr) {
2245
- var randomValue = (Math.random() * 16) | 0, randomCharValue = charStr === "x" ? randomValue : (randomValue & 0x3) | 0x8;
2245
+ const randomValue = (Math.random() * 16) | 0, randomCharValue = charStr === "x" ? randomValue : (randomValue & 0x3) | 0x8;
2246
2246
  return randomCharValue.toString(16);
2247
2247
  });
2248
2248
  }
@@ -2284,9 +2284,9 @@
2284
2284
  }
2285
2285
  }
2286
2286
  for (let index = 0; index < this.$config.configList.length; index++) {
2287
- let item = this.$config.configList[index];
2287
+ const item = this.$config.configList[index];
2288
2288
  if (typeof item.fn === "function") {
2289
- let result = await item.fn(details);
2289
+ const result = await item.fn(details);
2290
2290
  if (result == null) {
2291
2291
  return;
2292
2292
  }
@@ -2299,7 +2299,7 @@
2299
2299
  */
2300
2300
  add(fn) {
2301
2301
  if (typeof fn === "function") {
2302
- let uuid = GenerateUUID();
2302
+ const uuid = GenerateUUID();
2303
2303
  this.$config.configList.push({
2304
2304
  id: uuid,
2305
2305
  fn: fn,
@@ -2316,7 +2316,7 @@
2316
2316
  */
2317
2317
  delete(id) {
2318
2318
  if (typeof id === "string") {
2319
- let findIndex = this.$config.configList.findIndex((item) => item.id === id);
2319
+ const findIndex = this.$config.configList.findIndex((item) => item.id === id);
2320
2320
  if (findIndex !== -1) {
2321
2321
  this.$config.configList.splice(findIndex, 1);
2322
2322
  return true;
@@ -2362,9 +2362,9 @@
2362
2362
  }
2363
2363
  }
2364
2364
  for (let index = 0; index < this.$config.configList.length; index++) {
2365
- let item = this.$config.configList[index];
2365
+ const item = this.$config.configList[index];
2366
2366
  if (typeof item.successFn === "function") {
2367
- let result = await item.successFn(response, details);
2367
+ const result = await item.successFn(response, details);
2368
2368
  if (result == null) {
2369
2369
  return;
2370
2370
  }
@@ -2397,9 +2397,9 @@
2397
2397
  }
2398
2398
  }
2399
2399
  for (let index = 0; index < this.$config.configList.length; index++) {
2400
- let item = this.$config.configList[index];
2400
+ const item = this.$config.configList[index];
2401
2401
  if (typeof item.errorFn === "function") {
2402
- let result = await item.errorFn(data);
2402
+ const result = await item.errorFn(data);
2403
2403
  if (result == null) {
2404
2404
  return;
2405
2405
  }
@@ -2411,7 +2411,7 @@
2411
2411
  * 添加请求前的回调处理配置
2412
2412
  */
2413
2413
  add(successFn, errorFn) {
2414
- let id = GenerateUUID();
2414
+ const id = GenerateUUID();
2415
2415
  this.$config.configList.push({
2416
2416
  id: id,
2417
2417
  successFn: successFn,
@@ -2425,7 +2425,7 @@
2425
2425
  */
2426
2426
  delete(id) {
2427
2427
  if (typeof id === "string") {
2428
- let findIndex = this.$config.configList.findIndex((item) => item.id === id);
2428
+ const findIndex = this.$config.configList.findIndex((item) => item.id === id);
2429
2429
  if (findIndex !== -1) {
2430
2430
  this.$config.configList.splice(findIndex, 1);
2431
2431
  return true;
@@ -2446,23 +2446,23 @@
2446
2446
  * 对请求的参数进行合并处理
2447
2447
  */
2448
2448
  handleBeforeRequestOptionArgs(...args) {
2449
- let option = {
2449
+ const option = {
2450
2450
  url: void 0,
2451
2451
  };
2452
2452
  if (typeof args[0] === "string") {
2453
2453
  /* 传入的是url,转为配置 */
2454
- let url = args[0];
2454
+ const url = args[0];
2455
2455
  option.url = url;
2456
2456
  if (typeof args[1] === "object") {
2457
2457
  /* 处理第二个参数details */
2458
- let optionArg = args[1];
2458
+ const optionArg = args[1];
2459
2459
  commonUtil.assign(option, optionArg, true);
2460
2460
  option.url = url;
2461
2461
  }
2462
2462
  }
2463
2463
  else {
2464
2464
  /* 传入的是配置 */
2465
- let optionArg = args[0];
2465
+ const optionArg = args[0];
2466
2466
  commonUtil.assign(option, optionArg, true);
2467
2467
  }
2468
2468
  return option;
@@ -2475,7 +2475,7 @@
2475
2475
  * @param reject promise抛出错误回调
2476
2476
  */
2477
2477
  getRequestOption(method, userRequestOption, resolve, reject) {
2478
- let that = this;
2478
+ const that = this;
2479
2479
  let url = userRequestOption.url || this.context.#defaultRequestOption.url;
2480
2480
  if (typeof url === "string") {
2481
2481
  // 去除左右空格
@@ -2488,7 +2488,7 @@
2488
2488
  }
2489
2489
  }
2490
2490
  }
2491
- let requestOption = {
2491
+ const requestOption = {
2492
2492
  url: url,
2493
2493
  method: (method || "GET").toString().toUpperCase().trim(),
2494
2494
  timeout: userRequestOption.timeout || this.context.#defaultRequestOption.timeout,
@@ -2510,9 +2510,12 @@
2510
2510
  /* 对象使用深拷贝 */
2511
2511
  fetchInit: commonUtil.deepClone(this.context.#defaultRequestOption.fetchInit),
2512
2512
  allowInterceptConfig: {
2513
- beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig.beforeRequest,
2514
- afterResponseSuccess: this.context.#defaultRequestOption.allowInterceptConfig.afterResponseSuccess,
2515
- afterResponseError: this.context.#defaultRequestOption.allowInterceptConfig.afterResponseError,
2513
+ beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig
2514
+ .beforeRequest,
2515
+ afterResponseSuccess: this.context.#defaultRequestOption.allowInterceptConfig
2516
+ .afterResponseSuccess,
2517
+ afterResponseError: this.context.#defaultRequestOption.allowInterceptConfig
2518
+ .afterResponseError,
2516
2519
  },
2517
2520
  user: userRequestOption.user || this.context.#defaultRequestOption.user,
2518
2521
  password: userRequestOption.password || this.context.#defaultRequestOption.password,
@@ -2540,15 +2543,17 @@
2540
2543
  };
2541
2544
  // 补全allowInterceptConfig参数
2542
2545
  if (typeof userRequestOption.allowInterceptConfig === "boolean") {
2543
- Object.keys(requestOption.allowInterceptConfig).forEach((keyName) => {
2546
+ const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
2547
+ allowInterceptConfigKeys.forEach((keyName) => {
2544
2548
  Reflect.set(requestOption.allowInterceptConfig, keyName, userRequestOption.allowInterceptConfig);
2545
2549
  });
2546
2550
  }
2547
2551
  else {
2548
2552
  if (typeof userRequestOption.allowInterceptConfig === "object" &&
2549
2553
  userRequestOption.allowInterceptConfig != null) {
2550
- Object.keys(userRequestOption.allowInterceptConfig).forEach((keyName) => {
2551
- let value = Reflect.get(userRequestOption.allowInterceptConfig, keyName);
2554
+ const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
2555
+ allowInterceptConfigKeys.forEach((keyName) => {
2556
+ const value = Reflect.get(userRequestOption.allowInterceptConfig, keyName);
2552
2557
  if (typeof value === "boolean" &&
2553
2558
  Reflect.has(requestOption.allowInterceptConfig, keyName)) {
2554
2559
  Reflect.set(requestOption.allowInterceptConfig, keyName, value);
@@ -2562,7 +2567,8 @@
2562
2567
  }
2563
2568
  if (typeof requestOption.headers === "object") {
2564
2569
  if (typeof userRequestOption.headers === "object") {
2565
- Object.keys(userRequestOption.headers).forEach((keyName, index) => {
2570
+ const headerKeys = Object.keys(requestOption.headers);
2571
+ headerKeys.forEach((keyName) => {
2566
2572
  if (keyName in requestOption.headers && userRequestOption.headers?.[keyName] == null) {
2567
2573
  /* 在默认的header中存在,且设置它新的值为空,那么就是默认的值 */
2568
2574
  Reflect.deleteProperty(requestOption.headers, keyName);
@@ -2580,8 +2586,9 @@
2580
2586
  if (typeof requestOption.fetchInit === "object") {
2581
2587
  /* 使用assign替换且添加 */
2582
2588
  if (typeof userRequestOption.fetchInit === "object") {
2583
- Object.keys(userRequestOption.fetchInit).forEach((keyName, index) => {
2584
- if (keyName in requestOption.fetchInit && userRequestOption.fetchInit[keyName] == null) {
2589
+ const fetchInitKeys = Object.keys(requestOption.fetchInit);
2590
+ fetchInitKeys.forEach((keyName) => {
2591
+ if (keyName in requestOption.fetchInit && Reflect.get(userRequestOption.fetchInit ?? {}, keyName) == null) {
2585
2592
  /* 在默认的fetchInit中存在,且设置它新的值为空,那么就是默认的值 */
2586
2593
  Reflect.deleteProperty(requestOption.fetchInit, keyName);
2587
2594
  }
@@ -2606,7 +2613,7 @@
2606
2613
  try {
2607
2614
  new URL(requestOption.url);
2608
2615
  }
2609
- catch (error) {
2616
+ catch {
2610
2617
  if (requestOption.url.startsWith("//")) {
2611
2618
  // 补充https:
2612
2619
  requestOption.url = globalThis.location.protocol + requestOption.url;
@@ -2617,7 +2624,7 @@
2617
2624
  }
2618
2625
  else {
2619
2626
  // 补充origin+/
2620
- requestOption.url = globalThis.location.origin + "/" + requestOption.url;
2627
+ requestOption.url = `${globalThis.location.origin}/${requestOption.url}`;
2621
2628
  }
2622
2629
  }
2623
2630
  if (requestOption.fetchInit && !requestOption.fetch) {
@@ -2627,12 +2634,12 @@
2627
2634
  // 转换data类型
2628
2635
  try {
2629
2636
  /** 是否对数据进行处理 */
2630
- let processData = userRequestOption.processData ?? true;
2637
+ const processData = userRequestOption.processData ?? true;
2631
2638
  if (requestOption.data != null && processData) {
2632
- let method = requestOption.method;
2639
+ const method = requestOption.method;
2633
2640
  if (method === "GET" || method === "HEAD") {
2634
2641
  // GET类型,data如果有,那么需要转为searchParams
2635
- let urlObj = new URL(requestOption.url);
2642
+ const urlObj = new URL(requestOption.url);
2636
2643
  let urlSearch = "";
2637
2644
  let isHandler = false;
2638
2645
  if (typeof requestOption.data === "string") {
@@ -2642,7 +2649,7 @@
2642
2649
  else if (typeof requestOption.data === "object") {
2643
2650
  isHandler = true;
2644
2651
  // URLSearchParams参数可以转普通的string:string,包括FormData
2645
- let searchParams = new URLSearchParams(requestOption.data);
2652
+ const searchParams = new URLSearchParams(requestOption.data);
2646
2653
  urlSearch = searchParams.toString();
2647
2654
  }
2648
2655
  if (isHandler) {
@@ -2663,7 +2670,7 @@
2663
2670
  }
2664
2671
  else {
2665
2672
  // xxx=xxx&xxx=
2666
- urlObj.search = urlObj.search + "&" + urlSearch;
2673
+ urlObj.search = `${urlObj.search}&${urlSearch}`;
2667
2674
  }
2668
2675
  }
2669
2676
  }
@@ -2671,14 +2678,14 @@
2671
2678
  }
2672
2679
  else if (method === "POST" && requestOption.headers != null) {
2673
2680
  // POST类型,data如果是FormData,那么需要转为string
2674
- let headersKeyList = Object.keys(requestOption.headers);
2675
- let ContentTypeIndex = headersKeyList.findIndex((headerKey) => {
2681
+ const headersKeyList = Object.keys(requestOption.headers);
2682
+ const ContentTypeIndex = headersKeyList.findIndex((headerKey) => {
2676
2683
  return (headerKey.trim().toLowerCase() === "content-type" &&
2677
2684
  typeof requestOption.headers[headerKey] === "string");
2678
2685
  });
2679
2686
  if (ContentTypeIndex !== -1) {
2680
- let ContentTypeKey = headersKeyList[ContentTypeIndex];
2681
- let ContentType = requestOption.headers[ContentTypeKey];
2687
+ const ContentTypeKey = headersKeyList[ContentTypeIndex];
2688
+ const ContentType = requestOption.headers[ContentTypeKey];
2682
2689
  // 设置了Content-Type
2683
2690
  if (ContentType.includes("application/json")) {
2684
2691
  // application/json
@@ -2719,10 +2726,10 @@
2719
2726
  * @param option 请求配置
2720
2727
  */
2721
2728
  removeRequestNullOption(option) {
2722
- Object.keys(option).forEach((keyName) => {
2723
- if (option[keyName] == null ||
2724
- (option[keyName] instanceof Function &&
2725
- commonUtil.isNull(option[keyName]))) {
2729
+ const optionKeys = Object.keys(option);
2730
+ optionKeys.forEach((keyName) => {
2731
+ const optionValue = option[keyName];
2732
+ if (optionValue == null || (optionValue instanceof Function && commonUtil.isNull(optionValue))) {
2726
2733
  Reflect.deleteProperty(option, keyName);
2727
2734
  return;
2728
2735
  }
@@ -2740,14 +2747,14 @@
2740
2747
  /**
2741
2748
  * fetch的请求配置
2742
2749
  **/
2743
- let fetchRequestOption = {};
2750
+ const fetchRequestOption = {};
2744
2751
  if ((option.method === "GET" || option.method === "HEAD") && option.data != null) {
2745
2752
  /* GET 或 HEAD 方法的请求不能包含 body 信息 */
2746
2753
  Reflect.deleteProperty(option, "data");
2747
2754
  }
2748
2755
  /* 中止信号控制器 */
2749
- let abortController = new AbortController();
2750
- let signal = abortController.signal;
2756
+ const abortController = new AbortController();
2757
+ const signal = abortController.signal;
2751
2758
  signal.onabort = () => {
2752
2759
  option.onabort({
2753
2760
  isFetch: true,
@@ -2792,10 +2799,10 @@
2792
2799
  * onabort请求被取消-触发
2793
2800
  * @param details 配置
2794
2801
  * @param resolve promise回调
2795
- * @param reject promise抛出错误回调
2802
+ * @param _reject promise抛出错误回调
2796
2803
  * @param argsResult 返回的参数列表
2797
2804
  */
2798
- async onAbort(details, resolve, reject, argsResult) {
2805
+ async onAbort(details, resolve, _reject, argsResult) {
2799
2806
  // console.log(argsResult);
2800
2807
  if (typeof details?.onabort === "function") {
2801
2808
  details.onabort.apply(this, argsResult);
@@ -2832,7 +2839,7 @@
2832
2839
  * @param reject 抛出错误
2833
2840
  * @param argsResult 返回的参数列表
2834
2841
  */
2835
- async onTimeout(details, resolve, reject, argsResult) {
2842
+ async onTimeout(details, resolve, _reject, argsResult) {
2836
2843
  // console.log(argsResult);
2837
2844
  if (typeof details?.ontimeout === "function") {
2838
2845
  // 执行配置中的ontime回调
@@ -2870,10 +2877,10 @@
2870
2877
  * onerror请求异常-触发
2871
2878
  * @param details 配置
2872
2879
  * @param resolve 回调
2873
- * @param reject 抛出错误
2880
+ * @param _reject 抛出错误
2874
2881
  * @param argsResult 返回的参数列表
2875
2882
  */
2876
- async onError(details, resolve, reject, argsResult) {
2883
+ async onError(details, resolve, _reject, argsResult) {
2877
2884
  // console.log(argsResult);
2878
2885
  if (typeof details?.onerror === "function") {
2879
2886
  details.onerror.apply(this, argsResult);
@@ -2907,16 +2914,15 @@
2907
2914
  * onload加载完毕-触发
2908
2915
  * @param details 请求的配置
2909
2916
  * @param resolve 回调
2910
- * @param reject 抛出错误
2917
+ * @param _reject 抛出错误
2911
2918
  * @param argsResult 返回的参数列表
2912
2919
  */
2913
- async onLoad(details, resolve, reject, argsResult) {
2920
+ async onLoad(details, resolve, _reject, argsResult) {
2914
2921
  // console.log(argsResult);
2915
2922
  /* X浏览器会因为设置了responseType导致不返回responseText */
2916
- let originResponse = argsResult[0];
2923
+ const originResponse = argsResult[0];
2917
2924
  /* responseText为空,response不为空的情况 */
2918
- if (commonUtil.isNull(originResponse["responseText"]) &&
2919
- commonUtil.isNotNull(originResponse["response"])) {
2925
+ if (commonUtil.isNull(originResponse["responseText"]) && commonUtil.isNotNull(originResponse["response"])) {
2920
2926
  if (typeof originResponse["response"] === "object") {
2921
2927
  TryCatch().run(() => {
2922
2928
  originResponse["responseText"] = JSON.stringify(originResponse["response"]);
@@ -2931,51 +2937,51 @@
2931
2937
  typeof originResponse["responseText"] === "string" &&
2932
2938
  originResponse["responseText"].trim() !== "") {
2933
2939
  /** 原始的请求text */
2934
- let httpxResponseText = originResponse.responseText;
2940
+ const httpxResponseText = originResponse.responseText;
2935
2941
  // 自定义个新的response
2936
2942
  let httpxResponse = httpxResponseText;
2937
2943
  if (details.responseType === "json") {
2938
2944
  httpxResponse = commonUtil.toJSON(httpxResponseText);
2939
2945
  }
2940
2946
  else if (details.responseType === "document") {
2941
- let parser = new DOMParser();
2947
+ const parser = new DOMParser();
2942
2948
  httpxResponse = parser.parseFromString(httpxResponseText, "text/html");
2943
2949
  }
2944
2950
  else if (details.responseType === "arraybuffer") {
2945
- let encoder = new TextEncoder();
2946
- let arrayBuffer = encoder.encode(httpxResponseText);
2951
+ const encoder = new TextEncoder();
2952
+ const arrayBuffer = encoder.encode(httpxResponseText);
2947
2953
  httpxResponse = arrayBuffer;
2948
2954
  }
2949
2955
  else if (details.responseType === "blob") {
2950
- let encoder = new TextEncoder();
2951
- let arrayBuffer = encoder.encode(httpxResponseText);
2956
+ const encoder = new TextEncoder();
2957
+ const arrayBuffer = encoder.encode(httpxResponseText);
2952
2958
  httpxResponse = new Blob([arrayBuffer]);
2953
2959
  }
2954
2960
  // 尝试覆盖原response
2955
2961
  try {
2956
- let setStatus = Reflect.set(originResponse, "response", httpxResponse);
2962
+ const setStatus = Reflect.set(originResponse, "response", httpxResponse);
2957
2963
  if (!setStatus) {
2958
2964
  console.warn("[Httpx-HttpxCallBack.oonLoad] 覆盖原始 response 失败,尝试添加新的httpxResponse");
2959
2965
  try {
2960
2966
  Reflect.set(originResponse, "httpxResponse", httpxResponse);
2961
2967
  }
2962
- catch (error) {
2968
+ catch {
2963
2969
  console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
2964
2970
  }
2965
2971
  }
2966
2972
  }
2967
- catch (error) {
2973
+ catch {
2968
2974
  console.warn("[Httpx-HttpxCallBack.oonLoad] 原始 response 无法被覆盖,尝试添加新的httpxResponse");
2969
2975
  try {
2970
2976
  Reflect.set(originResponse, "httpxResponse", httpxResponse);
2971
2977
  }
2972
- catch (error) {
2978
+ catch {
2973
2979
  console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
2974
2980
  }
2975
2981
  }
2976
2982
  }
2977
2983
  /* Stay扩展中没有finalUrl,对应的是responseURL */
2978
- let originResponseURL = Reflect.get(originResponse, "responseURL");
2984
+ const originResponseURL = Reflect.get(originResponse, "responseURL");
2979
2985
  if (originResponse["finalUrl"] == null && originResponseURL != null) {
2980
2986
  Reflect.set(originResponse, "finalUrl", originResponseURL);
2981
2987
  }
@@ -2995,7 +3001,7 @@
2995
3001
  });
2996
3002
  }
2997
3003
  else {
2998
- this.context.HttpxResponseCallBack.onError(details, resolve, reject, argsResult);
3004
+ this.context.HttpxResponseCallBack.onError(details, resolve, _reject, argsResult);
2999
3005
  }
3000
3006
  },
3001
3007
  /**
@@ -3052,7 +3058,7 @@
3052
3058
  console.log("[Httpx-HttpxRequest.request] 请求前的配置👇", details);
3053
3059
  }
3054
3060
  if (typeof this.context.HttpxRequestHook.beforeRequestCallBack === "function") {
3055
- let hookResult = await this.context.HttpxRequestHook.beforeRequestCallBack(details);
3061
+ const hookResult = await this.context.HttpxRequestHook.beforeRequestCallBack(details);
3056
3062
  if (hookResult == null) {
3057
3063
  return;
3058
3064
  }
@@ -3084,7 +3090,7 @@
3084
3090
  fetch(option.url, fetchRequestOption)
3085
3091
  .then(async (fetchResponse) => {
3086
3092
  /** 自定义的response */
3087
- let httpxResponse = {
3093
+ const httpxResponse = {
3088
3094
  isFetch: true,
3089
3095
  finalUrl: fetchResponse.url,
3090
3096
  readyState: 4,
@@ -3099,9 +3105,9 @@
3099
3105
  };
3100
3106
  Object.assign(httpxResponse, option.context || {});
3101
3107
  // 把headers转为字符串
3102
- for (const [key, value] of fetchResponse.headers.entries()) {
3108
+ fetchResponse.headers.forEach((value, key) => {
3103
3109
  httpxResponse.responseHeaders += `${key}: ${value}\n`;
3104
- }
3110
+ });
3105
3111
  /** 请求返回的类型 */
3106
3112
  const fetchResponseType = fetchResponse.headers.get("Content-Type");
3107
3113
  /* 如果需要stream,且获取到的是stream,那直接返回 */
@@ -3122,11 +3128,11 @@
3122
3128
  /** 响应xml文档 */
3123
3129
  let responseXML = "";
3124
3130
  /** 先获取二进制数据 */
3125
- let arrayBuffer = await fetchResponse.arrayBuffer();
3131
+ const arrayBuffer = await fetchResponse.arrayBuffer();
3126
3132
  /** 数据编码 */
3127
3133
  let encoding = "utf-8";
3128
3134
  if (fetchResponse.headers.has("Content-Type")) {
3129
- let charsetMatched = fetchResponse.headers.get("Content-Type")?.match(/charset=(.+)/);
3135
+ const charsetMatched = fetchResponse.headers.get("Content-Type")?.match(/charset=(.+)/);
3130
3136
  if (charsetMatched) {
3131
3137
  encoding = charsetMatched[1];
3132
3138
  encoding = encoding.toLowerCase();
@@ -3136,7 +3142,7 @@
3136
3142
  // 去除引号
3137
3143
  encoding = encoding.replace(/('|")/gi, "");
3138
3144
  // 编码
3139
- let textDecoder = new TextDecoder(encoding);
3145
+ const textDecoder = new TextDecoder(encoding);
3140
3146
  responseText = textDecoder.decode(arrayBuffer);
3141
3147
  response = responseText;
3142
3148
  if (option.responseType === "arraybuffer") {
@@ -3154,11 +3160,11 @@
3154
3160
  }
3155
3161
  else if (option.responseType === "document" || option.responseType == null) {
3156
3162
  // response返回格式是文档格式
3157
- let parser = new DOMParser();
3163
+ const parser = new DOMParser();
3158
3164
  response = parser.parseFromString(responseText, "text/html");
3159
3165
  }
3160
3166
  // 转为XML结构
3161
- let parser = new DOMParser();
3167
+ const parser = new DOMParser();
3162
3168
  responseXML = parser.parseFromString(responseText, "text/xml");
3163
3169
  httpxResponse.response = response;
3164
3170
  httpxResponse.responseText = responseText;
@@ -3232,6 +3238,9 @@
3232
3238
  onreadystatechange() { },
3233
3239
  onprogress() { },
3234
3240
  };
3241
+ /**
3242
+ * 实例化的默认配置
3243
+ */
3235
3244
  #defaultInitOption = {
3236
3245
  /**
3237
3246
  * `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
@@ -3347,7 +3356,7 @@
3347
3356
  * @param details 配置
3348
3357
  */
3349
3358
  get(...args) {
3350
- let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3359
+ const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3351
3360
  useRequestOption.method = "GET";
3352
3361
  return this.request(useRequestOption, (option) => {
3353
3362
  Reflect.deleteProperty(option, "onprogress");
@@ -3357,7 +3366,7 @@
3357
3366
  * POST 请求
3358
3367
  */
3359
3368
  post(...args) {
3360
- let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3369
+ const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3361
3370
  useRequestOption.method = "POST";
3362
3371
  return this.request(useRequestOption);
3363
3372
  }
@@ -3365,7 +3374,7 @@
3365
3374
  * HEAD 请求
3366
3375
  */
3367
3376
  head(...args) {
3368
- let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3377
+ const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3369
3378
  useRequestOption.method = "HEAD";
3370
3379
  return this.request(useRequestOption, (option) => {
3371
3380
  Reflect.deleteProperty(option, "onprogress");
@@ -3375,7 +3384,7 @@
3375
3384
  * OPTIONS 请求
3376
3385
  */
3377
3386
  options(...args) {
3378
- let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3387
+ const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3379
3388
  useRequestOption.method = "OPTIONS";
3380
3389
  return this.request(useRequestOption, (option) => {
3381
3390
  Reflect.deleteProperty(option, "onprogress");
@@ -3385,7 +3394,7 @@
3385
3394
  * DELETE 请求
3386
3395
  */
3387
3396
  delete(...args) {
3388
- let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3397
+ const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3389
3398
  useRequestOption.method = "DELETE";
3390
3399
  return this.request(useRequestOption, (option) => {
3391
3400
  Reflect.deleteProperty(option, "onprogress");
@@ -3395,7 +3404,7 @@
3395
3404
  * PUT 请求
3396
3405
  */
3397
3406
  put(...args) {
3398
- let userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3407
+ const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
3399
3408
  userRequestOption.method = "PUT";
3400
3409
  return this.request(userRequestOption);
3401
3410
  }
@@ -3405,18 +3414,30 @@
3405
3414
  * @param beforeRequestOption 处理请求前的配置
3406
3415
  */
3407
3416
  request(details, beforeRequestOption) {
3408
- let useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(details);
3409
- /** 取消请求 */
3417
+ // 对请求的参数进行合并处理
3418
+ const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(details);
3419
+ /**
3420
+ * 取消请求
3421
+ */
3410
3422
  let abortFn = null;
3411
- let promise = new globalThis.Promise(async (resolve, reject) => {
3412
- let requestOption = (this.HttpxRequestOption.getRequestOption(useRequestOption.method, useRequestOption, resolve, reject));
3423
+ const promise = new globalThis.Promise(async (resolve, reject) => {
3424
+ // 请求配置
3425
+ let requestOption = this.HttpxRequestOption.getRequestOption(userRequestOption.method, userRequestOption, (resultOption) => {
3426
+ resolve(resultOption);
3427
+ }, (...args) => {
3428
+ reject(...args);
3429
+ });
3430
+ requestOption = this.HttpxRequestOption.removeRequestNullOption(requestOption);
3413
3431
  if (typeof beforeRequestOption === "function") {
3414
3432
  beforeRequestOption(requestOption);
3415
3433
  }
3416
- requestOption = this.HttpxRequestOption.removeRequestNullOption(requestOption);
3434
+ // 处理重试逻辑
3417
3435
  const requestResult = await this.HttpxRequest.request(requestOption);
3418
3436
  if (requestResult != null && typeof requestResult.abort === "function") {
3419
- abortFn = requestResult.abort;
3437
+ abortFn = () => {
3438
+ // 取消请求
3439
+ requestResult.abort();
3440
+ };
3420
3441
  }
3421
3442
  });
3422
3443
  promise.abort = () => {
@@ -3435,10 +3456,7 @@
3435
3456
  /* websql的版本号,由于ios的问题,版本号的写法不一样 */
3436
3457
  // #slqVersion = "1";
3437
3458
  /* 监听IndexDB */
3438
- #indexedDB = window.indexedDB ||
3439
- window.mozIndexedDB ||
3440
- window.webkitIndexedDB ||
3441
- window.msIndexedDB;
3459
+ #indexedDB = globalThis.indexedDB || globalThis.mozIndexedDB || globalThis.webkitIndexedDB || globalThis.msIndexedDB;
3442
3460
  /* 缓存数据库,避免同一个页面重复创建和销毁 */
3443
3461
  #db = {};
3444
3462
  // #store: IDBObjectStore = null as any;
@@ -3473,7 +3491,7 @@
3473
3491
  this.#storeName = storeName;
3474
3492
  this.#dbVersion = dbVersion;
3475
3493
  if (!this.#indexedDB) {
3476
- alert("很抱歉,您的浏览器不支持indexedDB");
3494
+ window.alert("很抱歉,您的浏览器不支持indexedDB");
3477
3495
  throw new TypeError("很抱歉,您的浏览器不支持indexedDB");
3478
3496
  }
3479
3497
  }
@@ -3482,10 +3500,9 @@
3482
3500
  * @param dbName 表名
3483
3501
  */
3484
3502
  createStore(dbName) {
3485
- let txn, store;
3486
- txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
3503
+ const txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
3487
3504
  /* IndexDB的读写权限 */
3488
- store = txn.objectStore(this.#storeName);
3505
+ const store = txn.objectStore(this.#storeName);
3489
3506
  // this.#store = store;
3490
3507
  return store;
3491
3508
  }
@@ -3495,12 +3512,12 @@
3495
3512
  * @param dbName 数据库名
3496
3513
  */
3497
3514
  open(callback, dbName) {
3498
- let that = this;
3515
+ const that = this;
3499
3516
  /* 打开数据库 */
3500
3517
  /* 如果支持IndexDB */
3501
3518
  if (!that.#db[dbName]) {
3502
3519
  /* 如果缓存中没有,则进行数据库的创建或打开,提高效率 */
3503
- let request = that.#indexedDB.open(dbName, that.#dbVersion);
3520
+ const request = that.#indexedDB.open(dbName, that.#dbVersion);
3504
3521
  request.onerror = function (event) {
3505
3522
  callback(null, {
3506
3523
  code: that.#statusCode.openFailed.code,
@@ -3510,26 +3527,26 @@
3510
3527
  };
3511
3528
  request.onsuccess = function (event) {
3512
3529
  if (!that.#db[dbName]) {
3513
- let target = event.target;
3530
+ const target = event.target;
3514
3531
  that.#db[dbName] = target.result;
3515
3532
  }
3516
- let store = that.createStore(dbName);
3533
+ const store = that.createStore(dbName);
3517
3534
  callback(store);
3518
3535
  };
3519
3536
  request.onupgradeneeded = function (event) {
3520
- let target = event.target;
3537
+ const target = event.target;
3521
3538
  that.#db[dbName] = target.result;
3522
- let store = that.#db[dbName].createObjectStore(that.#storeName, {
3539
+ const store = that.#db[dbName].createObjectStore(that.#storeName, {
3523
3540
  keyPath: "key",
3524
3541
  });
3525
- store.transaction.oncomplete = function (event) {
3542
+ store.transaction.oncomplete = function () {
3526
3543
  callback(store);
3527
3544
  };
3528
3545
  };
3529
3546
  }
3530
3547
  else {
3531
3548
  /* 如果缓存中已经打开了数据库,就直接使用 */
3532
- let store = this.createStore(dbName);
3549
+ const store = this.createStore(dbName);
3533
3550
  callback(store);
3534
3551
  }
3535
3552
  }
@@ -3539,10 +3556,10 @@
3539
3556
  * @param value 数据值
3540
3557
  */
3541
3558
  async save(key, value) {
3542
- let that = this;
3559
+ const that = this;
3543
3560
  return new Promise((resolve) => {
3544
- let dbName = this.#dbName;
3545
- let inData = {
3561
+ const dbName = this.#dbName;
3562
+ const inData = {
3546
3563
  key: key,
3547
3564
  value: value,
3548
3565
  };
@@ -3555,7 +3572,7 @@
3555
3572
  });
3556
3573
  }
3557
3574
  else {
3558
- let request = idbStore.put(inData);
3575
+ const request = idbStore.put(inData);
3559
3576
  request.onsuccess = function (event) {
3560
3577
  /* 保存成功有success 字段 */
3561
3578
  resolve({
@@ -3582,9 +3599,9 @@
3582
3599
  * @param key 数据key
3583
3600
  */
3584
3601
  async has(key) {
3585
- let that = this;
3602
+ const that = this;
3586
3603
  return new Promise((resolve) => {
3587
- let dbName = this.#dbName;
3604
+ const dbName = this.#dbName;
3588
3605
  this.open(function (idbStore) {
3589
3606
  /* 判断返回的数据中是否有error字段 */
3590
3607
  if (idbStore == null) {
@@ -3595,7 +3612,7 @@
3595
3612
  });
3596
3613
  }
3597
3614
  else {
3598
- let request = idbStore.get(key);
3615
+ const request = idbStore.get(key);
3599
3616
  request.onsuccess = function (event) {
3600
3617
  /* result 返回的是 {key: string, value: any} */
3601
3618
  /* 键值对存储 */
@@ -3623,9 +3640,9 @@
3623
3640
  * @param key 数据key
3624
3641
  */
3625
3642
  async get(key) {
3626
- let that = this;
3643
+ const that = this;
3627
3644
  return new Promise((resolve) => {
3628
- let dbName = this.#dbName;
3645
+ const dbName = this.#dbName;
3629
3646
  this.open(function (idbStore) {
3630
3647
  /* 判断返回的数据中是否有error字段 */
3631
3648
  if (idbStore == null) {
@@ -3637,13 +3654,13 @@
3637
3654
  });
3638
3655
  }
3639
3656
  else {
3640
- let request = idbStore.get(key);
3657
+ const request = idbStore.get(key);
3641
3658
  request.onsuccess = function (event) {
3642
- let target = event.target;
3643
- let result = target.result;
3659
+ const target = event.target;
3660
+ const result = target.result;
3644
3661
  /* result 返回的是 {key: string, value: any} */
3645
3662
  /* 键值对存储 */
3646
- let data = result ? result.value : void 0;
3663
+ const data = result ? result.value : void 0;
3647
3664
  if (data == null) {
3648
3665
  resolve({
3649
3666
  success: true,
@@ -3684,10 +3701,10 @@
3684
3701
  */
3685
3702
  async regexpGet(key) {
3686
3703
  let list = [];
3687
- let that = this;
3704
+ const that = this;
3688
3705
  return new Promise((resolve) => {
3689
3706
  /* 正则查询 */
3690
- let dbName = that.#dbName;
3707
+ const dbName = that.#dbName;
3691
3708
  this.open(function (idbStore) {
3692
3709
  /* 判断返回的数据中是否有error字段 */
3693
3710
  if (idbStore == null) {
@@ -3699,16 +3716,16 @@
3699
3716
  });
3700
3717
  }
3701
3718
  else {
3702
- let request = idbStore.getAll();
3719
+ const request = idbStore.getAll();
3703
3720
  request.onsuccess = function (event) {
3704
- let target = event.target;
3705
- let result = target.result;
3721
+ const target = event.target;
3722
+ const result = target.result;
3706
3723
  if (result.length !== 0) {
3707
- result.forEach((dataItem, index) => {
3724
+ result.forEach((dataItem) => {
3708
3725
  // 当前项的key
3709
- let __key = dataItem["key"];
3726
+ const __key = dataItem["key"];
3710
3727
  // 当前项的value
3711
- let __value = dataItem["value"];
3728
+ const __value = dataItem["value"];
3712
3729
  if (__key.match(key)) {
3713
3730
  list = list.concat(__value);
3714
3731
  }
@@ -3740,10 +3757,10 @@
3740
3757
  * @param key 数据key
3741
3758
  */
3742
3759
  async delete(key) {
3743
- let that = this;
3760
+ const that = this;
3744
3761
  return new Promise((resolve) => {
3745
3762
  /* 根据key删除某条数据 */
3746
- let dbName = that.#dbName;
3763
+ const dbName = that.#dbName;
3747
3764
  this.open(function (idbStore) {
3748
3765
  if (idbStore == null) {
3749
3766
  resolve({
@@ -3754,7 +3771,7 @@
3754
3771
  }
3755
3772
  else {
3756
3773
  // 删除键
3757
- let request = idbStore.delete(key);
3774
+ const request = idbStore.delete(key);
3758
3775
  request.onsuccess = function (event) {
3759
3776
  resolve({
3760
3777
  success: true,
@@ -3779,10 +3796,10 @@
3779
3796
  * 删除所有数据
3780
3797
  */
3781
3798
  async deleteAll() {
3782
- let that = this;
3799
+ const that = this;
3783
3800
  return new Promise((resolve) => {
3784
3801
  /* 清空数据库 */
3785
- let dbName = that.#dbName;
3802
+ const dbName = that.#dbName;
3786
3803
  this.open(function (idbStore) {
3787
3804
  if (idbStore == null) {
3788
3805
  resolve({
@@ -3793,7 +3810,7 @@
3793
3810
  }
3794
3811
  else {
3795
3812
  // 清空
3796
- let operateResult = idbStore.clear();
3813
+ const operateResult = idbStore.clear();
3797
3814
  operateResult.onsuccess = function (event) {
3798
3815
  resolve({
3799
3816
  success: true,
@@ -3826,7 +3843,7 @@
3826
3843
  run;
3827
3844
  isLock;
3828
3845
  constructor(callback, context, delayTime) {
3829
- let that = this;
3846
+ const that = this;
3830
3847
  this.#callback = callback;
3831
3848
  if (typeof context === "number") {
3832
3849
  this.#delayTime = context;
@@ -3916,14 +3933,14 @@
3916
3933
  * @param stack
3917
3934
  */
3918
3935
  parseErrorStack(stack) {
3919
- let result = {
3936
+ const result = {
3920
3937
  name: "",
3921
3938
  position: "",
3922
3939
  };
3923
3940
  for (let stackString of stack) {
3924
3941
  stackString = stackString.trim();
3925
- let stackFunctionNameMatch = stackString.match(/^at[\s]+(.+?)[\s]+/i);
3926
- let stackFunctionNamePositionMatch = stackString.match(/^at[\s]+.+[\s]+\((.+?)\)/i);
3942
+ const stackFunctionNameMatch = stackString.match(/^at[\s]+(.+?)[\s]+/i);
3943
+ const stackFunctionNamePositionMatch = stackString.match(/^at[\s]+.+[\s]+\((.+?)\)/i);
3927
3944
  if (stackFunctionNameMatch == null) {
3928
3945
  continue;
3929
3946
  }
@@ -3931,8 +3948,8 @@
3931
3948
  continue;
3932
3949
  }
3933
3950
  /* 获取最后一个,因为第一个是包含了at */
3934
- let stackFunctionName = stackFunctionNameMatch[stackFunctionNameMatch.length - 1];
3935
- let stackFunctionNamePosition = stackFunctionNamePositionMatch[stackFunctionNamePositionMatch.length - 1];
3951
+ const stackFunctionName = stackFunctionNameMatch[stackFunctionNameMatch.length - 1];
3952
+ const stackFunctionNamePosition = stackFunctionNamePositionMatch[stackFunctionNamePositionMatch.length - 1];
3936
3953
  if (stackFunctionName === "" ||
3937
3954
  stackFunctionName.match(/^(Utils\.|)Log(\.|)|.<anonymous>$|^Function.each|^NodeList.forEach|^k.fn.init.each/g)) {
3938
3955
  continue;
@@ -3944,9 +3961,9 @@
3944
3961
  }
3945
3962
  }
3946
3963
  if (result.position === "") {
3947
- let lastStackString = stack[stack.length - 1].trim();
3964
+ const lastStackString = stack[stack.length - 1].trim();
3948
3965
  if (lastStackString.startsWith("at chrome-extension://")) {
3949
- let lastStackMatch = lastStackString.match(/^at[\s]+(.+)/);
3966
+ const lastStackMatch = lastStackString.match(/^at[\s]+(.+)/);
3950
3967
  if (lastStackMatch) {
3951
3968
  result.position = lastStackMatch[lastStackMatch.length - 1];
3952
3969
  }
@@ -3976,16 +3993,18 @@
3976
3993
  printContent(msg, color, otherStyle) {
3977
3994
  this.checkClearConsole();
3978
3995
  otherStyle = otherStyle || "";
3979
- let stackSplit = new Error().stack.split("\n");
3996
+ const stackSplit = new Error().stack.split("\n");
3980
3997
  stackSplit.splice(0, 2);
3981
- let { name: callerName, position: callerPosition } = this.parseErrorStack(stackSplit);
3982
- let tagName = this.tag;
3983
- let that = this;
3998
+ const { name: callerName, position: callerPosition } = this.parseErrorStack(stackSplit);
3999
+ const tagName = this.tag;
4000
+ const that = this;
3984
4001
  /** tag的html输出格式 */
3985
- let tagNameHTML = `%c[${tagName}%c`;
4002
+ const tagNameHTML = `%c[${tagName}%c`;
3986
4003
  /** 调用的函数名的html输出格式 */
3987
4004
  let callerNameHTML = `%c${callerName}%c]%c`;
3988
- callerName.trim() !== "" && (callerNameHTML = "-" + callerNameHTML);
4005
+ if (callerName.trim() === "") {
4006
+ callerNameHTML = `-${callerNameHTML}`;
4007
+ }
3989
4008
  /**
3990
4009
  * 输出消息到控制台
3991
4010
  * @param message
@@ -4071,14 +4090,14 @@
4071
4090
  if (this.#disable)
4072
4091
  return;
4073
4092
  this.checkClearConsole();
4074
- let stack = new Error().stack.split("\n");
4093
+ const stack = new Error().stack.split("\n");
4075
4094
  stack.splice(0, 1);
4076
- let errorStackParse = this.parseErrorStack(stack);
4095
+ const errorStackParse = this.parseErrorStack(stack);
4077
4096
  /** 堆栈函数名 */
4078
- let stackFunctionName = errorStackParse.name;
4097
+ const stackFunctionName = errorStackParse.name;
4079
4098
  /** 堆栈位置 */
4080
- let stackFunctionNamePosition = errorStackParse.position;
4081
- let callerName = stackFunctionName;
4099
+ const stackFunctionNamePosition = errorStackParse.position;
4100
+ const callerName = stackFunctionName;
4082
4101
  this.#console.log(`%c[${this.tag}%c-%c${callerName}%c]%c`, ...this.#msgColorDetails, `color: ${this.#details.infoColor};`);
4083
4102
  this.#console.table(msg);
4084
4103
  if (this.#details.debug) {
@@ -4141,9 +4160,9 @@
4141
4160
  */
4142
4161
  circleRadius: 50,
4143
4162
  };
4144
- #ctx = null;
4145
- #width = null;
4146
- #height = null;
4163
+ #ctx;
4164
+ #width;
4165
+ #height;
4147
4166
  /**
4148
4167
  *
4149
4168
  * @param paramConfig 配置信息
@@ -4153,14 +4172,8 @@
4153
4172
  if (!(this.#config.canvasNode instanceof HTMLCanvasElement)) {
4154
4173
  throw new Error("Utils.Progress 参数 canvasNode 必须是 HTMLCanvasElement");
4155
4174
  }
4156
- this.init();
4157
- }
4158
- /**
4159
- * 初始化
4160
- */
4161
- init() {
4162
4175
  /* 获取画笔 */
4163
- let ctx = this.#config.canvasNode.getContext("2d");
4176
+ const ctx = this.#config.canvasNode.getContext("2d");
4164
4177
  if (ctx == null) {
4165
4178
  throw new Error("Utils.Progress 获取画笔失败");
4166
4179
  }
@@ -4171,8 +4184,8 @@
4171
4184
  this.#height = this.#config.canvasNode.height;
4172
4185
  /* 清除锯齿 */
4173
4186
  if (window.devicePixelRatio) {
4174
- this.#config.canvasNode.style.width = this.#width + "px";
4175
- this.#config.canvasNode.style.height = this.#height + "px";
4187
+ this.#config.canvasNode.style.width = `${this.#width}px`;
4188
+ this.#config.canvasNode.style.height = `${this.#height}px`;
4176
4189
  this.#config.canvasNode.height = this.#height * window.devicePixelRatio;
4177
4190
  this.#config.canvasNode.width = this.#width * window.devicePixelRatio;
4178
4191
  this.#ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
@@ -4184,7 +4197,7 @@
4184
4197
  * 绘制
4185
4198
  */
4186
4199
  draw() {
4187
- let degActive = (this.#config.progress * 360) / 100;
4200
+ const degActive = (this.#config.progress * 360) / 100;
4188
4201
  /* 清除画布 */
4189
4202
  this.#ctx.clearRect(0, 0, this.#width, this.#height);
4190
4203
  /* 开始绘制底圆 */
@@ -4198,11 +4211,11 @@
4198
4211
  this.#ctx.strokeStyle = this.#config.lineColor;
4199
4212
  this.#ctx.stroke();
4200
4213
  /* 获取百分比 */
4201
- let txt = parseInt(this.#config.progress.toString()) + "%";
4202
- this.#ctx.font = this.#config.fontSize + "px SimHei";
4214
+ const txt = `${parseInt(this.#config.progress.toString())}%`;
4215
+ this.#ctx.font = `${this.#config.fontSize}px SimHei`;
4203
4216
  /* 获取文本宽度 */
4204
- let w = this.#ctx.measureText(txt).width;
4205
- let h = this.#config.fontSize / 2;
4217
+ const w = this.#ctx.measureText(txt).width;
4218
+ const h = this.#config.fontSize / 2;
4206
4219
  this.#ctx.fillStyle = this.#config.textColor;
4207
4220
  this.#ctx.fillText(txt, this.#width / 2 - w / 2, this.#height / 2 + h / 2);
4208
4221
  }
@@ -4226,9 +4239,9 @@
4226
4239
  * 迭代器
4227
4240
  */
4228
4241
  get entries() {
4229
- let that = this;
4242
+ const that = this;
4230
4243
  return function* () {
4231
- let itemKeys = Object.keys(that.getItems());
4244
+ const itemKeys = Object.keys(that.getItems());
4232
4245
  for (const keyName of itemKeys) {
4233
4246
  yield [keyName, that.get(keyName)];
4234
4247
  }
@@ -4238,9 +4251,8 @@
4238
4251
  * 是否可遍历
4239
4252
  */
4240
4253
  get [Symbol.iterator]() {
4241
- let that = this;
4242
- return function () {
4243
- return that.entries();
4254
+ return () => {
4255
+ return this.entries();
4244
4256
  };
4245
4257
  }
4246
4258
  /**
@@ -4287,13 +4299,13 @@
4287
4299
  * 获取字典所有的键
4288
4300
  */
4289
4301
  keys() {
4290
- return this.items.keys().toArray();
4302
+ return Array.from(this.items.keys());
4291
4303
  }
4292
4304
  /**
4293
4305
  * 返回字典中的所有值
4294
4306
  */
4295
4307
  values() {
4296
- return this.items.values().toArray();
4308
+ return Array.from(this.items.values());
4297
4309
  }
4298
4310
  /**
4299
4311
  * 清空字典
@@ -4327,7 +4339,7 @@
4327
4339
  * @param callbackfn 回调函数
4328
4340
  */
4329
4341
  forEach(callbackfn) {
4330
- this.items.forEach((value, key, self) => {
4342
+ this.items.forEach((value, key) => {
4331
4343
  callbackfn(value, key, this);
4332
4344
  });
4333
4345
  }
@@ -4419,6 +4431,7 @@
4419
4431
  }
4420
4432
  }
4421
4433
 
4434
+ // @ts-nocheck
4422
4435
  const VueUtils = {
4423
4436
  /** 标签 */
4424
4437
  ReactiveFlags: {
@@ -4457,10 +4470,10 @@
4457
4470
  deps = [];
4458
4471
  active = true;
4459
4472
  fn;
4460
- // private scheduler;
4473
+ scheduler;
4461
4474
  constructor(fn, scheduler) {
4462
4475
  this.fn = fn;
4463
- // this.scheduler = scheduler;
4476
+ this.scheduler = scheduler;
4464
4477
  }
4465
4478
  run(cb) {
4466
4479
  if (!this.active) {
@@ -4532,7 +4545,7 @@
4532
4545
  if (VueUtils.isReactive(target)) {
4533
4546
  return target;
4534
4547
  }
4535
- let exisProxy = this.reactMap.get(target);
4548
+ const exisProxy = this.reactMap.get(target);
4536
4549
  if (exisProxy) {
4537
4550
  return exisProxy;
4538
4551
  }
@@ -4545,8 +4558,8 @@
4545
4558
  return Reflect.get(target, key, receiver);
4546
4559
  },
4547
4560
  set(target, key, value, receiver) {
4548
- let oldValue = target[key];
4549
- let result = Reflect.set(target, key, value, receiver);
4561
+ const oldValue = target[key];
4562
+ const result = Reflect.set(target, key, value, receiver);
4550
4563
  if (oldValue !== value) {
4551
4564
  that.trigger(target, "set", key, oldValue, value);
4552
4565
  }
@@ -4596,11 +4609,12 @@
4596
4609
  }
4597
4610
  toRefs(object) {
4598
4611
  const result = VueUtils.isArray(object) ? new Array(object.length) : {};
4599
- for (let key in object) {
4612
+ for (const key in object) {
4600
4613
  result[key] = this.toRef(object, key);
4601
4614
  }
4602
4615
  return result;
4603
4616
  }
4617
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
4604
4618
  trigger(target, type, key, oldValue, value) {
4605
4619
  const depsMap = this.targetMap.get(target);
4606
4620
  if (!depsMap)
@@ -4608,8 +4622,9 @@
4608
4622
  const effects = depsMap.get(key);
4609
4623
  this.triggerEffect(effects, "effects");
4610
4624
  }
4625
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
4611
4626
  triggerEffect(effects, name) {
4612
- effects &&
4627
+ if (effects) {
4613
4628
  effects.forEach((effect) => {
4614
4629
  if (effect.scheduler) {
4615
4630
  effect.scheduler();
@@ -4618,6 +4633,7 @@
4618
4633
  effect.run();
4619
4634
  }
4620
4635
  });
4636
+ }
4621
4637
  }
4622
4638
  track(target, type, key) {
4623
4639
  if (!this.activeEffect)
@@ -4634,7 +4650,7 @@
4634
4650
  }
4635
4651
  trackEffect(dep) {
4636
4652
  if (this.activeEffect) {
4637
- let shouldTrack = !dep.has(this.activeEffect);
4653
+ const shouldTrack = !dep.has(this.activeEffect);
4638
4654
  if (shouldTrack) {
4639
4655
  dep.add(this.activeEffect);
4640
4656
  this.activeEffect.deps.push(dep);
@@ -4648,7 +4664,7 @@
4648
4664
  return value;
4649
4665
  }
4650
4666
  set.add(value);
4651
- for (let key in value) {
4667
+ for (const key in value) {
4652
4668
  this.traversal(value[key], set);
4653
4669
  }
4654
4670
  return value;
@@ -4900,6 +4916,7 @@
4900
4916
  const setInterval = (...args) => loadOrReturnBroker().setInterval(...args);
4901
4917
  const setTimeout$1 = (...args) => loadOrReturnBroker().setTimeout(...args);
4902
4918
 
4919
+ /* eslint-disable */
4903
4920
  // ==UserScript==
4904
4921
  // @name ModuleRaid.js
4905
4922
  // @namespace http://tampermonkey.net/
@@ -5317,28 +5334,26 @@
5317
5334
  return $ele?.innerHTML?.trim() === "";
5318
5335
  });
5319
5336
  }
5320
- else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
5321
- selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
5337
+ else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
5322
5338
  // contains 语法
5323
- let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
5324
- let text = textMatch[2];
5339
+ const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
5340
+ const text = textMatch[2];
5325
5341
  selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
5326
5342
  return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
5327
5343
  return ($ele?.textContent || $ele?.innerText)?.includes(text);
5328
5344
  });
5329
5345
  }
5330
- else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
5331
- selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
5346
+ else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
5332
5347
  // regexp 语法
5333
- let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
5348
+ const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
5334
5349
  let pattern = textMatch[2];
5335
- let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
5350
+ const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
5336
5351
  let flags = "";
5337
5352
  if (flagMatch) {
5338
5353
  pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
5339
5354
  flags = flagMatch[3];
5340
5355
  }
5341
- let regexp = new RegExp(pattern, flags);
5356
+ const regexp = new RegExp(pattern, flags);
5342
5357
  selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
5343
5358
  return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
5344
5359
  return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
@@ -5380,11 +5395,10 @@
5380
5395
  selector = selector.replace(/:empty$/gi, "");
5381
5396
  return $el.matches(selector) && $el?.innerHTML?.trim() === "";
5382
5397
  }
5383
- else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
5384
- selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
5398
+ else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
5385
5399
  // contains 语法
5386
- let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
5387
- let text = textMatch[2];
5400
+ const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
5401
+ const text = textMatch[2];
5388
5402
  selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
5389
5403
  let content = $el?.textContent || $el?.innerText;
5390
5404
  if (typeof content !== "string") {
@@ -5392,18 +5406,17 @@
5392
5406
  }
5393
5407
  return $el.matches(selector) && content?.includes(text);
5394
5408
  }
5395
- else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
5396
- selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
5409
+ else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
5397
5410
  // regexp 语法
5398
- let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
5411
+ const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
5399
5412
  let pattern = textMatch[2];
5400
- let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
5413
+ const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
5401
5414
  let flags = "";
5402
5415
  if (flagMatch) {
5403
5416
  pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
5404
5417
  flags = flagMatch[3];
5405
5418
  }
5406
- let regexp = new RegExp(pattern, flags);
5419
+ const regexp = new RegExp(pattern, flags);
5407
5420
  selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
5408
5421
  let content = $el?.textContent || $el?.innerText;
5409
5422
  if (typeof content !== "string") {
@@ -5421,43 +5434,41 @@
5421
5434
  if (selector.match(/[^\s]{1}:empty$/gi)) {
5422
5435
  // empty 语法
5423
5436
  selector = selector.replace(/:empty$/gi, "");
5424
- let $closest = $el?.closest(selector);
5437
+ const $closest = $el?.closest(selector);
5425
5438
  if ($closest && $closest?.innerHTML?.trim() === "") {
5426
5439
  return $closest;
5427
5440
  }
5428
5441
  return null;
5429
5442
  }
5430
- else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
5431
- selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
5443
+ else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
5432
5444
  // contains 语法
5433
- let textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
5434
- let text = textMatch[2];
5445
+ const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
5446
+ const text = textMatch[2];
5435
5447
  selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
5436
- let $closest = $el?.closest(selector);
5448
+ const $closest = $el?.closest(selector);
5437
5449
  if ($closest) {
5438
- let content = $el?.textContent || $el?.innerText;
5450
+ const content = $el?.textContent || $el?.innerText;
5439
5451
  if (typeof content === "string" && content.includes(text)) {
5440
5452
  return $closest;
5441
5453
  }
5442
5454
  }
5443
5455
  return null;
5444
5456
  }
5445
- else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
5446
- selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
5457
+ else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
5447
5458
  // regexp 语法
5448
- let textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
5459
+ const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
5449
5460
  let pattern = textMatch[2];
5450
- let flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
5461
+ const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
5451
5462
  let flags = "";
5452
5463
  if (flagMatch) {
5453
5464
  pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
5454
5465
  flags = flagMatch[3];
5455
5466
  }
5456
- let regexp = new RegExp(pattern, flags);
5467
+ const regexp = new RegExp(pattern, flags);
5457
5468
  selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
5458
- let $closest = $el?.closest(selector);
5469
+ const $closest = $el?.closest(selector);
5459
5470
  if ($closest) {
5460
- let content = $el?.textContent || $el?.innerText;
5471
+ const content = $el?.textContent || $el?.innerText;
5461
5472
  if (typeof content === "string" && content.match(regexp)) {
5462
5473
  return $closest;
5463
5474
  }
@@ -5466,12 +5477,12 @@
5466
5477
  }
5467
5478
  else {
5468
5479
  // 普通语法
5469
- let $closest = $el?.closest(selector);
5480
+ const $closest = $el?.closest(selector);
5470
5481
  return $closest;
5471
5482
  }
5472
5483
  }
5473
5484
  }
5474
- let domUtils = new DOMUtils();
5485
+ const domUtils = new DOMUtils();
5475
5486
 
5476
5487
  class Utils {
5477
5488
  windowApi;
@@ -5479,12 +5490,12 @@
5479
5490
  this.windowApi = new WindowApi(option);
5480
5491
  }
5481
5492
  /** 版本号 */
5482
- version = "2025.9.8";
5493
+ version = "2025.9.14";
5483
5494
  addStyle(cssText) {
5484
5495
  if (typeof cssText !== "string") {
5485
5496
  throw new Error("Utils.addStyle 参数cssText 必须为String类型");
5486
5497
  }
5487
- let cssNode = this.windowApi.document.createElement("style");
5498
+ const cssNode = this.windowApi.document.createElement("style");
5488
5499
  cssNode.setAttribute("type", "text/css");
5489
5500
  cssNode.innerHTML = cssText;
5490
5501
  if (this.windowApi.document.head) {
@@ -5506,23 +5517,23 @@
5506
5517
  return cssNode;
5507
5518
  }
5508
5519
  /**
5509
- * JSON数据从源端替换到目标端中,如果目标端存在该数据则替换,不添加,返回结果为目标端替换完毕的结果
5510
- * @param target 目标数据
5511
- * @param source 源数据
5512
- * @param isAdd 是否可以追加键,默认false
5513
- * @example
5514
- * Utils.assign({"1":1,"2":{"3":3}}, {"2":{"3":4}});
5515
- * >
5516
- * {
5517
- "1": 1,
5518
- "2": {
5519
- "3": 4
5520
- }
5521
- }
5522
- */
5520
+ * JSON数据从源端替换到目标端中,如果目标端存在该数据则替换,不添加,返回结果为目标端替换完毕的结果
5521
+ * @param target 目标数据
5522
+ * @param source 源数据
5523
+ * @param isAdd 是否可以追加键,默认false
5524
+ * @example
5525
+ * Utils.assign({"1":1,"2":{"3":3}}, {"2":{"3":4}});
5526
+ * >
5527
+ * {
5528
+ "1": 1,
5529
+ "2": {
5530
+ "3": 4
5531
+ }
5532
+ }
5533
+ */
5523
5534
  assign = commonUtil.assign.bind(commonUtil);
5524
5535
  async asyncReplaceAll(string, pattern, asyncFn) {
5525
- let UtilsContext = this;
5536
+ const UtilsContext = this;
5526
5537
  if (typeof string !== "string") {
5527
5538
  throw new TypeError("string必须是字符串");
5528
5539
  }
@@ -5594,18 +5605,18 @@
5594
5605
  canvasElement.dispatchEvent(new MouseEvent("mouseup", eventInit));
5595
5606
  }
5596
5607
  checkUserClickInNode(element) {
5597
- let UtilsContext = this;
5608
+ const UtilsContext = this;
5598
5609
  if (!UtilsContext.isDOM(element)) {
5599
5610
  throw new Error("Utils.checkUserClickInNode 参数 targetNode 必须为 Element|Node 类型");
5600
5611
  }
5601
- let clickEvent = UtilsContext.windowApi.window.event;
5602
- let touchEvent = UtilsContext.windowApi.window.event;
5603
- let $click = clickEvent?.composedPath()?.[0];
5612
+ const clickEvent = UtilsContext.windowApi.window.event;
5613
+ const touchEvent = UtilsContext.windowApi.window.event;
5614
+ const $click = clickEvent?.composedPath()?.[0];
5604
5615
  // 点击的x坐标
5605
- let clickPosX = clickEvent?.clientX != null ? clickEvent.clientX : touchEvent.touches[0].clientX;
5616
+ const clickPosX = clickEvent?.clientX != null ? clickEvent.clientX : touchEvent.touches[0].clientX;
5606
5617
  // 点击的y坐标
5607
- let clickPosY = clickEvent?.clientY != null ? clickEvent.clientY : touchEvent.touches[0].clientY;
5608
- let {
5618
+ const clickPosY = clickEvent?.clientY != null ? clickEvent.clientY : touchEvent.touches[0].clientY;
5619
+ const {
5609
5620
  /* 要检测的元素的相对屏幕的横坐标最左边 */
5610
5621
  left: elementPosXLeft,
5611
5622
  /* 要检测的元素的相对屏幕的横坐标最右边 */
@@ -5633,32 +5644,32 @@
5633
5644
  * @param formData 需要clone的数据
5634
5645
  */
5635
5646
  cloneFormData(formData, filterFn) {
5636
- let clonedFormData = new FormData();
5637
- for (let [key, value] of formData.entries()) {
5638
- let isFilter = typeof filterFn === "function" ? filterFn(key, value) : false;
5647
+ const clonedFormData = new FormData();
5648
+ formData.forEach((value, key) => {
5649
+ const isFilter = typeof filterFn === "function" ? filterFn(key, value) : false;
5639
5650
  if (typeof isFilter === "boolean" && isFilter) {
5640
- continue;
5651
+ return;
5641
5652
  }
5642
5653
  clonedFormData.append(key, value);
5643
- }
5654
+ });
5644
5655
  return clonedFormData;
5645
5656
  }
5646
5657
  createOverload() {
5647
- let fnMap = new Map();
5658
+ const fnMap = new Map();
5648
5659
  function overload(...args) {
5649
- let key = args.map((it) => typeof it).join(",");
5650
- let fn = fnMap.get(key);
5660
+ const key = args.map((it) => typeof it).join(",");
5661
+ const fn = fnMap.get(key);
5651
5662
  if (!fn) {
5652
5663
  throw new TypeError("没有找到对应的实现");
5653
5664
  }
5654
5665
  return fn.apply(this, args);
5655
5666
  }
5656
5667
  overload.addImpl = function (...args) {
5657
- let fn = args.pop();
5668
+ const fn = args.pop();
5658
5669
  if (typeof fn !== "function") {
5659
5670
  throw new TypeError("最后一个参数必须是函数");
5660
5671
  }
5661
- let key = args.join(",");
5672
+ const key = args.join(",");
5662
5673
  fnMap.set(key, fn);
5663
5674
  };
5664
5675
  return overload;
@@ -5675,7 +5686,7 @@
5675
5686
  deepClone = commonUtil.deepClone.bind(commonUtil);
5676
5687
  debounce(fn, delay = 0) {
5677
5688
  let timer = null;
5678
- let UtilsContext = this;
5689
+ const UtilsContext = this;
5679
5690
  return function (...args) {
5680
5691
  UtilsContext.workerClearTimeout(timer);
5681
5692
  timer = UtilsContext.workerSetTimeout(function () {
@@ -5684,7 +5695,7 @@
5684
5695
  };
5685
5696
  }
5686
5697
  deleteParentNode(element, targetSelector) {
5687
- let UtilsContext = this;
5698
+ const UtilsContext = this;
5688
5699
  if (element == null) {
5689
5700
  return;
5690
5701
  }
@@ -5695,7 +5706,7 @@
5695
5706
  throw new Error("Utils.deleteParentNode 参数 targetSelector 必须为 string 类型");
5696
5707
  }
5697
5708
  let result = false;
5698
- let needRemoveDOM = domUtils.closest(element, targetSelector);
5709
+ const needRemoveDOM = domUtils.closest(element, targetSelector);
5699
5710
  if (needRemoveDOM) {
5700
5711
  needRemoveDOM.remove();
5701
5712
  result = true;
@@ -5725,7 +5736,7 @@
5725
5736
  eventNameList = [...eventName];
5726
5737
  }
5727
5738
  eventNameList.forEach((_eventName_) => {
5728
- let event = new Event(_eventName_);
5739
+ const event = new Event(_eventName_);
5729
5740
  if (details) {
5730
5741
  Object.assign(event, details);
5731
5742
  }
@@ -5733,7 +5744,7 @@
5733
5744
  });
5734
5745
  }
5735
5746
  downloadBase64(base64Data, fileName, isIFrame = false) {
5736
- let UtilsContext = this;
5747
+ const UtilsContext = this;
5737
5748
  if (typeof base64Data !== "string") {
5738
5749
  throw new Error("Utils.downloadBase64 参数 base64Data 必须为 string 类型");
5739
5750
  }
@@ -5765,7 +5776,7 @@
5765
5776
  let strFound;
5766
5777
  if (this.windowApi.globalThis.find) {
5767
5778
  /* CODE FOR BROWSERS THAT SUPPORT window.find */
5768
- let windowFind = this.windowApi.self.find;
5779
+ const windowFind = this.windowApi.self.find;
5769
5780
  strFound = windowFind(str, caseSensitive, true, true, false);
5770
5781
  if (strFound && this.windowApi.self.getSelection && !this.windowApi.self.getSelection().anchorNode) {
5771
5782
  strFound = windowFind(str, caseSensitive, true, true, false);
@@ -5799,19 +5810,19 @@
5799
5810
  return strFound ? true : false;
5800
5811
  }
5801
5812
  *findElementsWithText(element, text, filter) {
5802
- let that = this;
5813
+ const that = this;
5803
5814
  if (element.outerHTML.includes(text)) {
5804
5815
  if (element.children.length === 0) {
5805
- let filterResult = typeof filter === "function" ? filter(element) : false;
5816
+ const filterResult = typeof filter === "function" ? filter(element) : false;
5806
5817
  if (!filterResult) {
5807
5818
  yield element;
5808
5819
  }
5809
5820
  }
5810
5821
  else {
5811
- let textElement = Array.from(element.childNodes).filter((ele) => ele.nodeType === Node.TEXT_NODE);
5812
- for (let $child of textElement) {
5822
+ const textElement = Array.from(element.childNodes).filter((ele) => ele.nodeType === Node.TEXT_NODE);
5823
+ for (const $child of textElement) {
5813
5824
  if ($child.textContent.includes(text)) {
5814
- let filterResult = typeof filter === "function" ? filter(element) : false;
5825
+ const filterResult = typeof filter === "function" ? filter(element) : false;
5815
5826
  if (!filterResult) {
5816
5827
  yield $child;
5817
5828
  }
@@ -5820,7 +5831,7 @@
5820
5831
  }
5821
5832
  }
5822
5833
  for (let index = 0; index < element.children.length; index++) {
5823
- let $child = element.children[index];
5834
+ const $child = element.children[index];
5824
5835
  yield* that.findElementsWithText($child, text, filter);
5825
5836
  }
5826
5837
  }
@@ -5834,8 +5845,8 @@
5834
5845
  findVisibleElement(element) {
5835
5846
  let currentElement = element;
5836
5847
  while (currentElement) {
5837
- let elementRect = currentElement.getBoundingClientRect();
5838
- if (Boolean(elementRect.length)) {
5848
+ const elementRect = currentElement.getBoundingClientRect();
5849
+ if (elementRect.length) {
5839
5850
  return currentElement;
5840
5851
  }
5841
5852
  currentElement = currentElement.parentElement;
@@ -5849,7 +5860,7 @@
5849
5860
  }
5850
5861
  let result = 0;
5851
5862
  let resultType = "KB";
5852
- let sizeData = {};
5863
+ const sizeData = {};
5853
5864
  sizeData.B = 1;
5854
5865
  sizeData.KB = 1024;
5855
5866
  sizeData.MB = sizeData.KB * sizeData.KB;
@@ -5862,7 +5873,7 @@
5862
5873
  sizeData.BB = sizeData.YB * sizeData.KB;
5863
5874
  sizeData.NB = sizeData.BB * sizeData.KB;
5864
5875
  sizeData.DB = sizeData.NB * sizeData.KB;
5865
- for (let key in sizeData) {
5876
+ for (const key in sizeData) {
5866
5877
  result = byteSize / sizeData[key];
5867
5878
  resultType = key;
5868
5879
  if (sizeData.KB >= result) {
@@ -5875,7 +5886,7 @@
5875
5886
  }
5876
5887
  getNodeListValue(...args) {
5877
5888
  let resultArray = [];
5878
- for (let arg of args) {
5889
+ for (const arg of args) {
5879
5890
  let value = arg;
5880
5891
  if (typeof arg === "function") {
5881
5892
  /* 方法 */
@@ -5890,7 +5901,7 @@
5890
5901
  }
5891
5902
  getNonNullValue(...args) {
5892
5903
  let resultValue = args[args.length - 1];
5893
- let UtilsContext = this;
5904
+ const UtilsContext = this;
5894
5905
  for (const argValue of args) {
5895
5906
  if (UtilsContext.isNotNull(argValue)) {
5896
5907
  resultValue = argValue;
@@ -5900,7 +5911,7 @@
5900
5911
  return resultValue;
5901
5912
  }
5902
5913
  formatTime(text = new Date(), formatType = "yyyy-MM-dd HH:mm:ss") {
5903
- let time = text == null ? new Date() : new Date(text);
5914
+ const time = text == null ? new Date() : new Date(text);
5904
5915
  /**
5905
5916
  * 校验时间补0
5906
5917
  * @param timeNum
@@ -5908,7 +5919,7 @@
5908
5919
  */
5909
5920
  function checkTime(timeNum) {
5910
5921
  if (timeNum < 10)
5911
- return "0" + timeNum;
5922
+ return `0${timeNum}`;
5912
5923
  return timeNum;
5913
5924
  }
5914
5925
  /**
@@ -5919,7 +5930,7 @@
5919
5930
  function timeSystemChange(hourNum) {
5920
5931
  return hourNum > 12 ? hourNum - 12 : hourNum;
5921
5932
  }
5922
- let timeRegexp = {
5933
+ const timeRegexp = {
5923
5934
  yyyy: time.getFullYear(),
5924
5935
  /* 年 */
5925
5936
  MM: checkTime(time.getMonth() + 1),
@@ -5936,7 +5947,7 @@
5936
5947
  /* 秒 */
5937
5948
  };
5938
5949
  Object.keys(timeRegexp).forEach(function (key) {
5939
- let replaecRegexp = new RegExp(key, "g");
5950
+ const replaecRegexp = new RegExp(key, "g");
5940
5951
  formatType = formatType.replace(replaecRegexp, timeRegexp[key]);
5941
5952
  });
5942
5953
  return formatType;
@@ -5948,12 +5959,12 @@
5948
5959
  }
5949
5960
  if (text.length === 8) {
5950
5961
  /* 该字符串只有时分秒 */
5951
- let today = new Date();
5952
- text = today.getFullYear() + "-" + (today.getMonth() + 1) + "-" + today.getDate() + " " + text;
5962
+ const today = new Date();
5963
+ text = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()} ${text}`;
5953
5964
  }
5954
5965
  text = text.substring(0, 19);
5955
5966
  text = text.replace(/-/g, "/");
5956
- let timestamp = new Date(text).getTime();
5967
+ const timestamp = new Date(text).getTime();
5957
5968
  return timestamp;
5958
5969
  }
5959
5970
  /**
@@ -6003,16 +6014,16 @@
6003
6014
  if (timestamp2.toString().length === 10) {
6004
6015
  timestamp2 = timestamp2 * 1000;
6005
6016
  }
6006
- let smallTimeStamp = timestamp1 > timestamp2 ? timestamp2 : timestamp1;
6007
- let bigTimeStamp = timestamp1 > timestamp2 ? timestamp1 : timestamp2;
6008
- let oneSecond = 1000; /* 一秒的毫秒数 */
6009
- let oneMinute = 60 * oneSecond; /* 一分钟的毫秒数 */
6010
- let oneHour = 60 * oneMinute; /* 一小时的毫秒数 */
6011
- let oneDay = 24 * oneHour; /* 一天的毫秒数 */
6012
- let oneMonth = 30 * oneDay; /* 一个月的毫秒数(30天) */
6013
- let oneYear = 12 * oneMonth; /* 一年的毫秒数 */
6014
- let bigDate = new Date(bigTimeStamp);
6015
- let smallDate = new Date(smallTimeStamp);
6017
+ const smallTimeStamp = timestamp1 > timestamp2 ? timestamp2 : timestamp1;
6018
+ const bigTimeStamp = timestamp1 > timestamp2 ? timestamp1 : timestamp2;
6019
+ const oneSecond = 1000; /* 一秒的毫秒数 */
6020
+ const oneMinute = 60 * oneSecond; /* 一分钟的毫秒数 */
6021
+ const oneHour = 60 * oneMinute; /* 一小时的毫秒数 */
6022
+ const oneDay = 24 * oneHour; /* 一天的毫秒数 */
6023
+ const oneMonth = 30 * oneDay; /* 一个月的毫秒数(30天) */
6024
+ const oneYear = 12 * oneMonth; /* 一年的毫秒数 */
6025
+ const bigDate = new Date(bigTimeStamp);
6026
+ const smallDate = new Date(smallTimeStamp);
6016
6027
  let remainderValue = 1;
6017
6028
  if (type === "年") {
6018
6029
  remainderValue = oneYear;
@@ -6034,30 +6045,30 @@
6034
6045
  }
6035
6046
  let diffValue = Math.round(Math.abs((bigDate - smallDate) / remainderValue));
6036
6047
  if (type === "auto") {
6037
- let timeDifference = bigTimeStamp - smallTimeStamp;
6048
+ const timeDifference = bigTimeStamp - smallTimeStamp;
6038
6049
  diffValue = Math.floor(timeDifference / (24 * 3600 * 1000));
6039
6050
  if (diffValue > 0) {
6040
- diffValue = diffValue + "天";
6051
+ diffValue = `${diffValue}天`;
6041
6052
  }
6042
6053
  else {
6043
6054
  /* 计算出小时数 */
6044
- let leave1 = timeDifference % (24 * 3600 * 1000); /* 计算天数后剩余的毫秒数 */
6045
- let hours = Math.floor(leave1 / (3600 * 1000));
6055
+ const leave1 = timeDifference % (24 * 3600 * 1000); /* 计算天数后剩余的毫秒数 */
6056
+ const hours = Math.floor(leave1 / (3600 * 1000));
6046
6057
  if (hours > 0) {
6047
- diffValue = hours + "小时";
6058
+ diffValue = `${hours}小时`;
6048
6059
  }
6049
6060
  else {
6050
6061
  /* 计算相差分钟数 */
6051
- let leave2 = leave1 % (3600 * 1000); /* 计算小时数后剩余的毫秒数 */
6052
- let minutes = Math.floor(leave2 / (60 * 1000));
6062
+ const leave2 = leave1 % (3600 * 1000); /* 计算小时数后剩余的毫秒数 */
6063
+ const minutes = Math.floor(leave2 / (60 * 1000));
6053
6064
  if (minutes > 0) {
6054
- diffValue = minutes + "分钟";
6065
+ diffValue = `${minutes}分钟`;
6055
6066
  }
6056
6067
  else {
6057
6068
  /* 计算相差秒数 */
6058
- let leave3 = leave2 % (60 * 1000); /* 计算分钟数后剩余的毫秒数 */
6059
- let seconds = Math.round(leave3 / 1000);
6060
- diffValue = seconds + "秒";
6069
+ const leave3 = leave2 % (60 * 1000); /* 计算分钟数后剩余的毫秒数 */
6070
+ const seconds = Math.round(leave3 / 1000);
6071
+ diffValue = `${seconds}秒`;
6061
6072
  }
6062
6073
  }
6063
6074
  }
@@ -6065,14 +6076,14 @@
6065
6076
  return diffValue;
6066
6077
  }
6067
6078
  getElementSelector(element) {
6068
- let UtilsContext = this;
6079
+ const UtilsContext = this;
6069
6080
  if (!element)
6070
6081
  return void 0;
6071
6082
  if (!element.parentElement)
6072
6083
  return void 0;
6073
6084
  /* 如果元素有id属性,则直接返回id选择器 */
6074
6085
  if (element.id)
6075
- return "#" + element.id;
6086
+ return `#${element.id}`;
6076
6087
  /* 递归地获取父元素的选择器 */
6077
6088
  let selector = UtilsContext.getElementSelector(element.parentElement);
6078
6089
  if (!selector) {
@@ -6080,11 +6091,11 @@
6080
6091
  }
6081
6092
  /* 如果有多个相同类型的兄弟元素,则需要添加索引 */
6082
6093
  if (element.parentElement.querySelectorAll(element.tagName).length > 1) {
6083
- let index = Array.prototype.indexOf.call(element.parentElement.children, element) + 1;
6084
- selector += " > " + element.tagName.toLowerCase() + ":nth-child(" + index + ")";
6094
+ const index = Array.prototype.indexOf.call(element.parentElement.children, element) + 1;
6095
+ selector += ` > ${element.tagName.toLowerCase()}:nth-child(${index})`;
6085
6096
  }
6086
6097
  else {
6087
- selector += " > " + element.tagName.toLowerCase();
6098
+ selector += ` > ${element.tagName.toLowerCase()}`;
6088
6099
  }
6089
6100
  return selector;
6090
6101
  }
@@ -6095,15 +6106,15 @@
6095
6106
  * > 2
6096
6107
  */
6097
6108
  getMaxValue(...args) {
6098
- let result = [...args];
6109
+ const result = [...args];
6099
6110
  let newResult = [];
6100
6111
  if (result.length === 0) {
6101
6112
  return void 0;
6102
6113
  }
6103
6114
  if (result.length > 1) {
6104
6115
  if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
6105
- let data = result[0];
6106
- let handleDataFunc = result[1];
6116
+ const data = result[0];
6117
+ const handleDataFunc = result[1];
6107
6118
  Object.keys(data).forEach((keyName) => {
6108
6119
  newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
6109
6120
  });
@@ -6151,7 +6162,7 @@
6151
6162
  */
6152
6163
  function queryMaxZIndex($ele) {
6153
6164
  if (typeof ignoreCallBack === "function") {
6154
- let ignoreResult = ignoreCallBack($ele);
6165
+ const ignoreResult = ignoreCallBack($ele);
6155
6166
  if (typeof ignoreResult === "boolean" && !ignoreResult) {
6156
6167
  return;
6157
6168
  }
@@ -6160,7 +6171,7 @@
6160
6171
  const nodeStyle = UtilsContext.windowApi.window.getComputedStyle($ele);
6161
6172
  /* 不对position为static和display为none的元素进行获取它们的z-index */
6162
6173
  if (isVisibleNode(nodeStyle)) {
6163
- let nodeZIndex = parseInt(nodeStyle.zIndex);
6174
+ const nodeZIndex = parseInt(nodeStyle.zIndex);
6164
6175
  if (!isNaN(nodeZIndex)) {
6165
6176
  if (nodeZIndex > zIndex) {
6166
6177
  // 赋值到全局
@@ -6176,7 +6187,7 @@
6176
6187
  }
6177
6188
  }
6178
6189
  }
6179
- target.querySelectorAll("*").forEach(($ele, index) => {
6190
+ target.querySelectorAll("*").forEach(($ele) => {
6180
6191
  queryMaxZIndex($ele);
6181
6192
  });
6182
6193
  zIndex += deviation;
@@ -6193,15 +6204,15 @@
6193
6204
  return this.getMaxZIndexNodeInfo(deviation, target, ignoreCallBack).zIndex;
6194
6205
  }
6195
6206
  getMinValue(...args) {
6196
- let result = [...args];
6207
+ const result = [...args];
6197
6208
  let newResult = [];
6198
6209
  if (result.length === 0) {
6199
6210
  return void 0;
6200
6211
  }
6201
6212
  if (result.length > 1) {
6202
6213
  if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
6203
- let data = result[0];
6204
- let handleDataFunc = result[1];
6214
+ const data = result[0];
6215
+ const handleDataFunc = result[1];
6205
6216
  Object.keys(data).forEach((keyName) => {
6206
6217
  newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
6207
6218
  });
@@ -6231,8 +6242,8 @@
6231
6242
  * > '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'
6232
6243
  **/
6233
6244
  getRandomAndroidUA() {
6234
- let UtilsContext = this;
6235
- let mobileNameList = [
6245
+ const UtilsContext = this;
6246
+ const mobileNameList = [
6236
6247
  "LDN-LX3",
6237
6248
  "RNE-L03",
6238
6249
  "ASUS_X00ID Build/NMF26F",
@@ -6249,14 +6260,14 @@
6249
6260
  "MI 13 Build/OPR1.170623.027; wv",
6250
6261
  ];
6251
6262
  /* 安卓版本 */
6252
- let androidVersion = UtilsContext.getRandomValue(12, 14);
6263
+ const androidVersion = UtilsContext.getRandomValue(12, 14);
6253
6264
  /* 手机型号 */
6254
- let randomMobile = UtilsContext.getRandomValue(mobileNameList);
6265
+ const randomMobile = UtilsContext.getRandomValue(mobileNameList);
6255
6266
  /* chrome大版本号 */
6256
- let chromeVersion1 = UtilsContext.getRandomValue(120, 132);
6257
- let chromeVersion2 = UtilsContext.getRandomValue(0, 0);
6258
- let chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
6259
- let chromeVersion4 = UtilsContext.getRandomValue(1, 218);
6267
+ const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
6268
+ const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
6269
+ const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
6270
+ const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
6260
6271
  return `Mozilla/5.0 (Linux; Android ${androidVersion}; ${randomMobile}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Mobile Safari/537.36`;
6261
6272
  }
6262
6273
  /**
@@ -6278,20 +6289,20 @@
6278
6289
  * > 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5068.19 Safari/537.36'
6279
6290
  **/
6280
6291
  getRandomPCUA() {
6281
- let UtilsContext = this;
6292
+ const UtilsContext = this;
6282
6293
  /* chrome大版本号 */
6283
- let chromeVersion1 = UtilsContext.getRandomValue(120, 132);
6284
- let chromeVersion2 = UtilsContext.getRandomValue(0, 0);
6285
- let chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
6286
- let chromeVersion4 = UtilsContext.getRandomValue(1, 218);
6294
+ const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
6295
+ const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
6296
+ const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
6297
+ const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
6287
6298
  return `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Safari/537.36`;
6288
6299
  }
6289
6300
  getRandomValue(...args) {
6290
- let result = [...args];
6301
+ const result = [...args];
6291
6302
  if (result.length > 1) {
6292
6303
  if (result.length === 2 && typeof result[0] === "number" && typeof result[1] === "number") {
6293
- let leftNumber = result[0] > result[1] ? result[1] : result[0];
6294
- let rightNumber = result[0] > result[1] ? result[0] : result[1];
6304
+ const leftNumber = result[0] > result[1] ? result[1] : result[0];
6305
+ const rightNumber = result[0] > result[1] ? result[0] : result[1];
6295
6306
  return Math.round(Math.random() * (rightNumber - leftNumber)) + leftNumber;
6296
6307
  }
6297
6308
  else {
@@ -6299,12 +6310,12 @@
6299
6310
  }
6300
6311
  }
6301
6312
  else if (result.length === 1) {
6302
- let paramData = result[0];
6313
+ const paramData = result[0];
6303
6314
  if (Array.isArray(paramData)) {
6304
6315
  return paramData[Math.floor(Math.random() * paramData.length)];
6305
6316
  }
6306
6317
  else if (typeof paramData === "object" && Object.keys(paramData).length > 0) {
6307
- let paramObjDataKey = Object.keys(paramData)[Math.floor(Math.random() * Object.keys(paramData).length)];
6318
+ const paramObjDataKey = Object.keys(paramData)[Math.floor(Math.random() * Object.keys(paramData).length)];
6308
6319
  return paramData[paramObjDataKey];
6309
6320
  }
6310
6321
  else {
@@ -6320,7 +6331,7 @@
6320
6331
  * Utils.getReactObj(document.querySelector("input"))?.reactProps?.onChange({target:{value:"123"}});
6321
6332
  */
6322
6333
  getReactObj(element) {
6323
- let result = {};
6334
+ const result = {};
6324
6335
  if (element == null) {
6325
6336
  return result;
6326
6337
  }
@@ -6346,9 +6357,9 @@
6346
6357
  if (typeof target !== "object") {
6347
6358
  throw new TypeError("target不是一个对象");
6348
6359
  }
6349
- let objectsSymbols = Object.getOwnPropertySymbols(target);
6360
+ const objectsSymbols = Object.getOwnPropertySymbols(target);
6350
6361
  if (typeof keyName === "string") {
6351
- let findSymbol = objectsSymbols.find((key) => {
6362
+ const findSymbol = objectsSymbols.find((key) => {
6352
6363
  return key.toString() === keyName;
6353
6364
  });
6354
6365
  if (findSymbol) {
@@ -6356,7 +6367,7 @@
6356
6367
  }
6357
6368
  }
6358
6369
  else if (typeof keyName === "symbol") {
6359
- let findSymbol = objectsSymbols.find((key) => {
6370
+ const findSymbol = objectsSymbols.find((key) => {
6360
6371
  return key === keyName;
6361
6372
  });
6362
6373
  if (findSymbol) {
@@ -6364,7 +6375,7 @@
6364
6375
  }
6365
6376
  }
6366
6377
  else {
6367
- let result = {};
6378
+ const result = {};
6368
6379
  objectsSymbols.forEach((item) => {
6369
6380
  result[item] = target[item];
6370
6381
  });
@@ -6379,12 +6390,12 @@
6379
6390
  * > 12
6380
6391
  */
6381
6392
  getTextLength(text) {
6382
- let encoder = new TextEncoder();
6383
- let bytes = encoder.encode(text);
6393
+ const encoder = new TextEncoder();
6394
+ const bytes = encoder.encode(text);
6384
6395
  return bytes.length;
6385
6396
  }
6386
6397
  getTextStorageSize(text, addType = true) {
6387
- let UtilsContext = this;
6398
+ const UtilsContext = this;
6388
6399
  return UtilsContext.formatByteToSize(UtilsContext.getTextLength(text), addType);
6389
6400
  }
6390
6401
  getThunderUrl(url) {
@@ -6397,88 +6408,75 @@
6397
6408
  if (url.trim() === "") {
6398
6409
  throw new TypeError("url不能为空字符串或纯空格");
6399
6410
  }
6400
- return `thunder://${this.windowApi.globalThis.btoa("AA" + url + "ZZ")}`;
6411
+ return `thunder://${this.windowApi.globalThis.btoa(`AA${url}ZZ`)}`;
6401
6412
  }
6402
6413
  /**
6403
- * 对于GM_cookie的兼容写法,当无法使用GM_cookie时可以使用这个,但是并不完全兼容,有些写不出来且限制了httponly是无法访问的
6404
- * @example
6405
- let GM_cookie = new Utils.GM_Cookie();
6406
- GM_cookie.list({name:"xxx_cookie_xxx"},function(cookies,error){
6407
- if (!error) {
6408
- console.log(cookies);
6409
- console.log(cookies.value);
6410
- } else {
6411
- console.error(error);
6412
- }
6413
- });
6414
- GM_cookie.set({name:"xxx_cookie_test_xxx",value:"这是Cookie测试值"},function(error){
6415
- if (error) {
6416
- console.error(error);
6417
- } else {
6418
- console.log('Cookie set successfully.');
6419
- }
6420
- })
6421
- GM_cookie.delete({name:"xxx_cookie_test_xxx"},function(error){
6422
- if (error) {
6423
- console.error(error);
6424
- } else {
6425
- console.log('Cookie set successfully.');
6426
- }
6427
- })
6428
- **/
6414
+ * 对于GM_cookie的兼容写法,当无法使用GM_cookie时可以使用这个,但是并不完全兼容,有些写不出来且限制了httponly是无法访问的
6415
+ * @example
6416
+ let GM_cookie = new Utils.GM_Cookie();
6417
+ GM_cookie.list({name:"xxx_cookie_xxx"},function(cookies,error){
6418
+ if (!error) {
6419
+ console.log(cookies);
6420
+ console.log(cookies.value);
6421
+ } else {
6422
+ console.error(error);
6423
+ }
6424
+ });
6425
+ GM_cookie.set({name:"xxx_cookie_test_xxx",value:"这是Cookie测试值"},function(error){
6426
+ if (error) {
6427
+ console.error(error);
6428
+ } else {
6429
+ console.log('Cookie set successfully.');
6430
+ }
6431
+ })
6432
+ GM_cookie.delete({name:"xxx_cookie_test_xxx"},function(error){
6433
+ if (error) {
6434
+ console.error(error);
6435
+ } else {
6436
+ console.log('Cookie set successfully.');
6437
+ }
6438
+ })
6439
+ **/
6429
6440
  GM_Cookie = UtilsGMCookie;
6430
6441
  /**
6431
- * 注册油猴菜单,要求本地存储的键名不能存在其它键名`GM_Menu_Local_Map`会冲突/覆盖
6432
- * @example
6433
- let GM_Menu = new Utils.GM_Menu({
6434
- data: [
6435
- {
6436
- menu_key: "menu_key",
6437
- text: "测试按钮",
6438
- enable: true,
6439
- accessKey: "a",
6440
- autoClose: false,
6441
- showText(text, enable) {
6442
- return "[" + (enable ? "√" : "×") + "]" + text;
6442
+ * 注册油猴菜单,要求本地存储的键名不能存在其它键名`GM_Menu_Local_Map`会冲突/覆盖
6443
+ * @example
6444
+ let GM_Menu = new Utils.GM_Menu({
6445
+ data: [
6446
+ {
6447
+ menu_key: "menu_key",
6448
+ text: "测试按钮",
6449
+ enable: true,
6450
+ accessKey: "a",
6451
+ autoClose: false,
6452
+ showText(text, enable) {
6453
+ return "[" + (enable ? "√" : "×") + "]" + text;
6454
+ },
6455
+ callback(data) {
6456
+ console.log("点击菜单,值修改为", data.enable);
6457
+ },
6443
6458
  },
6444
- callback(data) {
6445
- console.log("点击菜单,值修改为", data.enable);
6446
- },
6447
- },
6448
- ],
6449
- autoReload: false,
6450
- GM_getValue,
6451
- GM_setValue,
6452
- GM_registerMenuCommand,
6453
- GM_unregisterMenuCommand,
6454
- });
6455
-
6456
-
6457
- // 获取某个菜单项的值
6458
- GM_Menu.get("menu_key");
6459
- > true
6460
-
6461
- // 获取某个菜单项的开启/关闭后显示的文本
6462
- GM_Menu.getShowTextValue("menu_key");
6463
- > √测试按钮
6464
-
6465
- // 添加键为menu_key2的菜单项
6466
- GM_Menu.add({
6467
- key:"menu_key2",
6468
- text: "测试按钮2",
6469
- enable: false,
6470
- showText(text,enable){
6471
- return "[" + (enable ? "√" : "×") + "]" + text;
6472
- },
6473
- callback(data){
6474
- console.log("点击菜单,值修改为",data.enable);
6475
- }
6476
- });
6477
- // 使用数组的方式添加多个菜单,如menu_key3、menu_key4
6478
- GM_Menu.add([
6479
- {
6480
- key:"menu_key3",
6481
- text: "测试按钮3",
6459
+ ],
6460
+ autoReload: false,
6461
+ GM_getValue,
6462
+ GM_setValue,
6463
+ GM_registerMenuCommand,
6464
+ GM_unregisterMenuCommand,
6465
+ });
6466
+
6467
+
6468
+ // 获取某个菜单项的值
6469
+ GM_Menu.get("menu_key");
6470
+ > true
6471
+
6472
+ // 获取某个菜单项的开启/关闭后显示的文本
6473
+ GM_Menu.getShowTextValue("menu_key");
6474
+ > √测试按钮
6475
+
6476
+ // 添加键为menu_key2的菜单项
6477
+ GM_Menu.add({
6478
+ key:"menu_key2",
6479
+ text: "测试按钮2",
6482
6480
  enable: false,
6483
6481
  showText(text,enable){
6484
6482
  return "[" + (enable ? "√" : "×") + "]" + text;
@@ -6486,152 +6484,165 @@
6486
6484
  callback(data){
6487
6485
  console.log("点击菜单,值修改为",data.enable);
6488
6486
  }
6489
- },
6490
- {
6491
- key:"menu_key4",
6492
- text: "测试按钮4",
6493
- enable: false,
6494
- showText(text,enable){
6495
- return "[" + (enable ? "√" : "×") + "]" + text;
6487
+ });
6488
+ // 使用数组的方式添加多个菜单,如menu_key3、menu_key4
6489
+ GM_Menu.add([
6490
+ {
6491
+ key:"menu_key3",
6492
+ text: "测试按钮3",
6493
+ enable: false,
6494
+ showText(text,enable){
6495
+ return "[" + (enable ? "√" : "×") + "]" + text;
6496
+ },
6497
+ callback(data){
6498
+ console.log("点击菜单,值修改为",data.enable);
6499
+ }
6496
6500
  },
6497
- callback(data){
6498
- console.log("点击菜单,值修改为",data.enable);
6501
+ {
6502
+ key:"menu_key4",
6503
+ text: "测试按钮4",
6504
+ enable: false,
6505
+ showText(text,enable){
6506
+ return "[" + (enable ? "√" : "×") + "]" + text;
6507
+ },
6508
+ callback(data){
6509
+ console.log("点击菜单,值修改为",data.enable);
6510
+ }
6499
6511
  }
6500
- }
6501
- ]);
6502
-
6503
- // 更新键为menu_key的显示文字和点击回调
6504
- GM_Menu.update({
6505
- menu_key:{
6506
- text: "更新后的测试按钮",
6507
- enable: true,
6508
- showText(text,enable){
6509
- return "[" + (enable ? "√" : "×") + "]" + text;
6510
- },
6511
- callback(data){
6512
- console.log("点击菜单更新后的测试按钮,新值修改为",data.enable);
6512
+ ]);
6513
+
6514
+ // 更新键为menu_key的显示文字和点击回调
6515
+ GM_Menu.update({
6516
+ menu_key:{
6517
+ text: "更新后的测试按钮",
6518
+ enable: true,
6519
+ showText(text,enable){
6520
+ return "[" + (enable ? "√" : "×") + "]" + text;
6521
+ },
6522
+ callback(data){
6523
+ console.log("点击菜单更新后的测试按钮,新值修改为",data.enable);
6524
+ }
6513
6525
  }
6514
- }
6515
- });
6516
-
6517
- // 删除键为menu_key的菜单
6518
- GM_Menu.delete("menu_key");
6519
- **/
6526
+ });
6527
+
6528
+ // 删除键为menu_key的菜单
6529
+ GM_Menu.delete("menu_key");
6530
+ **/
6520
6531
  GM_Menu = GMMenu;
6521
6532
  /**
6522
- * 基于Function prototype,能够勾住和释放任何函数
6523
- *
6524
- * .hook
6525
- * + realFunc {string} 用于保存原始函数的函数名称,用于unHook
6526
- * + hookFunc {string} 替换的hook函数
6527
- * + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
6528
- * + methodName {string} 匿名函数需显式传入目标函数名eg:this.Begin = function(){....};}
6529
- *
6530
- * .unhook
6531
- * + realFunc {string} 用于保存原始函数的函数名称,用于unHook
6532
- * + funcName {string} 被Hook的函数名称
6533
- * + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
6534
- * @example
6535
- let hook = new Utils.Hooks();
6536
- hook.initEnv();
6537
- function myFunction(){
6538
- console.log("我自己需要执行的函数");
6539
- }
6540
- function testFunction(){
6541
- console.log("正常执行的函数");
6542
- }
6543
- testFunction.hook(testFunction,myFunction,window);
6544
- **/
6533
+ * 基于Function prototype,能够勾住和释放任何函数
6534
+ *
6535
+ * .hook
6536
+ * + realFunc {string} 用于保存原始函数的函数名称,用于unHook
6537
+ * + hookFunc {string} 替换的hook函数
6538
+ * + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
6539
+ * + methodName {string} 匿名函数需显式传入目标函数名eg:this.Begin = function(){....};}
6540
+ *
6541
+ * .unhook
6542
+ * + realFunc {string} 用于保存原始函数的函数名称,用于unHook
6543
+ * + funcName {string} 被Hook的函数名称
6544
+ * + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
6545
+ * @example
6546
+ let hook = new Utils.Hooks();
6547
+ hook.initEnv();
6548
+ function myFunction(){
6549
+ console.log("我自己需要执行的函数");
6550
+ }
6551
+ function testFunction(){
6552
+ console.log("正常执行的函数");
6553
+ }
6554
+ testFunction.hook(testFunction,myFunction,window);
6555
+ **/
6545
6556
  Hooks = Hooks;
6546
6557
  /**
6547
- * 为减少代码量和回调,把GM_xmlhttpRequest封装
6548
- * 文档地址: https://www.tampermonkey.net/documentation.php?ext=iikm
6549
- * 其中onloadstart、onprogress、onreadystatechange是回调形式,onabort、ontimeout、onerror可以设置全局回调函数
6550
- * @param _GM_xmlHttpRequest_ 油猴中的GM_xmlhttpRequest
6551
- * @example
6552
- let httpx = new Utils.Httpx(GM_xmlhttpRequest);
6553
- let postResp = await httpx.post({
6554
- url:url,
6555
- data:JSON.stringify({
6556
- test:1
6557
- }),
6558
- timeout: 5000
6559
- });
6560
- console.log(postResp);
6561
- > {
6562
- status: true,
6563
- data: {responseText: "...", response: xxx,...},
6564
- msg: "请求完毕",
6565
- type: "onload",
6566
- }
6567
-
6568
- if(postResp === "onload" && postResp.status){
6569
- // onload
6570
- }else if(postResp === "ontimeout"){
6571
- // ontimeout
6572
- }
6573
- * @example
6574
- // 也可以先配置全局参数
6575
- let httpx = new Utils.Httpx(GM_xmlhttpRequest);
6576
- httpx.config({
6577
- timeout: 5000,
6578
- async: false,
6579
- responseType: "html",
6580
- redirect: "follow",
6581
- })
6582
- // 优先级为 默认details < 全局details < 单独的details
6583
- */
6558
+ * 为减少代码量和回调,把GM_xmlhttpRequest封装
6559
+ * 文档地址: https://www.tampermonkey.net/documentation.php?ext=iikm
6560
+ * 其中onloadstart、onprogress、onreadystatechange是回调形式,onabort、ontimeout、onerror可以设置全局回调函数
6561
+ * @param _GM_xmlHttpRequest_ 油猴中的GM_xmlhttpRequest
6562
+ * @example
6563
+ let httpx = new Utils.Httpx(GM_xmlhttpRequest);
6564
+ let postResp = await httpx.post({
6565
+ url:url,
6566
+ data:JSON.stringify({
6567
+ test:1
6568
+ }),
6569
+ timeout: 5000
6570
+ });
6571
+ console.log(postResp);
6572
+ > {
6573
+ status: true,
6574
+ data: {responseText: "...", response: xxx,...},
6575
+ msg: "请求完毕",
6576
+ type: "onload",
6577
+ }
6578
+
6579
+ if(postResp === "onload" && postResp.status){
6580
+ // onload
6581
+ }else if(postResp === "ontimeout"){
6582
+ // ontimeout
6583
+ }
6584
+ * @example
6585
+ // 也可以先配置全局参数
6586
+ let httpx = new Utils.Httpx(GM_xmlhttpRequest);
6587
+ httpx.config({
6588
+ timeout: 5000,
6589
+ async: false,
6590
+ responseType: "html",
6591
+ redirect: "follow",
6592
+ })
6593
+ // 优先级为 默认details < 全局details < 单独的details
6594
+ */
6584
6595
  Httpx = Httpx;
6585
6596
  /**
6586
- * 浏览器端的indexedDB操作封装
6587
- * @example
6588
- let db = new Utils.indexedDB('web_DB', 'nav_text')
6589
- let data = {name:'管理员', roleId: 1, type: 1};
6590
- db.save('list',data).then((resolve)=>{
6591
- console.log(resolve,'存储成功')
6592
- })
6593
-
6594
- db.get('list').then((resolve)=>{
6595
- console.log(resolve,'查询成功')
6596
- })
6597
-
6598
- db.getPaging('list',20,10).then((resolve)=>{
6599
- console.log(resolve,'查询分页偏移第20,一共10行成功');
6600
- })
6601
-
6602
- db.delete('list').then(resolve=>{
6603
- console.log(resolve,'删除成功---->>>>>>name')
6604
- })
6605
-
6606
- db.deleteAll().then(resolve=>{
6607
- console.log(resolve,'清除数据库---->>>>>>name')
6608
- })
6609
- **/
6597
+ * 浏览器端的indexedDB操作封装
6598
+ * @example
6599
+ let db = new Utils.indexedDB('web_DB', 'nav_text')
6600
+ let data = {name:'管理员', roleId: 1, type: 1};
6601
+ db.save('list',data).then((resolve)=>{
6602
+ console.log(resolve,'存储成功')
6603
+ })
6604
+
6605
+ db.get('list').then((resolve)=>{
6606
+ console.log(resolve,'查询成功')
6607
+ })
6608
+
6609
+ db.getPaging('list',20,10).then((resolve)=>{
6610
+ console.log(resolve,'查询分页偏移第20,一共10行成功');
6611
+ })
6612
+
6613
+ db.delete('list').then(resolve=>{
6614
+ console.log(resolve,'删除成功---->>>>>>name')
6615
+ })
6616
+
6617
+ db.deleteAll().then(resolve=>{
6618
+ console.log(resolve,'清除数据库---->>>>>>name')
6619
+ })
6620
+ **/
6610
6621
  indexedDB = indexedDB;
6611
6622
  isNativeFunc(target) {
6612
6623
  return Boolean(target.toString().match(/^function .*\(\) { \[native code\] }$/));
6613
6624
  }
6614
6625
  isNearBottom(...args) {
6615
6626
  let nearBottomHeight = 50;
6616
- let checkWindow = () => {
6627
+ const checkWindow = () => {
6617
6628
  // 已滚动的距离
6618
- let scrollTop = this.windowApi.window.pageYOffset || this.windowApi.document.documentElement.scrollTop;
6629
+ const scrollTop = this.windowApi.window.pageYOffset || this.windowApi.document.documentElement.scrollTop;
6619
6630
  // 视窗高度
6620
- let viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
6631
+ const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
6621
6632
  // 最大滚动距离
6622
- let maxScrollHeight = this.windowApi.document.documentElement.scrollHeight - nearBottomHeight;
6633
+ const maxScrollHeight = this.windowApi.document.documentElement.scrollHeight - nearBottomHeight;
6623
6634
  return scrollTop + viewportHeight >= maxScrollHeight;
6624
6635
  };
6625
- let checkNode = ($ele) => {
6636
+ const checkNode = ($ele) => {
6626
6637
  // 已滚动的距离
6627
- let scrollTop = $ele.scrollTop;
6638
+ const scrollTop = $ele.scrollTop;
6628
6639
  // 视窗高度
6629
- let viewportHeight = $ele.clientHeight;
6640
+ const viewportHeight = $ele.clientHeight;
6630
6641
  // 最大滚动距离
6631
- let maxScrollHeight = $ele.scrollHeight - viewportHeight - nearBottomHeight;
6642
+ const maxScrollHeight = $ele.scrollHeight - viewportHeight - nearBottomHeight;
6632
6643
  return scrollTop >= maxScrollHeight;
6633
6644
  };
6634
- let firstArg = args[0];
6645
+ const firstArg = args[0];
6635
6646
  if (args.length === 0 || typeof args[0] === "number") {
6636
6647
  // nearBottomHeight
6637
6648
  //
@@ -6646,7 +6657,7 @@
6646
6657
  return checkNode(args[0]);
6647
6658
  }
6648
6659
  else {
6649
- throw new TypeError("参数1类型错误" + typeof firstArg);
6660
+ throw new TypeError(`参数1类型错误${typeof firstArg}`);
6650
6661
  }
6651
6662
  }
6652
6663
  /**
@@ -6676,7 +6687,7 @@
6676
6687
  }
6677
6688
  if (typeof target === "object") {
6678
6689
  /* 也有种可能,这个jQuery对象是1.8.3版本的,页面中的jQuery是3.4.1版本的 */
6679
- let jQueryProps = [
6690
+ const jQueryProps = [
6680
6691
  "add",
6681
6692
  "addBack",
6682
6693
  "addClass",
@@ -6860,50 +6871,50 @@
6860
6871
  */
6861
6872
  isNotNull = commonUtil.isNotNull.bind(commonUtil);
6862
6873
  /**
6863
- * 判断对象或数据是否为空
6864
- * + `String`判空的值,如 ""、"null"、"undefined"、" "
6865
- * + `Number`判空的值,如 0
6866
- * + `Object`判空的值,如 {}、null、undefined
6867
- * + `Array`(存在属性Symbol.iterator)判空的值,如 []
6868
- * + `Boolean`判空的值,如false
6869
- * + `Function`判空的值,如()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){}
6870
- * @returns
6871
- * + true 为空
6872
- * + false 不为空
6873
- * @example
6874
- Utils.isNull({});
6875
- > true
6876
- * @example
6877
- Utils.isNull([]);
6878
- > true
6879
- * @example
6880
- Utils.isNull(" ");
6881
- > true
6882
- * @example
6883
- Utils.isNull(function(){});
6884
- > true
6885
- * @example
6886
- Utils.isNull(()=>{}));
6887
- > true
6888
- * @example
6889
- Utils.isNull("undefined");
6890
- > true
6891
- * @example
6892
- Utils.isNull("null");
6893
- > true
6894
- * @example
6895
- Utils.isNull(" ", false);
6896
- > true
6897
- * @example
6898
- Utils.isNull([1],[]);
6899
- > false
6900
- * @example
6901
- Utils.isNull([],[1]);
6902
- > false
6903
- * @example
6904
- Utils.isNull(false,[123]);
6905
- > false
6906
- **/
6874
+ * 判断对象或数据是否为空
6875
+ * + `String`判空的值,如 ""、"null"、"undefined"、" "
6876
+ * + `Number`判空的值,如 0
6877
+ * + `Object`判空的值,如 {}、null、undefined
6878
+ * + `Array`(存在属性Symbol.iterator)判空的值,如 []
6879
+ * + `Boolean`判空的值,如false
6880
+ * + `Function`判空的值,如()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){}
6881
+ * @returns
6882
+ * + true 为空
6883
+ * + false 不为空
6884
+ * @example
6885
+ Utils.isNull({});
6886
+ > true
6887
+ * @example
6888
+ Utils.isNull([]);
6889
+ > true
6890
+ * @example
6891
+ Utils.isNull(" ");
6892
+ > true
6893
+ * @example
6894
+ Utils.isNull(function(){});
6895
+ > true
6896
+ * @example
6897
+ Utils.isNull(()=>{}));
6898
+ > true
6899
+ * @example
6900
+ Utils.isNull("undefined");
6901
+ > true
6902
+ * @example
6903
+ Utils.isNull("null");
6904
+ > true
6905
+ * @example
6906
+ Utils.isNull(" ", false);
6907
+ > true
6908
+ * @example
6909
+ Utils.isNull([1],[]);
6910
+ > false
6911
+ * @example
6912
+ Utils.isNull([],[1]);
6913
+ > false
6914
+ * @example
6915
+ Utils.isNull(false,[123]);
6916
+ > false
6917
+ **/
6907
6918
  isNull = commonUtil.isNull.bind(commonUtil);
6908
6919
  isThemeDark() {
6909
6920
  return this.windowApi.globalThis.matchMedia("(prefers-color-scheme: dark)").matches;
@@ -6932,15 +6943,15 @@
6932
6943
  }
6933
6944
  let result = true;
6934
6945
  for (const domItem of needCheckDomList) {
6935
- let domDisplay = this.windowApi.window.getComputedStyle(domItem);
6946
+ const domDisplay = this.windowApi.window.getComputedStyle(domItem);
6936
6947
  if (domDisplay.display === "none") {
6937
6948
  result = false;
6938
6949
  }
6939
6950
  else {
6940
- let domClientRect = domItem.getBoundingClientRect();
6951
+ const domClientRect = domItem.getBoundingClientRect();
6941
6952
  if (inView) {
6942
- let viewportWidth = this.windowApi.window.innerWidth || this.windowApi.document.documentElement.clientWidth;
6943
- let viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
6953
+ const viewportWidth = this.windowApi.window.innerWidth || this.windowApi.document.documentElement.clientWidth;
6954
+ const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
6944
6955
  result = !(domClientRect.right < 0 ||
6945
6956
  domClientRect.left > viewportWidth ||
6946
6957
  domClientRect.bottom < 0 ||
@@ -6959,11 +6970,11 @@
6959
6970
  }
6960
6971
  isWebView_Via() {
6961
6972
  let result = true;
6962
- let UtilsContext = this;
6973
+ const UtilsContext = this;
6963
6974
  if (typeof this.windowApi.top.window.via === "object") {
6964
6975
  for (const key in Object.values(this.windowApi.top.window.via)) {
6965
6976
  if (Reflect.has(this.windowApi.top.window.via, key)) {
6966
- let objValueFunc = this.windowApi.top.window.via[key];
6977
+ const objValueFunc = this.windowApi.top.window.via[key];
6967
6978
  if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
6968
6979
  result = true;
6969
6980
  }
@@ -6981,11 +6992,11 @@
6981
6992
  }
6982
6993
  isWebView_X() {
6983
6994
  let result = true;
6984
- let UtilsContext = this;
6995
+ const UtilsContext = this;
6985
6996
  if (typeof this.windowApi.top.window.mbrowser === "object") {
6986
6997
  for (const key in Object.values(this.windowApi.top.window.mbrowser)) {
6987
6998
  if (Reflect.has(this.windowApi.top.window.mbrowser, key)) {
6988
- let objValueFunc = this.windowApi.top.window.mbrowser[key];
6999
+ const objValueFunc = this.windowApi.top.window.mbrowser[key];
6989
7000
  if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
6990
7001
  result = true;
6991
7002
  }
@@ -7012,46 +7023,46 @@
7012
7023
  return result;
7013
7024
  }
7014
7025
  /**
7015
- * 自动锁对象,用于循环判断运行的函数,在循环外new后使用,注意,如果函数内部存在异步操作,需要使用await
7016
- * @example
7017
- let lock = new Utils.LockFunction(()=>{console.log(1)}))
7018
- lock.run();
7019
- > 1
7020
- * @example
7021
- let lock = new Utils.LockFunction(()=>{console.log(1)}),true) -- 异步操作
7022
- await lock.run();
7023
- > 1
7024
- **/
7026
+ * 自动锁对象,用于循环判断运行的函数,在循环外new后使用,注意,如果函数内部存在异步操作,需要使用await
7027
+ * @example
7028
+ let lock = new Utils.LockFunction(()=>{console.log(1)}))
7029
+ lock.run();
7030
+ > 1
7031
+ * @example
7032
+ let lock = new Utils.LockFunction(()=>{console.log(1)}),true) -- 异步操作
7033
+ await lock.run();
7034
+ > 1
7035
+ **/
7025
7036
  LockFunction = LockFunction;
7026
7037
  /**
7027
- * 日志对象
7028
- * @param _GM_info_ 油猴管理器的API GM_info,或者是一个对象,如{"script":{name:"Utils.Log"}}
7029
- * @example
7030
- let log = new Utils.Log(GM_info);
7031
- log.info("普通输出");
7032
- > 普通输出
7033
-
7034
- log.success("成功输出");
7035
- > 成功输出
7036
-
7037
- log.error("错误输出");
7038
- > 错误输出
7039
-
7040
- log.warn("警告输出");
7041
- > 警告输出
7042
-
7043
- log.tag = "自定义tag信息";
7044
- log.info("自定义info的颜色","#e0e0e0");
7045
- > 自定义info的颜色
7046
-
7047
- log.config({
7048
- successColor: "#31dc02",
7049
- errorColor: "#e02d2d",
7050
- infoColor: "black",
7051
- })
7052
- log.success("颜色为#31dc02");
7053
- > 颜色为#31dc02
7054
- */
7038
+ * 日志对象
7039
+ * @param _GM_info_ 油猴管理器的API GM_info,或者是一个对象,如{"script":{name:"Utils.Log"}}
7040
+ * @example
7041
+ let log = new Utils.Log(GM_info);
7042
+ log.info("普通输出");
7043
+ > 普通输出
7044
+
7045
+ log.success("成功输出");
7046
+ > 成功输出
7047
+
7048
+ log.error("错误输出");
7049
+ > 错误输出
7050
+
7051
+ log.warn("警告输出");
7052
+ > 警告输出
7053
+
7054
+ log.tag = "自定义tag信息";
7055
+ log.info("自定义info的颜色","#e0e0e0");
7056
+ > 自定义info的颜色
7057
+
7058
+ log.config({
7059
+ successColor: "#31dc02",
7060
+ errorColor: "#e02d2d",
7061
+ infoColor: "black",
7062
+ })
7063
+ log.success("颜色为#31dc02");
7064
+ > 颜色为#31dc02
7065
+ */
7055
7066
  Log = Log;
7056
7067
  mergeArrayToString(data, handleFunc) {
7057
7068
  if (!(data instanceof Array)) {
@@ -7080,8 +7091,8 @@
7080
7091
  return content;
7081
7092
  }
7082
7093
  mutationObserver(target, observer_config) {
7083
- let UtilsContext = this;
7084
- let default_obverser_config = {
7094
+ const UtilsContext = this;
7095
+ const default_obverser_config = {
7085
7096
  /* 监听到元素有反馈,需执行的函数 */
7086
7097
  callback: () => { },
7087
7098
  config: {
@@ -7123,11 +7134,11 @@
7123
7134
  immediate: false,
7124
7135
  };
7125
7136
  observer_config = UtilsContext.assign(default_obverser_config, observer_config);
7126
- let windowMutationObserver = this.windowApi.window.MutationObserver ||
7137
+ const windowMutationObserver = this.windowApi.window.MutationObserver ||
7127
7138
  this.windowApi.window.webkitMutationObserver ||
7128
7139
  this.windowApi.window.MozMutationObserver;
7129
7140
  // 观察者对象
7130
- let mutationObserver = new windowMutationObserver(function (mutations, observer) {
7141
+ const mutationObserver = new windowMutationObserver(function (mutations, observer) {
7131
7142
  if (typeof observer_config.callback === "function") {
7132
7143
  observer_config.callback(mutations, observer);
7133
7144
  }
@@ -7140,7 +7151,7 @@
7140
7151
  }
7141
7152
  else if (UtilsContext.isJQuery(target)) {
7142
7153
  /* 传入的参数是jQuery对象 */
7143
- target.each((index, item) => {
7154
+ target.each((_, item) => {
7144
7155
  mutationObserver.observe(item, observer_config.config);
7145
7156
  });
7146
7157
  }
@@ -7178,7 +7189,7 @@
7178
7189
  threshold: [0.01, 0.99],
7179
7190
  };
7180
7191
  defaultOptions = this.assign(defaultOptions, options || {});
7181
- let intersectionObserver = new IntersectionObserver((entries, observer) => {
7192
+ const intersectionObserver = new IntersectionObserver((entries, observer) => {
7182
7193
  if (entries[0].isIntersecting) {
7183
7194
  if (typeof callback === "function") {
7184
7195
  callback(entries, observer);
@@ -7208,7 +7219,7 @@
7208
7219
  return utils;
7209
7220
  }
7210
7221
  noConflictFunc(needReleaseObject, needReleaseName, functionNameList = [], release = true) {
7211
- let UtilsContext = this;
7222
+ const UtilsContext = this;
7212
7223
  if (typeof needReleaseObject !== "object") {
7213
7224
  throw new Error("Utils.noConflictFunc 参数 needReleaseObject 必须为 object 类型");
7214
7225
  }
@@ -7218,7 +7229,7 @@
7218
7229
  if (!Array.isArray(functionNameList)) {
7219
7230
  throw new Error("Utils.noConflictFunc 参数 functionNameList 必须为 Array 类型");
7220
7231
  }
7221
- let needReleaseKey = "__" + needReleaseName;
7232
+ const needReleaseKey = `__${needReleaseName}`;
7222
7233
  /**
7223
7234
  * 释放所有
7224
7235
  */
@@ -7306,7 +7317,9 @@
7306
7317
  if (typeof dataUri !== "string") {
7307
7318
  throw new Error("Utils.parseBase64ToBlob 参数 dataUri 必须为 string 类型");
7308
7319
  }
7309
- let dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]), dataUriLength = dataUriBase64Str.length, u8arr = new Uint8Array(dataUriLength);
7320
+ const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
7321
+ let dataUriLength = dataUriBase64Str.length;
7322
+ const u8arr = new Uint8Array(dataUriLength);
7310
7323
  while (dataUriLength--) {
7311
7324
  u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
7312
7325
  }
@@ -7321,7 +7334,9 @@
7321
7334
  if (typeof fileName !== "string") {
7322
7335
  throw new Error("Utils.parseBase64ToFile 参数 fileName 必须为 string 类型");
7323
7336
  }
7324
- let dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]), dataUriLength = dataUriBase64Str.length, u8arr = new Uint8Array(dataUriLength);
7337
+ const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
7338
+ let dataUriLength = dataUriBase64Str.length;
7339
+ const u8arr = new Uint8Array(dataUriLength);
7325
7340
  while (dataUriLength--) {
7326
7341
  u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
7327
7342
  }
@@ -7355,15 +7370,15 @@
7355
7370
  }
7356
7371
  parseCDATA(text = "") {
7357
7372
  let result = "";
7358
- let cdataRegexp = /<\!\[CDATA\[([\s\S]*)\]\]>/;
7359
- let cdataMatch = cdataRegexp.exec(text.trim());
7373
+ const cdataRegexp = /<!\[CDATA\[([\s\S]*)\]\]>/;
7374
+ const cdataMatch = cdataRegexp.exec(text.trim());
7360
7375
  if (cdataMatch && cdataMatch.length > 1) {
7361
7376
  result = cdataMatch[cdataMatch.length - 1];
7362
7377
  }
7363
7378
  return result;
7364
7379
  }
7365
7380
  async parseFileToBase64(fileObj) {
7366
- let reader = new FileReader();
7381
+ const reader = new FileReader();
7367
7382
  reader.readAsDataURL(fileObj);
7368
7383
  return new Promise((resolve) => {
7369
7384
  reader.onload = function (event) {
@@ -7372,14 +7387,14 @@
7372
7387
  });
7373
7388
  }
7374
7389
  parseFromString(text, mimeType = "text/html") {
7375
- let parser = new DOMParser();
7390
+ const parser = new DOMParser();
7376
7391
  return parser.parseFromString(text, mimeType);
7377
7392
  }
7378
7393
  parseStringToRegExpString(text) {
7379
7394
  if (typeof text !== "string") {
7380
7395
  throw new TypeError("string必须是字符串");
7381
7396
  }
7382
- let regString = text.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&");
7397
+ const regString = text.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&");
7383
7398
  return regString;
7384
7399
  }
7385
7400
  preventEvent(element, eventNameList = [], capture) {
@@ -7394,6 +7409,7 @@
7394
7409
  }
7395
7410
  if (arguments.length === 1) {
7396
7411
  /* 直接阻止事件 */
7412
+ // eslint-disable-next-line prefer-rest-params
7397
7413
  return stopEvent(arguments[0]);
7398
7414
  }
7399
7415
  else {
@@ -7409,11 +7425,11 @@
7409
7425
  }
7410
7426
  }
7411
7427
  /**
7412
- * 在canvas元素节点上绘制进度圆圈
7413
- * @example
7414
- let progress = new Utils.Process({canvasNode:document.querySelector("canvas")});
7415
- progress.draw();
7416
- * **/
7428
+ * 在canvas元素节点上绘制进度圆圈
7429
+ * @example
7430
+ let progress = new Utils.Process({canvasNode:document.querySelector("canvas")});
7431
+ progress.draw();
7432
+ * **/
7417
7433
  Progress = Progress;
7418
7434
  registerTrustClickEvent(isTrustValue = true, filter) {
7419
7435
  function trustEvent(event) {
@@ -7435,8 +7451,8 @@
7435
7451
  }
7436
7452
  const originalListener = EventTarget.prototype.addEventListener;
7437
7453
  EventTarget.prototype.addEventListener = function (...args) {
7438
- let type = args[0];
7439
- let callback = args[1];
7454
+ const type = args[0];
7455
+ const callback = args[1];
7440
7456
  // let options = args[2];
7441
7457
  if (filter(type)) {
7442
7458
  if (typeof callback === "function") {
@@ -7445,7 +7461,7 @@
7445
7461
  };
7446
7462
  }
7447
7463
  else if (typeof callback === "object" && "handleEvent" in callback) {
7448
- let oldHandleEvent = callback["handleEvent"];
7464
+ const oldHandleEvent = callback["handleEvent"];
7449
7465
  args[1]["handleEvent"] = function (event) {
7450
7466
  if (event == null) {
7451
7467
  return;
@@ -7456,7 +7472,7 @@
7456
7472
  event instanceof Proxy;
7457
7473
  oldHandleEvent.call(this, trustEvent(event));
7458
7474
  }
7459
- catch (error) {
7475
+ catch {
7460
7476
  Reflect.set(event, "isTrusted", isTrustValue);
7461
7477
  }
7462
7478
  };
@@ -7479,7 +7495,7 @@
7479
7495
  return isNegative ? -reversedNum : reversedNum;
7480
7496
  }
7481
7497
  selectElementText(element, childTextNode, startIndex, endIndex) {
7482
- let range = this.windowApi.document.createRange();
7498
+ const range = this.windowApi.document.createRange();
7483
7499
  range.selectNodeContents(element);
7484
7500
  if (childTextNode) {
7485
7501
  if (childTextNode.nodeType !== Node.TEXT_NODE) {
@@ -7490,7 +7506,7 @@
7490
7506
  range.setEnd(childTextNode, endIndex);
7491
7507
  }
7492
7508
  }
7493
- let selection = this.windowApi.globalThis.getSelection();
7509
+ const selection = this.windowApi.globalThis.getSelection();
7494
7510
  if (selection) {
7495
7511
  selection.removeAllRanges();
7496
7512
  selection.addRange(range);
@@ -7518,7 +7534,7 @@
7518
7534
  else {
7519
7535
  textType = "text/plain";
7520
7536
  }
7521
- let UtilsContext = this;
7537
+ const UtilsContext = this;
7522
7538
  class UtilsClipboard {
7523
7539
  #resolve;
7524
7540
  #copyData;
@@ -7530,7 +7546,7 @@
7530
7546
  }
7531
7547
  async init() {
7532
7548
  let copyStatus = false;
7533
- let requestPermissionStatus = await this.requestClipboardPermission();
7549
+ const requestPermissionStatus = await this.requestClipboardPermission();
7534
7550
  console.log(requestPermissionStatus);
7535
7551
  if (this.hasClipboard() && (this.hasClipboardWrite() || this.hasClipboardWriteText())) {
7536
7552
  try {
@@ -7569,7 +7585,7 @@
7569
7585
  */
7570
7586
  copyTextByTextArea() {
7571
7587
  try {
7572
- let copyElement = UtilsContext.windowApi.document.createElement("textarea");
7588
+ const copyElement = UtilsContext.windowApi.document.createElement("textarea");
7573
7589
  copyElement.value = this.#copyData;
7574
7590
  copyElement.setAttribute("type", "text");
7575
7591
  copyElement.setAttribute("style", "opacity:0;position:absolute;");
@@ -7589,20 +7605,17 @@
7589
7605
  * 申请剪贴板权限
7590
7606
  */
7591
7607
  requestClipboardPermission() {
7592
- return new Promise((resolve, reject) => {
7608
+ return new Promise((resolve) => {
7593
7609
  if (navigator.permissions && navigator.permissions.query) {
7594
7610
  navigator.permissions
7595
7611
  .query({
7596
7612
  name: "clipboard-write",
7597
7613
  })
7598
- .then((permissionStatus) => {
7614
+ .then(() => {
7599
7615
  resolve(true);
7600
7616
  })
7601
7617
  .catch((error) => {
7602
- console.error([
7603
- "申请剪贴板权限失败,尝试直接写入👉",
7604
- error.message ?? error.name ?? error.stack,
7605
- ]);
7618
+ console.error(["申请剪贴板权限失败,尝试直接写入👉", error.message ?? error.name ?? error.stack]);
7606
7619
  resolve(false);
7607
7620
  });
7608
7621
  }
@@ -7629,7 +7642,7 @@
7629
7642
  }
7630
7643
  else {
7631
7644
  /* 可复制对象 */
7632
- let textBlob = new Blob([this.#copyData], {
7645
+ const textBlob = new Blob([this.#copyData], {
7633
7646
  type: this.#copyDataType,
7634
7647
  });
7635
7648
  navigator.clipboard
@@ -7661,7 +7674,7 @@
7661
7674
  });
7662
7675
  }
7663
7676
  setTimeout(callback, delayTime = 0) {
7664
- let UtilsContext = this;
7677
+ const UtilsContext = this;
7665
7678
  if (typeof callback !== "function" && typeof callback !== "string") {
7666
7679
  throw new TypeError("Utils.setTimeout 参数 callback 必须为 function|string 类型");
7667
7680
  }
@@ -7675,7 +7688,7 @@
7675
7688
  });
7676
7689
  }
7677
7690
  sleep(delayTime = 0) {
7678
- let UtilsContext = this;
7691
+ const UtilsContext = this;
7679
7692
  if (typeof delayTime !== "number") {
7680
7693
  throw new Error("Utils.sleep 参数 delayTime 必须为 number 类型");
7681
7694
  }
@@ -7686,18 +7699,18 @@
7686
7699
  });
7687
7700
  }
7688
7701
  dragSlider(selector, offsetX = this.windowApi.window.innerWidth) {
7689
- let UtilsContext = this;
7702
+ const UtilsContext = this;
7690
7703
  function initMouseEvent(eventName, offSetX, offSetY) {
7691
- let win = typeof unsafeWindow === "undefined" ? globalThis : unsafeWindow;
7692
- let mouseEvent = UtilsContext.windowApi.document.createEvent("MouseEvents");
7704
+ const win = typeof unsafeWindow === "undefined" ? globalThis : unsafeWindow;
7705
+ const mouseEvent = UtilsContext.windowApi.document.createEvent("MouseEvents");
7693
7706
  mouseEvent.initMouseEvent(eventName, true, true, win, 0, offSetX, offSetY, offSetX, offSetY, false, false, false, false, 0, null);
7694
7707
  return mouseEvent;
7695
7708
  }
7696
- let sliderElement = typeof selector === "string" ? domUtils.selector(selector) : selector;
7709
+ const sliderElement = typeof selector === "string" ? domUtils.selector(selector) : selector;
7697
7710
  if (!(sliderElement instanceof Node) || !(sliderElement instanceof Element)) {
7698
7711
  throw new Error("Utils.dragSlider 参数selector 必须为Node/Element类型");
7699
7712
  }
7700
- let rect = sliderElement.getBoundingClientRect(), x0 = rect.x || rect.left, y0 = rect.y || rect.top, x1 = x0 + offsetX, y1 = y0;
7713
+ const rect = sliderElement.getBoundingClientRect(), x0 = rect.x || rect.left, y0 = rect.y || rect.top, x1 = x0 + offsetX, y1 = y0;
7701
7714
  sliderElement.dispatchEvent(initMouseEvent("mousedown", x0, y0));
7702
7715
  sliderElement.dispatchEvent(initMouseEvent("mousemove", x1, y1));
7703
7716
  sliderElement.dispatchEvent(initMouseEvent("mouseleave", x1, y1));
@@ -7725,34 +7738,34 @@
7725
7738
  console.error(err);
7726
7739
  }
7727
7740
  }
7728
- exitFullScreen(element = this.windowApi.document.documentElement) {
7729
- if (this.windowApi.document.exitFullscreen) {
7730
- return this.windowApi.document.exitFullscreen();
7741
+ exitFullScreen($el = this.windowApi.document.documentElement) {
7742
+ if ($el.exitFullscreen) {
7743
+ return $el.exitFullscreen();
7731
7744
  }
7732
- else if (this.windowApi.document.msExitFullscreen) {
7733
- return this.windowApi.document.msExitFullscreen();
7745
+ else if ($el.msExitFullscreen) {
7746
+ return $el.msExitFullscreen();
7734
7747
  }
7735
- else if (this.windowApi.document.mozCancelFullScreen) {
7736
- return this.windowApi.document.mozCancelFullScreen();
7748
+ else if ($el.mozCancelFullScreen) {
7749
+ return $el.mozCancelFullScreen();
7737
7750
  }
7738
- else if (this.windowApi.document.webkitCancelFullScreen) {
7739
- return this.windowApi.document.webkitCancelFullScreen();
7751
+ else if ($el.webkitCancelFullScreen) {
7752
+ return $el.webkitCancelFullScreen();
7740
7753
  }
7741
7754
  else {
7742
- return new Promise((resolve, reject) => {
7755
+ return new Promise((_, reject) => {
7743
7756
  reject(new TypeError("该浏览器不支持全屏API"));
7744
7757
  });
7745
7758
  }
7746
7759
  }
7747
7760
  sortListByProperty(data, getPropertyValueFunc, sortByDesc = true) {
7748
- let UtilsContext = this;
7761
+ const UtilsContext = this;
7749
7762
  if (typeof getPropertyValueFunc !== "function" && typeof getPropertyValueFunc !== "string") {
7750
7763
  throw new Error("Utils.sortListByProperty 参数 getPropertyValueFunc 必须为 function|string 类型");
7751
7764
  }
7752
7765
  if (typeof sortByDesc !== "boolean") {
7753
7766
  throw new Error("Utils.sortListByProperty 参数 sortByDesc 必须为 boolean 类型");
7754
7767
  }
7755
- let getObjValue = function (obj) {
7768
+ const getObjValue = function (obj) {
7756
7769
  return typeof getPropertyValueFunc === "string" ? obj[getPropertyValueFunc] : getPropertyValueFunc(obj);
7757
7770
  };
7758
7771
  /**
@@ -7761,9 +7774,9 @@
7761
7774
  * @param {any} before_obj
7762
7775
  * @returns
7763
7776
  */
7764
- let sortFunc = function (after_obj, before_obj) {
7765
- let beforeValue = getObjValue(before_obj); /* 前 */
7766
- let afterValue = getObjValue(after_obj); /* 后 */
7777
+ const sortFunc = function (after_obj, before_obj) {
7778
+ const beforeValue = getObjValue(before_obj); /* 前 */
7779
+ const afterValue = getObjValue(after_obj); /* 后 */
7767
7780
  if (sortByDesc) {
7768
7781
  if (afterValue > beforeValue) {
7769
7782
  return -1;
@@ -7792,19 +7805,18 @@
7792
7805
  * @param nodeList 元素列表
7793
7806
  * @param getNodeListFunc 获取元素列表的函数
7794
7807
  */
7795
- let sortNodeFunc = function (nodeList, getNodeListFunc) {
7796
- let nodeListLength = nodeList.length;
7808
+ const sortNodeFunc = function (nodeList, getNodeListFunc) {
7809
+ const nodeListLength = nodeList.length;
7797
7810
  for (let i = 0; i < nodeListLength - 1; i++) {
7798
7811
  for (let j = 0; j < nodeListLength - 1 - i; j++) {
7799
- let beforeNode = nodeList[j];
7800
- let afterNode = nodeList[j + 1];
7801
- let beforeValue = getObjValue(beforeNode); /* 前 */
7802
- let afterValue = getObjValue(afterNode); /* 后 */
7803
- if ((sortByDesc == true && beforeValue < afterValue) ||
7804
- (sortByDesc == false && beforeValue > afterValue)) {
7812
+ const beforeNode = nodeList[j];
7813
+ const afterNode = nodeList[j + 1];
7814
+ const beforeValue = getObjValue(beforeNode); /* 前 */
7815
+ const afterValue = getObjValue(afterNode); /* 后 */
7816
+ if ((sortByDesc == true && beforeValue < afterValue) || (sortByDesc == false && beforeValue > afterValue)) {
7805
7817
  /* 升序/降序 */
7806
7818
  /* 相邻元素两两对比 */
7807
- let temp = beforeNode.nextElementSibling;
7819
+ const temp = beforeNode.nextElementSibling;
7808
7820
  afterNode.after(beforeNode);
7809
7821
  if (temp == null) {
7810
7822
  /* 如果为空,那么是最后一个元素,使用append */
@@ -7862,7 +7874,7 @@
7862
7874
  return newTargetString;
7863
7875
  }
7864
7876
  startsWith(target, searchString, position = 0) {
7865
- let UtilsContext = this;
7877
+ const UtilsContext = this;
7866
7878
  if (position > target.length) {
7867
7879
  /* 超出目标字符串的长度 */
7868
7880
  return false;
@@ -7906,7 +7918,7 @@
7906
7918
  */
7907
7919
  toJSON = commonUtil.toJSON.bind(commonUtil);
7908
7920
  toSearchParamsStr(obj, addPrefix) {
7909
- let UtilsContext = this;
7921
+ const UtilsContext = this;
7910
7922
  let searhParamsStr = "";
7911
7923
  if (Array.isArray(obj)) {
7912
7924
  obj.forEach((item) => {
@@ -7914,7 +7926,7 @@
7914
7926
  searhParamsStr += UtilsContext.toSearchParamsStr(item);
7915
7927
  }
7916
7928
  else {
7917
- searhParamsStr += "&" + UtilsContext.toSearchParamsStr(item);
7929
+ searhParamsStr += `&${UtilsContext.toSearchParamsStr(item)}`;
7918
7930
  }
7919
7931
  });
7920
7932
  }
@@ -7922,7 +7934,7 @@
7922
7934
  searhParamsStr = new URLSearchParams(Object.entries(obj)).toString();
7923
7935
  }
7924
7936
  if (addPrefix && !searhParamsStr.startsWith("?")) {
7925
- searhParamsStr = "?" + searhParamsStr;
7937
+ searhParamsStr = `?${searhParamsStr}`;
7926
7938
  }
7927
7939
  return searhParamsStr;
7928
7940
  }
@@ -7970,7 +7982,7 @@
7970
7982
  }
7971
7983
  }
7972
7984
  waitArrayLoopToEnd(data, handleFunc) {
7973
- let UtilsContext = this;
7985
+ const UtilsContext = this;
7974
7986
  if (typeof handleFunc !== "function" && typeof handleFunc !== "string") {
7975
7987
  throw new Error("Utils.waitArrayLoopToEnd 参数 handleDataFunction 必须为 function|string 类型");
7976
7988
  }
@@ -7980,17 +7992,17 @@
7980
7992
  }
7981
7993
  wait(checkFn, timeout, parent) {
7982
7994
  const UtilsContext = this;
7983
- let __timeout__ = typeof timeout === "number" ? timeout : 0;
7995
+ const __timeout__ = typeof timeout === "number" ? timeout : 0;
7984
7996
  return new Promise((resolve) => {
7985
- let observer = UtilsContext.mutationObserver(parent || UtilsContext.windowApi.document, {
7997
+ const observer = UtilsContext.mutationObserver(parent || UtilsContext.windowApi.document, {
7986
7998
  config: {
7987
7999
  subtree: true,
7988
8000
  childList: true,
7989
8001
  attributes: true,
7990
8002
  },
7991
8003
  immediate: true,
7992
- callback(mutations, __observer__) {
7993
- let result = checkFn();
8004
+ callback(_, __observer__) {
8005
+ const result = checkFn();
7994
8006
  if (result.success) {
7995
8007
  // 取消观察器
7996
8008
  if (typeof __observer__?.disconnect === "function") {
@@ -8014,9 +8026,9 @@
8014
8026
  waitNode(...args) {
8015
8027
  // 过滤掉undefined
8016
8028
  args = args.filter((arg) => arg !== void 0);
8017
- let UtilsContext = this;
8029
+ const UtilsContext = this;
8018
8030
  // 选择器
8019
- let selector = args[0];
8031
+ const selector = args[0];
8020
8032
  // 父元素(监听的元素)
8021
8033
  let parent = UtilsContext.windowApi.document;
8022
8034
  // 超时时间
@@ -8026,7 +8038,7 @@
8026
8038
  }
8027
8039
  if (args.length === 1) ;
8028
8040
  else if (args.length === 2) {
8029
- let secondParam = args[1];
8041
+ const secondParam = args[1];
8030
8042
  if (typeof secondParam === "number") {
8031
8043
  // "div",10000
8032
8044
  timeout = secondParam;
@@ -8042,9 +8054,9 @@
8042
8054
  else if (args.length === 3) {
8043
8055
  // "div",document,10000
8044
8056
  // 第二个参数,parent
8045
- let secondParam = args[1];
8057
+ const secondParam = args[1];
8046
8058
  // 第三个参数,timeout
8047
- let thirdParam = args[2];
8059
+ const thirdParam = args[2];
8048
8060
  if (typeof secondParam === "object" && secondParam instanceof Node) {
8049
8061
  parent = secondParam;
8050
8062
  if (typeof thirdParam === "number") {
@@ -8063,9 +8075,9 @@
8063
8075
  }
8064
8076
  function getNode() {
8065
8077
  if (Array.isArray(selector)) {
8066
- let result = [];
8078
+ const result = [];
8067
8079
  for (let index = 0; index < selector.length; index++) {
8068
- let node = domUtils.selector(selector[index]);
8080
+ const node = domUtils.selector(selector[index]);
8069
8081
  if (node) {
8070
8082
  result.push(node);
8071
8083
  }
@@ -8082,7 +8094,7 @@
8082
8094
  }
8083
8095
  }
8084
8096
  return UtilsContext.wait(() => {
8085
- let node = getNode();
8097
+ const node = getNode();
8086
8098
  if (node) {
8087
8099
  return {
8088
8100
  success: true,
@@ -8100,9 +8112,9 @@
8100
8112
  waitAnyNode(...args) {
8101
8113
  // 过滤掉undefined
8102
8114
  args = args.filter((arg) => arg !== void 0);
8103
- let UtilsContext = this;
8115
+ const UtilsContext = this;
8104
8116
  // 选择器
8105
- let selectorList = args[0];
8117
+ const selectorList = args[0];
8106
8118
  // 父元素(监听的元素)
8107
8119
  let parent = UtilsContext.windowApi.document;
8108
8120
  // 超时时间
@@ -8112,7 +8124,7 @@
8112
8124
  }
8113
8125
  if (args.length === 1) ;
8114
8126
  else if (args.length === 2) {
8115
- let secondParam = args[1];
8127
+ const secondParam = args[1];
8116
8128
  if (typeof secondParam === "number") {
8117
8129
  // "div",10000
8118
8130
  timeout = secondParam;
@@ -8128,9 +8140,9 @@
8128
8140
  else if (args.length === 3) {
8129
8141
  // "div",document,10000
8130
8142
  // 第二个参数,parent
8131
- let secondParam = args[1];
8143
+ const secondParam = args[1];
8132
8144
  // 第三个参数,timeout
8133
- let thirdParam = args[2];
8145
+ const thirdParam = args[2];
8134
8146
  if (typeof secondParam === "object" && secondParam instanceof Node) {
8135
8147
  parent = secondParam;
8136
8148
  if (typeof thirdParam === "number") {
@@ -8147,7 +8159,7 @@
8147
8159
  else {
8148
8160
  throw new TypeError("Utils.waitAnyNode 参数个数错误");
8149
8161
  }
8150
- let promiseList = selectorList.map((selector) => {
8162
+ const promiseList = selectorList.map((selector) => {
8151
8163
  return UtilsContext.waitNode(selector, parent, timeout);
8152
8164
  });
8153
8165
  return Promise.any(promiseList);
@@ -8155,9 +8167,9 @@
8155
8167
  waitNodeList(...args) {
8156
8168
  // 过滤掉undefined
8157
8169
  args = args.filter((arg) => arg !== void 0);
8158
- let UtilsContext = this;
8170
+ const UtilsContext = this;
8159
8171
  // 选择器数组
8160
- let selector = args[0];
8172
+ const selector = args[0];
8161
8173
  // 父元素(监听的元素)
8162
8174
  let parent = UtilsContext.windowApi.document;
8163
8175
  // 超时时间
@@ -8167,7 +8179,7 @@
8167
8179
  }
8168
8180
  if (args.length === 1) ;
8169
8181
  else if (args.length === 2) {
8170
- let secondParam = args[1];
8182
+ const secondParam = args[1];
8171
8183
  if (typeof secondParam === "number") {
8172
8184
  // "div",10000
8173
8185
  timeout = secondParam;
@@ -8183,9 +8195,9 @@
8183
8195
  else if (args.length === 3) {
8184
8196
  // "div",document,10000
8185
8197
  // 第二个参数,parent
8186
- let secondParam = args[1];
8198
+ const secondParam = args[1];
8187
8199
  // 第三个参数,timeout
8188
- let thirdParam = args[2];
8200
+ const thirdParam = args[2];
8189
8201
  if (typeof secondParam === "object" && secondParam instanceof Node) {
8190
8202
  parent = secondParam;
8191
8203
  if (typeof thirdParam === "number") {
@@ -8204,9 +8216,9 @@
8204
8216
  }
8205
8217
  function getNodeList() {
8206
8218
  if (Array.isArray(selector)) {
8207
- let result = [];
8219
+ const result = [];
8208
8220
  for (let index = 0; index < selector.length; index++) {
8209
- let nodeList = domUtils.selectorAll(selector[index], parent);
8221
+ const nodeList = domUtils.selectorAll(selector[index], parent);
8210
8222
  if (nodeList.length) {
8211
8223
  result.push(nodeList);
8212
8224
  }
@@ -8216,14 +8228,14 @@
8216
8228
  }
8217
8229
  }
8218
8230
  else {
8219
- let nodeList = domUtils.selectorAll(selector, parent);
8231
+ const nodeList = domUtils.selectorAll(selector, parent);
8220
8232
  if (nodeList.length) {
8221
8233
  return nodeList;
8222
8234
  }
8223
8235
  }
8224
8236
  }
8225
8237
  return UtilsContext.wait(() => {
8226
- let node = getNodeList();
8238
+ const node = getNodeList();
8227
8239
  if (node) {
8228
8240
  return {
8229
8241
  success: true,
@@ -8241,9 +8253,9 @@
8241
8253
  waitAnyNodeList(...args) {
8242
8254
  // 过滤掉undefined
8243
8255
  args = args.filter((arg) => arg !== void 0);
8244
- let UtilsContext = this;
8256
+ const UtilsContext = this;
8245
8257
  // 选择器数组
8246
- let selectorList = args[0];
8258
+ const selectorList = args[0];
8247
8259
  // 父元素(监听的元素)
8248
8260
  let parent = UtilsContext.windowApi.document;
8249
8261
  // 超时时间
@@ -8253,7 +8265,7 @@
8253
8265
  }
8254
8266
  if (args.length === 1) ;
8255
8267
  else if (args.length === 2) {
8256
- let secondParam = args[1];
8268
+ const secondParam = args[1];
8257
8269
  if (typeof secondParam === "number") {
8258
8270
  // "div",10000
8259
8271
  timeout = secondParam;
@@ -8269,9 +8281,9 @@
8269
8281
  else if (args.length === 3) {
8270
8282
  // "div",document,10000
8271
8283
  // 第二个参数,parent
8272
- let secondParam = args[1];
8284
+ const secondParam = args[1];
8273
8285
  // 第三个参数,timeout
8274
- let thirdParam = args[2];
8286
+ const thirdParam = args[2];
8275
8287
  if (typeof secondParam === "object" && secondParam instanceof Node) {
8276
8288
  parent = secondParam;
8277
8289
  if (typeof thirdParam === "number") {
@@ -8288,7 +8300,7 @@
8288
8300
  else {
8289
8301
  throw new TypeError("Utils.waitAnyNodeList 参数个数错误");
8290
8302
  }
8291
- let promiseList = selectorList.map((selector) => {
8303
+ const promiseList = selectorList.map((selector) => {
8292
8304
  return UtilsContext.waitNodeList(selector, parent, timeout);
8293
8305
  });
8294
8306
  return Promise.any(promiseList);
@@ -8317,13 +8329,13 @@
8317
8329
  });
8318
8330
  }
8319
8331
  waitPropertyByInterval(checkObj, checkPropertyName, intervalTimer = 250, maxTime = -1) {
8320
- let UtilsContext = this;
8332
+ const UtilsContext = this;
8321
8333
  if (checkObj == null) {
8322
8334
  throw new TypeError("checkObj 不能为空对象 ");
8323
8335
  }
8324
8336
  let isResolve = false;
8325
8337
  return new Promise((resolve, reject) => {
8326
- let interval = UtilsContext.workerSetInterval(() => {
8338
+ const interval = UtilsContext.workerSetInterval(() => {
8327
8339
  let obj = checkObj;
8328
8340
  if (typeof checkObj === "function") {
8329
8341
  obj = checkObj();
@@ -8356,7 +8368,7 @@
8356
8368
  throw new Error("Utils.waitVueByInterval 参数element 不能为空");
8357
8369
  }
8358
8370
  let flag = false;
8359
- let UtilsContext = this;
8371
+ const UtilsContext = this;
8360
8372
  try {
8361
8373
  await UtilsContext.waitPropertyByInterval(element, function (targetElement) {
8362
8374
  if (targetElement == null) {
@@ -8368,7 +8380,7 @@
8368
8380
  if (propertyName == null) {
8369
8381
  return true;
8370
8382
  }
8371
- let vueObject = targetElement[vueName];
8383
+ const vueObject = targetElement[vueName];
8372
8384
  if (typeof propertyName === "string") {
8373
8385
  if (propertyName in vueObject) {
8374
8386
  flag = true;
@@ -8384,6 +8396,7 @@
8384
8396
  }
8385
8397
  return false;
8386
8398
  }, timer, maxTime);
8399
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
8387
8400
  }
8388
8401
  catch (error) {
8389
8402
  return flag;
@@ -8442,7 +8455,7 @@
8442
8455
  if (target == null) {
8443
8456
  return;
8444
8457
  }
8445
- let handleResult = handler(target);
8458
+ const handleResult = handler(target);
8446
8459
  if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
8447
8460
  return handleResult.data;
8448
8461
  }
@@ -8455,10 +8468,10 @@
8455
8468
  */
8456
8469
  async asyncQueryProperty(target, handler) {
8457
8470
  if (target == null) {
8458
- // @ts-ignore
8471
+ // @ts-expect-error 空返回
8459
8472
  return;
8460
8473
  }
8461
- let handleResult = await handler(target);
8474
+ const handleResult = await handler(target);
8462
8475
  if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
8463
8476
  return handleResult.data;
8464
8477
  }
@@ -8566,6 +8579,7 @@
8566
8579
  workerSetTimeout(callback, timeout = 0) {
8567
8580
  try {
8568
8581
  return setTimeout$1(callback, timeout);
8582
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
8569
8583
  }
8570
8584
  catch (error) {
8571
8585
  return this.windowApi.setTimeout(callback, timeout);
@@ -8580,8 +8594,10 @@
8580
8594
  if (timeId != null) {
8581
8595
  clearTimeout$1(timeId);
8582
8596
  }
8597
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
8583
8598
  }
8584
8599
  catch (error) {
8600
+ // console.log(error);
8585
8601
  }
8586
8602
  finally {
8587
8603
  this.windowApi.clearTimeout(timeId);
@@ -8595,6 +8611,7 @@
8595
8611
  workerSetInterval(callback, timeout = 0) {
8596
8612
  try {
8597
8613
  return setInterval(callback, timeout);
8614
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
8598
8615
  }
8599
8616
  catch (error) {
8600
8617
  return this.windowApi.setInterval(callback, timeout);
@@ -8609,8 +8626,10 @@
8609
8626
  if (timeId != null) {
8610
8627
  clearInterval(timeId);
8611
8628
  }
8629
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
8612
8630
  }
8613
8631
  catch (error) {
8632
+ // console.log(error);
8614
8633
  }
8615
8634
  finally {
8616
8635
  this.windowApi.clearInterval(timeId);
@@ -8644,10 +8663,10 @@
8644
8663
  .query({
8645
8664
  name: "clipboard-read",
8646
8665
  })
8647
- .then((permissionStatus) => {
8666
+ .then(() => {
8648
8667
  readClipboardText();
8649
8668
  })
8650
- .catch((error) => {
8669
+ .catch(() => {
8651
8670
  /* 该权限申请Api可能在该环境下不生效,尝试直接读取剪贴板 */
8652
8671
  readClipboardText();
8653
8672
  });
@@ -8684,7 +8703,7 @@
8684
8703
  });
8685
8704
  }
8686
8705
  }
8687
- let utils = new Utils();
8706
+ const utils = new Utils();
8688
8707
 
8689
8708
  return utils;
8690
8709