karin-plugin-kkk 2.45.0 → 2.45.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/lib/build-metadata.json +5 -5
- package/lib/core_chunk/default.js +2854 -86
- package/lib/core_chunk/main.js +144 -89
- package/lib/core_chunk/vendor.js +208 -2465
- package/lib/web/assets/{CronEditor-Dbe5SaLF.js → CronEditor-By-hG-v8.js} +1 -1
- package/lib/web/assets/{DesktopLayout-Bhl91j9C.js → DesktopLayout-_4M-Hi0T.js} +1 -1
- package/lib/web/assets/{MobileLayout-DCJ7YGtl.js → MobileLayout-Dkxb7rZd.js} +1 -1
- package/lib/web/assets/{ThemeSwitch-BHRYNveR.js → ThemeSwitch-C1cJylms.js} +1 -1
- package/lib/web/assets/index-CXrY4Bct.js +47 -0
- package/lib/web/assets/{separator-LrjcIRE3.js → separator-QN4bEOP0.js} +1 -1
- package/lib/web/index.html +1 -1
- package/package.json +2 -2
- package/lib/web/assets/index-5JBK3EBf.js +0 -47
package/lib/core_chunk/vendor.js
CHANGED
|
@@ -4,8 +4,7 @@ import $, { createRequire } from "node:module";
|
|
|
4
4
|
import fs, { existsSync, readFileSync, writeSync } from "node:fs";
|
|
5
5
|
import minpath, { default as path } from "node:path";
|
|
6
6
|
import { fileURLToPath, fileURLToPath as urlToPath, pathToFileURL } from "node:url";
|
|
7
|
-
import crypto$1
|
|
8
|
-
import { gzipSync } from "node:zlib";
|
|
7
|
+
import crypto$1 from "node:crypto";
|
|
9
8
|
import jt from "fs";
|
|
10
9
|
import minproc from "node:process";
|
|
11
10
|
import { inspect } from "node:util";
|
|
@@ -5679,2310 +5678,6 @@ function number$1(params) {
|
|
|
5679
5678
|
return /* @__PURE__ */ _coercedNumber(ZodNumber, params);
|
|
5680
5679
|
}
|
|
5681
5680
|
//#endregion
|
|
5682
|
-
//#region ../../node_modules/.pnpm/@ikenxuan+xhshow-ts@1.1.0/node_modules/@ikenxuan/xhshow-ts/dist/index.mjs
|
|
5683
|
-
var CryptoConfig = class CryptoConfig {
|
|
5684
|
-
DES_KEY = "zbp30y86";
|
|
5685
|
-
GID_URL = "https://as.xiaohongshu.com/api/sec/v1/shield/webprofile";
|
|
5686
|
-
DATA_PLATFORM = "Windows";
|
|
5687
|
-
DATA_SVN = "2";
|
|
5688
|
-
DATA_SDK_VERSION = "4.3.5";
|
|
5689
|
-
DATA_WEB_BUILD = "6.3.0";
|
|
5690
|
-
MAX_32BIT = 4294967295;
|
|
5691
|
-
MAX_SIGNED_32BIT = 2147483647;
|
|
5692
|
-
MAX_BYTE = 255;
|
|
5693
|
-
STANDARD_BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
5694
|
-
CUSTOM_BASE64_ALPHABET = "ZmserbBoHQtNP+wOcza/LpngG8yJq42KWYj0DSfdikx3VT16IlUAFM97hECvuRX5";
|
|
5695
|
-
X3_BASE64_ALPHABET = "MfgqrsbcyzPQRStuvC7mn501HIJBo2DEFTKdeNOwxWXYZap89+/A4UVLhijkl63G";
|
|
5696
|
-
HEX_KEY = "71a302257793271ddd273bcee3e4b98d9d7935e1da33f5765e2ea8afb6dc77a51a499d23b67c20660025860cbf13d4540d92497f58686c574e508f46e1956344f39139bf4faf22a3eef120b79258145b2feb5193b6478669961298e79bedca646e1a693a926154a5a7a1bd1cf0dedb742f917a747a1e388b234f2277516db7116035439730fa61e9822a0eca7bff72d8";
|
|
5697
|
-
EXPECTED_HEX_LENGTH = 32;
|
|
5698
|
-
OUTPUT_BYTE_COUNT = 8;
|
|
5699
|
-
HEX_CHUNK_SIZE = 2;
|
|
5700
|
-
VERSION_BYTES = [
|
|
5701
|
-
121,
|
|
5702
|
-
104,
|
|
5703
|
-
96,
|
|
5704
|
-
41
|
|
5705
|
-
];
|
|
5706
|
-
PAYLOAD_LENGTH = 144;
|
|
5707
|
-
A1_LENGTH = 52;
|
|
5708
|
-
APP_ID_LENGTH = 10;
|
|
5709
|
-
MD5_XOR_LENGTH = 8;
|
|
5710
|
-
A3_PREFIX = [
|
|
5711
|
-
2,
|
|
5712
|
-
97,
|
|
5713
|
-
51,
|
|
5714
|
-
16
|
|
5715
|
-
];
|
|
5716
|
-
TIMESTAMP_LE_LENGTH = 8;
|
|
5717
|
-
SEQUENCE_VALUE_MIN = 15;
|
|
5718
|
-
SEQUENCE_VALUE_MAX = 50;
|
|
5719
|
-
WINDOW_PROPS_LENGTH_MIN = 1e3;
|
|
5720
|
-
WINDOW_PROPS_LENGTH_MAX = 1200;
|
|
5721
|
-
SESSION_WINDOW_PROPS_INIT_MIN = 1e3;
|
|
5722
|
-
SESSION_WINDOW_PROPS_INIT_MAX = 2e3;
|
|
5723
|
-
SESSION_SEQUENCE_INIT_MIN = 15;
|
|
5724
|
-
SESSION_SEQUENCE_INIT_MAX = 17;
|
|
5725
|
-
SESSION_SEQUENCE_STEP_MIN = 0;
|
|
5726
|
-
SESSION_SEQUENCE_STEP_MAX = 1;
|
|
5727
|
-
SESSION_WINDOW_PROPS_STEP_MIN = 1;
|
|
5728
|
-
SESSION_WINDOW_PROPS_STEP_MAX = 10;
|
|
5729
|
-
CHECKSUM_VERSION = 1;
|
|
5730
|
-
CHECKSUM_XOR_KEY = 115;
|
|
5731
|
-
CHECKSUM_FIXED_TAIL = [
|
|
5732
|
-
249,
|
|
5733
|
-
65,
|
|
5734
|
-
103,
|
|
5735
|
-
103,
|
|
5736
|
-
201,
|
|
5737
|
-
181,
|
|
5738
|
-
131,
|
|
5739
|
-
99,
|
|
5740
|
-
94,
|
|
5741
|
-
7,
|
|
5742
|
-
68,
|
|
5743
|
-
250,
|
|
5744
|
-
132,
|
|
5745
|
-
21
|
|
5746
|
-
];
|
|
5747
|
-
ENV_TABLE = [
|
|
5748
|
-
115,
|
|
5749
|
-
248,
|
|
5750
|
-
83,
|
|
5751
|
-
102,
|
|
5752
|
-
103,
|
|
5753
|
-
201,
|
|
5754
|
-
181,
|
|
5755
|
-
131,
|
|
5756
|
-
99,
|
|
5757
|
-
94,
|
|
5758
|
-
4,
|
|
5759
|
-
68,
|
|
5760
|
-
250,
|
|
5761
|
-
132,
|
|
5762
|
-
21
|
|
5763
|
-
];
|
|
5764
|
-
ENV_CHECKS_DEFAULT = [
|
|
5765
|
-
0,
|
|
5766
|
-
1,
|
|
5767
|
-
18,
|
|
5768
|
-
1,
|
|
5769
|
-
0,
|
|
5770
|
-
0,
|
|
5771
|
-
0,
|
|
5772
|
-
0,
|
|
5773
|
-
0,
|
|
5774
|
-
0,
|
|
5775
|
-
3,
|
|
5776
|
-
0,
|
|
5777
|
-
0,
|
|
5778
|
-
0,
|
|
5779
|
-
0
|
|
5780
|
-
];
|
|
5781
|
-
HASH_IV = [
|
|
5782
|
-
1831565813,
|
|
5783
|
-
461845907,
|
|
5784
|
-
2246822507,
|
|
5785
|
-
3266489909
|
|
5786
|
-
];
|
|
5787
|
-
ENV_FINGERPRINT_XOR_KEY = 41;
|
|
5788
|
-
ENV_FINGERPRINT_TIME_OFFSET_MIN = 10;
|
|
5789
|
-
ENV_FINGERPRINT_TIME_OFFSET_MAX = 50;
|
|
5790
|
-
SIGNATURE_DATA_TEMPLATE = {
|
|
5791
|
-
x0: "4.4.3",
|
|
5792
|
-
x1: "xhs-pc-web",
|
|
5793
|
-
x2: "Windows",
|
|
5794
|
-
x3: "",
|
|
5795
|
-
x4: ""
|
|
5796
|
-
};
|
|
5797
|
-
X3_PREFIX = "mns0301_";
|
|
5798
|
-
XYS_PREFIX = "XYS_";
|
|
5799
|
-
XYW_PREFIX = "XYW_";
|
|
5800
|
-
XYW_SIGN_SVN = "56";
|
|
5801
|
-
XYW_SIGN_TYPE = "x2";
|
|
5802
|
-
XYW_SIGN_VERSION = "1";
|
|
5803
|
-
XYW_AES_KEY = "7cc4adla5ay0701v";
|
|
5804
|
-
XYW_AES_IV = "4uzjr7mbsibcaldp";
|
|
5805
|
-
XYW_ENV_FLAGS_DEFAULT = "0|0|0|1|0|0|1|0|0|0|1|0|0|0|0|1|0|0|1";
|
|
5806
|
-
HEX_CHARS = "abcdef0123456789";
|
|
5807
|
-
XRAY_TRACE_ID_SEQ_MAX = 8388607;
|
|
5808
|
-
XRAY_TRACE_ID_TIMESTAMP_SHIFT = 23;
|
|
5809
|
-
XRAY_TRACE_ID_PART1_LENGTH = 16;
|
|
5810
|
-
XRAY_TRACE_ID_PART2_LENGTH = 16;
|
|
5811
|
-
B3_TRACE_ID_LENGTH = 16;
|
|
5812
|
-
B1_SECRET_KEY = "xhswebmplfbt";
|
|
5813
|
-
XRAP_SDK_VERSION = 10300;
|
|
5814
|
-
SIGNATURE_XSCOMMON_TEMPLATE = {
|
|
5815
|
-
s0: 5,
|
|
5816
|
-
s1: "",
|
|
5817
|
-
x0: "1",
|
|
5818
|
-
x1: "4.3.5",
|
|
5819
|
-
x2: "Windows",
|
|
5820
|
-
x3: "xhs-pc-web",
|
|
5821
|
-
x4: "4.86.0",
|
|
5822
|
-
x5: "",
|
|
5823
|
-
x6: "",
|
|
5824
|
-
x7: "",
|
|
5825
|
-
x8: "",
|
|
5826
|
-
x9: -596800761,
|
|
5827
|
-
x10: 0,
|
|
5828
|
-
x11: "normal"
|
|
5829
|
-
};
|
|
5830
|
-
PUBLIC_USERAGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0";
|
|
5831
|
-
/**
|
|
5832
|
-
* Create a new config instance with overridden values
|
|
5833
|
-
*/
|
|
5834
|
-
withOverrides(overrides) {
|
|
5835
|
-
const newConfig = new CryptoConfig();
|
|
5836
|
-
Object.assign(newConfig, overrides);
|
|
5837
|
-
return newConfig;
|
|
5838
|
-
}
|
|
5839
|
-
};
|
|
5840
|
-
var BitOperations = class {
|
|
5841
|
-
config;
|
|
5842
|
-
constructor(config) {
|
|
5843
|
-
this.config = config || new CryptoConfig();
|
|
5844
|
-
}
|
|
5845
|
-
normalizeTo32bit(value) {
|
|
5846
|
-
return value & this.config.MAX_32BIT;
|
|
5847
|
-
}
|
|
5848
|
-
toSigned32bit(unsignedValue) {
|
|
5849
|
-
if (unsignedValue > this.config.MAX_SIGNED_32BIT) return unsignedValue - 4294967296;
|
|
5850
|
-
return unsignedValue;
|
|
5851
|
-
}
|
|
5852
|
-
computeSeedValue(seed32bit) {
|
|
5853
|
-
const normalizedSeed = this.normalizeTo32bit(seed32bit);
|
|
5854
|
-
const shift15Bits = normalizedSeed >> 15;
|
|
5855
|
-
const shift13Bits = normalizedSeed >> 13;
|
|
5856
|
-
const shift12Bits = normalizedSeed >> 12;
|
|
5857
|
-
const shift10Bits = normalizedSeed >> 10;
|
|
5858
|
-
const shiftedResult = ((shift15Bits & ~shift13Bits | shift13Bits & ~shift15Bits) ^ shift12Bits ^ shift10Bits) << 31 & this.config.MAX_32BIT;
|
|
5859
|
-
return this.toSigned32bit(shiftedResult);
|
|
5860
|
-
}
|
|
5861
|
-
xorTransformArray(sourceIntegers) {
|
|
5862
|
-
const result = new Uint8Array(sourceIntegers.length);
|
|
5863
|
-
const keyBytes = Buffer.from(this.config.HEX_KEY, "hex");
|
|
5864
|
-
const keyLength = keyBytes.length;
|
|
5865
|
-
for (let i = 0; i < sourceIntegers.length; i++) if (i < keyLength) result[i] = (sourceIntegers[i] ^ keyBytes[i]) & 255;
|
|
5866
|
-
else result[i] = sourceIntegers[i] & 255;
|
|
5867
|
-
return result;
|
|
5868
|
-
}
|
|
5869
|
-
};
|
|
5870
|
-
var Base64Encoder = class {
|
|
5871
|
-
config;
|
|
5872
|
-
customEncodeTable;
|
|
5873
|
-
customDecodeTable;
|
|
5874
|
-
x3EncodeTable;
|
|
5875
|
-
x3DecodeTable;
|
|
5876
|
-
constructor(config) {
|
|
5877
|
-
this.config = config || new CryptoConfig();
|
|
5878
|
-
this.customEncodeTable = this.buildTranslationTable(this.config.STANDARD_BASE64_ALPHABET, this.config.CUSTOM_BASE64_ALPHABET);
|
|
5879
|
-
this.customDecodeTable = this.buildTranslationTable(this.config.CUSTOM_BASE64_ALPHABET, this.config.STANDARD_BASE64_ALPHABET);
|
|
5880
|
-
this.x3EncodeTable = this.buildTranslationTable(this.config.STANDARD_BASE64_ALPHABET, this.config.X3_BASE64_ALPHABET);
|
|
5881
|
-
this.x3DecodeTable = this.buildTranslationTable(this.config.X3_BASE64_ALPHABET, this.config.STANDARD_BASE64_ALPHABET);
|
|
5882
|
-
}
|
|
5883
|
-
buildTranslationTable(from, to) {
|
|
5884
|
-
const table = /* @__PURE__ */ new Map();
|
|
5885
|
-
for (let i = 0; i < from.length; i++) table.set(from[i], to[i]);
|
|
5886
|
-
return table;
|
|
5887
|
-
}
|
|
5888
|
-
translate(str, table) {
|
|
5889
|
-
let result = "";
|
|
5890
|
-
for (const char of str) result += table.get(char) ?? char;
|
|
5891
|
-
return result;
|
|
5892
|
-
}
|
|
5893
|
-
/**
|
|
5894
|
-
* Encode a string using custom Base64 alphabet
|
|
5895
|
-
*/
|
|
5896
|
-
encode(dataToEncode) {
|
|
5897
|
-
const standardEncoded = Buffer.from(dataToEncode, "utf8").toString("base64");
|
|
5898
|
-
return this.translate(standardEncoded, this.customEncodeTable);
|
|
5899
|
-
}
|
|
5900
|
-
/**
|
|
5901
|
-
* Decode string using custom Base64 alphabet
|
|
5902
|
-
*/
|
|
5903
|
-
decode(encodedString) {
|
|
5904
|
-
const standardEncoded = this.translate(encodedString, this.customDecodeTable);
|
|
5905
|
-
try {
|
|
5906
|
-
return Buffer.from(standardEncoded, "base64").toString("utf8");
|
|
5907
|
-
} catch (e) {
|
|
5908
|
-
throw new Error("Invalid Base64 input: unable to decode string");
|
|
5909
|
-
}
|
|
5910
|
-
}
|
|
5911
|
-
/**
|
|
5912
|
-
* Decode x3 signature using X3_BASE64_ALPHABET
|
|
5913
|
-
*/
|
|
5914
|
-
decodeX3(encodedString) {
|
|
5915
|
-
const standardEncoded = this.translate(encodedString, this.x3DecodeTable);
|
|
5916
|
-
try {
|
|
5917
|
-
return Buffer.from(standardEncoded, "base64");
|
|
5918
|
-
} catch (e) {
|
|
5919
|
-
throw new Error("Invalid Base64 input: unable to decode string");
|
|
5920
|
-
}
|
|
5921
|
-
}
|
|
5922
|
-
/**
|
|
5923
|
-
* Encode x3 signature using X3_BASE64_ALPHABET
|
|
5924
|
-
*/
|
|
5925
|
-
encodeX3(inputBytes) {
|
|
5926
|
-
const standardEncoded = Buffer.from(inputBytes).toString("base64");
|
|
5927
|
-
return this.translate(standardEncoded, this.x3EncodeTable);
|
|
5928
|
-
}
|
|
5929
|
-
};
|
|
5930
|
-
var HexProcessor = class {
|
|
5931
|
-
config;
|
|
5932
|
-
constructor() {
|
|
5933
|
-
this.config = new CryptoConfig();
|
|
5934
|
-
}
|
|
5935
|
-
hexStringToBytes(hexString) {
|
|
5936
|
-
const byteValues = [];
|
|
5937
|
-
for (let i = 0; i < hexString.length; i += this.config.HEX_CHUNK_SIZE) {
|
|
5938
|
-
const hexChunk = hexString.slice(i, i + this.config.HEX_CHUNK_SIZE);
|
|
5939
|
-
byteValues.push(parseInt(hexChunk, 16));
|
|
5940
|
-
}
|
|
5941
|
-
return byteValues;
|
|
5942
|
-
}
|
|
5943
|
-
processHexParameter(hexString, xorKey) {
|
|
5944
|
-
if (hexString.length !== this.config.EXPECTED_HEX_LENGTH) throw new Error(`hex parameter must be ${this.config.EXPECTED_HEX_LENGTH} characters`);
|
|
5945
|
-
return this.hexStringToBytes(hexString).map((byteVal) => byteVal ^ xorKey).slice(0, this.config.OUTPUT_BYTE_COUNT);
|
|
5946
|
-
}
|
|
5947
|
-
};
|
|
5948
|
-
var BASE36_CHARS = "0123456789abcdefghijklmnopqrstuvwxyz";
|
|
5949
|
-
var A1_CHARSET = "abcdefghijklmnopqrstuvwxyz1234567890";
|
|
5950
|
-
var STD_CRC32_TABLE = null;
|
|
5951
|
-
function stdCrc32(bytes) {
|
|
5952
|
-
if (STD_CRC32_TABLE === null) {
|
|
5953
|
-
const tbl = new Array(256);
|
|
5954
|
-
for (let n = 0; n < 256; n++) {
|
|
5955
|
-
let c = n;
|
|
5956
|
-
for (let k = 0; k < 8; k++) c = c & 1 ? c >>> 1 ^ 3988292384 : c >>> 1;
|
|
5957
|
-
tbl[n] = c >>> 0;
|
|
5958
|
-
}
|
|
5959
|
-
STD_CRC32_TABLE = tbl;
|
|
5960
|
-
}
|
|
5961
|
-
let crc = 4294967295;
|
|
5962
|
-
for (let i = 0; i < bytes.length; i++) crc = (STD_CRC32_TABLE[(crc ^ bytes[i]) & 255] ^ crc >>> 8) >>> 0;
|
|
5963
|
-
return (crc ^ 4294967295) >>> 0;
|
|
5964
|
-
}
|
|
5965
|
-
/**
|
|
5966
|
-
* Convert a non-negative BigInt to a base36 string.
|
|
5967
|
-
*/
|
|
5968
|
-
function intToBase36(value) {
|
|
5969
|
-
if (value === 0n) return "0";
|
|
5970
|
-
let result = "";
|
|
5971
|
-
const base = 36n;
|
|
5972
|
-
while (value > 0n) {
|
|
5973
|
-
const remainder = value % base;
|
|
5974
|
-
value = value / base;
|
|
5975
|
-
result = BASE36_CHARS[Number(remainder)] + result;
|
|
5976
|
-
}
|
|
5977
|
-
return result;
|
|
5978
|
-
}
|
|
5979
|
-
var RandomGenerator = class {
|
|
5980
|
-
config;
|
|
5981
|
-
constructor() {
|
|
5982
|
-
this.config = new CryptoConfig();
|
|
5983
|
-
}
|
|
5984
|
-
/**
|
|
5985
|
-
* Generate random byte array
|
|
5986
|
-
*/
|
|
5987
|
-
generateRandomBytes(byteCount) {
|
|
5988
|
-
return Array.from({ length: byteCount }, () => Math.floor(Math.random() * (this.config.MAX_BYTE + 1)));
|
|
5989
|
-
}
|
|
5990
|
-
/**
|
|
5991
|
-
* Generate random integer in range
|
|
5992
|
-
*/
|
|
5993
|
-
generateRandomByteInRange(minVal, maxVal) {
|
|
5994
|
-
return Math.floor(Math.random() * (maxVal - minVal + 1)) + minVal;
|
|
5995
|
-
}
|
|
5996
|
-
/**
|
|
5997
|
-
* Generate 32-bit random integer
|
|
5998
|
-
*/
|
|
5999
|
-
generateRandomInt() {
|
|
6000
|
-
return Math.floor(Math.random() * (this.config.MAX_32BIT + 1));
|
|
6001
|
-
}
|
|
6002
|
-
/**
|
|
6003
|
-
* Generate x-b3-traceid (16 random hex characters)
|
|
6004
|
-
*/
|
|
6005
|
-
generateB3TraceId() {
|
|
6006
|
-
let result = "";
|
|
6007
|
-
for (let i = 0; i < this.config.B3_TRACE_ID_LENGTH; i++) result += this.config.HEX_CHARS[Math.floor(Math.random() * this.config.HEX_CHARS.length)];
|
|
6008
|
-
return result;
|
|
6009
|
-
}
|
|
6010
|
-
/**
|
|
6011
|
-
* Generate x-xray-traceid (32 characters: 16 timestamp+seq + 16 random)
|
|
6012
|
-
*/
|
|
6013
|
-
generateXrayTraceId(timestamp, seq) {
|
|
6014
|
-
if (timestamp === void 0) timestamp = Date.now();
|
|
6015
|
-
if (seq === void 0) seq = Math.floor(Math.random() * (this.config.XRAY_TRACE_ID_SEQ_MAX + 1));
|
|
6016
|
-
const part1 = (BigInt(timestamp) << BigInt(this.config.XRAY_TRACE_ID_TIMESTAMP_SHIFT) | BigInt(seq)).toString(16).padStart(this.config.XRAY_TRACE_ID_PART1_LENGTH, "0");
|
|
6017
|
-
let part2 = "";
|
|
6018
|
-
for (let i = 0; i < this.config.XRAY_TRACE_ID_PART2_LENGTH; i++) part2 += this.config.HEX_CHARS[Math.floor(Math.random() * this.config.HEX_CHARS.length)];
|
|
6019
|
-
return part1 + part2;
|
|
6020
|
-
}
|
|
6021
|
-
/**
|
|
6022
|
-
* Generate a random ASCII string of the given length
|
|
6023
|
-
*/
|
|
6024
|
-
static generateRandomAscii(length, charset = "abcdefghijklmnopqrstuvwxyz0123456789") {
|
|
6025
|
-
let result = "";
|
|
6026
|
-
for (let i = 0; i < length; i++) result += charset[Math.floor(Math.random() * charset.length)];
|
|
6027
|
-
return result;
|
|
6028
|
-
}
|
|
6029
|
-
/**
|
|
6030
|
-
* Generate an a1 cookie value (52 characters)
|
|
6031
|
-
*/
|
|
6032
|
-
static generateA1() {
|
|
6033
|
-
const tsHex = Math.floor(Date.now()).toString(16);
|
|
6034
|
-
let randomStr = "";
|
|
6035
|
-
for (let i = 0; i < 30; i++) randomStr += A1_CHARSET[Math.floor(Math.random() * 36)];
|
|
6036
|
-
const aPart = tsHex + randomStr + "50000";
|
|
6037
|
-
const crc = stdCrc32(Buffer.from(aPart)) >>> 0;
|
|
6038
|
-
return (aPart + String(crc)).slice(0, 52);
|
|
6039
|
-
}
|
|
6040
|
-
/**
|
|
6041
|
-
* Generate web_id (32-character hex MD5) from an a1 cookie value
|
|
6042
|
-
*/
|
|
6043
|
-
static generateWebId(a1) {
|
|
6044
|
-
return createHash("md5").update(a1).digest("hex");
|
|
6045
|
-
}
|
|
6046
|
-
/**
|
|
6047
|
-
* Generate search_id for search endpoints (base36 of (timestamp_ms << 64) + random)
|
|
6048
|
-
*/
|
|
6049
|
-
generateSearchId() {
|
|
6050
|
-
const timestampMs = BigInt(Date.now());
|
|
6051
|
-
const randomPart = BigInt(Math.ceil(2147483646 * Math.random()));
|
|
6052
|
-
return intToBase36((timestampMs << 64n) + randomPart);
|
|
6053
|
-
}
|
|
6054
|
-
/**
|
|
6055
|
-
* Generate search request_id for search endpoints. Format: "{random}-{timestamp_ms}"
|
|
6056
|
-
*/
|
|
6057
|
-
generateSearchRequestId() {
|
|
6058
|
-
const timestampMs = Date.now();
|
|
6059
|
-
return `${Math.ceil(2147483646 * Math.random())}-${timestampMs}`;
|
|
6060
|
-
}
|
|
6061
|
-
};
|
|
6062
|
-
/**
|
|
6063
|
-
* Extract URI path from full URL (removes protocol, host, query, fragment)
|
|
6064
|
-
*/
|
|
6065
|
-
function extractUri(url) {
|
|
6066
|
-
if (!url || typeof url !== "string") throw new Error("URL must be a non-empty string");
|
|
6067
|
-
url = url.trim();
|
|
6068
|
-
try {
|
|
6069
|
-
if (url.startsWith("http://") || url.startsWith("https://")) {
|
|
6070
|
-
const path = new URL(url).pathname;
|
|
6071
|
-
if (!path || path === "/") throw new Error(`Cannot extract valid URI path from URL: ${url}`);
|
|
6072
|
-
return path;
|
|
6073
|
-
}
|
|
6074
|
-
const queryIndex = url.indexOf("?");
|
|
6075
|
-
const path = queryIndex >= 0 ? url.substring(0, queryIndex) : url;
|
|
6076
|
-
if (!path || path === "/") throw new Error(`Cannot extract valid URI path from URL: ${url}`);
|
|
6077
|
-
return path;
|
|
6078
|
-
} catch (e) {
|
|
6079
|
-
if (e instanceof Error && e.message.includes("Cannot extract")) throw e;
|
|
6080
|
-
throw new Error(`Cannot extract valid URI path from URL: ${url}`);
|
|
6081
|
-
}
|
|
6082
|
-
}
|
|
6083
|
-
/**
|
|
6084
|
-
* Build complete URL with query parameters (handles parameter escaping)
|
|
6085
|
-
*
|
|
6086
|
-
* IMPORTANT: This function uses XHS platform-specific encoding rules.
|
|
6087
|
-
* Only '=' characters are encoded as '%3D'. Other special characters
|
|
6088
|
-
* (including ',') are NOT encoded, as required by XHS signature algorithm.
|
|
6089
|
-
*/
|
|
6090
|
-
function buildUrl(baseUrl, params) {
|
|
6091
|
-
if (!baseUrl || typeof baseUrl !== "string") throw new Error("baseUrl must be a non-empty string");
|
|
6092
|
-
if (!params) return baseUrl;
|
|
6093
|
-
const queryParts = [];
|
|
6094
|
-
for (const [key, value] of Object.entries(params)) {
|
|
6095
|
-
let formattedValue;
|
|
6096
|
-
if (Array.isArray(value)) formattedValue = value.map((v) => String(v)).join(",");
|
|
6097
|
-
else if (value !== null && value !== void 0) formattedValue = String(value);
|
|
6098
|
-
else formattedValue = "";
|
|
6099
|
-
const encodedValue = formattedValue.replace(/=/g, "%3D");
|
|
6100
|
-
queryParts.push(`${key}=${encodedValue}`);
|
|
6101
|
-
}
|
|
6102
|
-
const queryString = queryParts.join("&");
|
|
6103
|
-
let separator;
|
|
6104
|
-
if (!baseUrl.includes("?")) separator = "?";
|
|
6105
|
-
else if (baseUrl.endsWith("?") || baseUrl.endsWith("&")) separator = "";
|
|
6106
|
-
else separator = "&";
|
|
6107
|
-
return `${baseUrl}${separator}${queryString}`;
|
|
6108
|
-
}
|
|
6109
|
-
/**
|
|
6110
|
-
* Pure TypeScript xxHash32 implementation.
|
|
6111
|
-
*
|
|
6112
|
-
* Ported from the upstream Python `utils/hash.py`. Used by the x-rap-param
|
|
6113
|
-
* generator to compute integrity hashes over the request body and envelope.
|
|
6114
|
-
*/
|
|
6115
|
-
var MASK_32 = 4294967295;
|
|
6116
|
-
/**
|
|
6117
|
-
* 32-bit left rotation (unsigned)
|
|
6118
|
-
*/
|
|
6119
|
-
function rotl32$1(val, shift) {
|
|
6120
|
-
val = val >>> 0;
|
|
6121
|
-
return (val << shift | val >>> 32 - shift) >>> 0;
|
|
6122
|
-
}
|
|
6123
|
-
/**
|
|
6124
|
-
* Compute the xxHash32 digest of the given bytes.
|
|
6125
|
-
*
|
|
6126
|
-
* @param data - Input bytes
|
|
6127
|
-
* @param seed - Optional seed (default 0)
|
|
6128
|
-
* @returns Unsigned 32-bit hash value
|
|
6129
|
-
*/
|
|
6130
|
-
function xxh32(data, seed = 0) {
|
|
6131
|
-
const buf = data;
|
|
6132
|
-
const length = buf.length;
|
|
6133
|
-
let pos = 0;
|
|
6134
|
-
const prime1 = 2654435761;
|
|
6135
|
-
const prime2 = 2246822519;
|
|
6136
|
-
const prime3 = 3266489917;
|
|
6137
|
-
const prime4 = 668265263;
|
|
6138
|
-
const prime5 = 374761393;
|
|
6139
|
-
let digest;
|
|
6140
|
-
if (length >= 16) {
|
|
6141
|
-
let acc1 = seed + prime1 + prime2 >>> 0;
|
|
6142
|
-
let acc2 = seed + prime2 >>> 0;
|
|
6143
|
-
let acc3 = seed >>> 0;
|
|
6144
|
-
let acc4 = seed - prime1 >>> 0;
|
|
6145
|
-
const end = length - 16;
|
|
6146
|
-
while (pos <= end) for (let accRef = 0; accRef < 4; accRef++) {
|
|
6147
|
-
const word = readU32LE(buf, pos);
|
|
6148
|
-
pos += 4;
|
|
6149
|
-
if (accRef === 0) acc1 = Math.imul(rotl32$1(acc1 + Math.imul(word, prime2) >>> 0, 13), prime1) >>> 0;
|
|
6150
|
-
else if (accRef === 1) acc2 = Math.imul(rotl32$1(acc2 + Math.imul(word, prime2) >>> 0, 13), prime1) >>> 0;
|
|
6151
|
-
else if (accRef === 2) acc3 = Math.imul(rotl32$1(acc3 + Math.imul(word, prime2) >>> 0, 13), prime1) >>> 0;
|
|
6152
|
-
else acc4 = Math.imul(rotl32$1(acc4 + Math.imul(word, prime2) >>> 0, 13), prime1) >>> 0;
|
|
6153
|
-
}
|
|
6154
|
-
digest = rotl32$1(acc1, 1) + rotl32$1(acc2, 7) + rotl32$1(acc3, 12) + rotl32$1(acc4, 18) >>> 0;
|
|
6155
|
-
} else digest = seed + prime5 >>> 0;
|
|
6156
|
-
digest = digest + length >>> 0;
|
|
6157
|
-
while (pos + 4 <= length) {
|
|
6158
|
-
const word = readU32LE(buf, pos);
|
|
6159
|
-
pos += 4;
|
|
6160
|
-
digest = Math.imul(rotl32$1(digest + Math.imul(word, prime3) >>> 0, 17), prime4) >>> 0;
|
|
6161
|
-
}
|
|
6162
|
-
while (pos < length) {
|
|
6163
|
-
digest = Math.imul(rotl32$1(digest + Math.imul(buf[pos], prime5) >>> 0, 11), prime1) >>> 0;
|
|
6164
|
-
pos += 1;
|
|
6165
|
-
}
|
|
6166
|
-
digest ^= digest >>> 15;
|
|
6167
|
-
digest = Math.imul(digest, prime2) >>> 0;
|
|
6168
|
-
digest ^= digest >>> 13;
|
|
6169
|
-
digest = Math.imul(digest, prime3) >>> 0;
|
|
6170
|
-
digest ^= digest >>> 16;
|
|
6171
|
-
return (digest & MASK_32) >>> 0;
|
|
6172
|
-
}
|
|
6173
|
-
/**
|
|
6174
|
-
* Read a 32-bit little-endian unsigned integer from a byte buffer.
|
|
6175
|
-
*/
|
|
6176
|
-
function readU32LE(buf, off) {
|
|
6177
|
-
return (buf[off] | buf[off + 1] << 8 | buf[off + 2] << 16 | buf[off + 3] << 24) >>> 0;
|
|
6178
|
-
}
|
|
6179
|
-
/**
|
|
6180
|
-
* Sharding key generation for the `xy-direction` request header.
|
|
6181
|
-
*
|
|
6182
|
-
* Ported from the upstream Python `utils/sharding.py`. When a `user_id` is
|
|
6183
|
-
* provided, the key is derived deterministically via a MurmurHash3-x86-32
|
|
6184
|
-
* variant; otherwise a random value in [10, 100] is returned.
|
|
6185
|
-
*/
|
|
6186
|
-
var C1 = 3432918353;
|
|
6187
|
-
var C2 = 461845907;
|
|
6188
|
-
/**
|
|
6189
|
-
* 32-bit left rotation (unsigned)
|
|
6190
|
-
*/
|
|
6191
|
-
function rotl32(x, r) {
|
|
6192
|
-
x = x >>> 0;
|
|
6193
|
-
return (x << r | x >>> 32 - r) >>> 0;
|
|
6194
|
-
}
|
|
6195
|
-
/**
|
|
6196
|
-
* Compute the sharding key for the `xy-direction` header.
|
|
6197
|
-
*
|
|
6198
|
-
* @param userId - Optional user id. If omitted, a random value in [10, 100].
|
|
6199
|
-
* @returns Sharding key
|
|
6200
|
-
*/
|
|
6201
|
-
function getShardingKey(userId) {
|
|
6202
|
-
if (userId === null || userId === void 0) return Math.floor(Math.random() * 91) + 10;
|
|
6203
|
-
const data = Buffer.from(userId, "utf-8");
|
|
6204
|
-
const length = data.length;
|
|
6205
|
-
let r = 151488;
|
|
6206
|
-
const nblocks = Math.floor(length / 4);
|
|
6207
|
-
for (let o = 0; o < nblocks; o++) {
|
|
6208
|
-
const i = 4 * o;
|
|
6209
|
-
let u = (data[i] | data[i + 1] << 8 | data[i + 2] << 16 | data[i + 3] << 24) >>> 0;
|
|
6210
|
-
u = Math.imul(u, C1) >>> 0;
|
|
6211
|
-
u = rotl32(u, 15);
|
|
6212
|
-
u = Math.imul(u, C2) >>> 0;
|
|
6213
|
-
r = (r ^ u) >>> 0;
|
|
6214
|
-
r = rotl32(r, 13);
|
|
6215
|
-
r = Math.imul(r, 5) + 3864292196 >>> 0;
|
|
6216
|
-
}
|
|
6217
|
-
const s = 4 * nblocks;
|
|
6218
|
-
let c = 0;
|
|
6219
|
-
const rem = length % 4;
|
|
6220
|
-
if (rem >= 3) c ^= data[s + 2] << 16;
|
|
6221
|
-
if (rem >= 2) c ^= data[s + 1] << 8;
|
|
6222
|
-
if (rem >= 1) {
|
|
6223
|
-
c ^= data[s];
|
|
6224
|
-
c = Math.imul(c, C1) >>> 0;
|
|
6225
|
-
c = rotl32(c, 15);
|
|
6226
|
-
c = Math.imul(c, C2) >>> 0;
|
|
6227
|
-
r = (r ^ c) >>> 0;
|
|
6228
|
-
}
|
|
6229
|
-
r = (r ^ length) >>> 0;
|
|
6230
|
-
r ^= r >>> 16;
|
|
6231
|
-
r = Math.imul(r, 2246822507) >>> 0;
|
|
6232
|
-
r ^= r >>> 13;
|
|
6233
|
-
r = Math.imul(r, 3266489909) >>> 0;
|
|
6234
|
-
r ^= r >>> 16;
|
|
6235
|
-
r = r >>> 0;
|
|
6236
|
-
return r % 100 + 1;
|
|
6237
|
-
}
|
|
6238
|
-
var CryptoProcessor = class {
|
|
6239
|
-
config;
|
|
6240
|
-
bitOps;
|
|
6241
|
-
b64encoder;
|
|
6242
|
-
hexProcessor;
|
|
6243
|
-
randomGen;
|
|
6244
|
-
constructor(config) {
|
|
6245
|
-
this.config = config || new CryptoConfig();
|
|
6246
|
-
this.bitOps = new BitOperations(this.config);
|
|
6247
|
-
this.b64encoder = new Base64Encoder(this.config);
|
|
6248
|
-
this.hexProcessor = new HexProcessor();
|
|
6249
|
-
this.randomGen = new RandomGenerator();
|
|
6250
|
-
}
|
|
6251
|
-
intToLeBytes(val, length = 4) {
|
|
6252
|
-
const arr = [];
|
|
6253
|
-
for (let i = 0; i < length; i++) {
|
|
6254
|
-
arr.push(val & 255);
|
|
6255
|
-
val = Math.floor(val / 256);
|
|
6256
|
-
}
|
|
6257
|
-
return arr;
|
|
6258
|
-
}
|
|
6259
|
-
/**
|
|
6260
|
-
* 32-bit left rotation
|
|
6261
|
-
*/
|
|
6262
|
-
rotateLeft(val, n) {
|
|
6263
|
-
return (val << n | val >>> 32 - n) >>> 0;
|
|
6264
|
-
}
|
|
6265
|
-
/**
|
|
6266
|
-
* Custom hash function for a3 field generation
|
|
6267
|
-
* Input: byte array (must be multiple of 8)
|
|
6268
|
-
* Output: 16-byte array
|
|
6269
|
-
*/
|
|
6270
|
-
customHashV2(inputBytes) {
|
|
6271
|
-
let [s0, s1, s2, s3] = this.config.HASH_IV;
|
|
6272
|
-
const length = inputBytes.length;
|
|
6273
|
-
s0 ^= length;
|
|
6274
|
-
s1 ^= length << 8;
|
|
6275
|
-
s2 ^= length << 16;
|
|
6276
|
-
s3 ^= length << 24;
|
|
6277
|
-
for (let i = 0; i < Math.floor(length / 8); i++) {
|
|
6278
|
-
const offset = i * 8;
|
|
6279
|
-
const v0 = (inputBytes[offset] | inputBytes[offset + 1] << 8 | inputBytes[offset + 2] << 16 | inputBytes[offset + 3] << 24) >>> 0;
|
|
6280
|
-
const v1 = (inputBytes[offset + 4] | inputBytes[offset + 5] << 8 | inputBytes[offset + 6] << 16 | inputBytes[offset + 7] << 24) >>> 0;
|
|
6281
|
-
s0 = this.rotateLeft(s0 + v0 & this.config.MAX_32BIT ^ s2, 7);
|
|
6282
|
-
s1 = this.rotateLeft((v0 ^ s1) + s3 & this.config.MAX_32BIT, 11);
|
|
6283
|
-
s2 = this.rotateLeft(s2 + v1 & this.config.MAX_32BIT ^ s0, 13);
|
|
6284
|
-
s3 = this.rotateLeft((s3 ^ v1) + s1 & this.config.MAX_32BIT, 17);
|
|
6285
|
-
}
|
|
6286
|
-
const t0 = s0 ^ length;
|
|
6287
|
-
const t1 = s1 ^ t0;
|
|
6288
|
-
const t2 = s2 + t1 & this.config.MAX_32BIT;
|
|
6289
|
-
const t3 = s3 ^ t2;
|
|
6290
|
-
const rotT0 = this.rotateLeft(t0, 9);
|
|
6291
|
-
const rotT1 = this.rotateLeft(t1, 13);
|
|
6292
|
-
const rotT2 = this.rotateLeft(t2, 17);
|
|
6293
|
-
const rotT3 = this.rotateLeft(t3, 19);
|
|
6294
|
-
s0 = rotT0 + rotT2 & this.config.MAX_32BIT;
|
|
6295
|
-
s1 = rotT1 ^ rotT3;
|
|
6296
|
-
s2 = rotT2 + s0 & this.config.MAX_32BIT;
|
|
6297
|
-
s3 = rotT3 ^ s1;
|
|
6298
|
-
const result = [];
|
|
6299
|
-
for (const s of [
|
|
6300
|
-
s0,
|
|
6301
|
-
s1,
|
|
6302
|
-
s2,
|
|
6303
|
-
s3
|
|
6304
|
-
]) result.push(...this.intToLeBytes(s, 4));
|
|
6305
|
-
return result;
|
|
6306
|
-
}
|
|
6307
|
-
/**
|
|
6308
|
-
* Build 144-byte payload array (mns0301 version)
|
|
6309
|
-
*
|
|
6310
|
-
* @param hexParameter - 32-char hex (MD5 of uri+data), used for the MD5 XOR segment
|
|
6311
|
-
* @param hexMd5Path - 32-char hex path hash (GET: MD5 of uri+params, POST: MD5 of uri)
|
|
6312
|
-
* @param a1Value - a1 value from cookies
|
|
6313
|
-
* @param appIdentifier - Application identifier, default "xhs-pc-web"
|
|
6314
|
-
* @param stringParam - String parameter (URI+data, used for length calculation)
|
|
6315
|
-
* @param timestamp - Unix timestamp in seconds (defaults to current time)
|
|
6316
|
-
* @param signState - Optional session state
|
|
6317
|
-
*/
|
|
6318
|
-
buildPayloadArray(hexParameter, hexMd5Path, a1Value, appIdentifier = "xhs-pc-web", stringParam = "", timestamp, signState) {
|
|
6319
|
-
if (timestamp === void 0) timestamp = Date.now() / 1e3;
|
|
6320
|
-
const seed = this.randomGen.generateRandomInt();
|
|
6321
|
-
const seedByte = seed & 255;
|
|
6322
|
-
const payload = [];
|
|
6323
|
-
payload.push(...this.config.VERSION_BYTES);
|
|
6324
|
-
payload.push(...this.intToLeBytes(seed, 4));
|
|
6325
|
-
const tsBytes = this.intToLeBytes(Math.floor(timestamp * 1e3), this.config.TIMESTAMP_LE_LENGTH);
|
|
6326
|
-
payload.push(...tsBytes);
|
|
6327
|
-
if (signState) {
|
|
6328
|
-
payload.push(...this.intToLeBytes(signState.pageLoadTimestamp, this.config.TIMESTAMP_LE_LENGTH));
|
|
6329
|
-
payload.push(...this.intToLeBytes(signState.sequenceValue, 4));
|
|
6330
|
-
payload.push(...this.intToLeBytes(signState.windowPropsLength, 4));
|
|
6331
|
-
payload.push(...this.intToLeBytes(signState.uriLength, 4));
|
|
6332
|
-
} else {
|
|
6333
|
-
const timeOffset = this.randomGen.generateRandomByteInRange(this.config.ENV_FINGERPRINT_TIME_OFFSET_MIN, this.config.ENV_FINGERPRINT_TIME_OFFSET_MAX);
|
|
6334
|
-
const effectiveTsMs = Math.floor((timestamp - timeOffset) * 1e3);
|
|
6335
|
-
payload.push(...this.intToLeBytes(effectiveTsMs, this.config.TIMESTAMP_LE_LENGTH));
|
|
6336
|
-
const sequenceValue = this.randomGen.generateRandomByteInRange(this.config.SEQUENCE_VALUE_MIN, this.config.SEQUENCE_VALUE_MAX);
|
|
6337
|
-
payload.push(...this.intToLeBytes(sequenceValue, 4));
|
|
6338
|
-
const windowPropsLength = this.randomGen.generateRandomByteInRange(this.config.WINDOW_PROPS_LENGTH_MIN, this.config.WINDOW_PROPS_LENGTH_MAX);
|
|
6339
|
-
payload.push(...this.intToLeBytes(windowPropsLength, 4));
|
|
6340
|
-
const uriLength = Buffer.from(stringParam, "utf-8").length;
|
|
6341
|
-
payload.push(...this.intToLeBytes(uriLength, 4));
|
|
6342
|
-
}
|
|
6343
|
-
const md5Bytes = Buffer.from(hexParameter, "hex");
|
|
6344
|
-
for (let i = 0; i < this.config.MD5_XOR_LENGTH; i++) payload.push(md5Bytes[i] ^ seedByte);
|
|
6345
|
-
const a1Bytes = Buffer.from(a1Value, "utf-8").subarray(0, this.config.A1_LENGTH);
|
|
6346
|
-
const a1Padded = Buffer.alloc(this.config.A1_LENGTH);
|
|
6347
|
-
a1Bytes.copy(a1Padded);
|
|
6348
|
-
payload.push(a1Padded.length);
|
|
6349
|
-
payload.push(...Array.from(a1Padded));
|
|
6350
|
-
const appBytes = Buffer.from(appIdentifier, "utf-8").subarray(0, this.config.APP_ID_LENGTH);
|
|
6351
|
-
const appPadded = Buffer.alloc(this.config.APP_ID_LENGTH);
|
|
6352
|
-
appBytes.copy(appPadded);
|
|
6353
|
-
payload.push(appPadded.length);
|
|
6354
|
-
payload.push(...Array.from(appPadded));
|
|
6355
|
-
const part11 = [1, seedByte ^ this.config.ENV_TABLE[0]];
|
|
6356
|
-
for (let i = 1; i < 15; i++) part11.push(this.config.ENV_TABLE[i] ^ this.config.ENV_CHECKS_DEFAULT[i]);
|
|
6357
|
-
payload.push(...part11);
|
|
6358
|
-
const md5PathBytes = [];
|
|
6359
|
-
for (let i = 0; i < 32; i += 2) md5PathBytes.push(parseInt(hexMd5Path.substring(i, i + 2), 16));
|
|
6360
|
-
const a3Hash = this.customHashV2([...tsBytes, ...md5PathBytes]);
|
|
6361
|
-
const a3Field = [...this.config.A3_PREFIX, ...a3Hash.map((b) => b ^ seedByte)];
|
|
6362
|
-
payload.push(...a3Field);
|
|
6363
|
-
return payload;
|
|
6364
|
-
}
|
|
6365
|
-
};
|
|
6366
|
-
/**
|
|
6367
|
-
* Custom CRC32 helper class.
|
|
6368
|
-
*
|
|
6369
|
-
* This implements a JavaScript-style CRC32 variant compatible with:
|
|
6370
|
-
* (-1 ^ c ^ 0xEDB88320) >>> 0
|
|
6371
|
-
* where `c` is the intermediate CRC state produced by the core CRC32 loop.
|
|
6372
|
-
*/
|
|
6373
|
-
var MASK32 = 4294967295;
|
|
6374
|
-
var POLY = 3988292384;
|
|
6375
|
-
var TABLE = null;
|
|
6376
|
-
function ensureTable() {
|
|
6377
|
-
if (TABLE !== null) return TABLE;
|
|
6378
|
-
const tbl = new Array(256);
|
|
6379
|
-
for (let d = 0; d < 256; d++) {
|
|
6380
|
-
let r = d;
|
|
6381
|
-
for (let i = 0; i < 8; i++) {
|
|
6382
|
-
r = r & 1 ? r >>> 1 ^ POLY : r >>> 1;
|
|
6383
|
-
r = r >>> 0;
|
|
6384
|
-
}
|
|
6385
|
-
tbl[d] = r;
|
|
6386
|
-
}
|
|
6387
|
-
TABLE = tbl;
|
|
6388
|
-
return TABLE;
|
|
6389
|
-
}
|
|
6390
|
-
function crc32Core(data, stringMode = "js") {
|
|
6391
|
-
const table = ensureTable();
|
|
6392
|
-
let c = MASK32;
|
|
6393
|
-
let bytes;
|
|
6394
|
-
if (typeof data === "string") {
|
|
6395
|
-
if (stringMode === "utf8") bytes = Array.from(Buffer.from(data, "utf8"));
|
|
6396
|
-
else {
|
|
6397
|
-
bytes = [];
|
|
6398
|
-
for (let i = 0; i < data.length; i++) bytes.push(data.charCodeAt(i) & 255);
|
|
6399
|
-
}
|
|
6400
|
-
} else bytes = data.map((b) => b & 255);
|
|
6401
|
-
for (const b of bytes) c = (table[(c & 255 ^ b) & 255] ^ c >>> 8) >>> 0;
|
|
6402
|
-
return c;
|
|
6403
|
-
}
|
|
6404
|
-
function toSigned32(u) {
|
|
6405
|
-
return u & 2147483648 ? u - 4294967296 : u;
|
|
6406
|
-
}
|
|
6407
|
-
var CRC32 = class {
|
|
6408
|
-
/**
|
|
6409
|
-
* JavaScript-style CRC32 public entry.
|
|
6410
|
-
*
|
|
6411
|
-
* This matches the JS expression:
|
|
6412
|
-
* (-1 ^ c ^ 0xEDB88320) >>> 0
|
|
6413
|
-
*/
|
|
6414
|
-
static crc32JsInt(data, options = {}) {
|
|
6415
|
-
const { stringMode = "js", signed = true } = options;
|
|
6416
|
-
const u = (crc32Core(data, stringMode) ^ 306674911) >>> 0;
|
|
6417
|
-
return signed ? toSigned32(u) : u;
|
|
6418
|
-
}
|
|
6419
|
-
};
|
|
6420
|
-
/**
|
|
6421
|
-
* Browser fingerprint data constants
|
|
6422
|
-
*/
|
|
6423
|
-
var GPU_VENDORS = [
|
|
6424
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) HD Graphics 400 (0x00000166) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6425
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) HD Graphics 4400 (0x00001112) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6426
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) HD Graphics 4600 (0x00000412) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6427
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) HD Graphics 520 (0x1912) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6428
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) HD Graphics 530 (0x00001912) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6429
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) HD Graphics 550 (0x00001512) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6430
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) HD Graphics 6000 (0x1606) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6431
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) Iris(TM) Graphics 540 (0x1912) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6432
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) Iris(TM) Graphics 550 (0x1913) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6433
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) Iris(TM) Plus Graphics 640 (0x161C) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6434
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) UHD Graphics 600 (0x3E80) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6435
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) UHD Graphics 620 (0x00003EA0) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6436
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) UHD Graphics 630 (0x00003E9B) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6437
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) UHD Graphics 655 (0x00009BC8) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6438
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) Iris(R) Xe Graphics (0x000046A8) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6439
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) Iris(R) Xe Graphics (0x00009A49) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6440
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) Iris(R) Xe MAX Graphics (0x00009BC0) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6441
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel Arc A370M (0x0000AF51) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6442
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel Arc A380 (0x0000AF41) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6443
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel Arc A380M (0x0000AF5E) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6444
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel Arc A550 (0x0000AF42) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6445
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel Arc A770 (0x0000AF43) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6446
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel Arc A770M (0x0000AF50) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6447
|
-
"Google Inc. (Intel)|ANGLE (Intel, Mesa Intel(R) Graphics (RPL‑P GT1) (0x0000A702) OpenGL 4.6)",
|
|
6448
|
-
"Google Inc. (Intel)|ANGLE (Intel, Mesa Intel(R) UHD Graphics 770 (0x00004680) OpenGL 4.6)",
|
|
6449
|
-
"Google Inc. (Intel)|ANGLE (Intel, Mesa Intel(R) HD Graphics 4400 (0x00001122) OpenGL 4.6)",
|
|
6450
|
-
"Google Inc. (Intel)|ANGLE (Intel, Mesa Intel(R) Graphics (ADL‑S GT1) (0x0000A0A1) OpenGL 4.6)",
|
|
6451
|
-
"Google Inc. (Intel)|ANGLE (Intel, Mesa Intel(R) Graphics (RKL GT1) (0x0000A9A1) OpenGL 4.6)",
|
|
6452
|
-
"Google Inc. (Intel)|ANGLE (Intel, Mesa Intel(R) UHD Graphics (CML GT2) (0x00009A14) OpenGL 4.6)",
|
|
6453
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) HD Graphics 3000 (0x00001022) Direct3D9Ex vs_3_0 ps_3_0, igdumd64.dll)",
|
|
6454
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) HD Graphics Family (0x00000A16) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6455
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) Iris Pro OpenGL Engine, OpenGL 4.1)",
|
|
6456
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) Iris(TM) Plus Graphics 645 (0x1616) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6457
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) Iris(TM) Plus Graphics 655 (0x161E) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6458
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) UHD Graphics 730 (0x0000A100) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6459
|
-
"Google Inc. (Intel)|ANGLE (Intel, Intel(R) UHD Graphics 805 (0x0000B0A0) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6460
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon Vega 3 Graphics (0x000015E0) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6461
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon Vega 8 Graphics (0x000015D8) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6462
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon Vega 11 Graphics (0x000015DD) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6463
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon Graphics (0x00001636) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6464
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 5500 XT Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6465
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 560 (0x000067EF) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6466
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 570 (0x000067DF) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6467
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 580 2048SP (0x00006FDF) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6468
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 590 (0x000067FF) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6469
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 6600 (0x000073FF) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6470
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 6600 XT (0x000073FF) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6471
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 6650 XT Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6472
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 6700 XT (0x000073DF) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6473
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 6800 (0x000073BF) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6474
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 6900 XT (0x000073C2) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6475
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon RX 7700 XT Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6476
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon Pro 5300M OpenGL Engine, OpenGL 4.1)",
|
|
6477
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon Pro 5500 XT OpenGL Engine, OpenGL 4.1)",
|
|
6478
|
-
"Google Inc. (AMD)|ANGLE (AMD, AMD Radeon R7 370 Series (0x00006811) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6479
|
-
"Google Inc. (AMD)|ANGLE (AMD, ATI Technologies Inc. AMD Radeon RX Vega 64 OpenGL Engine, OpenGL 4.1)",
|
|
6480
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce GTX 1050 (0x00001C81) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6481
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce GTX 1050 Ti (0x00001C8C) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6482
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce GTX 1060 6GB (0x000010DE) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6483
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce GTX 1070 (0x00001B81) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6484
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce GTX 1080 (0x00001B80) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6485
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 2060 (0x00001F06) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6486
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 2060 SUPER (0x00001F06) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6487
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 2070 (0x00001F10) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6488
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 2070 SUPER (0x00001F10) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6489
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 (0x0000250F) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6490
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Ti (0x00002489) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6491
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 3070 (0x00002488) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6492
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 3070 Ti (0x000028A5) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6493
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 3080 (0x00002206) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6494
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 3080 Ti (0x00002208) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6495
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 3090 (0x00002204) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6496
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 4060 (0x00002882) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6497
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 4060 Ti (0x00002803) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6498
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 4070 (0x00002786) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6499
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 4070 Ti (0x00002857) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6500
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 4080 (0x00002819) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6501
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA GeForce RTX 4090 (0x00002684) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6502
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA Quadro RTX 5000 Ada Generation (0x000026B2) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6503
|
-
"Google Inc. (NVIDIA)|ANGLE (NVIDIA, NVIDIA Quadro P400 (0x00001CB3) Direct3D11 vs_5_0 ps_5_0, D3D11)",
|
|
6504
|
-
"Google Inc. (Google)|ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
|
|
6505
|
-
"Google Inc. (Google)|ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero)), SwiftShader driver)",
|
|
6506
|
-
"Google Inc. (Google)|ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device), SwiftShader driver)"
|
|
6507
|
-
];
|
|
6508
|
-
var SCREEN_RESOLUTIONS = {
|
|
6509
|
-
resolutions: [
|
|
6510
|
-
"1366;768",
|
|
6511
|
-
"1600;900",
|
|
6512
|
-
"1920;1080",
|
|
6513
|
-
"2560;1440",
|
|
6514
|
-
"3840;2160",
|
|
6515
|
-
"7680;4320"
|
|
6516
|
-
],
|
|
6517
|
-
weights: [
|
|
6518
|
-
.25,
|
|
6519
|
-
.15,
|
|
6520
|
-
.35,
|
|
6521
|
-
.15,
|
|
6522
|
-
.08,
|
|
6523
|
-
.02
|
|
6524
|
-
]
|
|
6525
|
-
};
|
|
6526
|
-
var COLOR_DEPTH_OPTIONS = {
|
|
6527
|
-
values: [
|
|
6528
|
-
16,
|
|
6529
|
-
24,
|
|
6530
|
-
30,
|
|
6531
|
-
32
|
|
6532
|
-
],
|
|
6533
|
-
weights: [
|
|
6534
|
-
.05,
|
|
6535
|
-
.6,
|
|
6536
|
-
.05,
|
|
6537
|
-
.3
|
|
6538
|
-
]
|
|
6539
|
-
};
|
|
6540
|
-
var DEVICE_MEMORY_OPTIONS = {
|
|
6541
|
-
values: [
|
|
6542
|
-
1,
|
|
6543
|
-
2,
|
|
6544
|
-
4,
|
|
6545
|
-
8,
|
|
6546
|
-
12,
|
|
6547
|
-
16
|
|
6548
|
-
],
|
|
6549
|
-
weights: [
|
|
6550
|
-
.1,
|
|
6551
|
-
.25,
|
|
6552
|
-
.4,
|
|
6553
|
-
.2,
|
|
6554
|
-
.03,
|
|
6555
|
-
.01
|
|
6556
|
-
]
|
|
6557
|
-
};
|
|
6558
|
-
var CORE_OPTIONS = {
|
|
6559
|
-
values: [
|
|
6560
|
-
2,
|
|
6561
|
-
4,
|
|
6562
|
-
6,
|
|
6563
|
-
8,
|
|
6564
|
-
12,
|
|
6565
|
-
16,
|
|
6566
|
-
24,
|
|
6567
|
-
32
|
|
6568
|
-
],
|
|
6569
|
-
weights: [
|
|
6570
|
-
.1,
|
|
6571
|
-
.4,
|
|
6572
|
-
.2,
|
|
6573
|
-
.15,
|
|
6574
|
-
.08,
|
|
6575
|
-
.04,
|
|
6576
|
-
.02,
|
|
6577
|
-
.01
|
|
6578
|
-
]
|
|
6579
|
-
};
|
|
6580
|
-
var BROWSER_PLUGINS = "PDF Viewer,Chrome PDF Viewer,Chromium PDF Viewer,Microsoft Edge PDF Viewer,WebKit built-in PDF";
|
|
6581
|
-
var CANVAS_HASH = "742cc32c";
|
|
6582
|
-
var VOICE_HASH_OPTIONS = "10311144241322244122";
|
|
6583
|
-
var FONTS = "system-ui, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\", -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif, BlinkMacSystemFont, \"Helvetica Neue\", Arial, \"PingFang SC\", \"PingFang TC\", \"PingFang HK\", \"Microsoft Yahei\", \"Microsoft JhengHei\"";
|
|
6584
|
-
/**
|
|
6585
|
-
* Fingerprint generation helper functions
|
|
6586
|
-
*/
|
|
6587
|
-
/**
|
|
6588
|
-
* Random choice a value from list according to the given weights
|
|
6589
|
-
*/
|
|
6590
|
-
function weightedRandomChoice(options, weights) {
|
|
6591
|
-
const totalWeight = weights.reduce((sum, w) => sum + w, 0);
|
|
6592
|
-
let random = Math.random() * totalWeight;
|
|
6593
|
-
for (let i = 0; i < options.length; i++) {
|
|
6594
|
-
random -= weights[i];
|
|
6595
|
-
if (random <= 0) return String(options[i]);
|
|
6596
|
-
}
|
|
6597
|
-
return String(options[options.length - 1]);
|
|
6598
|
-
}
|
|
6599
|
-
/**
|
|
6600
|
-
* Get random GPU renderer information
|
|
6601
|
-
*/
|
|
6602
|
-
function getRendererInfo() {
|
|
6603
|
-
const [vendor, renderer] = GPU_VENDORS[Math.floor(Math.random() * GPU_VENDORS.length)].split("|");
|
|
6604
|
-
return [vendor, renderer];
|
|
6605
|
-
}
|
|
6606
|
-
/**
|
|
6607
|
-
* Get random screen configuration with width, height, and available dimensions
|
|
6608
|
-
*/
|
|
6609
|
-
function getScreenConfig() {
|
|
6610
|
-
const [widthStr, heightStr] = weightedRandomChoice(SCREEN_RESOLUTIONS.resolutions, SCREEN_RESOLUTIONS.weights).split(";");
|
|
6611
|
-
const width = parseInt(widthStr, 10);
|
|
6612
|
-
const height = parseInt(heightStr, 10);
|
|
6613
|
-
let availWidth;
|
|
6614
|
-
let availHeight;
|
|
6615
|
-
if (Math.random() < .5) {
|
|
6616
|
-
availWidth = width - parseInt(weightedRandomChoice([
|
|
6617
|
-
0,
|
|
6618
|
-
30,
|
|
6619
|
-
60,
|
|
6620
|
-
80
|
|
6621
|
-
], [
|
|
6622
|
-
.1,
|
|
6623
|
-
.4,
|
|
6624
|
-
.3,
|
|
6625
|
-
.2
|
|
6626
|
-
]), 10);
|
|
6627
|
-
availHeight = height;
|
|
6628
|
-
} else {
|
|
6629
|
-
availWidth = width;
|
|
6630
|
-
availHeight = height - parseInt(weightedRandomChoice([
|
|
6631
|
-
30,
|
|
6632
|
-
60,
|
|
6633
|
-
80,
|
|
6634
|
-
100
|
|
6635
|
-
], [
|
|
6636
|
-
.2,
|
|
6637
|
-
.5,
|
|
6638
|
-
.2,
|
|
6639
|
-
.1
|
|
6640
|
-
]), 10);
|
|
6641
|
-
}
|
|
6642
|
-
return {
|
|
6643
|
-
width,
|
|
6644
|
-
height,
|
|
6645
|
-
availWidth,
|
|
6646
|
-
availHeight
|
|
6647
|
-
};
|
|
6648
|
-
}
|
|
6649
|
-
/**
|
|
6650
|
-
* Generate canvas fingerprint hash
|
|
6651
|
-
*/
|
|
6652
|
-
function generateCanvasHash() {
|
|
6653
|
-
return CANVAS_HASH;
|
|
6654
|
-
}
|
|
6655
|
-
/**
|
|
6656
|
-
* Generate WebGL fingerprint hash
|
|
6657
|
-
*/
|
|
6658
|
-
function generateWebglHash() {
|
|
6659
|
-
return createHash("md5").update(randomBytes(32)).digest("hex");
|
|
6660
|
-
}
|
|
6661
|
-
/**
|
|
6662
|
-
* Browser fingerprint generator
|
|
6663
|
-
*/
|
|
6664
|
-
var FingerprintGenerator = class {
|
|
6665
|
-
config;
|
|
6666
|
-
b1Key;
|
|
6667
|
-
encoder;
|
|
6668
|
-
constructor(config) {
|
|
6669
|
-
this.config = config || new CryptoConfig();
|
|
6670
|
-
this.b1Key = Buffer.from(this.config.B1_SECRET_KEY, "utf8");
|
|
6671
|
-
this.encoder = new Base64Encoder(this.config);
|
|
6672
|
-
}
|
|
6673
|
-
/**
|
|
6674
|
-
* Generate b1 parameter from fingerprint
|
|
6675
|
-
*/
|
|
6676
|
-
generateB1(fp) {
|
|
6677
|
-
const b1Fp = {
|
|
6678
|
-
x33: fp.x33,
|
|
6679
|
-
x34: fp.x34,
|
|
6680
|
-
x35: fp.x35,
|
|
6681
|
-
x36: fp.x36,
|
|
6682
|
-
x37: fp.x37,
|
|
6683
|
-
x38: fp.x38,
|
|
6684
|
-
x39: fp.x39,
|
|
6685
|
-
x42: fp.x42,
|
|
6686
|
-
x43: fp.x43,
|
|
6687
|
-
x44: fp.x44,
|
|
6688
|
-
x45: fp.x45,
|
|
6689
|
-
x46: fp.x46,
|
|
6690
|
-
x48: fp.x48,
|
|
6691
|
-
x49: fp.x49,
|
|
6692
|
-
x50: fp.x50,
|
|
6693
|
-
x51: fp.x51,
|
|
6694
|
-
x52: fp.x52,
|
|
6695
|
-
x82: fp.x82
|
|
6696
|
-
};
|
|
6697
|
-
const b1Json = JSON.stringify(b1Fp);
|
|
6698
|
-
const ciphertext = this.rc4Encrypt(b1Json, this.b1Key);
|
|
6699
|
-
const encodedUrl = this.customUrlEncode(ciphertext);
|
|
6700
|
-
const b = [];
|
|
6701
|
-
const parts = encodedUrl.split("%").slice(1);
|
|
6702
|
-
for (const part of parts) {
|
|
6703
|
-
const chars = part.split("");
|
|
6704
|
-
b.push(parseInt(chars.slice(0, 2).join(""), 16));
|
|
6705
|
-
for (const c of chars.slice(2)) b.push(c.charCodeAt(0));
|
|
6706
|
-
}
|
|
6707
|
-
return this.encoder.encode(JSON.stringify(b));
|
|
6708
|
-
}
|
|
6709
|
-
/**
|
|
6710
|
-
* RC4 encryption implementation
|
|
6711
|
-
*/
|
|
6712
|
-
rc4Encrypt(data, key) {
|
|
6713
|
-
const S = new Array(256);
|
|
6714
|
-
for (let i = 0; i < 256; i++) S[i] = i;
|
|
6715
|
-
let j = 0;
|
|
6716
|
-
for (let i = 0; i < 256; i++) {
|
|
6717
|
-
j = (j + S[i] + key[i % key.length]) % 256;
|
|
6718
|
-
[S[i], S[j]] = [S[j], S[i]];
|
|
6719
|
-
}
|
|
6720
|
-
const dataBytes = Buffer.from(data, "utf8");
|
|
6721
|
-
const result = Buffer.alloc(dataBytes.length);
|
|
6722
|
-
let i = 0;
|
|
6723
|
-
j = 0;
|
|
6724
|
-
for (let k = 0; k < dataBytes.length; k++) {
|
|
6725
|
-
i = (i + 1) % 256;
|
|
6726
|
-
j = (j + S[i]) % 256;
|
|
6727
|
-
[S[i], S[j]] = [S[j], S[i]];
|
|
6728
|
-
const t = (S[i] + S[j]) % 256;
|
|
6729
|
-
result[k] = dataBytes[k] ^ S[t];
|
|
6730
|
-
}
|
|
6731
|
-
return result.toString("latin1");
|
|
6732
|
-
}
|
|
6733
|
-
/**
|
|
6734
|
-
* Custom URL encode matching Python's quote with safe="!*'()~_-"
|
|
6735
|
-
*/
|
|
6736
|
-
customUrlEncode(str) {
|
|
6737
|
-
const safeChars = "!*'()~_-";
|
|
6738
|
-
let result = "";
|
|
6739
|
-
for (let i = 0; i < str.length; i++) {
|
|
6740
|
-
const char = str[i];
|
|
6741
|
-
const code = str.charCodeAt(i);
|
|
6742
|
-
if (code >= 65 && code <= 90 || code >= 97 && code <= 122 || code >= 48 && code <= 57 || safeChars.includes(char)) result += char;
|
|
6743
|
-
else result += "%" + code.toString(16).toUpperCase().padStart(2, "0");
|
|
6744
|
-
}
|
|
6745
|
-
return result;
|
|
6746
|
-
}
|
|
6747
|
-
/**
|
|
6748
|
-
* Generate browser fingerprint
|
|
6749
|
-
*/
|
|
6750
|
-
generate(cookies, userAgent) {
|
|
6751
|
-
const cookieString = Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join("; ");
|
|
6752
|
-
const screenConfig = getScreenConfig();
|
|
6753
|
-
const isIncognitoMode = weightedRandomChoice(["true", "false"], [.95, .05]);
|
|
6754
|
-
const [vendor, renderer] = getRendererInfo();
|
|
6755
|
-
const x78Y = Math.floor(Math.random() * 100) + 2350;
|
|
6756
|
-
return {
|
|
6757
|
-
x1: userAgent,
|
|
6758
|
-
x2: "false",
|
|
6759
|
-
x3: "zh-CN",
|
|
6760
|
-
x4: weightedRandomChoice(COLOR_DEPTH_OPTIONS.values, COLOR_DEPTH_OPTIONS.weights),
|
|
6761
|
-
x5: weightedRandomChoice(DEVICE_MEMORY_OPTIONS.values, DEVICE_MEMORY_OPTIONS.weights),
|
|
6762
|
-
x6: "24",
|
|
6763
|
-
x7: `${vendor},${renderer}`,
|
|
6764
|
-
x8: weightedRandomChoice(CORE_OPTIONS.values, CORE_OPTIONS.weights),
|
|
6765
|
-
x9: `${screenConfig.width};${screenConfig.height}`,
|
|
6766
|
-
x10: `${screenConfig.availWidth};${screenConfig.availHeight}`,
|
|
6767
|
-
x11: "-480",
|
|
6768
|
-
x12: "Asia/Shanghai",
|
|
6769
|
-
x13: isIncognitoMode,
|
|
6770
|
-
x14: isIncognitoMode,
|
|
6771
|
-
x15: isIncognitoMode,
|
|
6772
|
-
x16: "false",
|
|
6773
|
-
x17: "false",
|
|
6774
|
-
x18: "un",
|
|
6775
|
-
x19: "Win32",
|
|
6776
|
-
x20: "",
|
|
6777
|
-
x21: BROWSER_PLUGINS,
|
|
6778
|
-
x22: generateWebglHash(),
|
|
6779
|
-
x23: "false",
|
|
6780
|
-
x24: "false",
|
|
6781
|
-
x25: "false",
|
|
6782
|
-
x26: "false",
|
|
6783
|
-
x27: "false",
|
|
6784
|
-
x28: "0,false,false",
|
|
6785
|
-
x29: "4,7,8",
|
|
6786
|
-
x30: "swf object not loaded",
|
|
6787
|
-
x33: "0",
|
|
6788
|
-
x34: "0",
|
|
6789
|
-
x35: "0",
|
|
6790
|
-
x36: `${Math.floor(Math.random() * 20) + 1}`,
|
|
6791
|
-
x37: "0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0",
|
|
6792
|
-
x38: "0|0|1|0|1|0|0|0|0|0|1|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0",
|
|
6793
|
-
x39: 0,
|
|
6794
|
-
x40: "0",
|
|
6795
|
-
x41: "0",
|
|
6796
|
-
x42: "3.4.4",
|
|
6797
|
-
x43: generateCanvasHash(),
|
|
6798
|
-
x44: `${Date.now()}`,
|
|
6799
|
-
x45: "__SEC_CAV__1-1-1-1-1|__SEC_WSA__|",
|
|
6800
|
-
x46: "false",
|
|
6801
|
-
x47: "1|0|0|0|0|0",
|
|
6802
|
-
x48: "",
|
|
6803
|
-
x49: "{list:[],type:}",
|
|
6804
|
-
x50: "",
|
|
6805
|
-
x51: "",
|
|
6806
|
-
x52: "",
|
|
6807
|
-
x55: "380,380,360,400,380,400,420,380,400,400,360,360,440,420",
|
|
6808
|
-
x56: `${vendor}|${renderer}|${generateWebglHash()}|35`,
|
|
6809
|
-
x57: cookieString,
|
|
6810
|
-
x58: "180",
|
|
6811
|
-
x59: "2",
|
|
6812
|
-
x60: "63",
|
|
6813
|
-
x61: "1291",
|
|
6814
|
-
x62: "2047",
|
|
6815
|
-
x63: "0",
|
|
6816
|
-
x64: "0",
|
|
6817
|
-
x65: "0",
|
|
6818
|
-
x66: {
|
|
6819
|
-
referer: "",
|
|
6820
|
-
location: "https://www.xiaohongshu.com/explore",
|
|
6821
|
-
frame: 0
|
|
6822
|
-
},
|
|
6823
|
-
x67: "1|0",
|
|
6824
|
-
x68: "0",
|
|
6825
|
-
x69: "326|1292|30",
|
|
6826
|
-
x70: ["location"],
|
|
6827
|
-
x71: "true",
|
|
6828
|
-
x72: "complete",
|
|
6829
|
-
x73: "1191",
|
|
6830
|
-
x74: "0|0|0",
|
|
6831
|
-
x75: "Google Inc.",
|
|
6832
|
-
x76: "true",
|
|
6833
|
-
x77: "1|1|1|1|1|1|1|1|1|1",
|
|
6834
|
-
x78: {
|
|
6835
|
-
x: 0,
|
|
6836
|
-
y: x78Y,
|
|
6837
|
-
left: 0,
|
|
6838
|
-
right: 290.828125,
|
|
6839
|
-
bottom: x78Y + 18,
|
|
6840
|
-
height: 18,
|
|
6841
|
-
top: x78Y,
|
|
6842
|
-
width: 290.828125,
|
|
6843
|
-
font: FONTS
|
|
6844
|
-
},
|
|
6845
|
-
x82: "_0x17a2|_0x1954",
|
|
6846
|
-
x31: "124.04347527516074",
|
|
6847
|
-
x79: "144|599565058866",
|
|
6848
|
-
x53: createHash("md5").update(randomBytes(32)).digest("hex"),
|
|
6849
|
-
x54: VOICE_HASH_OPTIONS,
|
|
6850
|
-
x80: "1|[object FileSystemDirectoryHandle]"
|
|
6851
|
-
};
|
|
6852
|
-
}
|
|
6853
|
-
/**
|
|
6854
|
-
* Update fingerprint with new cookies and URL
|
|
6855
|
-
*/
|
|
6856
|
-
update(fp, cookies, url) {
|
|
6857
|
-
const cookieString = Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join("; ");
|
|
6858
|
-
fp.x39 = 0;
|
|
6859
|
-
fp.x44 = `${Date.now()}`;
|
|
6860
|
-
fp.x57 = cookieString;
|
|
6861
|
-
fp.x66 = {
|
|
6862
|
-
referer: "https://www.xiaohongshu.com/explore",
|
|
6863
|
-
location: url,
|
|
6864
|
-
frame: 0
|
|
6865
|
-
};
|
|
6866
|
-
}
|
|
6867
|
-
};
|
|
6868
|
-
/**
|
|
6869
|
-
* x-s-common signature generation
|
|
6870
|
-
*/
|
|
6871
|
-
var XsCommonSigner = class {
|
|
6872
|
-
config;
|
|
6873
|
-
fpGenerator;
|
|
6874
|
-
encoder;
|
|
6875
|
-
constructor(config) {
|
|
6876
|
-
this.config = config || new CryptoConfig();
|
|
6877
|
-
this.fpGenerator = new FingerprintGenerator(this.config);
|
|
6878
|
-
this.encoder = new Base64Encoder(this.config);
|
|
6879
|
-
}
|
|
6880
|
-
/**
|
|
6881
|
-
* Generate x-s-common signature
|
|
6882
|
-
*/
|
|
6883
|
-
sign(cookieDict) {
|
|
6884
|
-
const a1Value = cookieDict.a1;
|
|
6885
|
-
if (!a1Value) throw new Error("Missing 'a1' in cookies");
|
|
6886
|
-
const fingerprint = this.fpGenerator.generate(cookieDict, this.config.PUBLIC_USERAGENT);
|
|
6887
|
-
const b1 = this.fpGenerator.generateB1(fingerprint);
|
|
6888
|
-
const x9 = CRC32.crc32JsInt(b1);
|
|
6889
|
-
const signStruct = { ...this.config.SIGNATURE_XSCOMMON_TEMPLATE };
|
|
6890
|
-
signStruct.x5 = a1Value;
|
|
6891
|
-
signStruct.x8 = b1;
|
|
6892
|
-
signStruct.x9 = x9;
|
|
6893
|
-
const signJson = JSON.stringify(signStruct);
|
|
6894
|
-
return this.encoder.encode(signJson);
|
|
6895
|
-
}
|
|
6896
|
-
};
|
|
6897
|
-
/**
|
|
6898
|
-
* XYW_ signature crypto (AES-128-CBC).
|
|
6899
|
-
*
|
|
6900
|
-
* Ported from the upstream Python `core/xyw_crypto.py`. Data-fetching APIs
|
|
6901
|
-
* (user_posted, otherinfo, etc.) reject the traditional XYS_ format with HTTP
|
|
6902
|
-
* 406; the XYW_ format uses an independent AES-128-CBC crypto path.
|
|
6903
|
-
*
|
|
6904
|
-
* The upstream ships a hand-rolled AES-128 implementation. Since it is
|
|
6905
|
-
* standard AES-128 (identical S-box, RCON, key schedule and MixColumns), this
|
|
6906
|
-
* port uses Node's native `aes-128-cbc` cipher, which produces byte-identical
|
|
6907
|
-
* ciphertext while being far less error-prone.
|
|
6908
|
-
*/
|
|
6909
|
-
var AES_BLOCK_SIZE = 16;
|
|
6910
|
-
/**
|
|
6911
|
-
* Apply PKCS#7 padding to a byte buffer.
|
|
6912
|
-
*/
|
|
6913
|
-
function pkcs7Pad(data) {
|
|
6914
|
-
const padLen = AES_BLOCK_SIZE - data.length % AES_BLOCK_SIZE;
|
|
6915
|
-
return Buffer.concat([data, Buffer.alloc(padLen, padLen)]);
|
|
6916
|
-
}
|
|
6917
|
-
/**
|
|
6918
|
-
* AES-128-CBC cipher matching the upstream XYW implementation.
|
|
6919
|
-
*/
|
|
6920
|
-
var XywCipher = class {
|
|
6921
|
-
key;
|
|
6922
|
-
iv;
|
|
6923
|
-
constructor(key, iv) {
|
|
6924
|
-
if (key.length !== AES_BLOCK_SIZE) throw new Error("AES-128 requires a 16-byte key");
|
|
6925
|
-
if (iv.length !== AES_BLOCK_SIZE) throw new Error("AES-CBC IV must be 16 bytes");
|
|
6926
|
-
this.key = key;
|
|
6927
|
-
this.iv = iv;
|
|
6928
|
-
}
|
|
6929
|
-
/**
|
|
6930
|
-
* Encrypt PKCS#7-padded plaintext with AES-128-CBC.
|
|
6931
|
-
*
|
|
6932
|
-
* @param plaintextBytes - Plaintext, already padded to a 16-byte boundary
|
|
6933
|
-
* @returns Ciphertext bytes
|
|
6934
|
-
*/
|
|
6935
|
-
encrypt(plaintextBytes) {
|
|
6936
|
-
if (plaintextBytes.length % AES_BLOCK_SIZE !== 0) throw new Error("plaintextBytes must be PKCS#7 padded to a 16-byte boundary");
|
|
6937
|
-
const cipher = createCipheriv("aes-128-cbc", this.key, this.iv);
|
|
6938
|
-
cipher.setAutoPadding(false);
|
|
6939
|
-
return Buffer.concat([cipher.update(plaintextBytes), cipher.final()]);
|
|
6940
|
-
}
|
|
6941
|
-
};
|
|
6942
|
-
/**
|
|
6943
|
-
* Build the hex-encoded payload for an XYW_ signature.
|
|
6944
|
-
*
|
|
6945
|
-
* @param options.fullUri - The content string (uri + params/body)
|
|
6946
|
-
* @param options.a1Value - a1 value from cookies
|
|
6947
|
-
* @param options.timestampMs - Millisecond timestamp string
|
|
6948
|
-
* @param options.config - Crypto configuration
|
|
6949
|
-
* @param options.envFlags - Optional environment flags string
|
|
6950
|
-
* @returns Hex-encoded AES-128-CBC ciphertext
|
|
6951
|
-
*/
|
|
6952
|
-
function buildXywPayloadHex(options) {
|
|
6953
|
-
const { fullUri, a1Value, timestampMs, config, envFlags } = options;
|
|
6954
|
-
const x1 = createHash("md5").update(`url=${fullUri}`).digest("hex");
|
|
6955
|
-
const x2 = envFlags || config.XYW_ENV_FLAGS_DEFAULT;
|
|
6956
|
-
const message = Buffer.from(`x1=${x1};x2=${x2};x3=${a1Value};x4=${timestampMs};`);
|
|
6957
|
-
const plaintext = pkcs7Pad(Buffer.from(message.toString("base64")));
|
|
6958
|
-
return new XywCipher(Buffer.from(config.XYW_AES_KEY, "utf-8"), Buffer.from(config.XYW_AES_IV, "utf-8")).encrypt(plaintext).toString("hex");
|
|
6959
|
-
}
|
|
6960
|
-
/**
|
|
6961
|
-
* x-rap-param generation.
|
|
6962
|
-
*
|
|
6963
|
-
* Ported from the upstream Python `core/xrap.py`. Required for feed, search,
|
|
6964
|
-
* and note-publishing endpoints. Builds a TLV body structure, gzip-compresses
|
|
6965
|
-
* it, then XOR + block-encrypts (SM4-variant with custom S-box/round keys) and
|
|
6966
|
-
* wraps it in a base64 envelope.
|
|
6967
|
-
*/
|
|
6968
|
-
var cfg = new CryptoConfig();
|
|
6969
|
-
cfg.MAX_32BIT;
|
|
6970
|
-
var XRAP_SDK_VERSION = cfg.XRAP_SDK_VERSION;
|
|
6971
|
-
var ROUND_KEYS = [
|
|
6972
|
-
[
|
|
6973
|
-
1802586417,
|
|
6974
|
-
1146381175,
|
|
6975
|
-
1264073008,
|
|
6976
|
-
1517568377
|
|
6977
|
-
],
|
|
6978
|
-
[
|
|
6979
|
-
2301709464,
|
|
6980
|
-
3445960687,
|
|
6981
|
-
2252150495,
|
|
6982
|
-
3695794086
|
|
6983
|
-
],
|
|
6984
|
-
[
|
|
6985
|
-
3255120652,
|
|
6986
|
-
257957091,
|
|
6987
|
-
2304576060,
|
|
6988
|
-
1427398042
|
|
6989
|
-
],
|
|
6990
|
-
[
|
|
6991
|
-
3523543150,
|
|
6992
|
-
3714391181,
|
|
6993
|
-
1412961969,
|
|
6994
|
-
19680043
|
|
6995
|
-
],
|
|
6996
|
-
[
|
|
6997
|
-
1997286255,
|
|
6998
|
-
2859022306,
|
|
6999
|
-
4266729811,
|
|
7000
|
-
4286409336
|
|
7001
|
-
],
|
|
7002
|
-
[
|
|
7003
|
-
2020015092,
|
|
7004
|
-
3524250646,
|
|
7005
|
-
744418629,
|
|
7006
|
-
3542320957
|
|
7007
|
-
],
|
|
7008
|
-
[
|
|
7009
|
-
2431239806,
|
|
7010
|
-
1122372200,
|
|
7011
|
-
1857611565,
|
|
7012
|
-
3181076496
|
|
7013
|
-
],
|
|
7014
|
-
[
|
|
7015
|
-
3922013166,
|
|
7016
|
-
2871206278,
|
|
7017
|
-
3315320491,
|
|
7018
|
-
2013308603
|
|
7019
|
-
],
|
|
7020
|
-
[
|
|
7021
|
-
330996286,
|
|
7022
|
-
3097082808,
|
|
7023
|
-
2097315091,
|
|
7024
|
-
84073384
|
|
7025
|
-
],
|
|
7026
|
-
[
|
|
7027
|
-
1348547184,
|
|
7028
|
-
3908602312,
|
|
7029
|
-
2516251867,
|
|
7030
|
-
2432184179
|
|
7031
|
-
]
|
|
7032
|
-
];
|
|
7033
|
-
var LAST_ROUND_KEY = [
|
|
7034
|
-
4086740047,
|
|
7035
|
-
460209543,
|
|
7036
|
-
2392115548,
|
|
7037
|
-
510453295
|
|
7038
|
-
];
|
|
7039
|
-
var LAST_ROUND_KEY_BYTES = (() => {
|
|
7040
|
-
const b = Buffer.alloc(16);
|
|
7041
|
-
for (let i = 0; i < 4; i++) b.writeUInt32BE(LAST_ROUND_KEY[i] >>> 0, i * 4);
|
|
7042
|
-
return b;
|
|
7043
|
-
})();
|
|
7044
|
-
var SBOX = [
|
|
7045
|
-
122,
|
|
7046
|
-
1,
|
|
7047
|
-
88,
|
|
7048
|
-
224,
|
|
7049
|
-
80,
|
|
7050
|
-
78,
|
|
7051
|
-
2,
|
|
7052
|
-
121,
|
|
7053
|
-
29,
|
|
7054
|
-
75,
|
|
7055
|
-
83,
|
|
7056
|
-
218,
|
|
7057
|
-
107,
|
|
7058
|
-
72,
|
|
7059
|
-
212,
|
|
7060
|
-
82,
|
|
7061
|
-
237,
|
|
7062
|
-
119,
|
|
7063
|
-
18,
|
|
7064
|
-
33,
|
|
7065
|
-
20,
|
|
7066
|
-
21,
|
|
7067
|
-
236,
|
|
7068
|
-
16,
|
|
7069
|
-
24,
|
|
7070
|
-
229,
|
|
7071
|
-
185,
|
|
7072
|
-
241,
|
|
7073
|
-
12,
|
|
7074
|
-
8,
|
|
7075
|
-
252,
|
|
7076
|
-
125,
|
|
7077
|
-
249,
|
|
7078
|
-
205,
|
|
7079
|
-
181,
|
|
7080
|
-
200,
|
|
7081
|
-
230,
|
|
7082
|
-
55,
|
|
7083
|
-
38,
|
|
7084
|
-
135,
|
|
7085
|
-
86,
|
|
7086
|
-
186,
|
|
7087
|
-
184,
|
|
7088
|
-
43,
|
|
7089
|
-
173,
|
|
7090
|
-
240,
|
|
7091
|
-
104,
|
|
7092
|
-
247,
|
|
7093
|
-
139,
|
|
7094
|
-
141,
|
|
7095
|
-
211,
|
|
7096
|
-
94,
|
|
7097
|
-
54,
|
|
7098
|
-
77,
|
|
7099
|
-
46,
|
|
7100
|
-
146,
|
|
7101
|
-
49,
|
|
7102
|
-
130,
|
|
7103
|
-
242,
|
|
7104
|
-
41,
|
|
7105
|
-
112,
|
|
7106
|
-
61,
|
|
7107
|
-
45,
|
|
7108
|
-
215,
|
|
7109
|
-
182,
|
|
7110
|
-
64,
|
|
7111
|
-
178,
|
|
7112
|
-
67,
|
|
7113
|
-
68,
|
|
7114
|
-
128,
|
|
7115
|
-
120,
|
|
7116
|
-
210,
|
|
7117
|
-
13,
|
|
7118
|
-
73,
|
|
7119
|
-
74,
|
|
7120
|
-
9,
|
|
7121
|
-
99,
|
|
7122
|
-
108,
|
|
7123
|
-
7,
|
|
7124
|
-
58,
|
|
7125
|
-
158,
|
|
7126
|
-
213,
|
|
7127
|
-
6,
|
|
7128
|
-
198,
|
|
7129
|
-
225,
|
|
7130
|
-
98,
|
|
7131
|
-
244,
|
|
7132
|
-
52,
|
|
7133
|
-
36,
|
|
7134
|
-
89,
|
|
7135
|
-
169,
|
|
7136
|
-
87,
|
|
7137
|
-
42,
|
|
7138
|
-
0,
|
|
7139
|
-
62,
|
|
7140
|
-
23,
|
|
7141
|
-
44,
|
|
7142
|
-
10,
|
|
7143
|
-
26,
|
|
7144
|
-
66,
|
|
7145
|
-
250,
|
|
7146
|
-
147,
|
|
7147
|
-
190,
|
|
7148
|
-
220,
|
|
7149
|
-
245,
|
|
7150
|
-
179,
|
|
7151
|
-
106,
|
|
7152
|
-
19,
|
|
7153
|
-
232,
|
|
7154
|
-
3,
|
|
7155
|
-
199,
|
|
7156
|
-
151,
|
|
7157
|
-
187,
|
|
7158
|
-
115,
|
|
7159
|
-
118,
|
|
7160
|
-
134,
|
|
7161
|
-
227,
|
|
7162
|
-
70,
|
|
7163
|
-
114,
|
|
7164
|
-
71,
|
|
7165
|
-
208,
|
|
7166
|
-
5,
|
|
7167
|
-
76,
|
|
7168
|
-
56,
|
|
7169
|
-
124,
|
|
7170
|
-
31,
|
|
7171
|
-
129,
|
|
7172
|
-
171,
|
|
7173
|
-
117,
|
|
7174
|
-
81,
|
|
7175
|
-
235,
|
|
7176
|
-
243,
|
|
7177
|
-
50,
|
|
7178
|
-
116,
|
|
7179
|
-
17,
|
|
7180
|
-
143,
|
|
7181
|
-
132,
|
|
7182
|
-
137,
|
|
7183
|
-
156,
|
|
7184
|
-
113,
|
|
7185
|
-
34,
|
|
7186
|
-
126,
|
|
7187
|
-
157,
|
|
7188
|
-
207,
|
|
7189
|
-
63,
|
|
7190
|
-
145,
|
|
7191
|
-
105,
|
|
7192
|
-
101,
|
|
7193
|
-
60,
|
|
7194
|
-
109,
|
|
7195
|
-
150,
|
|
7196
|
-
162,
|
|
7197
|
-
152,
|
|
7198
|
-
153,
|
|
7199
|
-
51,
|
|
7200
|
-
57,
|
|
7201
|
-
154,
|
|
7202
|
-
202,
|
|
7203
|
-
195,
|
|
7204
|
-
159,
|
|
7205
|
-
160,
|
|
7206
|
-
188,
|
|
7207
|
-
228,
|
|
7208
|
-
163,
|
|
7209
|
-
164,
|
|
7210
|
-
84,
|
|
7211
|
-
127,
|
|
7212
|
-
167,
|
|
7213
|
-
168,
|
|
7214
|
-
4,
|
|
7215
|
-
111,
|
|
7216
|
-
93,
|
|
7217
|
-
172,
|
|
7218
|
-
183,
|
|
7219
|
-
39,
|
|
7220
|
-
175,
|
|
7221
|
-
176,
|
|
7222
|
-
40,
|
|
7223
|
-
65,
|
|
7224
|
-
174,
|
|
7225
|
-
180,
|
|
7226
|
-
110,
|
|
7227
|
-
11,
|
|
7228
|
-
27,
|
|
7229
|
-
223,
|
|
7230
|
-
142,
|
|
7231
|
-
48,
|
|
7232
|
-
177,
|
|
7233
|
-
254,
|
|
7234
|
-
144,
|
|
7235
|
-
97,
|
|
7236
|
-
96,
|
|
7237
|
-
192,
|
|
7238
|
-
203,
|
|
7239
|
-
92,
|
|
7240
|
-
14,
|
|
7241
|
-
239,
|
|
7242
|
-
22,
|
|
7243
|
-
131,
|
|
7244
|
-
234,
|
|
7245
|
-
32,
|
|
7246
|
-
233,
|
|
7247
|
-
201,
|
|
7248
|
-
85,
|
|
7249
|
-
196,
|
|
7250
|
-
69,
|
|
7251
|
-
133,
|
|
7252
|
-
204,
|
|
7253
|
-
30,
|
|
7254
|
-
170,
|
|
7255
|
-
103,
|
|
7256
|
-
138,
|
|
7257
|
-
123,
|
|
7258
|
-
53,
|
|
7259
|
-
214,
|
|
7260
|
-
25,
|
|
7261
|
-
216,
|
|
7262
|
-
217,
|
|
7263
|
-
194,
|
|
7264
|
-
219,
|
|
7265
|
-
148,
|
|
7266
|
-
221,
|
|
7267
|
-
28,
|
|
7268
|
-
222,
|
|
7269
|
-
166,
|
|
7270
|
-
255,
|
|
7271
|
-
248,
|
|
7272
|
-
191,
|
|
7273
|
-
91,
|
|
7274
|
-
90,
|
|
7275
|
-
15,
|
|
7276
|
-
231,
|
|
7277
|
-
193,
|
|
7278
|
-
189,
|
|
7279
|
-
209,
|
|
7280
|
-
102,
|
|
7281
|
-
197,
|
|
7282
|
-
37,
|
|
7283
|
-
238,
|
|
7284
|
-
140,
|
|
7285
|
-
226,
|
|
7286
|
-
95,
|
|
7287
|
-
136,
|
|
7288
|
-
161,
|
|
7289
|
-
59,
|
|
7290
|
-
165,
|
|
7291
|
-
246,
|
|
7292
|
-
206,
|
|
7293
|
-
149,
|
|
7294
|
-
47,
|
|
7295
|
-
100,
|
|
7296
|
-
35,
|
|
7297
|
-
251,
|
|
7298
|
-
253,
|
|
7299
|
-
79,
|
|
7300
|
-
155
|
|
7301
|
-
];
|
|
7302
|
-
function gfDouble(x) {
|
|
7303
|
-
x <<= 1;
|
|
7304
|
-
return x & 256 ? (x ^ 283) & 255 : x & 255;
|
|
7305
|
-
}
|
|
7306
|
-
function gfMul(x, n) {
|
|
7307
|
-
if (n === 1) return x;
|
|
7308
|
-
if (n === 2) return gfDouble(x);
|
|
7309
|
-
if (n === 3) return gfDouble(x) ^ x;
|
|
7310
|
-
throw new Error(`unsupported GF multiplier: ${n}`);
|
|
7311
|
-
}
|
|
7312
|
-
/**
|
|
7313
|
-
* Pre-compute 4 shifted T-tables from the S-box for the round function.
|
|
7314
|
-
*/
|
|
7315
|
-
function buildLookupTables() {
|
|
7316
|
-
const col0 = [];
|
|
7317
|
-
const col1 = [];
|
|
7318
|
-
const col2 = [];
|
|
7319
|
-
const col3 = [];
|
|
7320
|
-
for (const s of SBOX) {
|
|
7321
|
-
const a = gfMul(s, 2);
|
|
7322
|
-
const d = gfMul(s, 3);
|
|
7323
|
-
col0.push((a << 24 | s << 16 | s << 8 | d) >>> 0);
|
|
7324
|
-
col1.push((d << 24 | a << 16 | s << 8 | s) >>> 0);
|
|
7325
|
-
col2.push((s << 24 | d << 16 | a << 8 | s) >>> 0);
|
|
7326
|
-
col3.push((s << 24 | s << 16 | d << 8 | a) >>> 0);
|
|
7327
|
-
}
|
|
7328
|
-
return [
|
|
7329
|
-
col0,
|
|
7330
|
-
col1,
|
|
7331
|
-
col2,
|
|
7332
|
-
col3
|
|
7333
|
-
];
|
|
7334
|
-
}
|
|
7335
|
-
var [LUT0, LUT1, LUT2, LUT3] = buildLookupTables();
|
|
7336
|
-
function readU32BE(buf, off = 0) {
|
|
7337
|
-
return buf.readUInt32BE(off);
|
|
7338
|
-
}
|
|
7339
|
-
function toCompactJson(data) {
|
|
7340
|
-
if (typeof data === "string") return data;
|
|
7341
|
-
if (Buffer.isBuffer(data) || data instanceof Uint8Array) return Buffer.from(data).toString("utf-8");
|
|
7342
|
-
return JSON.stringify(data);
|
|
7343
|
-
}
|
|
7344
|
-
function fieldByte(tag, val = 0) {
|
|
7345
|
-
const b = Buffer.alloc(3);
|
|
7346
|
-
b.writeUInt16BE(tag, 0);
|
|
7347
|
-
b.writeUInt8(val & 255, 2);
|
|
7348
|
-
return b;
|
|
7349
|
-
}
|
|
7350
|
-
function fieldU32(tag, val) {
|
|
7351
|
-
const b = Buffer.alloc(6);
|
|
7352
|
-
b.writeUInt16BE(tag, 0);
|
|
7353
|
-
b.writeUInt32BE(val >>> 0, 2);
|
|
7354
|
-
return b;
|
|
7355
|
-
}
|
|
7356
|
-
function fieldU64(tag, val) {
|
|
7357
|
-
const b = Buffer.alloc(10);
|
|
7358
|
-
b.writeUInt16BE(tag, 0);
|
|
7359
|
-
b.writeBigUInt64BE(BigInt(val), 2);
|
|
7360
|
-
return b;
|
|
7361
|
-
}
|
|
7362
|
-
function fieldBlob(tag, data) {
|
|
7363
|
-
const head = Buffer.alloc(6);
|
|
7364
|
-
head.writeUInt16BE(tag, 0);
|
|
7365
|
-
head.writeUInt32BE(data.length >>> 0, 2);
|
|
7366
|
-
return Buffer.concat([head, data]);
|
|
7367
|
-
}
|
|
7368
|
-
/**
|
|
7369
|
-
* Encrypt a single 16-byte block; shorter input is zero-padded on the right.
|
|
7370
|
-
*/
|
|
7371
|
-
function encryptBlock16(block) {
|
|
7372
|
-
const src = Buffer.from(block);
|
|
7373
|
-
if (src.length > 16) throw new Error("block length must be <= 16");
|
|
7374
|
-
const padded = Buffer.alloc(16);
|
|
7375
|
-
src.copy(padded);
|
|
7376
|
-
let s0 = (readU32BE(padded, 0) ^ ROUND_KEYS[0][0]) >>> 0;
|
|
7377
|
-
let s1 = (readU32BE(padded, 4) ^ ROUND_KEYS[0][1]) >>> 0;
|
|
7378
|
-
let s2 = (readU32BE(padded, 8) ^ ROUND_KEYS[0][2]) >>> 0;
|
|
7379
|
-
let s3 = (readU32BE(padded, 12) ^ ROUND_KEYS[0][3]) >>> 0;
|
|
7380
|
-
for (let rnd = 1; rnd < 10; rnd++) {
|
|
7381
|
-
const rk = ROUND_KEYS[rnd];
|
|
7382
|
-
const n0 = (LUT0[s0 >>> 24 & 255] ^ LUT1[s1 >>> 16 & 255] ^ LUT2[s2 >>> 8 & 255] ^ LUT3[s3 & 255] ^ rk[0]) >>> 0;
|
|
7383
|
-
const n1 = (LUT0[s1 >>> 24 & 255] ^ LUT1[s2 >>> 16 & 255] ^ LUT2[s3 >>> 8 & 255] ^ LUT3[s0 & 255] ^ rk[1]) >>> 0;
|
|
7384
|
-
const n2 = (LUT0[s2 >>> 24 & 255] ^ LUT1[s3 >>> 16 & 255] ^ LUT2[s0 >>> 8 & 255] ^ LUT3[s1 & 255] ^ rk[2]) >>> 0;
|
|
7385
|
-
const n3 = (LUT0[s3 >>> 24 & 255] ^ LUT1[s0 >>> 16 & 255] ^ LUT2[s1 >>> 8 & 255] ^ LUT3[s2 & 255] ^ rk[3]) >>> 0;
|
|
7386
|
-
s0 = n0;
|
|
7387
|
-
s1 = n1;
|
|
7388
|
-
s2 = n2;
|
|
7389
|
-
s3 = n3;
|
|
7390
|
-
}
|
|
7391
|
-
const state = [
|
|
7392
|
-
s0,
|
|
7393
|
-
s1,
|
|
7394
|
-
s2,
|
|
7395
|
-
s3
|
|
7396
|
-
];
|
|
7397
|
-
const out = Buffer.alloc(16);
|
|
7398
|
-
for (let row = 0; row < 4; row++) for (let col = 0; col < 4; col++) {
|
|
7399
|
-
const idx = state[row + col & 3] >>> 24 - 8 * col & 255;
|
|
7400
|
-
out[4 * row + col] = SBOX[idx] ^ LAST_ROUND_KEY_BYTES[4 * row + col];
|
|
7401
|
-
}
|
|
7402
|
-
return out;
|
|
7403
|
-
}
|
|
7404
|
-
/**
|
|
7405
|
-
* Encrypt data by splitting into 16-byte blocks (ECB mode).
|
|
7406
|
-
*/
|
|
7407
|
-
function encryptBlocks(src) {
|
|
7408
|
-
const parts = [];
|
|
7409
|
-
for (let i = 0; i < src.length; i += 16) parts.push(encryptBlock16(src.subarray(i, i + 16)));
|
|
7410
|
-
return Buffer.concat(parts);
|
|
7411
|
-
}
|
|
7412
|
-
/**
|
|
7413
|
-
* Encrypt the 16-byte session key and append its length.
|
|
7414
|
-
*/
|
|
7415
|
-
function encryptSessionKey(key) {
|
|
7416
|
-
if (key.length !== 16) throw new Error("session key must be 16 bytes");
|
|
7417
|
-
const len = Buffer.alloc(4);
|
|
7418
|
-
len.writeUInt32BE(16, 0);
|
|
7419
|
-
return Buffer.concat([encryptBlock16(key), len]);
|
|
7420
|
-
}
|
|
7421
|
-
var DEFAULT_INTERACTION_TRACE = Buffer.from("0002000200004700000000000001ffd9ffa8005c23fff1ffff001501ff90fff9000022fff2ffff001501ffb800770061a5ffe3ffff002a01fffcffe70000f0ffe4ffff002a01ffd30000003e01ffd40000003e01ffc8ffff005301ffbdfffa006901ffbefffb006901ffb1fff4007d01ffa6ffee009301ffa8ffef009301ff9effe900a801ff96ffe600be01ff97ffe600be01ff93ffe500d301ff92ffe500ea01ff92ffe4010501ff92ffe3011b01ff92ffe402d101ff93ffe502f201ff94ffe6040501", "hex");
|
|
7422
|
-
var DEFAULT_ENVIRONMENT_SNAPSHOT = Buffer.from("000000010000000000000000fffeffff00000000000000390001ffff00bc00000000006e00020001013400000000012f00000002011a00000000016100000000019f0000000002470000000002790000000002b1", "hex");
|
|
7423
|
-
/**
|
|
7424
|
-
* Build the pre-compression TLV payload for the RAP parameter.
|
|
7425
|
-
*/
|
|
7426
|
-
function buildBodyStructure(api, data, options = {}) {
|
|
7427
|
-
const bodyStr = toCompactJson(data);
|
|
7428
|
-
const hashInput = Buffer.from(api + bodyStr, "utf-8");
|
|
7429
|
-
const ts = options.timestampMs === null || options.timestampMs === void 0 ? Math.floor(Date.now()) : Math.floor(options.timestampMs);
|
|
7430
|
-
let key;
|
|
7431
|
-
if (typeof options.sessionKey === "string") key = Buffer.from(options.sessionKey, "ascii");
|
|
7432
|
-
else if (options.sessionKey) key = Buffer.from(options.sessionKey);
|
|
7433
|
-
else key = Buffer.from(RandomGenerator.generateRandomAscii(16), "ascii");
|
|
7434
|
-
if (key.length !== 16) throw new Error("sessionKey must be 16 bytes");
|
|
7435
|
-
const xorByte = options.obfuscationByte === null || options.obfuscationByte === void 0 ? Math.floor(Math.random() * 255) + 1 : options.obfuscationByte & 255;
|
|
7436
|
-
const randNonce = options.nonce === null || options.nonce === void 0 ? Math.floor(Math.random() * 4294967296) >>> 0 : options.nonce >>> 0;
|
|
7437
|
-
const trace = options.interactionTrace ?? DEFAULT_INTERACTION_TRACE;
|
|
7438
|
-
const env = options.environmentSnapshot ?? DEFAULT_ENVIRONMENT_SNAPSHOT;
|
|
7439
|
-
const parts = [];
|
|
7440
|
-
parts.push(fieldU64(1e3, ts));
|
|
7441
|
-
parts.push(fieldU32(1001, randNonce));
|
|
7442
|
-
parts.push(fieldBlob(1002, key));
|
|
7443
|
-
parts.push(fieldU32(1003, xxh32(hashInput)));
|
|
7444
|
-
const flagTags = [];
|
|
7445
|
-
for (let t = 1051; t < 1066; t++) flagTags.push(t);
|
|
7446
|
-
flagTags.push(1070);
|
|
7447
|
-
for (let t = 1066; t < 1070; t++) flagTags.push(t);
|
|
7448
|
-
for (const tag of flagTags) parts.push(fieldByte(tag));
|
|
7449
|
-
parts.push(fieldU32(1100, 0));
|
|
7450
|
-
for (let t = 1071; t < 1074; t++) parts.push(fieldByte(t));
|
|
7451
|
-
parts.push(fieldU32(1075, 1380));
|
|
7452
|
-
parts.push(fieldU32(1076, 44));
|
|
7453
|
-
parts.push(fieldU64(1077, Math.max(0, ts - 1076)));
|
|
7454
|
-
parts.push(fieldBlob(1078, trace));
|
|
7455
|
-
parts.push(fieldU32(1082, 0));
|
|
7456
|
-
parts.push(fieldU32(1084, 0));
|
|
7457
|
-
parts.push(fieldU32(1085, 0));
|
|
7458
|
-
parts.push(fieldU32(1086, 100));
|
|
7459
|
-
parts.push(fieldU64(1087, Math.max(0, ts - 727)));
|
|
7460
|
-
parts.push(fieldBlob(1088, env));
|
|
7461
|
-
parts.push(fieldU32(1090, 0));
|
|
7462
|
-
parts.push(fieldU32(1097, 0));
|
|
7463
|
-
parts.push(fieldU32(1092, 1382));
|
|
7464
|
-
parts.push(fieldU32(1094, 1305));
|
|
7465
|
-
parts.push(fieldU64(1095, Math.max(0, ts - 8588)));
|
|
7466
|
-
parts.push(fieldU32(1093, 0));
|
|
7467
|
-
parts.push(fieldByte(1096));
|
|
7468
|
-
parts.push(fieldBlob(1091, Buffer.from([
|
|
7469
|
-
0,
|
|
7470
|
-
0,
|
|
7471
|
-
255,
|
|
7472
|
-
255
|
|
7473
|
-
])));
|
|
7474
|
-
for (let t = 1151; t < 1157; t++) parts.push(fieldByte(t));
|
|
7475
|
-
const buf = Buffer.concat(parts);
|
|
7476
|
-
const out = Buffer.from(buf);
|
|
7477
|
-
for (let i = 16; i < out.length; i++) out[i] = out[i] ^ xorByte;
|
|
7478
|
-
return out;
|
|
7479
|
-
}
|
|
7480
|
-
/**
|
|
7481
|
-
* Gzip-compress with OS byte patched to match the browser runtime (0x03).
|
|
7482
|
-
*/
|
|
7483
|
-
function compressBody(raw, mtime, level = 6) {
|
|
7484
|
-
const mt = mtime === null || mtime === void 0 ? Math.floor(Date.now() / 1e3) : mtime;
|
|
7485
|
-
const out = Buffer.from(gzipSync(raw, { level }));
|
|
7486
|
-
if (out.length >= 10) {
|
|
7487
|
-
out.writeUInt32LE(mt >>> 0, 4);
|
|
7488
|
-
out[9] = 3;
|
|
7489
|
-
}
|
|
7490
|
-
return out;
|
|
7491
|
-
}
|
|
7492
|
-
function cyclicXor(data, key) {
|
|
7493
|
-
const out = Buffer.alloc(data.length);
|
|
7494
|
-
for (let i = 0; i < data.length; i++) out[i] = data[i] ^ key[i % key.length];
|
|
7495
|
-
return out;
|
|
7496
|
-
}
|
|
7497
|
-
/**
|
|
7498
|
-
* Encrypt, wrap, and base64-encode the compressed body into the final x-rap-param.
|
|
7499
|
-
*/
|
|
7500
|
-
function packEnvelope(compressed, options = {}) {
|
|
7501
|
-
const gz = Buffer.from(compressed);
|
|
7502
|
-
let key;
|
|
7503
|
-
if (typeof options.encryptionKey === "string") key = Buffer.from(options.encryptionKey, "ascii");
|
|
7504
|
-
else if (options.encryptionKey) key = Buffer.from(options.encryptionKey);
|
|
7505
|
-
else key = Buffer.from(RandomGenerator.generateRandomAscii(16), "ascii");
|
|
7506
|
-
if (key.length !== 16) throw new Error("encryptionKey must be 16 bytes");
|
|
7507
|
-
const salt = options.saltString === null || options.saltString === void 0 ? RandomGenerator.generateRandomAscii([
|
|
7508
|
-
4,
|
|
7509
|
-
5,
|
|
7510
|
-
6
|
|
7511
|
-
][Math.floor(Math.random() * 3)]) : options.saltString;
|
|
7512
|
-
const saltBytes = Buffer.from(salt, "ascii");
|
|
7513
|
-
if (saltBytes.length < 0 || saltBytes.length > 255) throw new Error("saltString length must fit one byte");
|
|
7514
|
-
const cipherBlocks = encryptBlocks(cyclicXor(gz, key));
|
|
7515
|
-
const gzLen = Buffer.alloc(4);
|
|
7516
|
-
gzLen.writeUInt32BE(gz.length >>> 0, 0);
|
|
7517
|
-
const cipherBody = Buffer.concat([cipherBlocks, gzLen]);
|
|
7518
|
-
const content = Buffer.concat([
|
|
7519
|
-
saltBytes,
|
|
7520
|
-
encryptSessionKey(key),
|
|
7521
|
-
cipherBody
|
|
7522
|
-
]);
|
|
7523
|
-
const contentHash = xxh32(content);
|
|
7524
|
-
const encTime = options.processingTime === null || options.processingTime === void 0 ? Math.floor(Math.random() * 181) + 60 : options.processingTime;
|
|
7525
|
-
const protocolVersion = options.protocolVersion ?? XRAP_SDK_VERSION;
|
|
7526
|
-
const header = Buffer.alloc(36);
|
|
7527
|
-
header[0] = 7;
|
|
7528
|
-
header[1] = 36;
|
|
7529
|
-
header[2] = 1;
|
|
7530
|
-
header[3] = saltBytes.length & 255;
|
|
7531
|
-
header.writeUInt32BE(1, 4);
|
|
7532
|
-
header.writeUInt32BE(20, 8);
|
|
7533
|
-
header.writeUInt32BE(cipherBody.length >>> 0, 12);
|
|
7534
|
-
header.writeUInt32BE(contentHash >>> 0, 16);
|
|
7535
|
-
header.writeUInt32BE(protocolVersion >>> 0, 20);
|
|
7536
|
-
header.writeUInt32BE(encTime >>> 0, 24);
|
|
7537
|
-
return Buffer.concat([header, content]).toString("base64");
|
|
7538
|
-
}
|
|
7539
|
-
/**
|
|
7540
|
-
* Generate x-rap-param from API path and request payload.
|
|
7541
|
-
*
|
|
7542
|
-
* @param api - Request API path (e.g. "//edith.xiaohongshu.com/api/sns/web/v1/feed")
|
|
7543
|
-
* @param data - Request body as object, JSON string, or raw bytes
|
|
7544
|
-
* @param options - Optional deterministic overrides (used for testing)
|
|
7545
|
-
* @returns Base64-encoded x-rap-param string
|
|
7546
|
-
*/
|
|
7547
|
-
function xRapParam(api, data, options = {}) {
|
|
7548
|
-
return packEnvelope(compressBody(buildBodyStructure(api, data, {
|
|
7549
|
-
sessionKey: options.innerKey,
|
|
7550
|
-
timestampMs: options.timestampMs,
|
|
7551
|
-
nonce: options.bodyRand32,
|
|
7552
|
-
obfuscationByte: options.mask,
|
|
7553
|
-
interactionTrace: options.tracePayload,
|
|
7554
|
-
environmentSnapshot: options.envPayload
|
|
7555
|
-
}), options.gzipMtime, options.compresslevel ?? 6), {
|
|
7556
|
-
encryptionKey: options.aesKey,
|
|
7557
|
-
saltString: options.randomString,
|
|
7558
|
-
processingTime: options.bodyEncryTime,
|
|
7559
|
-
protocolVersion: options.sdkVersion ?? XRAP_SDK_VERSION
|
|
7560
|
-
});
|
|
7561
|
-
}
|
|
7562
|
-
var methodSchema = _enum(["GET", "POST"], { message: "method must be \"GET\" or \"POST\"" });
|
|
7563
|
-
var uriSchema = string$2({ message: "uri must be a string" }).min(1, "uri cannot be empty");
|
|
7564
|
-
var a1ValueSchema = string$2({ message: "a1Value must be a string" }).min(1, "a1Value cannot be empty");
|
|
7565
|
-
string$2({ message: "xsecAppid must be a string" }).min(1, "xsecAppid cannot be empty");
|
|
7566
|
-
record(string$2(), any()).nullable().optional();
|
|
7567
|
-
var cookieSchema = union([record(string$2(), any()), string$2()]);
|
|
7568
|
-
var signatureParamsSchema = object({
|
|
7569
|
-
method: methodSchema,
|
|
7570
|
-
uri: uriSchema,
|
|
7571
|
-
a1Value: a1ValueSchema
|
|
7572
|
-
});
|
|
7573
|
-
var getSignatureParamsSchema = object({
|
|
7574
|
-
uri: uriSchema,
|
|
7575
|
-
a1Value: a1ValueSchema
|
|
7576
|
-
});
|
|
7577
|
-
var postSignatureParamsSchema = object({
|
|
7578
|
-
uri: uriSchema,
|
|
7579
|
-
a1Value: a1ValueSchema
|
|
7580
|
-
});
|
|
7581
|
-
var xsCommonParamsSchema = object({ cookieDict: cookieSchema });
|
|
7582
|
-
function validateSignatureParams(method, uri, a1Value) {
|
|
7583
|
-
try {
|
|
7584
|
-
signatureParamsSchema.parse({
|
|
7585
|
-
method,
|
|
7586
|
-
uri,
|
|
7587
|
-
a1Value
|
|
7588
|
-
});
|
|
7589
|
-
} catch (error) {
|
|
7590
|
-
if (error instanceof ZodError) {
|
|
7591
|
-
const firstError = error.issues[0];
|
|
7592
|
-
throw new TypeError(firstError.message);
|
|
7593
|
-
}
|
|
7594
|
-
throw error;
|
|
7595
|
-
}
|
|
7596
|
-
}
|
|
7597
|
-
function validateGetSignatureParams(uri, a1Value) {
|
|
7598
|
-
try {
|
|
7599
|
-
getSignatureParamsSchema.parse({
|
|
7600
|
-
uri,
|
|
7601
|
-
a1Value
|
|
7602
|
-
});
|
|
7603
|
-
} catch (error) {
|
|
7604
|
-
if (error instanceof ZodError) {
|
|
7605
|
-
const firstError = error.issues[0];
|
|
7606
|
-
throw new TypeError(firstError.message);
|
|
7607
|
-
}
|
|
7608
|
-
throw error;
|
|
7609
|
-
}
|
|
7610
|
-
}
|
|
7611
|
-
function validatePostSignatureParams(uri, a1Value) {
|
|
7612
|
-
try {
|
|
7613
|
-
postSignatureParamsSchema.parse({
|
|
7614
|
-
uri,
|
|
7615
|
-
a1Value
|
|
7616
|
-
});
|
|
7617
|
-
} catch (error) {
|
|
7618
|
-
if (error instanceof ZodError) {
|
|
7619
|
-
const firstError = error.issues[0];
|
|
7620
|
-
throw new TypeError(firstError.message);
|
|
7621
|
-
}
|
|
7622
|
-
throw error;
|
|
7623
|
-
}
|
|
7624
|
-
}
|
|
7625
|
-
function validateXsCommonParams(cookieDict) {
|
|
7626
|
-
try {
|
|
7627
|
-
xsCommonParamsSchema.parse({ cookieDict });
|
|
7628
|
-
} catch (error) {
|
|
7629
|
-
if (error instanceof ZodError) {
|
|
7630
|
-
const firstError = error.issues[0];
|
|
7631
|
-
throw new TypeError(firstError.message);
|
|
7632
|
-
}
|
|
7633
|
-
throw error;
|
|
7634
|
-
}
|
|
7635
|
-
}
|
|
7636
|
-
var Xhshow = class {
|
|
7637
|
-
config;
|
|
7638
|
-
cryptoProcessor;
|
|
7639
|
-
randomGenerator;
|
|
7640
|
-
/**
|
|
7641
|
-
* 创建 Xhshow 实例
|
|
7642
|
-
* @param config - 可选的加密配置对象,不传则使用默认配置
|
|
7643
|
-
*/
|
|
7644
|
-
constructor(config) {
|
|
7645
|
-
this.config = config || new CryptoConfig();
|
|
7646
|
-
this.cryptoProcessor = new CryptoProcessor(this.config);
|
|
7647
|
-
this.randomGenerator = new RandomGenerator();
|
|
7648
|
-
}
|
|
7649
|
-
/**
|
|
7650
|
-
* 构建内容字符串(用于 MD5 计算和签名生成)
|
|
7651
|
-
* @param method - HTTP 请求方法
|
|
7652
|
-
* @param uri - 请求 URI 路径
|
|
7653
|
-
* @param payload - 请求参数或请求体
|
|
7654
|
-
* @returns 用于签名的内容字符串
|
|
7655
|
-
*/
|
|
7656
|
-
buildContentString(method, uri, payload = null) {
|
|
7657
|
-
const normalizedPayload = payload || {};
|
|
7658
|
-
if (method.toUpperCase() === "POST") return uri + JSON.stringify(normalizedPayload);
|
|
7659
|
-
else {
|
|
7660
|
-
if (Object.keys(normalizedPayload).length === 0) return uri;
|
|
7661
|
-
return `${uri}?${Object.entries(normalizedPayload).map(([key, value]) => {
|
|
7662
|
-
let valStr = "";
|
|
7663
|
-
if (Array.isArray(value)) valStr = value.map((v) => String(v)).join(",");
|
|
7664
|
-
else valStr = value !== null && value !== void 0 ? String(value) : "";
|
|
7665
|
-
return `${key}=${valStr.replace(/=/g, "%3D")}`;
|
|
7666
|
-
}).join("&")}`;
|
|
7667
|
-
}
|
|
7668
|
-
}
|
|
7669
|
-
/**
|
|
7670
|
-
* 根据内容字符串生成 d 值(MD5 哈希)
|
|
7671
|
-
* @param content - 内容字符串
|
|
7672
|
-
* @returns MD5 哈希值(十六进制字符串)
|
|
7673
|
-
*/
|
|
7674
|
-
generateDValue(content) {
|
|
7675
|
-
return createHash("md5").update(content, "utf8").digest("hex");
|
|
7676
|
-
}
|
|
7677
|
-
/**
|
|
7678
|
-
* 构建签名
|
|
7679
|
-
* @param dValue - MD5 哈希值
|
|
7680
|
-
* @param a1Value - Cookie 中的 a1 值
|
|
7681
|
-
* @param xsecAppid - 应用 ID,默认为 'xhs-pc-web'
|
|
7682
|
-
* @param stringParam - 字符串参数
|
|
7683
|
-
* @param timestamp - 可选的时间戳
|
|
7684
|
-
* @param signState - 可选的签名状态(用于会话管理)
|
|
7685
|
-
* @returns 编码后的签名字符串
|
|
7686
|
-
*/
|
|
7687
|
-
buildSignature(dValue, mValue, a1Value, xsecAppid = "xhs-pc-web", stringParam = "", timestamp, signState) {
|
|
7688
|
-
const payloadArray = this.cryptoProcessor.buildPayloadArray(dValue, mValue, a1Value, xsecAppid, stringParam, timestamp, signState);
|
|
7689
|
-
const xorResult = this.cryptoProcessor.bitOps.xorTransformArray(payloadArray);
|
|
7690
|
-
return this.cryptoProcessor.b64encoder.encodeX3(xorResult.subarray(0, this.config.PAYLOAD_LENGTH));
|
|
7691
|
-
}
|
|
7692
|
-
/**
|
|
7693
|
-
* 生成请求签名(支持 GET 和 POST)
|
|
7694
|
-
* @param method - HTTP 请求方法,'GET' 或 'POST'
|
|
7695
|
-
* @param uri - 请求 URI 路径(可以是完整 URL,会自动提取路径部分)
|
|
7696
|
-
* @param a1Value - Cookie 中的 a1 值
|
|
7697
|
-
* @param xsecAppid - 应用 ID,默认为 'xhs-pc-web'
|
|
7698
|
-
* @param payload - GET 请求的查询参数或 POST 请求的请求体
|
|
7699
|
-
* @param timestamp - 可选的时间戳(秒),不传则使用当前时间
|
|
7700
|
-
* @param session - 可选的会话管理器,用于生成更真实的签名
|
|
7701
|
-
* @returns x-s 签名字符串
|
|
7702
|
-
*/
|
|
7703
|
-
signXs(method, uri, a1Value, xsecAppid = "xhs-pc-web", payload = null, timestamp, session) {
|
|
7704
|
-
validateSignatureParams(method, uri, a1Value);
|
|
7705
|
-
uri = extractUri(uri);
|
|
7706
|
-
const signatureData = { ...this.config.SIGNATURE_DATA_TEMPLATE };
|
|
7707
|
-
const contentString = this.buildContentString(method, uri, payload);
|
|
7708
|
-
const dValue = this.generateDValue(contentString);
|
|
7709
|
-
const mValue = method === "GET" ? dValue : createHash("md5").update(uri, "utf8").digest("hex");
|
|
7710
|
-
const signState = session ? session.getCurrentState(contentString) : void 0;
|
|
7711
|
-
signatureData.x3 = this.config.X3_PREFIX + this.buildSignature(dValue, mValue, a1Value, xsecAppid, contentString, timestamp, signState);
|
|
7712
|
-
const jsonStr = JSON.stringify(signatureData);
|
|
7713
|
-
return this.config.XYS_PREFIX + this.cryptoProcessor.b64encoder.encode(jsonStr);
|
|
7714
|
-
}
|
|
7715
|
-
/**
|
|
7716
|
-
* 生成 XYW_ 格式签名(AES-128-CBC 加密)
|
|
7717
|
-
*
|
|
7718
|
-
* 数据获取类接口(user_posted、otherinfo 等)自 2026 年 3 月起会以 HTTP 406
|
|
7719
|
-
* 拒绝传统 XYS_ 格式,此时需改用 XYW_ 格式。它使用独立于 signXs 的加密路径。
|
|
7720
|
-
*
|
|
7721
|
-
* @param method - HTTP 请求方法,'GET' 或 'POST'
|
|
7722
|
-
* @param uri - 请求 URI 路径(可以是完整 URL)
|
|
7723
|
-
* @param a1Value - Cookie 中的 a1 值
|
|
7724
|
-
* @param xsecAppid - 应用 ID,默认为 'xhs-pc-web'
|
|
7725
|
-
* @param payload - GET 请求的查询参数或 POST 请求的请求体
|
|
7726
|
-
* @param timestamp - 可选的时间戳(秒),不传则使用当前时间
|
|
7727
|
-
* @param _session - 未使用,仅为保持与 signXs 的接口一致
|
|
7728
|
-
* @returns XYW_ 格式签名字符串
|
|
7729
|
-
*/
|
|
7730
|
-
signXyw(method, uri, a1Value, xsecAppid = "xhs-pc-web", payload = null, timestamp, _session) {
|
|
7731
|
-
validateSignatureParams(method, uri, a1Value);
|
|
7732
|
-
uri = extractUri(uri);
|
|
7733
|
-
const payloadHex = buildXywPayloadHex({
|
|
7734
|
-
fullUri: this.buildContentString(method, uri, payload),
|
|
7735
|
-
a1Value,
|
|
7736
|
-
timestampMs: String(this.getXT(timestamp)),
|
|
7737
|
-
config: this.config
|
|
7738
|
-
});
|
|
7739
|
-
const xywData = {
|
|
7740
|
-
signSvn: this.config.XYW_SIGN_SVN,
|
|
7741
|
-
signType: this.config.XYW_SIGN_TYPE,
|
|
7742
|
-
appId: xsecAppid,
|
|
7743
|
-
signVersion: this.config.XYW_SIGN_VERSION,
|
|
7744
|
-
payload: payloadHex
|
|
7745
|
-
};
|
|
7746
|
-
const xywJson = JSON.stringify(xywData);
|
|
7747
|
-
return this.config.XYW_PREFIX + Buffer.from(xywJson, "utf-8").toString("base64");
|
|
7748
|
-
}
|
|
7749
|
-
/**
|
|
7750
|
-
* 生成 x-s-common 签名
|
|
7751
|
-
* @param cookieDict - Cookie 字典对象或 Cookie 字符串
|
|
7752
|
-
* @returns x-s-common 签名字符串
|
|
7753
|
-
*/
|
|
7754
|
-
signXsCommon(cookieDict) {
|
|
7755
|
-
const parsedCookies = this.parseCookies(cookieDict);
|
|
7756
|
-
return new XsCommonSigner(this.config).sign(parsedCookies);
|
|
7757
|
-
}
|
|
7758
|
-
/**
|
|
7759
|
-
* 生成 GET 请求签名(便捷方法)
|
|
7760
|
-
* @param uri - 请求 URI 路径
|
|
7761
|
-
* @param a1Value - Cookie 中的 a1 值
|
|
7762
|
-
* @param xsecAppid - 应用 ID,默认为 'xhs-pc-web'
|
|
7763
|
-
* @param params - 查询参数对象
|
|
7764
|
-
* @param timestamp - 可选的时间戳(秒)
|
|
7765
|
-
* @param session - 可选的会话管理器
|
|
7766
|
-
* @returns x-s 签名字符串
|
|
7767
|
-
*/
|
|
7768
|
-
signXsGet(uri, a1Value, xsecAppid = "xhs-pc-web", params = null, timestamp, session) {
|
|
7769
|
-
validateGetSignatureParams(uri, a1Value);
|
|
7770
|
-
return this.signXs("GET", uri, a1Value, xsecAppid, params, timestamp, session);
|
|
7771
|
-
}
|
|
7772
|
-
/**
|
|
7773
|
-
* 生成 POST 请求签名(便捷方法)
|
|
7774
|
-
* @param uri - 请求 URI 路径
|
|
7775
|
-
* @param a1Value - Cookie 中的 a1 值
|
|
7776
|
-
* @param xsecAppid - 应用 ID,默认为 'xhs-pc-web'
|
|
7777
|
-
* @param payload - 请求体对象
|
|
7778
|
-
* @param timestamp - 可选的时间戳(秒)
|
|
7779
|
-
* @param session - 可选的会话管理器
|
|
7780
|
-
* @returns x-s 签名字符串
|
|
7781
|
-
*/
|
|
7782
|
-
signXsPost(uri, a1Value, xsecAppid = "xhs-pc-web", payload = null, timestamp, session) {
|
|
7783
|
-
validatePostSignatureParams(uri, a1Value);
|
|
7784
|
-
return this.signXs("POST", uri, a1Value, xsecAppid, payload, timestamp, session);
|
|
7785
|
-
}
|
|
7786
|
-
/**
|
|
7787
|
-
* 生成 x-s-common 签名的便捷包装方法
|
|
7788
|
-
* @param cookieDict - Cookie 字典对象或 Cookie 字符串
|
|
7789
|
-
* @returns x-s-common 签名字符串
|
|
7790
|
-
*/
|
|
7791
|
-
signXsc(cookieDict) {
|
|
7792
|
-
validateXsCommonParams(cookieDict);
|
|
7793
|
-
return this.signXsCommon(cookieDict);
|
|
7794
|
-
}
|
|
7795
|
-
/**
|
|
7796
|
-
* 解密 x3 签名(Base64 格式)
|
|
7797
|
-
* @param x3Signature - x3 签名字符串
|
|
7798
|
-
* @returns 解密后的字节数组
|
|
7799
|
-
*/
|
|
7800
|
-
decodeX3(x3Signature) {
|
|
7801
|
-
if (x3Signature.startsWith(this.config.X3_PREFIX)) x3Signature = x3Signature.slice(this.config.X3_PREFIX.length);
|
|
7802
|
-
const decodedBytes = this.cryptoProcessor.b64encoder.decodeX3(x3Signature);
|
|
7803
|
-
return this.cryptoProcessor.bitOps.xorTransformArray(Array.from(decodedBytes));
|
|
7804
|
-
}
|
|
7805
|
-
/**
|
|
7806
|
-
* 解密完整的 XYS 签名
|
|
7807
|
-
* @param xsSignature - x-s 签名字符串
|
|
7808
|
-
* @returns 解密后的签名数据对象
|
|
7809
|
-
* @throws 如果 JSON 解析失败则抛出错误
|
|
7810
|
-
*/
|
|
7811
|
-
decodeXs(xsSignature) {
|
|
7812
|
-
if (xsSignature.startsWith(this.config.XYS_PREFIX)) xsSignature = xsSignature.slice(this.config.XYS_PREFIX.length);
|
|
7813
|
-
const jsonString = this.cryptoProcessor.b64encoder.decode(xsSignature);
|
|
7814
|
-
try {
|
|
7815
|
-
return JSON.parse(jsonString);
|
|
7816
|
-
} catch (e) {
|
|
7817
|
-
throw new Error(`Invalid signature: JSON decode failed - ${e}`);
|
|
7818
|
-
}
|
|
7819
|
-
}
|
|
7820
|
-
/**
|
|
7821
|
-
* 构建带查询参数的完整 URL(便捷方法)
|
|
7822
|
-
* @param baseUrl - 基础 URL
|
|
7823
|
-
* @param params - 可选的查询参数对象
|
|
7824
|
-
* @returns 完整的 URL 字符串
|
|
7825
|
-
*/
|
|
7826
|
-
buildUrl(baseUrl, params) {
|
|
7827
|
-
return buildUrl(baseUrl, params);
|
|
7828
|
-
}
|
|
7829
|
-
/**
|
|
7830
|
-
* 构建 POST 请求的 JSON 请求体字符串(便捷方法)
|
|
7831
|
-
* @param payload - 请求体对象
|
|
7832
|
-
* @returns JSON 字符串
|
|
7833
|
-
*/
|
|
7834
|
-
buildJsonBody(payload) {
|
|
7835
|
-
return JSON.stringify(payload);
|
|
7836
|
-
}
|
|
7837
|
-
/**
|
|
7838
|
-
* 生成 HTTP 请求头中的 x-b3-traceid
|
|
7839
|
-
* @returns x-b3-traceid 字符串
|
|
7840
|
-
*/
|
|
7841
|
-
getB3TraceId() {
|
|
7842
|
-
return this.randomGenerator.generateB3TraceId();
|
|
7843
|
-
}
|
|
7844
|
-
/**
|
|
7845
|
-
* 生成 HTTP 请求头中的 x-xray-traceid
|
|
7846
|
-
* @param timestamp - 可选的时间戳(毫秒)
|
|
7847
|
-
* @param seq - 可选的序列号
|
|
7848
|
-
* @returns x-xray-traceid 字符串
|
|
7849
|
-
*/
|
|
7850
|
-
getXrayTraceId(timestamp, seq) {
|
|
7851
|
-
return this.randomGenerator.generateXrayTraceId(timestamp, seq);
|
|
7852
|
-
}
|
|
7853
|
-
/**
|
|
7854
|
-
* 生成搜索接口所需的 search_id
|
|
7855
|
-
* @returns Base36 编码的搜索 ID
|
|
7856
|
-
*/
|
|
7857
|
-
getSearchId() {
|
|
7858
|
-
return this.randomGenerator.generateSearchId();
|
|
7859
|
-
}
|
|
7860
|
-
/**
|
|
7861
|
-
* 生成搜索接口所需的 request_id
|
|
7862
|
-
* @returns 格式为 "{random}-{timestamp_ms}" 的字符串
|
|
7863
|
-
*/
|
|
7864
|
-
getSearchRequestId() {
|
|
7865
|
-
return this.randomGenerator.generateSearchRequestId();
|
|
7866
|
-
}
|
|
7867
|
-
/**
|
|
7868
|
-
* 生成 a1 Cookie 值
|
|
7869
|
-
* @returns 52 字符的 a1 值
|
|
7870
|
-
*/
|
|
7871
|
-
static generateA1() {
|
|
7872
|
-
return RandomGenerator.generateA1();
|
|
7873
|
-
}
|
|
7874
|
-
/**
|
|
7875
|
-
* 根据 a1 值生成 web_id
|
|
7876
|
-
* @param a1 - a1 Cookie 值
|
|
7877
|
-
* @returns 32 字符的十六进制 web_id
|
|
7878
|
-
*/
|
|
7879
|
-
static generateWebId(a1) {
|
|
7880
|
-
return RandomGenerator.generateWebId(a1);
|
|
7881
|
-
}
|
|
7882
|
-
/**
|
|
7883
|
-
* 生成 x-t 请求头值(Unix 时间戳,毫秒)
|
|
7884
|
-
* @param timestamp - 可选的时间戳(秒),不传则使用当前时间
|
|
7885
|
-
* @returns Unix 时间戳(毫秒)
|
|
7886
|
-
*/
|
|
7887
|
-
getXT(timestamp) {
|
|
7888
|
-
if (timestamp === void 0) timestamp = Date.now() / 1e3;
|
|
7889
|
-
return Math.floor(timestamp * 1e3);
|
|
7890
|
-
}
|
|
7891
|
-
/**
|
|
7892
|
-
* 将 Cookie 解析为字典格式
|
|
7893
|
-
* @param cookies - Cookie 字典对象或 Cookie 字符串
|
|
7894
|
-
* @returns Cookie 字典对象
|
|
7895
|
-
*/
|
|
7896
|
-
parseCookies(cookies) {
|
|
7897
|
-
if (typeof cookies === "string") {
|
|
7898
|
-
const result = {};
|
|
7899
|
-
const pairs = cookies.split(";");
|
|
7900
|
-
for (const pair of pairs) {
|
|
7901
|
-
const trimmed = pair.trim();
|
|
7902
|
-
const eqIndex = trimmed.indexOf("=");
|
|
7903
|
-
if (eqIndex > 0) {
|
|
7904
|
-
const key = trimmed.substring(0, eqIndex).trim();
|
|
7905
|
-
result[key] = trimmed.substring(eqIndex + 1).trim();
|
|
7906
|
-
}
|
|
7907
|
-
}
|
|
7908
|
-
return result;
|
|
7909
|
-
}
|
|
7910
|
-
return cookies;
|
|
7911
|
-
}
|
|
7912
|
-
/**
|
|
7913
|
-
* 生成包含签名和追踪 ID 的完整请求头
|
|
7914
|
-
* @param method - HTTP 请求方法,'GET' 或 'POST'
|
|
7915
|
-
* @param uri - 请求 URI 路径
|
|
7916
|
-
* @param cookies - Cookie 字典对象或 Cookie 字符串(必须包含 a1)
|
|
7917
|
-
* @param xsecAppid - 应用 ID,默认为 'xhs-pc-web'
|
|
7918
|
-
* @param params - GET 请求的查询参数(POST 请求时不可用)
|
|
7919
|
-
* @param payload - POST 请求的请求体(GET 请求时不可用)
|
|
7920
|
-
* @param timestamp - 可选的时间戳(秒)
|
|
7921
|
-
* @param session - 可选的会话管理器
|
|
7922
|
-
* @returns 包含 x-s、x-s-common、x-t、x-b3-traceid、x-xray-traceid 的请求头对象
|
|
7923
|
-
* @throws 如果 GET 请求使用 payload 或 POST 请求使用 params 则抛出错误
|
|
7924
|
-
* @throws 如果 cookies 中缺少 a1 则抛出错误
|
|
7925
|
-
*/
|
|
7926
|
-
signHeaders(method, uri, cookies, xsecAppid = "xhs-pc-web", params, payload, timestamp, session, signFormat = "xys", userId, xRap = false) {
|
|
7927
|
-
if (timestamp === void 0) timestamp = Date.now() / 1e3;
|
|
7928
|
-
const methodUpper = method.toUpperCase();
|
|
7929
|
-
let requestData;
|
|
7930
|
-
if (methodUpper === "GET") {
|
|
7931
|
-
if (payload !== void 0 && payload !== null) throw new Error("GET requests must use 'params', not 'payload'");
|
|
7932
|
-
requestData = params ?? null;
|
|
7933
|
-
} else if (methodUpper === "POST") {
|
|
7934
|
-
if (params !== void 0 && params !== null) throw new Error("POST requests must use 'payload', not 'params'");
|
|
7935
|
-
requestData = payload ?? null;
|
|
7936
|
-
} else throw new Error(`Unsupported method: ${method}`);
|
|
7937
|
-
if (signFormat !== "xys" && signFormat !== "xyw") throw new Error(`Unsupported signFormat=${JSON.stringify(signFormat)}; expected 'xys' or 'xyw'`);
|
|
7938
|
-
const cookieDict = this.parseCookies(cookies);
|
|
7939
|
-
const a1Value = cookieDict.a1;
|
|
7940
|
-
if (!a1Value) throw new Error("Missing 'a1' in cookies");
|
|
7941
|
-
const xS = signFormat === "xyw" ? this.signXyw(methodUpper, uri, a1Value, xsecAppid, requestData, timestamp) : this.signXs(methodUpper, uri, a1Value, xsecAppid, requestData, timestamp, session);
|
|
7942
|
-
const xSCommon = this.signXsCommon(cookieDict);
|
|
7943
|
-
const xT = this.getXT(timestamp);
|
|
7944
|
-
const xB3Traceid = this.getB3TraceId();
|
|
7945
|
-
const xXrayTraceid = this.getXrayTraceId(Math.floor(timestamp * 1e3));
|
|
7946
|
-
const headers = {
|
|
7947
|
-
"x-s": xS,
|
|
7948
|
-
"x-s-common": xSCommon,
|
|
7949
|
-
"x-t": String(xT),
|
|
7950
|
-
"x-b3-traceid": xB3Traceid,
|
|
7951
|
-
"x-xray-traceid": xXrayTraceid,
|
|
7952
|
-
"x-mns": "unload",
|
|
7953
|
-
"xy-direction": String(getShardingKey(userId))
|
|
7954
|
-
};
|
|
7955
|
-
if (xRap) headers["x-rap-param"] = xRapParam("//edith.xiaohongshu.com" + extractUri(uri), requestData || {});
|
|
7956
|
-
return headers;
|
|
7957
|
-
}
|
|
7958
|
-
/**
|
|
7959
|
-
* 生成 GET 请求的完整请求头(便捷方法)
|
|
7960
|
-
* @param uri - 请求 URI 路径
|
|
7961
|
-
* @param cookies - Cookie 字典对象或 Cookie 字符串(必须包含 a1)
|
|
7962
|
-
* @param xsecAppid - 应用 ID,默认为 'xhs-pc-web'
|
|
7963
|
-
* @param params - 查询参数对象
|
|
7964
|
-
* @param timestamp - 可选的时间戳(秒)
|
|
7965
|
-
* @param session - 可选的会话管理器
|
|
7966
|
-
* @returns 包含签名和追踪 ID 的请求头对象
|
|
7967
|
-
*/
|
|
7968
|
-
signHeadersGet(uri, cookies, xsecAppid = "xhs-pc-web", params, timestamp, session, signFormat = "xys", userId, xRap = false) {
|
|
7969
|
-
return this.signHeaders("GET", uri, cookies, xsecAppid, params, void 0, timestamp, session, signFormat, userId, xRap);
|
|
7970
|
-
}
|
|
7971
|
-
/**
|
|
7972
|
-
* 生成 POST 请求的完整请求头(便捷方法)
|
|
7973
|
-
* @param uri - 请求 URI 路径
|
|
7974
|
-
* @param cookies - Cookie 字典对象或 Cookie 字符串(必须包含 a1)
|
|
7975
|
-
* @param xsecAppid - 应用 ID,默认为 'xhs-pc-web'
|
|
7976
|
-
* @param payload - 请求体对象
|
|
7977
|
-
* @param timestamp - 可选的时间戳(秒)
|
|
7978
|
-
* @param session - 可选的会话管理器
|
|
7979
|
-
* @returns 包含签名和追踪 ID 的请求头对象
|
|
7980
|
-
*/
|
|
7981
|
-
signHeadersPost(uri, cookies, xsecAppid = "xhs-pc-web", payload, timestamp, session, signFormat = "xys", userId, xRap = false) {
|
|
7982
|
-
return this.signHeaders("POST", uri, cookies, xsecAppid, void 0, payload, timestamp, session, signFormat, userId, xRap);
|
|
7983
|
-
}
|
|
7984
|
-
};
|
|
7985
|
-
//#endregion
|
|
7986
5681
|
//#region ../../node_modules/.pnpm/protobufjs@8.8.0/node_modules/protobufjs/src/util/aspromise.js
|
|
7987
5682
|
var require_aspromise = /* @__PURE__ */ __commonJSMin$1(((exports, module) => {
|
|
7988
5683
|
module.exports = asPromise;
|
|
@@ -56992,7 +54687,7 @@ function createLucideIcon(iconDataOrName, iconNode = [], aliases = []) {
|
|
|
56992
54687
|
* This source code is licensed under the ISC license.
|
|
56993
54688
|
* See the LICENSE file in the root directory of this source tree.
|
|
56994
54689
|
*/
|
|
56995
|
-
var __iconData$
|
|
54690
|
+
var __iconData$93 = {
|
|
56996
54691
|
name: "arrow-right",
|
|
56997
54692
|
size: 24,
|
|
56998
54693
|
node: [["path", {
|
|
@@ -57003,8 +54698,8 @@ var __iconData$92 = {
|
|
|
57003
54698
|
key: "xquz4c"
|
|
57004
54699
|
}]]
|
|
57005
54700
|
};
|
|
57006
|
-
__iconData$
|
|
57007
|
-
var ArrowRight = createLucideIcon(__iconData$
|
|
54701
|
+
__iconData$93.node;
|
|
54702
|
+
var ArrowRight = createLucideIcon(__iconData$93);
|
|
57008
54703
|
//#endregion
|
|
57009
54704
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/bell-ring.mjs
|
|
57010
54705
|
/**
|
|
@@ -57013,7 +54708,7 @@ var ArrowRight = createLucideIcon(__iconData$92);
|
|
|
57013
54708
|
* This source code is licensed under the ISC license.
|
|
57014
54709
|
* See the LICENSE file in the root directory of this source tree.
|
|
57015
54710
|
*/
|
|
57016
|
-
var __iconData$
|
|
54711
|
+
var __iconData$92 = {
|
|
57017
54712
|
name: "bell-ring",
|
|
57018
54713
|
size: 24,
|
|
57019
54714
|
node: [
|
|
@@ -57035,8 +54730,8 @@ var __iconData$91 = {
|
|
|
57035
54730
|
}]
|
|
57036
54731
|
]
|
|
57037
54732
|
};
|
|
57038
|
-
__iconData$
|
|
57039
|
-
var BellRing = createLucideIcon(__iconData$
|
|
54733
|
+
__iconData$92.node;
|
|
54734
|
+
var BellRing = createLucideIcon(__iconData$92);
|
|
57040
54735
|
//#endregion
|
|
57041
54736
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/book-open-text.mjs
|
|
57042
54737
|
/**
|
|
@@ -57045,7 +54740,7 @@ var BellRing = createLucideIcon(__iconData$91);
|
|
|
57045
54740
|
* This source code is licensed under the ISC license.
|
|
57046
54741
|
* See the LICENSE file in the root directory of this source tree.
|
|
57047
54742
|
*/
|
|
57048
|
-
var __iconData$
|
|
54743
|
+
var __iconData$91 = {
|
|
57049
54744
|
name: "book-open-text",
|
|
57050
54745
|
size: 24,
|
|
57051
54746
|
node: [
|
|
@@ -57075,8 +54770,8 @@ var __iconData$90 = {
|
|
|
57075
54770
|
}]
|
|
57076
54771
|
]
|
|
57077
54772
|
};
|
|
57078
|
-
__iconData$
|
|
57079
|
-
var BookOpenText = createLucideIcon(__iconData$
|
|
54773
|
+
__iconData$91.node;
|
|
54774
|
+
var BookOpenText = createLucideIcon(__iconData$91);
|
|
57080
54775
|
//#endregion
|
|
57081
54776
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/bookmark.mjs
|
|
57082
54777
|
/**
|
|
@@ -57085,7 +54780,7 @@ var BookOpenText = createLucideIcon(__iconData$90);
|
|
|
57085
54780
|
* This source code is licensed under the ISC license.
|
|
57086
54781
|
* See the LICENSE file in the root directory of this source tree.
|
|
57087
54782
|
*/
|
|
57088
|
-
var __iconData$
|
|
54783
|
+
var __iconData$90 = {
|
|
57089
54784
|
name: "bookmark",
|
|
57090
54785
|
size: 24,
|
|
57091
54786
|
node: [["path", {
|
|
@@ -57093,8 +54788,8 @@ var __iconData$89 = {
|
|
|
57093
54788
|
key: "oz39mx"
|
|
57094
54789
|
}]]
|
|
57095
54790
|
};
|
|
57096
|
-
__iconData$
|
|
57097
|
-
var Bookmark = createLucideIcon(__iconData$
|
|
54791
|
+
__iconData$90.node;
|
|
54792
|
+
var Bookmark = createLucideIcon(__iconData$90);
|
|
57098
54793
|
//#endregion
|
|
57099
54794
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/bot.mjs
|
|
57100
54795
|
/**
|
|
@@ -57103,7 +54798,7 @@ var Bookmark = createLucideIcon(__iconData$89);
|
|
|
57103
54798
|
* This source code is licensed under the ISC license.
|
|
57104
54799
|
* See the LICENSE file in the root directory of this source tree.
|
|
57105
54800
|
*/
|
|
57106
|
-
var __iconData$
|
|
54801
|
+
var __iconData$89 = {
|
|
57107
54802
|
name: "bot",
|
|
57108
54803
|
size: 24,
|
|
57109
54804
|
node: [
|
|
@@ -57137,8 +54832,8 @@ var __iconData$88 = {
|
|
|
57137
54832
|
}]
|
|
57138
54833
|
]
|
|
57139
54834
|
};
|
|
57140
|
-
__iconData$
|
|
57141
|
-
var Bot = createLucideIcon(__iconData$
|
|
54835
|
+
__iconData$89.node;
|
|
54836
|
+
var Bot = createLucideIcon(__iconData$89);
|
|
57142
54837
|
//#endregion
|
|
57143
54838
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/box.mjs
|
|
57144
54839
|
/**
|
|
@@ -57147,7 +54842,7 @@ var Bot = createLucideIcon(__iconData$88);
|
|
|
57147
54842
|
* This source code is licensed under the ISC license.
|
|
57148
54843
|
* See the LICENSE file in the root directory of this source tree.
|
|
57149
54844
|
*/
|
|
57150
|
-
var __iconData$
|
|
54845
|
+
var __iconData$88 = {
|
|
57151
54846
|
name: "box",
|
|
57152
54847
|
size: 24,
|
|
57153
54848
|
node: [
|
|
@@ -57165,8 +54860,8 @@ var __iconData$87 = {
|
|
|
57165
54860
|
}]
|
|
57166
54861
|
]
|
|
57167
54862
|
};
|
|
57168
|
-
__iconData$
|
|
57169
|
-
var Box = createLucideIcon(__iconData$
|
|
54863
|
+
__iconData$88.node;
|
|
54864
|
+
var Box = createLucideIcon(__iconData$88);
|
|
57170
54865
|
//#endregion
|
|
57171
54866
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/braces.mjs
|
|
57172
54867
|
/**
|
|
@@ -57175,7 +54870,7 @@ var Box = createLucideIcon(__iconData$87);
|
|
|
57175
54870
|
* This source code is licensed under the ISC license.
|
|
57176
54871
|
* See the LICENSE file in the root directory of this source tree.
|
|
57177
54872
|
*/
|
|
57178
|
-
var __iconData$
|
|
54873
|
+
var __iconData$87 = {
|
|
57179
54874
|
name: "braces",
|
|
57180
54875
|
size: 24,
|
|
57181
54876
|
node: [["path", {
|
|
@@ -57187,8 +54882,8 @@ var __iconData$86 = {
|
|
|
57187
54882
|
}]],
|
|
57188
54883
|
aliases: ["curly-braces"]
|
|
57189
54884
|
};
|
|
57190
|
-
__iconData$
|
|
57191
|
-
var Braces = createLucideIcon(__iconData$
|
|
54885
|
+
__iconData$87.node;
|
|
54886
|
+
var Braces = createLucideIcon(__iconData$87);
|
|
57192
54887
|
//#endregion
|
|
57193
54888
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/calendar.mjs
|
|
57194
54889
|
/**
|
|
@@ -57197,7 +54892,7 @@ var Braces = createLucideIcon(__iconData$86);
|
|
|
57197
54892
|
* This source code is licensed under the ISC license.
|
|
57198
54893
|
* See the LICENSE file in the root directory of this source tree.
|
|
57199
54894
|
*/
|
|
57200
|
-
var __iconData$
|
|
54895
|
+
var __iconData$86 = {
|
|
57201
54896
|
name: "calendar",
|
|
57202
54897
|
size: 24,
|
|
57203
54898
|
node: [
|
|
@@ -57223,8 +54918,8 @@ var __iconData$85 = {
|
|
|
57223
54918
|
}]
|
|
57224
54919
|
]
|
|
57225
54920
|
};
|
|
57226
|
-
__iconData$
|
|
57227
|
-
var Calendar = createLucideIcon(__iconData$
|
|
54921
|
+
__iconData$86.node;
|
|
54922
|
+
var Calendar = createLucideIcon(__iconData$86);
|
|
57228
54923
|
//#endregion
|
|
57229
54924
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/camera.mjs
|
|
57230
54925
|
/**
|
|
@@ -57233,7 +54928,7 @@ var Calendar = createLucideIcon(__iconData$85);
|
|
|
57233
54928
|
* This source code is licensed under the ISC license.
|
|
57234
54929
|
* See the LICENSE file in the root directory of this source tree.
|
|
57235
54930
|
*/
|
|
57236
|
-
var __iconData$
|
|
54931
|
+
var __iconData$85 = {
|
|
57237
54932
|
name: "camera",
|
|
57238
54933
|
size: 24,
|
|
57239
54934
|
node: [["path", {
|
|
@@ -57246,8 +54941,8 @@ var __iconData$84 = {
|
|
|
57246
54941
|
key: "1vg3eu"
|
|
57247
54942
|
}]]
|
|
57248
54943
|
};
|
|
57249
|
-
__iconData$
|
|
57250
|
-
var Camera = createLucideIcon(__iconData$
|
|
54944
|
+
__iconData$85.node;
|
|
54945
|
+
var Camera = createLucideIcon(__iconData$85);
|
|
57251
54946
|
//#endregion
|
|
57252
54947
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/chart-column.mjs
|
|
57253
54948
|
/**
|
|
@@ -57256,7 +54951,7 @@ var Camera = createLucideIcon(__iconData$84);
|
|
|
57256
54951
|
* This source code is licensed under the ISC license.
|
|
57257
54952
|
* See the LICENSE file in the root directory of this source tree.
|
|
57258
54953
|
*/
|
|
57259
|
-
var __iconData$
|
|
54954
|
+
var __iconData$84 = {
|
|
57260
54955
|
name: "chart-column",
|
|
57261
54956
|
size: 24,
|
|
57262
54957
|
node: [
|
|
@@ -57279,8 +54974,8 @@ var __iconData$83 = {
|
|
|
57279
54974
|
],
|
|
57280
54975
|
aliases: ["bar-chart-3"]
|
|
57281
54976
|
};
|
|
57282
|
-
__iconData$
|
|
57283
|
-
var ChartColumn = createLucideIcon(__iconData$
|
|
54977
|
+
__iconData$84.node;
|
|
54978
|
+
var ChartColumn = createLucideIcon(__iconData$84);
|
|
57284
54979
|
//#endregion
|
|
57285
54980
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/check.mjs
|
|
57286
54981
|
/**
|
|
@@ -57289,7 +54984,7 @@ var ChartColumn = createLucideIcon(__iconData$83);
|
|
|
57289
54984
|
* This source code is licensed under the ISC license.
|
|
57290
54985
|
* See the LICENSE file in the root directory of this source tree.
|
|
57291
54986
|
*/
|
|
57292
|
-
var __iconData$
|
|
54987
|
+
var __iconData$83 = {
|
|
57293
54988
|
name: "check",
|
|
57294
54989
|
size: 24,
|
|
57295
54990
|
node: [["path", {
|
|
@@ -57297,8 +54992,8 @@ var __iconData$82 = {
|
|
|
57297
54992
|
key: "1gmf2c"
|
|
57298
54993
|
}]]
|
|
57299
54994
|
};
|
|
57300
|
-
__iconData$
|
|
57301
|
-
var Check = createLucideIcon(__iconData$
|
|
54995
|
+
__iconData$83.node;
|
|
54996
|
+
var Check = createLucideIcon(__iconData$83);
|
|
57302
54997
|
//#endregion
|
|
57303
54998
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/circle-alert.mjs
|
|
57304
54999
|
/**
|
|
@@ -57307,7 +55002,7 @@ var Check = createLucideIcon(__iconData$82);
|
|
|
57307
55002
|
* This source code is licensed under the ISC license.
|
|
57308
55003
|
* See the LICENSE file in the root directory of this source tree.
|
|
57309
55004
|
*/
|
|
57310
|
-
var __iconData$
|
|
55005
|
+
var __iconData$82 = {
|
|
57311
55006
|
name: "circle-alert",
|
|
57312
55007
|
size: 24,
|
|
57313
55008
|
node: [
|
|
@@ -57334,8 +55029,8 @@ var __iconData$81 = {
|
|
|
57334
55029
|
],
|
|
57335
55030
|
aliases: ["alert-circle"]
|
|
57336
55031
|
};
|
|
57337
|
-
__iconData$
|
|
57338
|
-
var CircleAlert = createLucideIcon(__iconData$
|
|
55032
|
+
__iconData$82.node;
|
|
55033
|
+
var CircleAlert = createLucideIcon(__iconData$82);
|
|
57339
55034
|
//#endregion
|
|
57340
55035
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/circle-check-big.mjs
|
|
57341
55036
|
/**
|
|
@@ -57344,7 +55039,7 @@ var CircleAlert = createLucideIcon(__iconData$81);
|
|
|
57344
55039
|
* This source code is licensed under the ISC license.
|
|
57345
55040
|
* See the LICENSE file in the root directory of this source tree.
|
|
57346
55041
|
*/
|
|
57347
|
-
var __iconData$
|
|
55042
|
+
var __iconData$81 = {
|
|
57348
55043
|
name: "circle-check-big",
|
|
57349
55044
|
size: 24,
|
|
57350
55045
|
node: [["path", {
|
|
@@ -57356,8 +55051,8 @@ var __iconData$80 = {
|
|
|
57356
55051
|
}]],
|
|
57357
55052
|
aliases: ["check-circle"]
|
|
57358
55053
|
};
|
|
57359
|
-
__iconData$
|
|
57360
|
-
var CircleCheckBig = createLucideIcon(__iconData$
|
|
55054
|
+
__iconData$81.node;
|
|
55055
|
+
var CircleCheckBig = createLucideIcon(__iconData$81);
|
|
57361
55056
|
//#endregion
|
|
57362
55057
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/circle-check.mjs
|
|
57363
55058
|
/**
|
|
@@ -57366,7 +55061,7 @@ var CircleCheckBig = createLucideIcon(__iconData$80);
|
|
|
57366
55061
|
* This source code is licensed under the ISC license.
|
|
57367
55062
|
* See the LICENSE file in the root directory of this source tree.
|
|
57368
55063
|
*/
|
|
57369
|
-
var __iconData$
|
|
55064
|
+
var __iconData$80 = {
|
|
57370
55065
|
name: "circle-check",
|
|
57371
55066
|
size: 24,
|
|
57372
55067
|
node: [["circle", {
|
|
@@ -57380,8 +55075,8 @@ var __iconData$79 = {
|
|
|
57380
55075
|
}]],
|
|
57381
55076
|
aliases: ["check-circle-2"]
|
|
57382
55077
|
};
|
|
57383
|
-
__iconData$
|
|
57384
|
-
var CircleCheck = createLucideIcon(__iconData$
|
|
55078
|
+
__iconData$80.node;
|
|
55079
|
+
var CircleCheck = createLucideIcon(__iconData$80);
|
|
57385
55080
|
//#endregion
|
|
57386
55081
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/circle-dashed.mjs
|
|
57387
55082
|
/**
|
|
@@ -57390,7 +55085,7 @@ var CircleCheck = createLucideIcon(__iconData$79);
|
|
|
57390
55085
|
* This source code is licensed under the ISC license.
|
|
57391
55086
|
* See the LICENSE file in the root directory of this source tree.
|
|
57392
55087
|
*/
|
|
57393
|
-
var __iconData$
|
|
55088
|
+
var __iconData$79 = {
|
|
57394
55089
|
name: "circle-dashed",
|
|
57395
55090
|
size: 24,
|
|
57396
55091
|
node: [
|
|
@@ -57428,8 +55123,8 @@ var __iconData$78 = {
|
|
|
57428
55123
|
}]
|
|
57429
55124
|
]
|
|
57430
55125
|
};
|
|
57431
|
-
__iconData$
|
|
57432
|
-
var CircleDashed = createLucideIcon(__iconData$
|
|
55126
|
+
__iconData$79.node;
|
|
55127
|
+
var CircleDashed = createLucideIcon(__iconData$79);
|
|
57433
55128
|
//#endregion
|
|
57434
55129
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/circle-ellipsis.mjs
|
|
57435
55130
|
/**
|
|
@@ -57438,7 +55133,7 @@ var CircleDashed = createLucideIcon(__iconData$78);
|
|
|
57438
55133
|
* This source code is licensed under the ISC license.
|
|
57439
55134
|
* See the LICENSE file in the root directory of this source tree.
|
|
57440
55135
|
*/
|
|
57441
|
-
var __iconData$
|
|
55136
|
+
var __iconData$78 = {
|
|
57442
55137
|
name: "circle-ellipsis",
|
|
57443
55138
|
size: 24,
|
|
57444
55139
|
node: [
|
|
@@ -57462,8 +55157,8 @@ var __iconData$77 = {
|
|
|
57462
55157
|
}]
|
|
57463
55158
|
]
|
|
57464
55159
|
};
|
|
57465
|
-
__iconData$
|
|
57466
|
-
var CircleEllipsis = createLucideIcon(__iconData$
|
|
55160
|
+
__iconData$78.node;
|
|
55161
|
+
var CircleEllipsis = createLucideIcon(__iconData$78);
|
|
57467
55162
|
//#endregion
|
|
57468
55163
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/circle-fading-arrow-up.mjs
|
|
57469
55164
|
/**
|
|
@@ -57472,7 +55167,7 @@ var CircleEllipsis = createLucideIcon(__iconData$77);
|
|
|
57472
55167
|
* This source code is licensed under the ISC license.
|
|
57473
55168
|
* See the LICENSE file in the root directory of this source tree.
|
|
57474
55169
|
*/
|
|
57475
|
-
var __iconData$
|
|
55170
|
+
var __iconData$77 = {
|
|
57476
55171
|
name: "circle-fading-arrow-up",
|
|
57477
55172
|
size: 24,
|
|
57478
55173
|
node: [
|
|
@@ -57506,8 +55201,8 @@ var __iconData$76 = {
|
|
|
57506
55201
|
}]
|
|
57507
55202
|
]
|
|
57508
55203
|
};
|
|
57509
|
-
__iconData$
|
|
57510
|
-
var CircleFadingArrowUp = createLucideIcon(__iconData$
|
|
55204
|
+
__iconData$77.node;
|
|
55205
|
+
var CircleFadingArrowUp = createLucideIcon(__iconData$77);
|
|
57511
55206
|
//#endregion
|
|
57512
55207
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/circle-question-mark.mjs
|
|
57513
55208
|
/**
|
|
@@ -57516,7 +55211,7 @@ var CircleFadingArrowUp = createLucideIcon(__iconData$76);
|
|
|
57516
55211
|
* This source code is licensed under the ISC license.
|
|
57517
55212
|
* See the LICENSE file in the root directory of this source tree.
|
|
57518
55213
|
*/
|
|
57519
|
-
var __iconData$
|
|
55214
|
+
var __iconData$76 = {
|
|
57520
55215
|
name: "circle-question-mark",
|
|
57521
55216
|
size: 24,
|
|
57522
55217
|
node: [
|
|
@@ -57537,8 +55232,8 @@ var __iconData$75 = {
|
|
|
57537
55232
|
],
|
|
57538
55233
|
aliases: ["help-circle", "circle-help"]
|
|
57539
55234
|
};
|
|
57540
|
-
__iconData$
|
|
57541
|
-
var CircleQuestionMark = createLucideIcon(__iconData$
|
|
55235
|
+
__iconData$76.node;
|
|
55236
|
+
var CircleQuestionMark = createLucideIcon(__iconData$76);
|
|
57542
55237
|
//#endregion
|
|
57543
55238
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/clapperboard.mjs
|
|
57544
55239
|
/**
|
|
@@ -57547,7 +55242,7 @@ var CircleQuestionMark = createLucideIcon(__iconData$75);
|
|
|
57547
55242
|
* This source code is licensed under the ISC license.
|
|
57548
55243
|
* See the LICENSE file in the root directory of this source tree.
|
|
57549
55244
|
*/
|
|
57550
|
-
var __iconData$
|
|
55245
|
+
var __iconData$75 = {
|
|
57551
55246
|
name: "clapperboard",
|
|
57552
55247
|
size: 24,
|
|
57553
55248
|
node: [
|
|
@@ -57569,8 +55264,8 @@ var __iconData$74 = {
|
|
|
57569
55264
|
}]
|
|
57570
55265
|
]
|
|
57571
55266
|
};
|
|
57572
|
-
__iconData$
|
|
57573
|
-
var Clapperboard = createLucideIcon(__iconData$
|
|
55267
|
+
__iconData$75.node;
|
|
55268
|
+
var Clapperboard = createLucideIcon(__iconData$75);
|
|
57574
55269
|
//#endregion
|
|
57575
55270
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/clock-3.mjs
|
|
57576
55271
|
/**
|
|
@@ -57579,7 +55274,7 @@ var Clapperboard = createLucideIcon(__iconData$74);
|
|
|
57579
55274
|
* This source code is licensed under the ISC license.
|
|
57580
55275
|
* See the LICENSE file in the root directory of this source tree.
|
|
57581
55276
|
*/
|
|
57582
|
-
var __iconData$
|
|
55277
|
+
var __iconData$74 = {
|
|
57583
55278
|
name: "clock-3",
|
|
57584
55279
|
size: 24,
|
|
57585
55280
|
node: [["circle", {
|
|
@@ -57592,8 +55287,8 @@ var __iconData$73 = {
|
|
|
57592
55287
|
key: "135r8i"
|
|
57593
55288
|
}]]
|
|
57594
55289
|
};
|
|
57595
|
-
__iconData$
|
|
57596
|
-
var Clock3 = createLucideIcon(__iconData$
|
|
55290
|
+
__iconData$74.node;
|
|
55291
|
+
var Clock3 = createLucideIcon(__iconData$74);
|
|
57597
55292
|
//#endregion
|
|
57598
55293
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/clock.mjs
|
|
57599
55294
|
/**
|
|
@@ -57602,7 +55297,7 @@ var Clock3 = createLucideIcon(__iconData$73);
|
|
|
57602
55297
|
* This source code is licensed under the ISC license.
|
|
57603
55298
|
* See the LICENSE file in the root directory of this source tree.
|
|
57604
55299
|
*/
|
|
57605
|
-
var __iconData$
|
|
55300
|
+
var __iconData$73 = {
|
|
57606
55301
|
name: "clock",
|
|
57607
55302
|
size: 24,
|
|
57608
55303
|
node: [["circle", {
|
|
@@ -57615,8 +55310,8 @@ var __iconData$72 = {
|
|
|
57615
55310
|
key: "mmk7yg"
|
|
57616
55311
|
}]]
|
|
57617
55312
|
};
|
|
57618
|
-
__iconData$
|
|
57619
|
-
var Clock = createLucideIcon(__iconData$
|
|
55313
|
+
__iconData$73.node;
|
|
55314
|
+
var Clock = createLucideIcon(__iconData$73);
|
|
57620
55315
|
//#endregion
|
|
57621
55316
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/code.mjs
|
|
57622
55317
|
/**
|
|
@@ -57625,7 +55320,7 @@ var Clock = createLucideIcon(__iconData$72);
|
|
|
57625
55320
|
* This source code is licensed under the ISC license.
|
|
57626
55321
|
* See the LICENSE file in the root directory of this source tree.
|
|
57627
55322
|
*/
|
|
57628
|
-
var __iconData$
|
|
55323
|
+
var __iconData$72 = {
|
|
57629
55324
|
name: "code",
|
|
57630
55325
|
size: 24,
|
|
57631
55326
|
node: [["path", {
|
|
@@ -57636,8 +55331,8 @@ var __iconData$71 = {
|
|
|
57636
55331
|
key: "ppft3o"
|
|
57637
55332
|
}]]
|
|
57638
55333
|
};
|
|
57639
|
-
__iconData$
|
|
57640
|
-
var Code = createLucideIcon(__iconData$
|
|
55334
|
+
__iconData$72.node;
|
|
55335
|
+
var Code = createLucideIcon(__iconData$72);
|
|
57641
55336
|
//#endregion
|
|
57642
55337
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/copy.mjs
|
|
57643
55338
|
/**
|
|
@@ -57646,7 +55341,7 @@ var Code = createLucideIcon(__iconData$71);
|
|
|
57646
55341
|
* This source code is licensed under the ISC license.
|
|
57647
55342
|
* See the LICENSE file in the root directory of this source tree.
|
|
57648
55343
|
*/
|
|
57649
|
-
var __iconData$
|
|
55344
|
+
var __iconData$71 = {
|
|
57650
55345
|
name: "copy",
|
|
57651
55346
|
size: 24,
|
|
57652
55347
|
node: [["rect", {
|
|
@@ -57662,8 +55357,8 @@ var __iconData$70 = {
|
|
|
57662
55357
|
key: "zix9uf"
|
|
57663
55358
|
}]]
|
|
57664
55359
|
};
|
|
57665
|
-
__iconData$
|
|
57666
|
-
var Copy = createLucideIcon(__iconData$
|
|
55360
|
+
__iconData$71.node;
|
|
55361
|
+
var Copy = createLucideIcon(__iconData$71);
|
|
57667
55362
|
//#endregion
|
|
57668
55363
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/corner-down-left.mjs
|
|
57669
55364
|
/**
|
|
@@ -57672,7 +55367,7 @@ var Copy = createLucideIcon(__iconData$70);
|
|
|
57672
55367
|
* This source code is licensed under the ISC license.
|
|
57673
55368
|
* See the LICENSE file in the root directory of this source tree.
|
|
57674
55369
|
*/
|
|
57675
|
-
var __iconData$
|
|
55370
|
+
var __iconData$70 = {
|
|
57676
55371
|
name: "corner-down-left",
|
|
57677
55372
|
size: 24,
|
|
57678
55373
|
node: [["path", {
|
|
@@ -57683,8 +55378,8 @@ var __iconData$69 = {
|
|
|
57683
55378
|
key: "1kshq7"
|
|
57684
55379
|
}]]
|
|
57685
55380
|
};
|
|
57686
|
-
__iconData$
|
|
57687
|
-
var CornerDownLeft = createLucideIcon(__iconData$
|
|
55381
|
+
__iconData$70.node;
|
|
55382
|
+
var CornerDownLeft = createLucideIcon(__iconData$70);
|
|
57688
55383
|
//#endregion
|
|
57689
55384
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/cpu.mjs
|
|
57690
55385
|
/**
|
|
@@ -57693,7 +55388,7 @@ var CornerDownLeft = createLucideIcon(__iconData$69);
|
|
|
57693
55388
|
* This source code is licensed under the ISC license.
|
|
57694
55389
|
* See the LICENSE file in the root directory of this source tree.
|
|
57695
55390
|
*/
|
|
57696
|
-
var __iconData$
|
|
55391
|
+
var __iconData$69 = {
|
|
57697
55392
|
name: "cpu",
|
|
57698
55393
|
size: 24,
|
|
57699
55394
|
node: [
|
|
@@ -57763,8 +55458,8 @@ var __iconData$68 = {
|
|
|
57763
55458
|
}]
|
|
57764
55459
|
]
|
|
57765
55460
|
};
|
|
57766
|
-
__iconData$
|
|
57767
|
-
var Cpu = createLucideIcon(__iconData$
|
|
55461
|
+
__iconData$69.node;
|
|
55462
|
+
var Cpu = createLucideIcon(__iconData$69);
|
|
57768
55463
|
//#endregion
|
|
57769
55464
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/crown.mjs
|
|
57770
55465
|
/**
|
|
@@ -57773,7 +55468,7 @@ var Cpu = createLucideIcon(__iconData$68);
|
|
|
57773
55468
|
* This source code is licensed under the ISC license.
|
|
57774
55469
|
* See the LICENSE file in the root directory of this source tree.
|
|
57775
55470
|
*/
|
|
57776
|
-
var __iconData$
|
|
55471
|
+
var __iconData$68 = {
|
|
57777
55472
|
name: "crown",
|
|
57778
55473
|
size: 24,
|
|
57779
55474
|
node: [["path", {
|
|
@@ -57784,8 +55479,8 @@ var __iconData$67 = {
|
|
|
57784
55479
|
key: "11awu3"
|
|
57785
55480
|
}]]
|
|
57786
55481
|
};
|
|
57787
|
-
__iconData$
|
|
57788
|
-
var Crown = createLucideIcon(__iconData$
|
|
55482
|
+
__iconData$68.node;
|
|
55483
|
+
var Crown = createLucideIcon(__iconData$68);
|
|
57789
55484
|
//#endregion
|
|
57790
55485
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/download.mjs
|
|
57791
55486
|
/**
|
|
@@ -57794,7 +55489,7 @@ var Crown = createLucideIcon(__iconData$67);
|
|
|
57794
55489
|
* This source code is licensed under the ISC license.
|
|
57795
55490
|
* See the LICENSE file in the root directory of this source tree.
|
|
57796
55491
|
*/
|
|
57797
|
-
var __iconData$
|
|
55492
|
+
var __iconData$67 = {
|
|
57798
55493
|
name: "download",
|
|
57799
55494
|
size: 24,
|
|
57800
55495
|
node: [
|
|
@@ -57812,8 +55507,8 @@ var __iconData$66 = {
|
|
|
57812
55507
|
}]
|
|
57813
55508
|
]
|
|
57814
55509
|
};
|
|
57815
|
-
__iconData$
|
|
57816
|
-
var Download = createLucideIcon(__iconData$
|
|
55510
|
+
__iconData$67.node;
|
|
55511
|
+
var Download = createLucideIcon(__iconData$67);
|
|
57817
55512
|
//#endregion
|
|
57818
55513
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/external-link.mjs
|
|
57819
55514
|
/**
|
|
@@ -57822,7 +55517,7 @@ var Download = createLucideIcon(__iconData$66);
|
|
|
57822
55517
|
* This source code is licensed under the ISC license.
|
|
57823
55518
|
* See the LICENSE file in the root directory of this source tree.
|
|
57824
55519
|
*/
|
|
57825
|
-
var __iconData$
|
|
55520
|
+
var __iconData$66 = {
|
|
57826
55521
|
name: "external-link",
|
|
57827
55522
|
size: 24,
|
|
57828
55523
|
node: [
|
|
@@ -57840,8 +55535,8 @@ var __iconData$65 = {
|
|
|
57840
55535
|
}]
|
|
57841
55536
|
]
|
|
57842
55537
|
};
|
|
57843
|
-
__iconData$
|
|
57844
|
-
var ExternalLink = createLucideIcon(__iconData$
|
|
55538
|
+
__iconData$66.node;
|
|
55539
|
+
var ExternalLink = createLucideIcon(__iconData$66);
|
|
57845
55540
|
//#endregion
|
|
57846
55541
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/eye-off.mjs
|
|
57847
55542
|
/**
|
|
@@ -57850,7 +55545,7 @@ var ExternalLink = createLucideIcon(__iconData$65);
|
|
|
57850
55545
|
* This source code is licensed under the ISC license.
|
|
57851
55546
|
* See the LICENSE file in the root directory of this source tree.
|
|
57852
55547
|
*/
|
|
57853
|
-
var __iconData$
|
|
55548
|
+
var __iconData$65 = {
|
|
57854
55549
|
name: "eye-off",
|
|
57855
55550
|
size: 24,
|
|
57856
55551
|
node: [
|
|
@@ -57872,8 +55567,8 @@ var __iconData$64 = {
|
|
|
57872
55567
|
}]
|
|
57873
55568
|
]
|
|
57874
55569
|
};
|
|
57875
|
-
__iconData$
|
|
57876
|
-
var EyeOff = createLucideIcon(__iconData$
|
|
55570
|
+
__iconData$65.node;
|
|
55571
|
+
var EyeOff = createLucideIcon(__iconData$65);
|
|
57877
55572
|
//#endregion
|
|
57878
55573
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/eye.mjs
|
|
57879
55574
|
/**
|
|
@@ -57882,7 +55577,7 @@ var EyeOff = createLucideIcon(__iconData$64);
|
|
|
57882
55577
|
* This source code is licensed under the ISC license.
|
|
57883
55578
|
* See the LICENSE file in the root directory of this source tree.
|
|
57884
55579
|
*/
|
|
57885
|
-
var __iconData$
|
|
55580
|
+
var __iconData$64 = {
|
|
57886
55581
|
name: "eye",
|
|
57887
55582
|
size: 24,
|
|
57888
55583
|
node: [["path", {
|
|
@@ -57895,8 +55590,8 @@ var __iconData$63 = {
|
|
|
57895
55590
|
key: "1v7zrd"
|
|
57896
55591
|
}]]
|
|
57897
55592
|
};
|
|
57898
|
-
__iconData$
|
|
57899
|
-
var Eye = createLucideIcon(__iconData$
|
|
55593
|
+
__iconData$64.node;
|
|
55594
|
+
var Eye = createLucideIcon(__iconData$64);
|
|
57900
55595
|
//#endregion
|
|
57901
55596
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/file-exclamation-point.mjs
|
|
57902
55597
|
/**
|
|
@@ -57905,7 +55600,7 @@ var Eye = createLucideIcon(__iconData$63);
|
|
|
57905
55600
|
* This source code is licensed under the ISC license.
|
|
57906
55601
|
* See the LICENSE file in the root directory of this source tree.
|
|
57907
55602
|
*/
|
|
57908
|
-
var __iconData$
|
|
55603
|
+
var __iconData$63 = {
|
|
57909
55604
|
name: "file-exclamation-point",
|
|
57910
55605
|
size: 24,
|
|
57911
55606
|
node: [
|
|
@@ -57924,8 +55619,8 @@ var __iconData$62 = {
|
|
|
57924
55619
|
],
|
|
57925
55620
|
aliases: ["file-warning"]
|
|
57926
55621
|
};
|
|
57927
|
-
__iconData$
|
|
57928
|
-
var FileExclamationPoint = createLucideIcon(__iconData$
|
|
55622
|
+
__iconData$63.node;
|
|
55623
|
+
var FileExclamationPoint = createLucideIcon(__iconData$63);
|
|
57929
55624
|
//#endregion
|
|
57930
55625
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/file-play.mjs
|
|
57931
55626
|
/**
|
|
@@ -57934,7 +55629,7 @@ var FileExclamationPoint = createLucideIcon(__iconData$62);
|
|
|
57934
55629
|
* This source code is licensed under the ISC license.
|
|
57935
55630
|
* See the LICENSE file in the root directory of this source tree.
|
|
57936
55631
|
*/
|
|
57937
|
-
var __iconData$
|
|
55632
|
+
var __iconData$62 = {
|
|
57938
55633
|
name: "file-play",
|
|
57939
55634
|
size: 24,
|
|
57940
55635
|
node: [
|
|
@@ -57953,8 +55648,8 @@ var __iconData$61 = {
|
|
|
57953
55648
|
],
|
|
57954
55649
|
aliases: ["file-video"]
|
|
57955
55650
|
};
|
|
57956
|
-
__iconData$
|
|
57957
|
-
var FilePlay = createLucideIcon(__iconData$
|
|
55651
|
+
__iconData$62.node;
|
|
55652
|
+
var FilePlay = createLucideIcon(__iconData$62);
|
|
57958
55653
|
//#endregion
|
|
57959
55654
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/file-text.mjs
|
|
57960
55655
|
/**
|
|
@@ -57963,7 +55658,7 @@ var FilePlay = createLucideIcon(__iconData$61);
|
|
|
57963
55658
|
* This source code is licensed under the ISC license.
|
|
57964
55659
|
* See the LICENSE file in the root directory of this source tree.
|
|
57965
55660
|
*/
|
|
57966
|
-
var __iconData$
|
|
55661
|
+
var __iconData$61 = {
|
|
57967
55662
|
name: "file-text",
|
|
57968
55663
|
size: 24,
|
|
57969
55664
|
node: [
|
|
@@ -57989,8 +55684,8 @@ var __iconData$60 = {
|
|
|
57989
55684
|
}]
|
|
57990
55685
|
]
|
|
57991
55686
|
};
|
|
57992
|
-
__iconData$
|
|
57993
|
-
var FileText = createLucideIcon(__iconData$
|
|
55687
|
+
__iconData$61.node;
|
|
55688
|
+
var FileText = createLucideIcon(__iconData$61);
|
|
57994
55689
|
//#endregion
|
|
57995
55690
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/fingerprint-pattern.mjs
|
|
57996
55691
|
/**
|
|
@@ -57999,7 +55694,7 @@ var FileText = createLucideIcon(__iconData$60);
|
|
|
57999
55694
|
* This source code is licensed under the ISC license.
|
|
58000
55695
|
* See the LICENSE file in the root directory of this source tree.
|
|
58001
55696
|
*/
|
|
58002
|
-
var __iconData$
|
|
55697
|
+
var __iconData$60 = {
|
|
58003
55698
|
name: "fingerprint-pattern",
|
|
58004
55699
|
size: 24,
|
|
58005
55700
|
node: [
|
|
@@ -58042,8 +55737,8 @@ var __iconData$59 = {
|
|
|
58042
55737
|
],
|
|
58043
55738
|
aliases: ["fingerprint"]
|
|
58044
55739
|
};
|
|
58045
|
-
__iconData$
|
|
58046
|
-
var FingerprintPattern = createLucideIcon(__iconData$
|
|
55740
|
+
__iconData$60.node;
|
|
55741
|
+
var FingerprintPattern = createLucideIcon(__iconData$60);
|
|
58047
55742
|
//#endregion
|
|
58048
55743
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/gamepad-2.mjs
|
|
58049
55744
|
/**
|
|
@@ -58052,7 +55747,7 @@ var FingerprintPattern = createLucideIcon(__iconData$59);
|
|
|
58052
55747
|
* This source code is licensed under the ISC license.
|
|
58053
55748
|
* See the LICENSE file in the root directory of this source tree.
|
|
58054
55749
|
*/
|
|
58055
|
-
var __iconData$
|
|
55750
|
+
var __iconData$59 = {
|
|
58056
55751
|
name: "gamepad-2",
|
|
58057
55752
|
size: 24,
|
|
58058
55753
|
node: [
|
|
@@ -58090,8 +55785,8 @@ var __iconData$58 = {
|
|
|
58090
55785
|
}]
|
|
58091
55786
|
]
|
|
58092
55787
|
};
|
|
58093
|
-
__iconData$
|
|
58094
|
-
var Gamepad2 = createLucideIcon(__iconData$
|
|
55788
|
+
__iconData$59.node;
|
|
55789
|
+
var Gamepad2 = createLucideIcon(__iconData$59);
|
|
58095
55790
|
//#endregion
|
|
58096
55791
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/gauge.mjs
|
|
58097
55792
|
/**
|
|
@@ -58100,7 +55795,7 @@ var Gamepad2 = createLucideIcon(__iconData$58);
|
|
|
58100
55795
|
* This source code is licensed under the ISC license.
|
|
58101
55796
|
* See the LICENSE file in the root directory of this source tree.
|
|
58102
55797
|
*/
|
|
58103
|
-
var __iconData$
|
|
55798
|
+
var __iconData$58 = {
|
|
58104
55799
|
name: "gauge",
|
|
58105
55800
|
size: 24,
|
|
58106
55801
|
node: [["path", {
|
|
@@ -58111,8 +55806,8 @@ var __iconData$57 = {
|
|
|
58111
55806
|
key: "19p75a"
|
|
58112
55807
|
}]]
|
|
58113
55808
|
};
|
|
58114
|
-
__iconData$
|
|
58115
|
-
var Gauge = createLucideIcon(__iconData$
|
|
55809
|
+
__iconData$58.node;
|
|
55810
|
+
var Gauge = createLucideIcon(__iconData$58);
|
|
58116
55811
|
//#endregion
|
|
58117
55812
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/gift.mjs
|
|
58118
55813
|
/**
|
|
@@ -58121,7 +55816,7 @@ var Gauge = createLucideIcon(__iconData$57);
|
|
|
58121
55816
|
* This source code is licensed under the ISC license.
|
|
58122
55817
|
* See the LICENSE file in the root directory of this source tree.
|
|
58123
55818
|
*/
|
|
58124
|
-
var __iconData$
|
|
55819
|
+
var __iconData$57 = {
|
|
58125
55820
|
name: "gift",
|
|
58126
55821
|
size: 24,
|
|
58127
55822
|
node: [
|
|
@@ -58147,8 +55842,8 @@ var __iconData$56 = {
|
|
|
58147
55842
|
}]
|
|
58148
55843
|
]
|
|
58149
55844
|
};
|
|
58150
|
-
__iconData$
|
|
58151
|
-
var Gift = createLucideIcon(__iconData$
|
|
55845
|
+
__iconData$57.node;
|
|
55846
|
+
var Gift = createLucideIcon(__iconData$57);
|
|
58152
55847
|
//#endregion
|
|
58153
55848
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/git-branch.mjs
|
|
58154
55849
|
/**
|
|
@@ -58157,7 +55852,7 @@ var Gift = createLucideIcon(__iconData$56);
|
|
|
58157
55852
|
* This source code is licensed under the ISC license.
|
|
58158
55853
|
* See the LICENSE file in the root directory of this source tree.
|
|
58159
55854
|
*/
|
|
58160
|
-
var __iconData$
|
|
55855
|
+
var __iconData$56 = {
|
|
58161
55856
|
name: "git-branch",
|
|
58162
55857
|
size: 24,
|
|
58163
55858
|
node: [
|
|
@@ -58179,8 +55874,8 @@ var __iconData$55 = {
|
|
|
58179
55874
|
}]
|
|
58180
55875
|
]
|
|
58181
55876
|
};
|
|
58182
|
-
__iconData$
|
|
58183
|
-
var GitBranch = createLucideIcon(__iconData$
|
|
55877
|
+
__iconData$56.node;
|
|
55878
|
+
var GitBranch = createLucideIcon(__iconData$56);
|
|
58184
55879
|
//#endregion
|
|
58185
55880
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/hash.mjs
|
|
58186
55881
|
/**
|
|
@@ -58189,7 +55884,7 @@ var GitBranch = createLucideIcon(__iconData$55);
|
|
|
58189
55884
|
* This source code is licensed under the ISC license.
|
|
58190
55885
|
* See the LICENSE file in the root directory of this source tree.
|
|
58191
55886
|
*/
|
|
58192
|
-
var __iconData$
|
|
55887
|
+
var __iconData$55 = {
|
|
58193
55888
|
name: "hash",
|
|
58194
55889
|
size: 24,
|
|
58195
55890
|
node: [
|
|
@@ -58223,8 +55918,8 @@ var __iconData$54 = {
|
|
|
58223
55918
|
}]
|
|
58224
55919
|
]
|
|
58225
55920
|
};
|
|
58226
|
-
__iconData$
|
|
58227
|
-
var Hash = createLucideIcon(__iconData$
|
|
55921
|
+
__iconData$55.node;
|
|
55922
|
+
var Hash = createLucideIcon(__iconData$55);
|
|
58228
55923
|
//#endregion
|
|
58229
55924
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/heart.mjs
|
|
58230
55925
|
/**
|
|
@@ -58233,7 +55928,7 @@ var Hash = createLucideIcon(__iconData$54);
|
|
|
58233
55928
|
* This source code is licensed under the ISC license.
|
|
58234
55929
|
* See the LICENSE file in the root directory of this source tree.
|
|
58235
55930
|
*/
|
|
58236
|
-
var __iconData$
|
|
55931
|
+
var __iconData$54 = {
|
|
58237
55932
|
name: "heart",
|
|
58238
55933
|
size: 24,
|
|
58239
55934
|
node: [["path", {
|
|
@@ -58241,8 +55936,8 @@ var __iconData$53 = {
|
|
|
58241
55936
|
key: "mvr1a0"
|
|
58242
55937
|
}]]
|
|
58243
55938
|
};
|
|
58244
|
-
__iconData$
|
|
58245
|
-
var Heart = createLucideIcon(__iconData$
|
|
55939
|
+
__iconData$54.node;
|
|
55940
|
+
var Heart = createLucideIcon(__iconData$54);
|
|
58246
55941
|
//#endregion
|
|
58247
55942
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/image.mjs
|
|
58248
55943
|
/**
|
|
@@ -58251,7 +55946,7 @@ var Heart = createLucideIcon(__iconData$53);
|
|
|
58251
55946
|
* This source code is licensed under the ISC license.
|
|
58252
55947
|
* See the LICENSE file in the root directory of this source tree.
|
|
58253
55948
|
*/
|
|
58254
|
-
var __iconData$
|
|
55949
|
+
var __iconData$53 = {
|
|
58255
55950
|
name: "image",
|
|
58256
55951
|
size: 24,
|
|
58257
55952
|
node: [
|
|
@@ -58276,8 +55971,8 @@ var __iconData$52 = {
|
|
|
58276
55971
|
}]
|
|
58277
55972
|
]
|
|
58278
55973
|
};
|
|
58279
|
-
__iconData$
|
|
58280
|
-
var Image$1 = createLucideIcon(__iconData$
|
|
55974
|
+
__iconData$53.node;
|
|
55975
|
+
var Image$1 = createLucideIcon(__iconData$53);
|
|
58281
55976
|
//#endregion
|
|
58282
55977
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/info.mjs
|
|
58283
55978
|
/**
|
|
@@ -58286,7 +55981,7 @@ var Image$1 = createLucideIcon(__iconData$52);
|
|
|
58286
55981
|
* This source code is licensed under the ISC license.
|
|
58287
55982
|
* See the LICENSE file in the root directory of this source tree.
|
|
58288
55983
|
*/
|
|
58289
|
-
var __iconData$
|
|
55984
|
+
var __iconData$52 = {
|
|
58290
55985
|
name: "info",
|
|
58291
55986
|
size: 24,
|
|
58292
55987
|
node: [
|
|
@@ -58306,8 +56001,8 @@ var __iconData$51 = {
|
|
|
58306
56001
|
}]
|
|
58307
56002
|
]
|
|
58308
56003
|
};
|
|
58309
|
-
__iconData$
|
|
58310
|
-
var Info$1 = createLucideIcon(__iconData$
|
|
56004
|
+
__iconData$52.node;
|
|
56005
|
+
var Info$1 = createLucideIcon(__iconData$52);
|
|
58311
56006
|
//#endregion
|
|
58312
56007
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/layout-template.mjs
|
|
58313
56008
|
/**
|
|
@@ -58316,7 +56011,7 @@ var Info$1 = createLucideIcon(__iconData$51);
|
|
|
58316
56011
|
* This source code is licensed under the ISC license.
|
|
58317
56012
|
* See the LICENSE file in the root directory of this source tree.
|
|
58318
56013
|
*/
|
|
58319
|
-
var __iconData$
|
|
56014
|
+
var __iconData$51 = {
|
|
58320
56015
|
name: "layout-template",
|
|
58321
56016
|
size: 24,
|
|
58322
56017
|
node: [
|
|
@@ -58346,8 +56041,8 @@ var __iconData$50 = {
|
|
|
58346
56041
|
}]
|
|
58347
56042
|
]
|
|
58348
56043
|
};
|
|
58349
|
-
__iconData$
|
|
58350
|
-
var LayoutTemplate = createLucideIcon(__iconData$
|
|
56044
|
+
__iconData$51.node;
|
|
56045
|
+
var LayoutTemplate = createLucideIcon(__iconData$51);
|
|
58351
56046
|
//#endregion
|
|
58352
56047
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/link.mjs
|
|
58353
56048
|
/**
|
|
@@ -58356,7 +56051,7 @@ var LayoutTemplate = createLucideIcon(__iconData$50);
|
|
|
58356
56051
|
* This source code is licensed under the ISC license.
|
|
58357
56052
|
* See the LICENSE file in the root directory of this source tree.
|
|
58358
56053
|
*/
|
|
58359
|
-
var __iconData$
|
|
56054
|
+
var __iconData$50 = {
|
|
58360
56055
|
name: "link",
|
|
58361
56056
|
size: 24,
|
|
58362
56057
|
node: [["path", {
|
|
@@ -58367,8 +56062,8 @@ var __iconData$49 = {
|
|
|
58367
56062
|
key: "19qd67"
|
|
58368
56063
|
}]]
|
|
58369
56064
|
};
|
|
58370
|
-
__iconData$
|
|
58371
|
-
var Link = createLucideIcon(__iconData$
|
|
56065
|
+
__iconData$50.node;
|
|
56066
|
+
var Link = createLucideIcon(__iconData$50);
|
|
58372
56067
|
//#endregion
|
|
58373
56068
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/list-checks.mjs
|
|
58374
56069
|
/**
|
|
@@ -58377,7 +56072,7 @@ var Link = createLucideIcon(__iconData$49);
|
|
|
58377
56072
|
* This source code is licensed under the ISC license.
|
|
58378
56073
|
* See the LICENSE file in the root directory of this source tree.
|
|
58379
56074
|
*/
|
|
58380
|
-
var __iconData$
|
|
56075
|
+
var __iconData$49 = {
|
|
58381
56076
|
name: "list-checks",
|
|
58382
56077
|
size: 24,
|
|
58383
56078
|
node: [
|
|
@@ -58403,8 +56098,8 @@ var __iconData$48 = {
|
|
|
58403
56098
|
}]
|
|
58404
56099
|
]
|
|
58405
56100
|
};
|
|
58406
|
-
__iconData$
|
|
58407
|
-
var ListChecks = createLucideIcon(__iconData$
|
|
56101
|
+
__iconData$49.node;
|
|
56102
|
+
var ListChecks = createLucideIcon(__iconData$49);
|
|
58408
56103
|
//#endregion
|
|
58409
56104
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/loader-circle.mjs
|
|
58410
56105
|
/**
|
|
@@ -58413,7 +56108,7 @@ var ListChecks = createLucideIcon(__iconData$48);
|
|
|
58413
56108
|
* This source code is licensed under the ISC license.
|
|
58414
56109
|
* See the LICENSE file in the root directory of this source tree.
|
|
58415
56110
|
*/
|
|
58416
|
-
var __iconData$
|
|
56111
|
+
var __iconData$48 = {
|
|
58417
56112
|
name: "loader-circle",
|
|
58418
56113
|
size: 24,
|
|
58419
56114
|
node: [["path", {
|
|
@@ -58422,8 +56117,8 @@ var __iconData$47 = {
|
|
|
58422
56117
|
}]],
|
|
58423
56118
|
aliases: ["loader-2"]
|
|
58424
56119
|
};
|
|
58425
|
-
__iconData$
|
|
58426
|
-
var LoaderCircle = createLucideIcon(__iconData$
|
|
56120
|
+
__iconData$48.node;
|
|
56121
|
+
var LoaderCircle = createLucideIcon(__iconData$48);
|
|
58427
56122
|
//#endregion
|
|
58428
56123
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/map-pin.mjs
|
|
58429
56124
|
/**
|
|
@@ -58432,7 +56127,7 @@ var LoaderCircle = createLucideIcon(__iconData$47);
|
|
|
58432
56127
|
* This source code is licensed under the ISC license.
|
|
58433
56128
|
* See the LICENSE file in the root directory of this source tree.
|
|
58434
56129
|
*/
|
|
58435
|
-
var __iconData$
|
|
56130
|
+
var __iconData$47 = {
|
|
58436
56131
|
name: "map-pin",
|
|
58437
56132
|
size: 24,
|
|
58438
56133
|
node: [["path", {
|
|
@@ -58445,8 +56140,8 @@ var __iconData$46 = {
|
|
|
58445
56140
|
key: "ilqhr7"
|
|
58446
56141
|
}]]
|
|
58447
56142
|
};
|
|
58448
|
-
__iconData$
|
|
58449
|
-
var MapPin = createLucideIcon(__iconData$
|
|
56143
|
+
__iconData$47.node;
|
|
56144
|
+
var MapPin = createLucideIcon(__iconData$47);
|
|
58450
56145
|
//#endregion
|
|
58451
56146
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/maximize.mjs
|
|
58452
56147
|
/**
|
|
@@ -58455,7 +56150,7 @@ var MapPin = createLucideIcon(__iconData$46);
|
|
|
58455
56150
|
* This source code is licensed under the ISC license.
|
|
58456
56151
|
* See the LICENSE file in the root directory of this source tree.
|
|
58457
56152
|
*/
|
|
58458
|
-
var __iconData$
|
|
56153
|
+
var __iconData$46 = {
|
|
58459
56154
|
name: "maximize",
|
|
58460
56155
|
size: 24,
|
|
58461
56156
|
node: [
|
|
@@ -58477,8 +56172,8 @@ var __iconData$45 = {
|
|
|
58477
56172
|
}]
|
|
58478
56173
|
]
|
|
58479
56174
|
};
|
|
58480
|
-
__iconData$
|
|
58481
|
-
var Maximize = createLucideIcon(__iconData$
|
|
56175
|
+
__iconData$46.node;
|
|
56176
|
+
var Maximize = createLucideIcon(__iconData$46);
|
|
58482
56177
|
//#endregion
|
|
58483
56178
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/menu.mjs
|
|
58484
56179
|
/**
|
|
@@ -58487,7 +56182,7 @@ var Maximize = createLucideIcon(__iconData$45);
|
|
|
58487
56182
|
* This source code is licensed under the ISC license.
|
|
58488
56183
|
* See the LICENSE file in the root directory of this source tree.
|
|
58489
56184
|
*/
|
|
58490
|
-
var __iconData$
|
|
56185
|
+
var __iconData$45 = {
|
|
58491
56186
|
name: "menu",
|
|
58492
56187
|
size: 24,
|
|
58493
56188
|
node: [
|
|
@@ -58505,8 +56200,8 @@ var __iconData$44 = {
|
|
|
58505
56200
|
}]
|
|
58506
56201
|
]
|
|
58507
56202
|
};
|
|
58508
|
-
__iconData$
|
|
58509
|
-
var Menu = createLucideIcon(__iconData$
|
|
56203
|
+
__iconData$45.node;
|
|
56204
|
+
var Menu = createLucideIcon(__iconData$45);
|
|
58510
56205
|
//#endregion
|
|
58511
56206
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/message-circle.mjs
|
|
58512
56207
|
/**
|
|
@@ -58515,7 +56210,7 @@ var Menu = createLucideIcon(__iconData$44);
|
|
|
58515
56210
|
* This source code is licensed under the ISC license.
|
|
58516
56211
|
* See the LICENSE file in the root directory of this source tree.
|
|
58517
56212
|
*/
|
|
58518
|
-
var __iconData$
|
|
56213
|
+
var __iconData$44 = {
|
|
58519
56214
|
name: "message-circle",
|
|
58520
56215
|
size: 24,
|
|
58521
56216
|
node: [["path", {
|
|
@@ -58523,8 +56218,8 @@ var __iconData$43 = {
|
|
|
58523
56218
|
key: "1sd12s"
|
|
58524
56219
|
}]]
|
|
58525
56220
|
};
|
|
58526
|
-
__iconData$
|
|
58527
|
-
var MessageCircle = createLucideIcon(__iconData$
|
|
56221
|
+
__iconData$44.node;
|
|
56222
|
+
var MessageCircle = createLucideIcon(__iconData$44);
|
|
58528
56223
|
//#endregion
|
|
58529
56224
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/monitor.mjs
|
|
58530
56225
|
/**
|
|
@@ -58533,7 +56228,7 @@ var MessageCircle = createLucideIcon(__iconData$43);
|
|
|
58533
56228
|
* This source code is licensed under the ISC license.
|
|
58534
56229
|
* See the LICENSE file in the root directory of this source tree.
|
|
58535
56230
|
*/
|
|
58536
|
-
var __iconData$
|
|
56231
|
+
var __iconData$43 = {
|
|
58537
56232
|
name: "monitor",
|
|
58538
56233
|
size: 24,
|
|
58539
56234
|
node: [
|
|
@@ -58561,8 +56256,8 @@ var __iconData$42 = {
|
|
|
58561
56256
|
}]
|
|
58562
56257
|
]
|
|
58563
56258
|
};
|
|
58564
|
-
__iconData$
|
|
58565
|
-
var Monitor = createLucideIcon(__iconData$
|
|
56259
|
+
__iconData$43.node;
|
|
56260
|
+
var Monitor = createLucideIcon(__iconData$43);
|
|
58566
56261
|
//#endregion
|
|
58567
56262
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/moon.mjs
|
|
58568
56263
|
/**
|
|
@@ -58571,7 +56266,7 @@ var Monitor = createLucideIcon(__iconData$42);
|
|
|
58571
56266
|
* This source code is licensed under the ISC license.
|
|
58572
56267
|
* See the LICENSE file in the root directory of this source tree.
|
|
58573
56268
|
*/
|
|
58574
|
-
var __iconData$
|
|
56269
|
+
var __iconData$42 = {
|
|
58575
56270
|
name: "moon",
|
|
58576
56271
|
size: 24,
|
|
58577
56272
|
node: [["path", {
|
|
@@ -58579,8 +56274,8 @@ var __iconData$41 = {
|
|
|
58579
56274
|
key: "kfwtm"
|
|
58580
56275
|
}]]
|
|
58581
56276
|
};
|
|
58582
|
-
__iconData$
|
|
58583
|
-
var Moon = createLucideIcon(__iconData$
|
|
56277
|
+
__iconData$42.node;
|
|
56278
|
+
var Moon = createLucideIcon(__iconData$42);
|
|
58584
56279
|
//#endregion
|
|
58585
56280
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/music.mjs
|
|
58586
56281
|
/**
|
|
@@ -58589,7 +56284,7 @@ var Moon = createLucideIcon(__iconData$41);
|
|
|
58589
56284
|
* This source code is licensed under the ISC license.
|
|
58590
56285
|
* See the LICENSE file in the root directory of this source tree.
|
|
58591
56286
|
*/
|
|
58592
|
-
var __iconData$
|
|
56287
|
+
var __iconData$41 = {
|
|
58593
56288
|
name: "music",
|
|
58594
56289
|
size: 24,
|
|
58595
56290
|
node: [
|
|
@@ -58611,8 +56306,56 @@ var __iconData$40 = {
|
|
|
58611
56306
|
}]
|
|
58612
56307
|
]
|
|
58613
56308
|
};
|
|
56309
|
+
__iconData$41.node;
|
|
56310
|
+
var Music = createLucideIcon(__iconData$41);
|
|
56311
|
+
//#endregion
|
|
56312
|
+
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/network.mjs
|
|
56313
|
+
/**
|
|
56314
|
+
* @license lucide-react v1.52.0 - ISC
|
|
56315
|
+
*
|
|
56316
|
+
* This source code is licensed under the ISC license.
|
|
56317
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
56318
|
+
*/
|
|
56319
|
+
var __iconData$40 = {
|
|
56320
|
+
name: "network",
|
|
56321
|
+
size: 24,
|
|
56322
|
+
node: [
|
|
56323
|
+
["rect", {
|
|
56324
|
+
x: "16",
|
|
56325
|
+
y: "16",
|
|
56326
|
+
width: "6",
|
|
56327
|
+
height: "6",
|
|
56328
|
+
rx: "1",
|
|
56329
|
+
key: "4q2zg0"
|
|
56330
|
+
}],
|
|
56331
|
+
["rect", {
|
|
56332
|
+
x: "2",
|
|
56333
|
+
y: "16",
|
|
56334
|
+
width: "6",
|
|
56335
|
+
height: "6",
|
|
56336
|
+
rx: "1",
|
|
56337
|
+
key: "8cvhb9"
|
|
56338
|
+
}],
|
|
56339
|
+
["rect", {
|
|
56340
|
+
x: "9",
|
|
56341
|
+
y: "2",
|
|
56342
|
+
width: "6",
|
|
56343
|
+
height: "6",
|
|
56344
|
+
rx: "1",
|
|
56345
|
+
key: "1egb70"
|
|
56346
|
+
}],
|
|
56347
|
+
["path", {
|
|
56348
|
+
d: "M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",
|
|
56349
|
+
key: "1jsf9p"
|
|
56350
|
+
}],
|
|
56351
|
+
["path", {
|
|
56352
|
+
d: "M12 12V8",
|
|
56353
|
+
key: "2874zd"
|
|
56354
|
+
}]
|
|
56355
|
+
]
|
|
56356
|
+
};
|
|
58614
56357
|
__iconData$40.node;
|
|
58615
|
-
var
|
|
56358
|
+
var Network = createLucideIcon(__iconData$40);
|
|
58616
56359
|
//#endregion
|
|
58617
56360
|
//#region ../../node_modules/.pnpm/lucide-react@1.52.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/palette.mjs
|
|
58618
56361
|
/**
|
|
@@ -159662,4 +157405,4 @@ var G = WebAssembly.compile((a = "AGFzbQEAAAABKwhgAX8Bf2AEf39/fwBgAAF/YAAAYAF/AG
|
|
|
159662
157405
|
});
|
|
159663
157406
|
var a;
|
|
159664
157407
|
//#endregion
|
|
159665
|
-
export { RiPieChart2Fill as $,
|
|
157408
|
+
export { RiPieChart2Fill as $, Gamepad2 as $n, record as $r, UsersRound as $t, MdFitScreen as A, Plus as An, Bookmark as Ar, e$5 as At, AiFillHeart as B, Maximize as Bn, resolveTemplateStyle as Br, s$4 as Bt, webassembly_default as C, RotateCcw as Cn, Check as Cr, o$4 as Ct, tailwind_css_default as D, Quote as Dn, Braces as Dr, a$4 as Dt, tsdown_default as E, Radio as En, Calendar as Er, m$5 as Et, FaCommentDots as F, Music as Fn, Button as Fr, c$7 as Ft, RiArrowRightFill as G, LayoutTemplate as Gn, require_protobufjs as Gr, formatDistanceToNow as Gt, AiFillStar as H, LoaderCircle as Hn, require_react as Hr, zhCN as Ht, FaMusic as I, Moon as In, require_jsx_runtime as Ir, o$8 as It, RiHeart3Fill as J, Heart as Jn, any as Jr, Zap as Jt, RiGroupLine as K, Info$1 as Kn, number$1 as Kr, format$1 as Kt, FaTiktok as L, Monitor as Ln, twMerge as Lr, c$8 as Lt, MdLightbulbOutline as M, Pencil as Mn, BellRing as Mr, a$6 as Mt, MdLocationOn as N, Palette as Nn, ArrowRight as Nr, m$6 as Nt, sqlite_default as O, QrCode as On, Box as Or, n$2 as Ot, MdSchedule as P, Network as Pn, Chip as Pr, m$7 as Pt, RiMessage3Fill as Q, Gauge as Qn, object as Qr, Users as Qt, FaUserGroup as R, MessageCircle as Rn, clsx as Rr, p$5 as Rt, rehypeHighlight as S, Route as Sn, CircleAlert as Sr, r$3 as St, typescript_default as T, RefreshCw as Tn, Camera as Tr, s$3 as Tt, AiOutlineVideoCamera as U, ListChecks as Un, HtmlWrapper as Ur, parse$2 as Ut, AiFillPushpin as V, MapPin as Vn, require_server_node as Vr, m$8 as Vt, Markdown as W, Link as Wn, defineTemplate as Wr, fromUnixTime as Wt, RiHeartLine as X, GitBranch as Xn, literal as Xr, WandSparkles as Xt, RiHeart3Line as Y, Hash as Yn, array as Yr, X$2 as Yt, RiLiveLine as Z, Gift as Zn, number$2 as Zr, Video as Zt, use as _, Share2 as _n, CircleFadingArrowUp as _r, SiGithub as _t, drawDither as a, Timer as an, EyeOff as ar, RiTrophyFill as at, install$14 as b, ScanLine as bn, CircleCheck as br, SiAnthropic as bt, install as c, Star as cn, Crown as cr, RiVideoLine as ct, install$5 as d, Sparkles as dn, Copy as dr, SiSamsung as dt, string$2 as ei, User as en, FingerprintPattern as er, RiShareForwardFill as et, install$6 as f, Smartphone as fn, Code as fr, SiOppo as ft, install$11 as g, ShieldAlert as gn, CircleQuestionMark as gr, SiGooglephotos as gt, install$10 as h, ShieldCheck as hn, Clapperboard as hr, SiHonor as ht, qe as i, Trash as in, Eye as ir, RiTiktokFill as it, MdInfoOutline as j, Play as jn, BookOpenText as jr, c$6 as jt, react_default as k, Puzzle as kn, Bot as kr, p$4 as kt, install$1 as l, Square as ln, Cpu as lr, SiXiaomi as lt, install$9 as m, Shield as mn, Clock3 as mr, SiHuawei as mt, G as n, ZodError as ni, Upload as nn, FilePlay as nr, RiStarLine as nt, require_jpeg_js as o, Terminal as on, ExternalLink as or, RiUserFollowLine as ot, install$8 as p, ShoppingBag as pn, Clock as pr, SiOneplus as pt, RiHashtag as q, Image$1 as qn, _enum as qr, differenceInSeconds as qt, L as r, toJSONSchema as ri, TriangleAlert as rn, FileExclamationPoint as rr, RiThumbUpFill as rt, require_heic_decode as s, Sun as sn, Download as sr, RiVerifiedBadgeFill as st, F as t, union as ti, UserPlus as tn, FileText as tr, RiStarFill as tt, install$4 as u, SquarePen as un, CornerDownLeft as ur, SiVivo as ut, init as v, Settings2 as vn, CircleEllipsis as vr, SiBilibili as vt, vite_default as w, Repeat as wn, ChartColumn as wr, o$5 as wt, install$15 as x, Save as xn, CircleCheckBig as xr, o$3 as xt, install$13 as y, Search as yn, CircleDashed as yr, SiApple as yt, BiImage as z, Menu as zn, createTemplateRenderer as zr, n$3 as zt };
|