@erfan_bahramali/tping 1.0.0 → 1.1.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/README.md +76 -55
- package/dist/crypto/x25519.d.ts +10 -0
- package/dist/crypto/x25519.d.ts.map +1 -0
- package/dist/crypto/x25519.js +51 -0
- package/dist/crypto/x25519.js.map +1 -0
- package/dist/index.js +82 -39
- package/dist/index.js.map +1 -1
- package/dist/lib/attempt.d.ts +31 -0
- package/dist/lib/attempt.d.ts.map +1 -0
- package/dist/lib/attempt.js +94 -0
- package/dist/lib/attempt.js.map +1 -0
- package/dist/lib/checker.d.ts +21 -3
- package/dist/lib/checker.d.ts.map +1 -1
- package/dist/lib/checker.js +133 -49
- package/dist/lib/checker.js.map +1 -1
- package/dist/lib/datacenters.d.ts +15 -0
- package/dist/lib/datacenters.d.ts.map +1 -0
- package/dist/lib/datacenters.js +20 -0
- package/dist/lib/datacenters.js.map +1 -0
- package/dist/lib/parser.d.ts +18 -3
- package/dist/lib/parser.d.ts.map +1 -1
- package/dist/lib/parser.js +174 -78
- package/dist/lib/parser.js.map +1 -1
- package/dist/lib/ping.d.ts +13 -6
- package/dist/lib/ping.d.ts.map +1 -1
- package/dist/lib/ping.js +44 -44
- package/dist/lib/ping.js.map +1 -1
- package/dist/mtproto/exchange.d.ts +10 -0
- package/dist/mtproto/exchange.d.ts.map +1 -0
- package/dist/mtproto/exchange.js +20 -0
- package/dist/mtproto/exchange.js.map +1 -0
- package/dist/mtproto/fake-tls.d.ts +36 -44
- package/dist/mtproto/fake-tls.d.ts.map +1 -1
- package/dist/mtproto/fake-tls.js +174 -148
- package/dist/mtproto/fake-tls.js.map +1 -1
- package/dist/mtproto/messages.d.ts +23 -36
- package/dist/mtproto/messages.d.ts.map +1 -1
- package/dist/mtproto/messages.js +64 -90
- package/dist/mtproto/messages.js.map +1 -1
- package/dist/mtproto/obfuscation.d.ts +23 -20
- package/dist/mtproto/obfuscation.d.ts.map +1 -1
- package/dist/mtproto/obfuscation.js +64 -64
- package/dist/mtproto/obfuscation.js.map +1 -1
- package/dist/mtproto/secret.d.ts +28 -0
- package/dist/mtproto/secret.d.ts.map +1 -0
- package/dist/mtproto/secret.js +68 -0
- package/dist/mtproto/secret.js.map +1 -0
- package/dist/mtproto/transport.d.ts +28 -0
- package/dist/mtproto/transport.d.ts.map +1 -0
- package/dist/mtproto/transport.js +78 -0
- package/dist/mtproto/transport.js.map +1 -0
- package/dist/net/http-client.d.ts +37 -0
- package/dist/net/http-client.d.ts.map +1 -0
- package/dist/net/http-client.js +93 -0
- package/dist/net/http-client.js.map +1 -0
- package/dist/net/http-proxy.d.ts +26 -0
- package/dist/net/http-proxy.d.ts.map +1 -0
- package/dist/net/http-proxy.js +71 -0
- package/dist/net/http-proxy.js.map +1 -0
- package/dist/net/socks5.d.ts +15 -0
- package/dist/net/socks5.d.ts.map +1 -0
- package/dist/net/socks5.js +112 -0
- package/dist/net/socks5.js.map +1 -0
- package/dist/net/stream.d.ts +54 -0
- package/dist/net/stream.d.ts.map +1 -0
- package/dist/net/stream.js +142 -0
- package/dist/net/stream.js.map +1 -0
- package/dist/net/websocket.d.ts +19 -0
- package/dist/net/websocket.d.ts.map +1 -0
- package/dist/net/websocket.js +123 -0
- package/dist/net/websocket.js.map +1 -0
- package/dist/types/index.d.ts +40 -17
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/format.d.ts +7 -14
- package/dist/utils/format.d.ts.map +1 -1
- package/dist/utils/format.js +101 -87
- package/dist/utils/format.js.map +1 -1
- package/dist/webproxy/check.d.ts +15 -0
- package/dist/webproxy/check.d.ts.map +1 -0
- package/dist/webproxy/check.js +423 -0
- package/dist/webproxy/check.js.map +1 -0
- package/dist/webproxy/frames.d.ts +30 -0
- package/dist/webproxy/frames.d.ts.map +1 -0
- package/dist/webproxy/frames.js +59 -0
- package/dist/webproxy/frames.js.map +1 -0
- package/dist/webproxy/link.d.ts +27 -0
- package/dist/webproxy/link.d.ts.map +1 -0
- package/dist/webproxy/link.js +107 -0
- package/dist/webproxy/link.js.map +1 -0
- package/package.json +16 -11
- package/dist/mtproto/connection.d.ts +0 -59
- package/dist/mtproto/connection.d.ts.map +0 -1
- package/dist/mtproto/connection.js +0 -198
- package/dist/mtproto/connection.js.map +0 -1
- package/dist/mtproto/socks5.d.ts +0 -36
- package/dist/mtproto/socks5.d.ts.map +0 -1
- package/dist/mtproto/socks5.js +0 -148
- package/dist/mtproto/socks5.js.map +0 -1
package/dist/lib/ping.d.ts
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import type { TelegramProxy, CheckResult } from '../types/index.js';
|
|
2
|
+
export interface PingOptions {
|
|
3
|
+
readonly count?: number;
|
|
4
|
+
readonly interval: number;
|
|
5
|
+
readonly timeout: number;
|
|
6
|
+
readonly dcs: readonly number[];
|
|
7
|
+
readonly ipv6: boolean;
|
|
8
|
+
readonly verbose: boolean;
|
|
9
|
+
}
|
|
2
10
|
/**
|
|
3
|
-
* Ping proxies
|
|
11
|
+
* Ping all proxies in rounds, like `ping`. Returns every non-aborted result per proxy.
|
|
12
|
+
*
|
|
13
|
+
* On a TTY with enough rows the lines of a round are updated in place;
|
|
14
|
+
* otherwise (pipes, files, many proxies) each result is printed when it arrives.
|
|
4
15
|
*/
|
|
5
|
-
export declare const
|
|
6
|
-
count?: number;
|
|
7
|
-
interval?: number;
|
|
8
|
-
timeout?: number;
|
|
9
|
-
}, signal?: AbortSignal) => Promise<readonly CheckResult[][]>;
|
|
16
|
+
export declare const pingProxies: (proxies: readonly TelegramProxy[], options: PingOptions, signal: AbortSignal) => Promise<readonly CheckResult[][]>;
|
|
10
17
|
//# sourceMappingURL=ping.d.ts.map
|
package/dist/lib/ping.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../src/lib/ping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIpE
|
|
1
|
+
{"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../src/lib/ping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIpE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAiBD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,SAAS,SAAS,aAAa,EAAE,EACjC,SAAS,WAAW,EACpB,QAAQ,WAAW,KAClB,OAAO,CAAC,SAAS,WAAW,EAAE,EAAE,CA2ClC,CAAC"}
|
package/dist/lib/ping.js
CHANGED
|
@@ -1,56 +1,56 @@
|
|
|
1
1
|
import { checkProxy } from './checker.js';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const { count, interval = 1000, timeout = 10000 } = options;
|
|
8
|
-
let shouldStop = false;
|
|
9
|
-
// Handle abort signal
|
|
10
|
-
if (signal) {
|
|
11
|
-
signal.addEventListener('abort', () => {
|
|
12
|
-
shouldStop = true;
|
|
13
|
-
});
|
|
2
|
+
import { formatPingLine, printPingStatistics } from '../utils/format.js';
|
|
3
|
+
const sleep = (ms, signal) => new Promise((resolve) => {
|
|
4
|
+
if (signal.aborted) {
|
|
5
|
+
resolve();
|
|
6
|
+
return;
|
|
14
7
|
}
|
|
15
|
-
const
|
|
16
|
-
|
|
8
|
+
const done = () => {
|
|
9
|
+
clearTimeout(timer);
|
|
10
|
+
signal.removeEventListener('abort', done);
|
|
11
|
+
resolve();
|
|
17
12
|
};
|
|
18
|
-
|
|
13
|
+
const timer = setTimeout(done, ms);
|
|
14
|
+
signal.addEventListener('abort', done, { once: true });
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Ping all proxies in rounds, like `ping`. Returns every non-aborted result per proxy.
|
|
18
|
+
*
|
|
19
|
+
* On a TTY with enough rows the lines of a round are updated in place;
|
|
20
|
+
* otherwise (pipes, files, many proxies) each result is printed when it arrives.
|
|
21
|
+
*/
|
|
22
|
+
export const pingProxies = async (proxies, options, signal) => {
|
|
23
|
+
const out = process.stdout;
|
|
24
|
+
const live = Boolean(out.isTTY) && proxies.length < (out.rows ?? 24) - 2;
|
|
19
25
|
const allResults = proxies.map(() => []);
|
|
20
|
-
let sequence = 1;
|
|
21
|
-
|
|
22
|
-
while (!shouldStop) {
|
|
23
|
-
// Check if we've reached the count limit
|
|
24
|
-
if (count !== undefined && sequence > count) {
|
|
26
|
+
for (let sequence = 1; options.count === undefined || sequence <= options.count; sequence++) {
|
|
27
|
+
if (signal.aborted) {
|
|
25
28
|
break;
|
|
26
29
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
printPingResult(i, proxies, sequence, 'testing');
|
|
30
|
-
process.stdout.write('\n');
|
|
30
|
+
if (live) {
|
|
31
|
+
proxies.forEach((_, i) => out.write(`${formatPingLine(i, proxies, sequence, undefined, options.verbose)}\n`));
|
|
31
32
|
}
|
|
32
|
-
// Ping all proxies in parallel with real-time updates
|
|
33
33
|
await Promise.all(proxies.map(async (proxy, i) => {
|
|
34
|
-
const result = await checkProxy(proxy,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
// Wait for interval before next ping (unless it's the last one)
|
|
50
|
-
if (count === undefined || sequence <= count) {
|
|
51
|
-
if (!shouldStop) {
|
|
52
|
-
await sleep(interval);
|
|
34
|
+
const result = await checkProxy(proxy, {
|
|
35
|
+
timeout: options.timeout,
|
|
36
|
+
dcs: options.dcs,
|
|
37
|
+
ipv6: options.ipv6,
|
|
38
|
+
signal,
|
|
39
|
+
});
|
|
40
|
+
if (!result.aborted) {
|
|
41
|
+
allResults[i].push(result);
|
|
42
|
+
}
|
|
43
|
+
const line = formatPingLine(i, proxies, sequence, result, options.verbose);
|
|
44
|
+
if (live) {
|
|
45
|
+
const up = proxies.length - i;
|
|
46
|
+
out.write(`\x1b[${up}A\r\x1b[2K${line}\x1b[${up}B\r`);
|
|
53
47
|
}
|
|
48
|
+
else if (!result.aborted) {
|
|
49
|
+
out.write(`${line}\n`);
|
|
50
|
+
}
|
|
51
|
+
}));
|
|
52
|
+
if (options.count === undefined || sequence < options.count) {
|
|
53
|
+
await sleep(options.interval, signal);
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
printPingStatistics(proxies, allResults);
|
package/dist/lib/ping.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ping.js","sourceRoot":"","sources":["../../src/lib/ping.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ping.js","sourceRoot":"","sources":["../../src/lib/ping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Pipe } from '../net/stream.js';
|
|
2
|
+
import { type TransportMode } from './transport.js';
|
|
3
|
+
export declare class InvalidResponseError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Send req_pq_multi and wait for a resPQ with our nonce.
|
|
8
|
+
*/
|
|
9
|
+
export declare const exchangeReqPq: (pipe: Pipe, mode: TransportMode) => Promise<void>;
|
|
10
|
+
//# sourceMappingURL=exchange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange.d.ts","sourceRoot":"","sources":["../../src/mtproto/exchange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAA0B,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG5E,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,GAAU,MAAM,IAAI,EAAE,MAAM,aAAa,KAAG,OAAO,CAAC,IAAI,CAOjF,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { encodeFrame, readFrame } from './transport.js';
|
|
2
|
+
import { buildReqPqMulti, parseResPQ } from './messages.js';
|
|
3
|
+
export class InvalidResponseError extends Error {
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = 'InvalidResponseError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Send req_pq_multi and wait for a resPQ with our nonce.
|
|
11
|
+
*/
|
|
12
|
+
export const exchangeReqPq = async (pipe, mode) => {
|
|
13
|
+
const { message, nonce } = buildReqPqMulti();
|
|
14
|
+
pipe.write(encodeFrame(mode, message));
|
|
15
|
+
const reply = parseResPQ(await readFrame(mode, pipe));
|
|
16
|
+
if (!reply || !reply.nonce.equals(nonce)) {
|
|
17
|
+
throw new InvalidResponseError('Invalid reply from Telegram (not a resPQ with our nonce)');
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=exchange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/mtproto/exchange.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,IAAU,EAAE,IAAmB,EAAiB,EAAE;IACpF,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;IAC7C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,oBAAoB,CAAC,0DAA0D,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -1,56 +1,48 @@
|
|
|
1
|
+
import type { Pipe, SocketStream } from '../net/stream.js';
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
+
* Fake TLS layer for MTProto proxies (secret with "ee" prefix), implemented
|
|
4
|
+
* like Telegram Desktop (mtproto_tls_socket.cpp) and Android (tgnet).
|
|
3
5
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
export declare class FakeTlsError extends Error {
|
|
7
|
+
constructor(message: string);
|
|
8
|
+
}
|
|
9
|
+
/** Offset of the 32-byte random field inside the ClientHello / ServerHello packet. */
|
|
10
|
+
export declare const RANDOM_OFFSET = 11;
|
|
11
|
+
/** Official clients split outgoing data into records of at most this size. */
|
|
12
|
+
export declare const MAX_CLIENT_RECORD = 2878;
|
|
13
|
+
export interface ClientHello {
|
|
14
|
+
readonly packet: Buffer;
|
|
15
|
+
readonly clientRandom: Buffer;
|
|
11
16
|
}
|
|
12
17
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
|
|
17
|
-
export declare function parseSecret(secretHex: string): ParsedSecret;
|
|
18
|
-
/**
|
|
19
|
-
* TLS record content types.
|
|
20
|
-
*/
|
|
21
|
-
export declare const TLS_RECORD: {
|
|
22
|
-
readonly CHANGE_CIPHER_SPEC: 20;
|
|
23
|
-
readonly ALERT: 21;
|
|
24
|
-
readonly HANDSHAKE: 22;
|
|
25
|
-
readonly APPLICATION_DATA: 23;
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* Generate a FakeTLS ClientHello with a valid HMAC digest in the client random,
|
|
29
|
-
* exactly as official Telegram clients do. The proxy verifies this digest.
|
|
30
|
-
*
|
|
31
|
-
* @param domain - SNI domain from the ee secret
|
|
32
|
-
* @param secret - 16-byte proxy secret
|
|
18
|
+
* Build the ClientHello exactly like the official clients: Chrome-like cipher
|
|
19
|
+
* suites and extensions (shuffled), GREASE, a valid x25519 key share, padding
|
|
20
|
+
* to 517 bytes, and the client random set to HMAC-SHA256(secret, packet) with
|
|
21
|
+
* the last 4 bytes XORed with the current UNIX time.
|
|
33
22
|
*/
|
|
34
|
-
export declare
|
|
23
|
+
export declare const buildClientHello: (domain: string, key: Buffer, nowMs?: number) => ClientHello;
|
|
35
24
|
/**
|
|
36
|
-
*
|
|
25
|
+
* Check the proxy's ServerHello: HMAC-SHA256(secret, clientRandom || response
|
|
26
|
+
* with the random field zeroed) must equal the random field.
|
|
37
27
|
*/
|
|
38
|
-
export declare
|
|
28
|
+
export declare const verifyServerHello: (response: Buffer, clientRandom: Buffer, key: Buffer) => boolean;
|
|
39
29
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
30
|
+
* TLS record wrapper used after the handshake.
|
|
31
|
+
* Outgoing: one ChangeCipherSpec prefix, then Application Data records of at most 2878 bytes.
|
|
32
|
+
* Incoming: only Application Data records are accepted.
|
|
43
33
|
*/
|
|
44
|
-
export declare
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
34
|
+
export declare class FakeTlsPipe implements Pipe {
|
|
35
|
+
private readonly inner;
|
|
36
|
+
private prefixSent;
|
|
37
|
+
private incoming;
|
|
38
|
+
constructor(inner: Pipe);
|
|
39
|
+
write(data: Buffer): void;
|
|
40
|
+
read(length: number): Promise<Buffer>;
|
|
41
|
+
}
|
|
48
42
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* @returns 'incomplete' while waiting for more bytes, 'valid' or 'invalid' when decided
|
|
43
|
+
* Perform the fake TLS handshake. Like the official clients, the response must
|
|
44
|
+
* be exactly: ServerHello record, ChangeCipherSpec (1 byte), one Application
|
|
45
|
+
* Data record; anything else is rejected.
|
|
54
46
|
*/
|
|
55
|
-
export declare
|
|
47
|
+
export declare const fakeTlsHandshake: (stream: SocketStream, key: Buffer, domain: string) => Promise<FakeTlsPipe>;
|
|
56
48
|
//# sourceMappingURL=fake-tls.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake-tls.d.ts","sourceRoot":"","sources":["../../src/mtproto/fake-tls.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"fake-tls.d.ts","sourceRoot":"","sources":["../../src/mtproto/fake-tls.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;;GAGG;AAEH,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,sFAAsF;AACtF,eAAO,MAAM,aAAa,KAAK,CAAC;AAIhC,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAgDtC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,EAAE,QAAO,MAAmB,KAAG,WA0D1F,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,EAAE,cAAc,MAAM,EAAE,KAAK,MAAM,KAAG,OAQvF,CAAC;AAEF;;;;GAIG;AACH,qBAAa,WAAY,YAAW,IAAI;IAI1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAA2B;gBAEd,KAAK,EAAE,IAAI;IAExC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAanB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAiB5C;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAU,QAAQ,YAAY,EAAE,KAAK,MAAM,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,WAAW,CA2B7G,CAAC"}
|