@kangwifi-pro/waliwa 1.0.0
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/LICENSE +21 -0
- package/README.md +600 -0
- package/dist/advanced/features.d.ts +211 -0
- package/dist/advanced/features.d.ts.map +1 -0
- package/dist/advanced/features.js +671 -0
- package/dist/advanced/features.js.map +1 -0
- package/dist/auth/auth-state.d.ts +89 -0
- package/dist/auth/auth-state.d.ts.map +1 -0
- package/dist/auth/auth-state.js +330 -0
- package/dist/auth/auth-state.js.map +1 -0
- package/dist/auth/pairing-code.d.ts +78 -0
- package/dist/auth/pairing-code.d.ts.map +1 -0
- package/dist/auth/pairing-code.js +191 -0
- package/dist/auth/pairing-code.js.map +1 -0
- package/dist/auth/qr-code.d.ts +60 -0
- package/dist/auth/qr-code.d.ts.map +1 -0
- package/dist/auth/qr-code.js +151 -0
- package/dist/auth/qr-code.js.map +1 -0
- package/dist/calls/handler.d.ts +61 -0
- package/dist/calls/handler.d.ts.map +1 -0
- package/dist/calls/handler.js +117 -0
- package/dist/calls/handler.js.map +1 -0
- package/dist/core/binary.d.ts +74 -0
- package/dist/core/binary.d.ts.map +1 -0
- package/dist/core/binary.js +448 -0
- package/dist/core/binary.js.map +1 -0
- package/dist/core/crypto.d.ts +60 -0
- package/dist/core/crypto.d.ts.map +1 -0
- package/dist/core/crypto.js +170 -0
- package/dist/core/crypto.js.map +1 -0
- package/dist/core/noise.d.ts +106 -0
- package/dist/core/noise.d.ts.map +1 -0
- package/dist/core/noise.js +307 -0
- package/dist/core/noise.js.map +1 -0
- package/dist/events/emitter.d.ts +44 -0
- package/dist/events/emitter.d.ts.map +1 -0
- package/dist/events/emitter.js +79 -0
- package/dist/events/emitter.js.map +1 -0
- package/dist/features/index.d.ts +342 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +755 -0
- package/dist/features/index.js.map +1 -0
- package/dist/fixes/index.d.ts +333 -0
- package/dist/fixes/index.d.ts.map +1 -0
- package/dist/fixes/index.js +762 -0
- package/dist/fixes/index.js.map +1 -0
- package/dist/groups/management.d.ts +86 -0
- package/dist/groups/management.d.ts.map +1 -0
- package/dist/groups/management.js +443 -0
- package/dist/groups/management.js.map +1 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +236 -0
- package/dist/index.js.map +1 -0
- package/dist/messages/media.d.ts +93 -0
- package/dist/messages/media.d.ts.map +1 -0
- package/dist/messages/media.js +252 -0
- package/dist/messages/media.js.map +1 -0
- package/dist/messages/message-encoder.d.ts +70 -0
- package/dist/messages/message-encoder.d.ts.map +1 -0
- package/dist/messages/message-encoder.js +453 -0
- package/dist/messages/message-encoder.js.map +1 -0
- package/dist/messages/send.d.ts +101 -0
- package/dist/messages/send.d.ts.map +1 -0
- package/dist/messages/send.js +409 -0
- package/dist/messages/send.js.map +1 -0
- package/dist/recovery/index.d.ts +125 -0
- package/dist/recovery/index.d.ts.map +1 -0
- package/dist/recovery/index.js +584 -0
- package/dist/recovery/index.js.map +1 -0
- package/dist/skdm/index.d.ts +220 -0
- package/dist/skdm/index.d.ts.map +1 -0
- package/dist/skdm/index.js +600 -0
- package/dist/skdm/index.js.map +1 -0
- package/dist/socket/hybrid.d.ts +118 -0
- package/dist/socket/hybrid.d.ts.map +1 -0
- package/dist/socket/hybrid.js +352 -0
- package/dist/socket/hybrid.js.map +1 -0
- package/dist/socket/wa-socket.d.ts +300 -0
- package/dist/socket/wa-socket.d.ts.map +1 -0
- package/dist/socket/wa-socket.js +1094 -0
- package/dist/socket/wa-socket.js.map +1 -0
- package/dist/socket/ws-socket.d.ts +96 -0
- package/dist/socket/ws-socket.d.ts.map +1 -0
- package/dist/socket/ws-socket.js +302 -0
- package/dist/socket/ws-socket.js.map +1 -0
- package/dist/types/index.d.ts +444 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/jid.d.ts +46 -0
- package/dist/utils/jid.d.ts.map +1 -0
- package/dist/utils/jid.js +152 -0
- package/dist/utils/jid.js.map +1 -0
- package/dist/utils/logger.d.ts +45 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +79 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/retry.d.ts +43 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +175 -0
- package/dist/utils/retry.js.map +1 -0
- package/docs/API.md +745 -0
- package/docs/ARCHITECTURE.md +307 -0
- package/docs/BAILEYS_FIXES.md +360 -0
- package/docs/FEATURES.md +532 -0
- package/docs/PROTOCOL.md +489 -0
- package/docs/RECOVERY.md +409 -0
- package/docs/SKDM.md +233 -0
- package/examples/ai-bot/index.ts +479 -0
- package/examples/ai-bot/package.json +17 -0
- package/examples/echo-bot/index.ts +171 -0
- package/examples/echo-bot/package.json +18 -0
- package/examples/group-bot/index.ts +557 -0
- package/examples/group-bot/package.json +17 -0
- package/examples/rest-gateway/index.ts +499 -0
- package/examples/rest-gateway/package.json +19 -0
- package/package.json +75 -0
- package/src/advanced/features.ts +817 -0
- package/src/auth/auth-state.ts +342 -0
- package/src/auth/pairing-code.ts +246 -0
- package/src/auth/qr-code.ts +191 -0
- package/src/calls/handler.ts +153 -0
- package/src/core/binary.ts +464 -0
- package/src/core/crypto.ts +189 -0
- package/src/core/noise.ts +406 -0
- package/src/events/emitter.ts +88 -0
- package/src/features/index.ts +921 -0
- package/src/fixes/index.ts +882 -0
- package/src/groups/management.ts +497 -0
- package/src/index.ts +274 -0
- package/src/messages/media.ts +372 -0
- package/src/messages/message-encoder.ts +520 -0
- package/src/messages/send.ts +521 -0
- package/src/recovery/index.ts +704 -0
- package/src/skdm/index.ts +693 -0
- package/src/socket/hybrid.ts +414 -0
- package/src/socket/wa-socket.ts +1347 -0
- package/src/socket/ws-socket.ts +355 -0
- package/src/types/index.ts +457 -0
- package/src/utils/jid.ts +156 -0
- package/src/utils/logger.ts +84 -0
- package/src/utils/retry.ts +205 -0
- package/tsconfig.json +30 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waliwa - Binary encoder/decoder untuk WhatsApp Web binary protocol
|
|
3
|
+
*
|
|
4
|
+
* WhatsApp menggunakan custom binary format untuk encode pesan di WebSocket.
|
|
5
|
+
* Format ini berbeda dari protobuf - lebih ringan dan custom.
|
|
6
|
+
*
|
|
7
|
+
* Manual implementation untuk pemahaman mendalam struktur WA binary.
|
|
8
|
+
* Reference: WhatsApp Web binary tags, BINARY_NODE_ENCODING
|
|
9
|
+
*/
|
|
10
|
+
export declare enum TAG_LIST {
|
|
11
|
+
EMPTY = 0,
|
|
12
|
+
DICTIONARY_0 = 236,// 0xFC
|
|
13
|
+
DICTIONARY_1 = 237,// 0xFD
|
|
14
|
+
DICTIONARY_2 = 238,// 0xFE
|
|
15
|
+
DICTIONARY_3 = 239
|
|
16
|
+
}
|
|
17
|
+
export declare const TAG_NIBBLE = 255;
|
|
18
|
+
export declare const TAG_HEX = 254;
|
|
19
|
+
export declare const TAG_BINARY_8 = 252;
|
|
20
|
+
export declare const TAG_BINARY_20 = 253;
|
|
21
|
+
export declare const TAG_BINARY_32 = 254;
|
|
22
|
+
export declare const TAG_ADJACENT = 255;
|
|
23
|
+
export declare const TAG_LIST_8 = 248;
|
|
24
|
+
export declare const TAG_LIST_16 = 249;
|
|
25
|
+
export declare const TAG_JID_PAIR = 250;
|
|
26
|
+
export declare const TAG_PACKED_NIBBLE = 251;
|
|
27
|
+
export declare const TAG_PACKED_HEX = 252;
|
|
28
|
+
/**
|
|
29
|
+
* Pack nibbles (4 bits per char, jadi 2 char per byte) - lebih hemat space
|
|
30
|
+
* untuk encoding string numeric/hex
|
|
31
|
+
*/
|
|
32
|
+
export declare function packNibbles(str: string): Uint8Array;
|
|
33
|
+
/**
|
|
34
|
+
* Unpack nibbles dari binary ke string
|
|
35
|
+
*/
|
|
36
|
+
export declare function unpackNibbles(bytes: Uint8Array): string;
|
|
37
|
+
export interface BinaryNode {
|
|
38
|
+
tag: string;
|
|
39
|
+
attrs: Record<string, string>;
|
|
40
|
+
content?: string | Uint8Array | BinaryNode[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Binary encoder - mengubah BinaryNode ke Uint8Array
|
|
44
|
+
* Implementasi sesuai WA Web binary protocol
|
|
45
|
+
*/
|
|
46
|
+
export declare class BinaryEncoder {
|
|
47
|
+
private buffer;
|
|
48
|
+
encode(node: BinaryNode): Uint8Array;
|
|
49
|
+
private writeNode;
|
|
50
|
+
private writeString;
|
|
51
|
+
private writePackedString;
|
|
52
|
+
private writeBytes;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Binary decoder - parse WA binary protocol ke BinaryNode
|
|
56
|
+
*/
|
|
57
|
+
export declare class BinaryDecoder {
|
|
58
|
+
private data;
|
|
59
|
+
private pos;
|
|
60
|
+
decode(data: Uint8Array): BinaryNode;
|
|
61
|
+
private readNode;
|
|
62
|
+
private readChild;
|
|
63
|
+
private readString;
|
|
64
|
+
private readPackedString;
|
|
65
|
+
private readBytes;
|
|
66
|
+
private readByte;
|
|
67
|
+
}
|
|
68
|
+
export declare function encodeBinaryNode(node: BinaryNode): Uint8Array;
|
|
69
|
+
export declare function decodeBinaryNode(data: Uint8Array): BinaryNode;
|
|
70
|
+
/**
|
|
71
|
+
* Convert binary node to XML-like string for debugging
|
|
72
|
+
*/
|
|
73
|
+
export declare function binaryNodeToString(node: BinaryNode, indent?: number): string;
|
|
74
|
+
//# sourceMappingURL=binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../../src/core/binary.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,YAAY,MAAM,CAAE,OAAO;IAC3B,YAAY,MAAM,CAAE,OAAO;IAC3B,YAAY,MAAM,CAAE,OAAO;IAC3B,YAAY,MAAM;CACnB;AAGD,eAAO,MAAM,UAAU,MAAM,CAAC;AAC9B,eAAO,MAAM,OAAO,MAAM,CAAC;AAG3B,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,eAAO,MAAM,UAAU,MAAM,CAAC;AAC9B,eAAO,MAAM,WAAW,MAAM,CAAC;AAC/B,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,cAAc,MAAM,CAAC;AAMlC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAUnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CASvD;AAID,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,EAAE,CAAC;CAC9C;AAUD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAE9B,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU;IAMpC,OAAO,CAAC,SAAS;IA+CjB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,UAAU;CAsBnB;AAID;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,GAAG,CAAa;IAExB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU;IAMpC,OAAO,CAAC,QAAQ;IA4DhB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,UAAU;IAyClB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,QAAQ;CAGjB;AAoED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAE7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,CA0B/E"}
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Waliwa - Binary encoder/decoder untuk WhatsApp Web binary protocol
|
|
4
|
+
*
|
|
5
|
+
* WhatsApp menggunakan custom binary format untuk encode pesan di WebSocket.
|
|
6
|
+
* Format ini berbeda dari protobuf - lebih ringan dan custom.
|
|
7
|
+
*
|
|
8
|
+
* Manual implementation untuk pemahaman mendalam struktur WA binary.
|
|
9
|
+
* Reference: WhatsApp Web binary tags, BINARY_NODE_ENCODING
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.BinaryDecoder = exports.BinaryEncoder = exports.TAG_PACKED_HEX = exports.TAG_PACKED_NIBBLE = exports.TAG_JID_PAIR = exports.TAG_LIST_16 = exports.TAG_LIST_8 = exports.TAG_ADJACENT = exports.TAG_BINARY_32 = exports.TAG_BINARY_20 = exports.TAG_BINARY_8 = exports.TAG_HEX = exports.TAG_NIBBLE = exports.TAG_LIST = void 0;
|
|
13
|
+
exports.packNibbles = packNibbles;
|
|
14
|
+
exports.unpackNibbles = unpackNibbles;
|
|
15
|
+
exports.encodeBinaryNode = encodeBinaryNode;
|
|
16
|
+
exports.decodeBinaryNode = decodeBinaryNode;
|
|
17
|
+
exports.binaryNodeToString = binaryNodeToString;
|
|
18
|
+
// ============== Tag Constants ==============
|
|
19
|
+
// List tags (pakai byte ini untuk type)
|
|
20
|
+
var TAG_LIST;
|
|
21
|
+
(function (TAG_LIST) {
|
|
22
|
+
TAG_LIST[TAG_LIST["EMPTY"] = 0] = "EMPTY";
|
|
23
|
+
TAG_LIST[TAG_LIST["DICTIONARY_0"] = 236] = "DICTIONARY_0";
|
|
24
|
+
TAG_LIST[TAG_LIST["DICTIONARY_1"] = 237] = "DICTIONARY_1";
|
|
25
|
+
TAG_LIST[TAG_LIST["DICTIONARY_2"] = 238] = "DICTIONARY_2";
|
|
26
|
+
TAG_LIST[TAG_LIST["DICTIONARY_3"] = 239] = "DICTIONARY_3";
|
|
27
|
+
})(TAG_LIST || (exports.TAG_LIST = TAG_LIST = {}));
|
|
28
|
+
// Nibble pack (4 bits per char)
|
|
29
|
+
exports.TAG_NIBBLE = 255; // 0xFF already used by dict 3, so different
|
|
30
|
+
exports.TAG_HEX = 254; // ditto
|
|
31
|
+
// Hex tags
|
|
32
|
+
exports.TAG_BINARY_8 = 252; // 0xFC
|
|
33
|
+
exports.TAG_BINARY_20 = 253; // 0xFD
|
|
34
|
+
exports.TAG_BINARY_32 = 254; // 0xFE
|
|
35
|
+
exports.TAG_ADJACENT = 255; // 0xFF
|
|
36
|
+
exports.TAG_LIST_8 = 248; // 0xF8
|
|
37
|
+
exports.TAG_LIST_16 = 249; // 0xF9
|
|
38
|
+
exports.TAG_JID_PAIR = 250; // 0xFA
|
|
39
|
+
exports.TAG_PACKED_NIBBLE = 251; // 0xFB
|
|
40
|
+
exports.TAG_PACKED_HEX = 252; // 0xFC
|
|
41
|
+
// ============== Packed Encoding ==============
|
|
42
|
+
const HEX_CHARS = '0123456789abcdef';
|
|
43
|
+
/**
|
|
44
|
+
* Pack nibbles (4 bits per char, jadi 2 char per byte) - lebih hemat space
|
|
45
|
+
* untuk encoding string numeric/hex
|
|
46
|
+
*/
|
|
47
|
+
function packNibbles(str) {
|
|
48
|
+
// Pad agar panjang genap
|
|
49
|
+
if (str.length % 2 !== 0)
|
|
50
|
+
str += '0';
|
|
51
|
+
const result = new Uint8Array(str.length / 2);
|
|
52
|
+
for (let i = 0; i < str.length; i += 2) {
|
|
53
|
+
const high = parseInt(str[i], 16);
|
|
54
|
+
const low = parseInt(str[i + 1], 16);
|
|
55
|
+
result[i / 2] = (high << 4) | low;
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Unpack nibbles dari binary ke string
|
|
61
|
+
*/
|
|
62
|
+
function unpackNibbles(bytes) {
|
|
63
|
+
let result = '';
|
|
64
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
65
|
+
const high = (bytes[i] >> 4) & 0xf;
|
|
66
|
+
const low = bytes[i] & 0xf;
|
|
67
|
+
result += HEX_CHARS[high];
|
|
68
|
+
result += HEX_CHARS[low];
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
// ============== Constants ==============
|
|
73
|
+
const NUM_DOUBLE_BYTE = 251; // 0xFB
|
|
74
|
+
const NUM_SINGLE_BYTE = 250; // 0xFA
|
|
75
|
+
const NUM_QUAD_BYTE = 252; // 0xFC
|
|
76
|
+
// ============== Encoder ==============
|
|
77
|
+
/**
|
|
78
|
+
* Binary encoder - mengubah BinaryNode ke Uint8Array
|
|
79
|
+
* Implementasi sesuai WA Web binary protocol
|
|
80
|
+
*/
|
|
81
|
+
class BinaryEncoder {
|
|
82
|
+
buffer = [];
|
|
83
|
+
encode(node) {
|
|
84
|
+
this.buffer = [];
|
|
85
|
+
this.writeNode(node);
|
|
86
|
+
return new Uint8Array(this.buffer);
|
|
87
|
+
}
|
|
88
|
+
writeNode(node) {
|
|
89
|
+
if (!node)
|
|
90
|
+
return;
|
|
91
|
+
const children = Array.isArray(node.content) ? node.content : [];
|
|
92
|
+
const hasContent = node.content !== undefined;
|
|
93
|
+
const numAttrs = Object.keys(node.attrs || {}).length;
|
|
94
|
+
// Write tag header
|
|
95
|
+
if (numAttrs === 0 && !hasContent) {
|
|
96
|
+
this.buffer.push(TAG_LIST.EMPTY);
|
|
97
|
+
}
|
|
98
|
+
else if (numAttrs === 0) {
|
|
99
|
+
this.buffer.push(TAG_LIST.EMPTY | 0x80);
|
|
100
|
+
}
|
|
101
|
+
else if (numAttrs < 256 && children.length < 256) {
|
|
102
|
+
this.buffer.push(TAG_LIST.EMPTY | (numAttrs << 4) | (children.length > 0 ? 0x80 : 0));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.buffer.push(exports.TAG_LIST_8);
|
|
106
|
+
this.buffer.push(numAttrs & 0xff);
|
|
107
|
+
this.buffer.push(children.length & 0xff);
|
|
108
|
+
}
|
|
109
|
+
// Write tag string (we assume tag is in dict, encode as packed nibble index)
|
|
110
|
+
this.writeString(node.tag);
|
|
111
|
+
// Write attributes
|
|
112
|
+
for (const [k, v] of Object.entries(node.attrs)) {
|
|
113
|
+
this.writeString(k);
|
|
114
|
+
this.writeString(v);
|
|
115
|
+
}
|
|
116
|
+
// Write content
|
|
117
|
+
if (children.length > 0) {
|
|
118
|
+
for (const child of children) {
|
|
119
|
+
if (typeof child === 'string') {
|
|
120
|
+
this.writeString(child);
|
|
121
|
+
}
|
|
122
|
+
else if (child instanceof Uint8Array) {
|
|
123
|
+
this.writeBytes(child);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
this.writeNode(child);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else if (typeof node.content === 'string') {
|
|
131
|
+
this.writeString(node.content);
|
|
132
|
+
}
|
|
133
|
+
else if (node.content instanceof Uint8Array) {
|
|
134
|
+
this.writeBytes(node.content);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
writeString(str) {
|
|
138
|
+
if (str === '') {
|
|
139
|
+
this.buffer.push(TAG_LIST.EMPTY);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Try to find in dictionary
|
|
143
|
+
const dictIndex = findInDict(str);
|
|
144
|
+
if (dictIndex !== -1) {
|
|
145
|
+
const dict = dictIndex >> 8;
|
|
146
|
+
const idx = dictIndex & 0xff;
|
|
147
|
+
this.buffer.push(TAG_LIST.DICTIONARY_0 + dict);
|
|
148
|
+
this.buffer.push(idx);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// Try nibble packing for hex/numeric strings
|
|
152
|
+
if (/^[0-9a-fA-F]+$/.test(str) && str.length > 1) {
|
|
153
|
+
this.buffer.push(exports.TAG_PACKED_HEX);
|
|
154
|
+
this.writePackedString(str);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (/^[0-9]+$/.test(str) && str.length > 1) {
|
|
158
|
+
this.buffer.push(exports.TAG_PACKED_NIBBLE);
|
|
159
|
+
this.writePackedString(str);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
// Default: raw bytes
|
|
163
|
+
this.writeBytes(new TextEncoder().encode(str));
|
|
164
|
+
}
|
|
165
|
+
writePackedString(str) {
|
|
166
|
+
// Pack nibbles - 2 char per byte, terminate with 0xf
|
|
167
|
+
const packed = packNibbles(str);
|
|
168
|
+
this.buffer.push(...packed);
|
|
169
|
+
// Terminator
|
|
170
|
+
this.buffer.push(0xf);
|
|
171
|
+
}
|
|
172
|
+
writeBytes(bytes) {
|
|
173
|
+
const len = bytes.length;
|
|
174
|
+
if (len < 256) {
|
|
175
|
+
this.buffer.push(exports.TAG_BINARY_8);
|
|
176
|
+
this.buffer.push(len);
|
|
177
|
+
}
|
|
178
|
+
else if (len < 1048576) {
|
|
179
|
+
this.buffer.push(exports.TAG_BINARY_20);
|
|
180
|
+
this.buffer.push((len >> 16) & 0xff);
|
|
181
|
+
this.buffer.push((len >> 8) & 0xff);
|
|
182
|
+
this.buffer.push(len & 0xff);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
this.buffer.push(exports.TAG_BINARY_32);
|
|
186
|
+
// 4 bytes big-endian
|
|
187
|
+
this.buffer.push((len >> 24) & 0xff);
|
|
188
|
+
this.buffer.push((len >> 16) & 0xff);
|
|
189
|
+
this.buffer.push((len >> 8) & 0xff);
|
|
190
|
+
this.buffer.push(len & 0xff);
|
|
191
|
+
}
|
|
192
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
193
|
+
this.buffer.push(bytes[i]);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.BinaryEncoder = BinaryEncoder;
|
|
198
|
+
// ============== Decoder ==============
|
|
199
|
+
/**
|
|
200
|
+
* Binary decoder - parse WA binary protocol ke BinaryNode
|
|
201
|
+
*/
|
|
202
|
+
class BinaryDecoder {
|
|
203
|
+
data;
|
|
204
|
+
pos = 0;
|
|
205
|
+
decode(data) {
|
|
206
|
+
this.data = data;
|
|
207
|
+
this.pos = 0;
|
|
208
|
+
return this.readNode();
|
|
209
|
+
}
|
|
210
|
+
readNode() {
|
|
211
|
+
const listFlag = (0x80 & this.readByte()) !== 0;
|
|
212
|
+
const numAttrs = 0x7f & this.readByte();
|
|
213
|
+
const tag = this.readString();
|
|
214
|
+
const attrs = {};
|
|
215
|
+
for (let i = 0; i < numAttrs; i++) {
|
|
216
|
+
const key = this.readString();
|
|
217
|
+
const value = this.readString();
|
|
218
|
+
attrs[key] = value;
|
|
219
|
+
}
|
|
220
|
+
let content;
|
|
221
|
+
if (listFlag) {
|
|
222
|
+
const children = [];
|
|
223
|
+
while (this.pos < this.data.length) {
|
|
224
|
+
const peek = this.data[this.pos];
|
|
225
|
+
if (peek === 0) {
|
|
226
|
+
// End marker
|
|
227
|
+
this.pos++;
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
// Determine type
|
|
231
|
+
if (peek === exports.TAG_LIST_8 || peek === exports.TAG_LIST_16) {
|
|
232
|
+
children.push(this.readNode());
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
// It's a string or bytes
|
|
236
|
+
const child = this.readChild();
|
|
237
|
+
if (typeof child === 'string') {
|
|
238
|
+
children.push({ tag: '__text__', attrs: {}, content: child });
|
|
239
|
+
}
|
|
240
|
+
else if (child instanceof Uint8Array) {
|
|
241
|
+
children.push({ tag: '__bytes__', attrs: {}, content: child });
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
children.push(child);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
content = children.length > 0 ? children : undefined;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
// Single child or none
|
|
252
|
+
if (this.pos < this.data.length) {
|
|
253
|
+
const peek = this.data[this.pos];
|
|
254
|
+
if (peek === 0) {
|
|
255
|
+
this.pos++;
|
|
256
|
+
}
|
|
257
|
+
else if (peek === exports.TAG_LIST_8 || peek === exports.TAG_LIST_16) {
|
|
258
|
+
content = [this.readNode()];
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
const child = this.readChild();
|
|
262
|
+
if (typeof child === 'string' || child instanceof Uint8Array) {
|
|
263
|
+
content = child;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
content = [child];
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return { tag, attrs, content };
|
|
272
|
+
}
|
|
273
|
+
readChild() {
|
|
274
|
+
const peek = this.data[this.pos];
|
|
275
|
+
if (peek === exports.TAG_LIST_8 || peek === exports.TAG_LIST_16) {
|
|
276
|
+
return this.readNode();
|
|
277
|
+
}
|
|
278
|
+
return this.readString();
|
|
279
|
+
}
|
|
280
|
+
readString() {
|
|
281
|
+
const tag = this.readByte();
|
|
282
|
+
if (tag === TAG_LIST.EMPTY) {
|
|
283
|
+
return '';
|
|
284
|
+
}
|
|
285
|
+
if (tag === TAG_LIST.DICTIONARY_0 ||
|
|
286
|
+
tag === TAG_LIST.DICTIONARY_1 ||
|
|
287
|
+
tag === TAG_LIST.DICTIONARY_2 ||
|
|
288
|
+
tag === TAG_LIST.DICTIONARY_3) {
|
|
289
|
+
const dictIndex = this.readByte();
|
|
290
|
+
return lookupDict(tag - TAG_LIST.DICTIONARY_0, dictIndex);
|
|
291
|
+
}
|
|
292
|
+
if (tag === exports.TAG_PACKED_NIBBLE) {
|
|
293
|
+
return this.readPackedString(false);
|
|
294
|
+
}
|
|
295
|
+
if (tag === exports.TAG_PACKED_HEX) {
|
|
296
|
+
return this.readPackedString(true);
|
|
297
|
+
}
|
|
298
|
+
if (tag === exports.TAG_BINARY_8) {
|
|
299
|
+
const len = this.readByte();
|
|
300
|
+
return new TextDecoder().decode(this.readBytes(len));
|
|
301
|
+
}
|
|
302
|
+
if (tag === exports.TAG_BINARY_20) {
|
|
303
|
+
const b1 = this.readByte();
|
|
304
|
+
const b2 = this.readByte();
|
|
305
|
+
const b3 = this.readByte();
|
|
306
|
+
const len = (b1 << 16) | (b2 << 8) | b3;
|
|
307
|
+
return new TextDecoder().decode(this.readBytes(len));
|
|
308
|
+
}
|
|
309
|
+
if (tag === exports.TAG_BINARY_32) {
|
|
310
|
+
const b1 = this.readByte();
|
|
311
|
+
const b2 = this.readByte();
|
|
312
|
+
const b3 = this.readByte();
|
|
313
|
+
const b4 = this.readByte();
|
|
314
|
+
const len = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
|
|
315
|
+
return new TextDecoder().decode(this.readBytes(len));
|
|
316
|
+
}
|
|
317
|
+
// Fall through - single byte char
|
|
318
|
+
return String.fromCharCode(tag);
|
|
319
|
+
}
|
|
320
|
+
readPackedString(isHex) {
|
|
321
|
+
const bytes = [];
|
|
322
|
+
while (this.pos < this.data.length) {
|
|
323
|
+
const b = this.data[this.pos++];
|
|
324
|
+
const high = (b >> 4) & 0xf;
|
|
325
|
+
const low = b & 0xf;
|
|
326
|
+
if (high === 0xf)
|
|
327
|
+
break;
|
|
328
|
+
bytes.push(high);
|
|
329
|
+
if (low === 0xf)
|
|
330
|
+
break;
|
|
331
|
+
bytes.push(low);
|
|
332
|
+
}
|
|
333
|
+
if (isHex) {
|
|
334
|
+
return bytes.map(b => HEX_CHARS[b]).join('');
|
|
335
|
+
}
|
|
336
|
+
// Nibble - numeric 0-9
|
|
337
|
+
return bytes.map(b => String(b)).join('');
|
|
338
|
+
}
|
|
339
|
+
readBytes(n) {
|
|
340
|
+
const result = this.data.subarray(this.pos, this.pos + n);
|
|
341
|
+
this.pos += n;
|
|
342
|
+
return result;
|
|
343
|
+
}
|
|
344
|
+
readByte() {
|
|
345
|
+
return this.data[this.pos++];
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
exports.BinaryDecoder = BinaryDecoder;
|
|
349
|
+
// ============== Dictionaries (Tokens) ==============
|
|
350
|
+
/**
|
|
351
|
+
* WhatsApp dictionary berisi string yang sering dipakai untuk kompresi.
|
|
352
|
+
* Encode sebagai dictionary index (1 byte) daripada string length + bytes.
|
|
353
|
+
*
|
|
354
|
+
* Note: dictionary disusun dari analisis WhatsApp Web JavaScript bundle.
|
|
355
|
+
* Total ~240 entries per dictionary (4 dictionaries), prefix common tags.
|
|
356
|
+
*/
|
|
357
|
+
const DICTIONARIES = [
|
|
358
|
+
// Dictionary 0 - common protocol tags
|
|
359
|
+
[
|
|
360
|
+
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
|
|
361
|
+
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
|
|
362
|
+
// index 32+ actual entries
|
|
363
|
+
'edge_routing', 'account_sync', 'action', 'add', 'after', 'all', 'allow', 'available',
|
|
364
|
+
'background', 'battery', 'before', 'broadcast', 'browser', 'call', 'cancel',
|
|
365
|
+
'category', 'chat', 'code', 'commands', 'config', 'contacts', 'conversation',
|
|
366
|
+
'count', 'create', 'debug', 'delete', 'demote', 'deny', 'device', 'devices',
|
|
367
|
+
'disconnect', 'domain', 'download', 'edit', 'encrypt', 'error', 'expiration',
|
|
368
|
+
'false', 'file', 'filename', 'first', 'from', 'g.us', 'group', 'groups',
|
|
369
|
+
'history', 'id', 'identity', 'image', 'in', 'index', 'invite', 'iq',
|
|
370
|
+
'jid', 'kind', 'last', 'length', 'level', 'list', 'location', 'manifest',
|
|
371
|
+
'media', 'message', 'messages', 'method', 'migrate', 'modify', 'mute', 'name',
|
|
372
|
+
'newsletter', 'next', 'nick', 'no', 'not', 'notify', 'off', 'offer',
|
|
373
|
+
'offline', 'on', 'open', 'out', 'owner', 'pair', 'pairing', 'participant',
|
|
374
|
+
'participants', 'payload', 'paused', 'permissions', 'phone', 'pin', 'platform', 'presence',
|
|
375
|
+
'preview', 'primary', 'promote', 'protocol', 'push', 'query', 'rate', 'read',
|
|
376
|
+
'reason', 'receipt', 'received', 'recording', 'reject', 'remove', 'request', 'response',
|
|
377
|
+
'retry', 'revoke', 's.whatsapp.net', 'send', 'session', 'settings', 'sha256', 'signature',
|
|
378
|
+
'since', 'status', 'subscribe', 'success', 'sync', 'tag', 'target', 'text',
|
|
379
|
+
'timestamp', 'true', 'type', 'unblock', 'unavailable', 'unread', 'update', 'user',
|
|
380
|
+
'verify', 'version', 'video', 'visible', 'voice', 'wait', 'warning', 'whatsapp',
|
|
381
|
+
'ack', 'expire', 'image_message', 'video_message', 'audio_message', 'document_message',
|
|
382
|
+
'sticker_message', 'location_message', 'contact_message', 'poll_message', 'server_sync',
|
|
383
|
+
'business_hours', 'business_profile', 'catalog', 'label', 'order', 'product',
|
|
384
|
+
'reaction', 'status_attendance', 'ephemeral', 'view_once', 'keep_in_chat',
|
|
385
|
+
'unarchive', 'archive', 'mute', 'star', 'pin_v2'
|
|
386
|
+
],
|
|
387
|
+
// Dictionary 1, 2, 3 - shorter/smaller for less common tags
|
|
388
|
+
[], [], []
|
|
389
|
+
];
|
|
390
|
+
/**
|
|
391
|
+
* Find string in dictionary, return encoded index
|
|
392
|
+
* Returns -1 if not found
|
|
393
|
+
*/
|
|
394
|
+
function findInDict(str) {
|
|
395
|
+
for (let dict = 0; dict < DICTIONARIES.length; dict++) {
|
|
396
|
+
const idx = DICTIONARIES[dict].indexOf(str);
|
|
397
|
+
if (idx !== -1) {
|
|
398
|
+
return (dict << 8) | idx;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return -1;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Lookup dict by index
|
|
405
|
+
*/
|
|
406
|
+
function lookupDict(dict, index) {
|
|
407
|
+
return DICTIONARIES[dict]?.[index] ?? '';
|
|
408
|
+
}
|
|
409
|
+
// ============== Helpers ==============
|
|
410
|
+
function encodeBinaryNode(node) {
|
|
411
|
+
return new BinaryEncoder().encode(node);
|
|
412
|
+
}
|
|
413
|
+
function decodeBinaryNode(data) {
|
|
414
|
+
return new BinaryDecoder().decode(data);
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Convert binary node to XML-like string for debugging
|
|
418
|
+
*/
|
|
419
|
+
function binaryNodeToString(node, indent = 0) {
|
|
420
|
+
const pad = ' '.repeat(indent);
|
|
421
|
+
let str = `${pad}<${node.tag}`;
|
|
422
|
+
for (const [k, v] of Object.entries(node.attrs)) {
|
|
423
|
+
str += ` ${k}="${v}"`;
|
|
424
|
+
}
|
|
425
|
+
if (!node.content) {
|
|
426
|
+
return str + ' />';
|
|
427
|
+
}
|
|
428
|
+
if (typeof node.content === 'string') {
|
|
429
|
+
return str + `>${node.content}</${node.tag}>`;
|
|
430
|
+
}
|
|
431
|
+
if (node.content instanceof Uint8Array) {
|
|
432
|
+
return str + `>[${node.content.length} bytes]</${node.tag}>`;
|
|
433
|
+
}
|
|
434
|
+
str += '>\n';
|
|
435
|
+
for (const child of node.content) {
|
|
436
|
+
if (typeof child === 'string') {
|
|
437
|
+
str += `${pad} ${child}\n`;
|
|
438
|
+
}
|
|
439
|
+
else if (child instanceof Uint8Array) {
|
|
440
|
+
str += `${pad} [${child.length} bytes]\n`;
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
str += binaryNodeToString(child, indent + 1) + '\n';
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
return str + `${pad}</${node.tag}>`;
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.js","sourceRoot":"","sources":["../../src/core/binary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waliwa - Crypto utilities
|
|
3
|
+
* Hybrid approach: menggunakan @noble/curves & @noble/hashes untuk primitives
|
|
4
|
+
* Manual implementasi untuk WhatsApp-specific encoding (noise handshake, message framing)
|
|
5
|
+
*
|
|
6
|
+
* RAM optimization: gunakan Uint8Array (bukan Buffer) di mana memungkinkan untuk
|
|
7
|
+
* hindari overhead V8 Buffer pool.
|
|
8
|
+
*/
|
|
9
|
+
export interface KeyPair {
|
|
10
|
+
private: Uint8Array;
|
|
11
|
+
public: Uint8Array;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate Curve25519 key pair untuk Noise Protocol / Signal keys
|
|
15
|
+
* RAM-friendly: gunakan direct x25519 dari @noble/curves (no bindings).
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateCurveKeyPair(): KeyPair;
|
|
18
|
+
/**
|
|
19
|
+
* X25519 ECDH - compute shared secret
|
|
20
|
+
*/
|
|
21
|
+
export declare function curveSharedSecret(privateKey: Uint8Array, publicKey: Uint8Array): Uint8Array;
|
|
22
|
+
/**
|
|
23
|
+
* Sign data dengan Ed25519 (untuk Signal signed pre-keys)
|
|
24
|
+
*/
|
|
25
|
+
export declare function curveSign(privateKey: Uint8Array, data: Uint8Array): Uint8Array;
|
|
26
|
+
/**
|
|
27
|
+
* Verify Ed25519 signature
|
|
28
|
+
*/
|
|
29
|
+
export declare function curveVerify(publicKey: Uint8Array, data: Uint8Array, signature: Uint8Array): boolean;
|
|
30
|
+
export declare function sha256Hash(data: Uint8Array): Uint8Array;
|
|
31
|
+
export declare function sha512Hash(data: Uint8Array): Uint8Array;
|
|
32
|
+
export declare function sha1Hash(data: Uint8Array): Uint8Array;
|
|
33
|
+
export declare function hmacSha256(key: Uint8Array, data: Uint8Array): Uint8Array;
|
|
34
|
+
export declare function hmacSha512(key: Uint8Array, data: Uint8Array): Uint8Array;
|
|
35
|
+
/**
|
|
36
|
+
* HKDF - HMAC-based Key Derivation Function
|
|
37
|
+
* WhatsApp menggunakan HKDF extensively untuk derive keys dari shared secrets
|
|
38
|
+
*/
|
|
39
|
+
export declare function hkdfDerive(ikm: Uint8Array, salt: Uint8Array, info: Uint8Array, length: number): Uint8Array;
|
|
40
|
+
export interface AESCipher {
|
|
41
|
+
encrypt(plaintext: Uint8Array, iv: Uint8Array, aad?: Uint8Array): {
|
|
42
|
+
ciphertext: Uint8Array;
|
|
43
|
+
tag: Uint8Array;
|
|
44
|
+
};
|
|
45
|
+
decrypt(ciphertext: Uint8Array, iv: Uint8Array, tag: Uint8Array, aad?: Uint8Array): Uint8Array;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* AES-256-GCM cipher (sebuah komponen inti WA message encryption)
|
|
49
|
+
*/
|
|
50
|
+
export declare function createAESCipher(key: Uint8Array): AESCipher;
|
|
51
|
+
export declare function aesEncryptCBC(plaintext: Uint8Array, key: Uint8Array, iv: Uint8Array): Uint8Array;
|
|
52
|
+
export declare function aesDecryptCBC(ciphertext: Uint8Array, key: Uint8Array, iv: Uint8Array): Uint8Array;
|
|
53
|
+
export declare function getRandomBytes(length: number): Uint8Array;
|
|
54
|
+
export declare function concatBytes(...arrays: Uint8Array[]): Uint8Array;
|
|
55
|
+
export declare function areBytesEqual(a: Uint8Array, b: Uint8Array): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Constant-time comparison untuk hmac verification
|
|
58
|
+
*/
|
|
59
|
+
export declare function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean;
|
|
60
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/core/crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,UAAU,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAE3F;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAI9E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAOnG;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAEvD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAEvD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAErD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAExE;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAExE;AAID;;;GAGG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,GACb,UAAU,CAGZ;AAID,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,UAAU,CAAA;KAAE,CAAC;IAC9G,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CAChG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,CAkB1D;AAID,wBAAgB,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,UAAU,CAahG;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,UAAU,CAOjG;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAEzD;AAID,wBAAgB,WAAW,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAS/D;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAKnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAEvE"}
|