@push.rocks/smartproxy 21.0.0 → 21.1.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 +18 -0
- package/dist_ts/core/utils/proxy-protocol.d.ts +5 -17
- package/dist_ts/core/utils/proxy-protocol.js +13 -97
- package/dist_ts/core/utils/websocket-utils.d.ts +6 -7
- package/dist_ts/core/utils/websocket-utils.js +10 -66
- package/dist_ts/detection/detectors/http-detector-v2.d.ts +33 -0
- package/dist_ts/detection/detectors/http-detector-v2.js +87 -0
- package/dist_ts/detection/detectors/http-detector.d.ts +33 -0
- package/dist_ts/detection/detectors/http-detector.js +89 -0
- package/dist_ts/detection/detectors/quick-detector.d.ts +28 -0
- package/dist_ts/detection/detectors/quick-detector.js +131 -0
- package/dist_ts/detection/detectors/routing-extractor.d.ts +28 -0
- package/dist_ts/detection/detectors/routing-extractor.js +122 -0
- package/dist_ts/detection/detectors/tls-detector-v2.d.ts +33 -0
- package/dist_ts/detection/detectors/tls-detector-v2.js +80 -0
- package/dist_ts/detection/detectors/tls-detector.d.ts +55 -0
- package/dist_ts/detection/detectors/tls-detector.js +206 -0
- package/dist_ts/detection/index.d.ts +17 -0
- package/dist_ts/detection/index.js +22 -0
- package/dist_ts/detection/models/detection-types.d.ts +87 -0
- package/dist_ts/detection/models/detection-types.js +5 -0
- package/dist_ts/detection/models/interfaces.d.ts +97 -0
- package/dist_ts/detection/models/interfaces.js +5 -0
- package/dist_ts/detection/protocol-detector-v2.d.ts +46 -0
- package/dist_ts/detection/protocol-detector-v2.js +116 -0
- package/dist_ts/detection/protocol-detector.d.ts +74 -0
- package/dist_ts/detection/protocol-detector.js +173 -0
- package/dist_ts/detection/utils/buffer-utils.d.ts +61 -0
- package/dist_ts/detection/utils/buffer-utils.js +127 -0
- package/dist_ts/detection/utils/fragment-manager.d.ts +31 -0
- package/dist_ts/detection/utils/fragment-manager.js +53 -0
- package/dist_ts/detection/utils/parser-utils.d.ts +42 -0
- package/dist_ts/detection/utils/parser-utils.js +63 -0
- package/dist_ts/index.d.ts +2 -0
- package/dist_ts/index.js +3 -1
- package/dist_ts/protocols/common/fragment-handler.d.ts +73 -0
- package/dist_ts/protocols/common/fragment-handler.js +117 -0
- package/dist_ts/protocols/common/index.d.ts +7 -0
- package/dist_ts/protocols/common/index.js +8 -0
- package/dist_ts/protocols/common/types.d.ts +68 -0
- package/dist_ts/protocols/common/types.js +7 -0
- package/dist_ts/protocols/http/constants.d.ts +119 -0
- package/dist_ts/protocols/http/constants.js +200 -0
- package/dist_ts/protocols/http/index.d.ts +7 -0
- package/dist_ts/protocols/http/index.js +8 -0
- package/dist_ts/protocols/http/parser.d.ts +58 -0
- package/dist_ts/protocols/http/parser.js +184 -0
- package/dist_ts/protocols/http/types.d.ts +62 -0
- package/dist_ts/protocols/http/types.js +5 -0
- package/dist_ts/protocols/index.d.ts +11 -0
- package/dist_ts/protocols/index.js +12 -0
- package/dist_ts/protocols/proxy/index.d.ts +6 -0
- package/dist_ts/protocols/proxy/index.js +7 -0
- package/dist_ts/protocols/proxy/parser.d.ts +44 -0
- package/dist_ts/protocols/proxy/parser.js +153 -0
- package/dist_ts/protocols/proxy/types.d.ts +47 -0
- package/dist_ts/protocols/proxy/types.js +6 -0
- package/dist_ts/protocols/tls/alerts/index.d.ts +4 -0
- package/dist_ts/protocols/tls/alerts/index.js +5 -0
- package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +150 -0
- package/dist_ts/protocols/tls/alerts/tls-alert.js +226 -0
- package/dist_ts/protocols/tls/constants.d.ts +122 -0
- package/dist_ts/protocols/tls/constants.js +135 -0
- package/dist_ts/protocols/tls/index.d.ts +12 -0
- package/dist_ts/protocols/tls/index.js +27 -0
- package/dist_ts/protocols/tls/parser.d.ts +53 -0
- package/dist_ts/protocols/tls/parser.js +294 -0
- package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +100 -0
- package/dist_ts/protocols/tls/sni/client-hello-parser.js +463 -0
- package/dist_ts/protocols/tls/sni/index.d.ts +5 -0
- package/dist_ts/protocols/tls/sni/index.js +6 -0
- package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +58 -0
- package/dist_ts/protocols/tls/sni/sni-extraction.js +275 -0
- package/dist_ts/protocols/tls/types.d.ts +65 -0
- package/dist_ts/protocols/tls/types.js +5 -0
- package/dist_ts/protocols/tls/utils/index.d.ts +4 -0
- package/dist_ts/protocols/tls/utils/index.js +5 -0
- package/dist_ts/protocols/tls/utils/tls-utils.d.ts +158 -0
- package/dist_ts/protocols/tls/utils/tls-utils.js +187 -0
- package/dist_ts/protocols/websocket/constants.d.ts +55 -0
- package/dist_ts/protocols/websocket/constants.js +58 -0
- package/dist_ts/protocols/websocket/index.d.ts +7 -0
- package/dist_ts/protocols/websocket/index.js +8 -0
- package/dist_ts/protocols/websocket/types.d.ts +47 -0
- package/dist_ts/protocols/websocket/types.js +5 -0
- package/dist_ts/protocols/websocket/utils.d.ts +25 -0
- package/dist_ts/protocols/websocket/utils.js +103 -0
- package/dist_ts/proxies/http-proxy/models/http-types.d.ts +25 -27
- package/dist_ts/proxies/http-proxy/models/http-types.js +24 -44
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -0
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +81 -61
- package/dist_ts/proxies/smart-proxy/tls-manager.js +2 -1
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +2 -0
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +61 -52
- package/dist_ts/tls/index.d.ts +5 -7
- package/dist_ts/tls/index.js +8 -11
- package/dist_ts/tls/sni/client-hello-parser.js +3 -2
- package/dist_ts/tls/sni/sni-handler.js +4 -4
- package/dist_ts/tls/utils/tls-utils.d.ts +1 -110
- package/dist_ts/tls/utils/tls-utils.js +4 -116
- package/package.json +1 -1
- package/readme.plan.md +0 -0
- package/ts/core/utils/proxy-protocol.ts +14 -131
- package/ts/core/utils/websocket-utils.ts +12 -60
- package/ts/detection/detectors/http-detector.ts +114 -0
- package/ts/detection/detectors/quick-detector.ts +148 -0
- package/ts/detection/detectors/routing-extractor.ts +147 -0
- package/ts/detection/detectors/tls-detector.ts +252 -0
- package/ts/detection/index.ts +25 -0
- package/ts/detection/models/detection-types.ts +102 -0
- package/ts/detection/models/interfaces.ts +115 -0
- package/ts/detection/protocol-detector.ts +230 -0
- package/ts/detection/utils/buffer-utils.ts +141 -0
- package/ts/detection/utils/fragment-manager.ts +64 -0
- package/ts/detection/utils/parser-utils.ts +77 -0
- package/ts/index.ts +3 -1
- package/ts/protocols/common/fragment-handler.ts +163 -0
- package/ts/protocols/common/index.ts +8 -0
- package/ts/protocols/common/types.ts +76 -0
- package/ts/protocols/http/constants.ts +219 -0
- package/ts/protocols/http/index.ts +8 -0
- package/ts/protocols/http/parser.ts +219 -0
- package/ts/protocols/http/types.ts +70 -0
- package/ts/protocols/index.ts +12 -0
- package/ts/protocols/proxy/index.ts +7 -0
- package/ts/protocols/proxy/parser.ts +183 -0
- package/ts/protocols/proxy/types.ts +53 -0
- package/ts/{tls → protocols/tls}/alerts/tls-alert.ts +1 -1
- package/ts/protocols/tls/index.ts +37 -0
- package/ts/protocols/tls/sni/index.ts +6 -0
- package/ts/{tls → protocols/tls}/utils/tls-utils.ts +1 -1
- package/ts/protocols/websocket/constants.ts +60 -0
- package/ts/protocols/websocket/index.ts +8 -0
- package/ts/protocols/websocket/types.ts +53 -0
- package/ts/protocols/websocket/utils.ts +98 -0
- package/ts/proxies/http-proxy/models/http-types.ts +29 -46
- package/ts/proxies/smart-proxy/models/interfaces.ts +7 -0
- package/ts/proxies/smart-proxy/route-connection-handler.ts +91 -68
- package/ts/proxies/smart-proxy/tls-manager.ts +1 -0
- package/ts/proxies/smart-proxy/utils/route-helpers.ts +72 -56
- package/ts/tls/index.ts +8 -12
- package/ts/tls/sni/sni-handler.ts +3 -3
- /package/ts/{tls → protocols/tls}/alerts/index.ts +0 -0
- /package/ts/{tls → protocols/tls}/sni/client-hello-parser.ts +0 -0
- /package/ts/{tls → protocols/tls}/sni/sni-extraction.ts +0 -0
- /package/ts/{tls → protocols/tls}/utils/index.ts +0 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TLS protocol detector
|
|
3
|
+
*/
|
|
4
|
+
import { readUInt16BE, readUInt24BE, BufferAccumulator } from '../utils/buffer-utils.js';
|
|
5
|
+
import { tlsVersionToString } from '../utils/parser-utils.js';
|
|
6
|
+
// Import from protocols
|
|
7
|
+
import { TlsRecordType, TlsHandshakeType, TlsExtensionType } from '../../protocols/tls/index.js';
|
|
8
|
+
// Import TLS utilities for SNI extraction from protocols
|
|
9
|
+
import { SniExtraction } from '../../protocols/tls/sni/sni-extraction.js';
|
|
10
|
+
import { ClientHelloParser } from '../../protocols/tls/sni/client-hello-parser.js';
|
|
11
|
+
/**
|
|
12
|
+
* TLS detector implementation
|
|
13
|
+
*/
|
|
14
|
+
export class TlsDetector {
|
|
15
|
+
/**
|
|
16
|
+
* Minimum bytes needed to identify TLS (record header)
|
|
17
|
+
*/
|
|
18
|
+
static { this.MIN_TLS_HEADER_SIZE = 5; }
|
|
19
|
+
/**
|
|
20
|
+
* Fragment tracking for incomplete handshakes
|
|
21
|
+
*/
|
|
22
|
+
static { this.fragmentedBuffers = new Map(); }
|
|
23
|
+
/**
|
|
24
|
+
* Create connection ID from context
|
|
25
|
+
*/
|
|
26
|
+
createConnectionId(context) {
|
|
27
|
+
return `${context.sourceIp || 'unknown'}:${context.sourcePort || 0}->${context.destIp || 'unknown'}:${context.destPort || 0}`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Detect TLS protocol from buffer
|
|
31
|
+
*/
|
|
32
|
+
detect(buffer, options) {
|
|
33
|
+
// Check if buffer is too small
|
|
34
|
+
if (buffer.length < TlsDetector.MIN_TLS_HEADER_SIZE) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
// Check if this is a TLS record
|
|
38
|
+
if (!this.isTlsRecord(buffer)) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
// Extract basic TLS info
|
|
42
|
+
const recordType = buffer[0];
|
|
43
|
+
const tlsMajor = buffer[1];
|
|
44
|
+
const tlsMinor = buffer[2];
|
|
45
|
+
const recordLength = readUInt16BE(buffer, 3);
|
|
46
|
+
// Initialize connection info
|
|
47
|
+
const connectionInfo = {
|
|
48
|
+
protocol: 'tls',
|
|
49
|
+
tlsVersion: tlsVersionToString(tlsMajor, tlsMinor) || undefined
|
|
50
|
+
};
|
|
51
|
+
// If it's a handshake, try to extract more info
|
|
52
|
+
if (recordType === TlsRecordType.HANDSHAKE && buffer.length >= 6) {
|
|
53
|
+
const handshakeType = buffer[5];
|
|
54
|
+
// For ClientHello, extract SNI and other info
|
|
55
|
+
if (handshakeType === TlsHandshakeType.CLIENT_HELLO) {
|
|
56
|
+
// Check if we have the complete handshake
|
|
57
|
+
const totalRecordLength = recordLength + 5; // Including TLS header
|
|
58
|
+
if (buffer.length >= totalRecordLength) {
|
|
59
|
+
// Extract SNI using existing logic
|
|
60
|
+
const sni = SniExtraction.extractSNI(buffer);
|
|
61
|
+
if (sni) {
|
|
62
|
+
connectionInfo.domain = sni;
|
|
63
|
+
connectionInfo.sni = sni;
|
|
64
|
+
}
|
|
65
|
+
// Parse ClientHello for additional info
|
|
66
|
+
const parseResult = ClientHelloParser.parseClientHello(buffer);
|
|
67
|
+
if (parseResult.isValid) {
|
|
68
|
+
// Extract ALPN if present
|
|
69
|
+
const alpnExtension = parseResult.extensions.find(ext => ext.type === TlsExtensionType.APPLICATION_LAYER_PROTOCOL_NEGOTIATION);
|
|
70
|
+
if (alpnExtension) {
|
|
71
|
+
connectionInfo.alpn = this.parseAlpnExtension(alpnExtension.data);
|
|
72
|
+
}
|
|
73
|
+
// Store cipher suites if needed
|
|
74
|
+
if (parseResult.cipherSuites && options?.extractFullHeaders) {
|
|
75
|
+
connectionInfo.cipherSuites = this.parseCipherSuites(parseResult.cipherSuites);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Return complete result
|
|
79
|
+
return {
|
|
80
|
+
protocol: 'tls',
|
|
81
|
+
connectionInfo,
|
|
82
|
+
remainingBuffer: buffer.length > totalRecordLength
|
|
83
|
+
? buffer.subarray(totalRecordLength)
|
|
84
|
+
: undefined,
|
|
85
|
+
isComplete: true
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Incomplete handshake
|
|
90
|
+
return {
|
|
91
|
+
protocol: 'tls',
|
|
92
|
+
connectionInfo,
|
|
93
|
+
isComplete: false,
|
|
94
|
+
bytesNeeded: totalRecordLength
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// For other TLS record types, just return basic info
|
|
100
|
+
return {
|
|
101
|
+
protocol: 'tls',
|
|
102
|
+
connectionInfo,
|
|
103
|
+
isComplete: true,
|
|
104
|
+
remainingBuffer: buffer.length > recordLength + 5
|
|
105
|
+
? buffer.subarray(recordLength + 5)
|
|
106
|
+
: undefined
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if buffer can be handled by this detector
|
|
111
|
+
*/
|
|
112
|
+
canHandle(buffer) {
|
|
113
|
+
return buffer.length >= TlsDetector.MIN_TLS_HEADER_SIZE &&
|
|
114
|
+
this.isTlsRecord(buffer);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get minimum bytes needed for detection
|
|
118
|
+
*/
|
|
119
|
+
getMinimumBytes() {
|
|
120
|
+
return TlsDetector.MIN_TLS_HEADER_SIZE;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if buffer contains a valid TLS record
|
|
124
|
+
*/
|
|
125
|
+
isTlsRecord(buffer) {
|
|
126
|
+
const recordType = buffer[0];
|
|
127
|
+
// Check for valid record type
|
|
128
|
+
const validTypes = [
|
|
129
|
+
TlsRecordType.CHANGE_CIPHER_SPEC,
|
|
130
|
+
TlsRecordType.ALERT,
|
|
131
|
+
TlsRecordType.HANDSHAKE,
|
|
132
|
+
TlsRecordType.APPLICATION_DATA,
|
|
133
|
+
TlsRecordType.HEARTBEAT
|
|
134
|
+
];
|
|
135
|
+
if (!validTypes.includes(recordType)) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
// Check TLS version bytes (should be 0x03 0x0X)
|
|
139
|
+
if (buffer[1] !== 0x03) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
// Check record length is reasonable
|
|
143
|
+
const recordLength = readUInt16BE(buffer, 3);
|
|
144
|
+
if (recordLength > 16384) { // Max TLS record size
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Parse ALPN extension data
|
|
151
|
+
*/
|
|
152
|
+
parseAlpnExtension(data) {
|
|
153
|
+
const protocols = [];
|
|
154
|
+
if (data.length < 2) {
|
|
155
|
+
return protocols;
|
|
156
|
+
}
|
|
157
|
+
const listLength = readUInt16BE(data, 0);
|
|
158
|
+
let offset = 2;
|
|
159
|
+
while (offset < Math.min(2 + listLength, data.length)) {
|
|
160
|
+
const protoLength = data[offset];
|
|
161
|
+
offset++;
|
|
162
|
+
if (offset + protoLength <= data.length) {
|
|
163
|
+
const protocol = data.subarray(offset, offset + protoLength).toString('ascii');
|
|
164
|
+
protocols.push(protocol);
|
|
165
|
+
offset += protoLength;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return protocols;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Parse cipher suites
|
|
175
|
+
*/
|
|
176
|
+
parseCipherSuites(cipherData) {
|
|
177
|
+
const suites = [];
|
|
178
|
+
for (let i = 0; i < cipherData.length - 1; i += 2) {
|
|
179
|
+
const suite = readUInt16BE(cipherData, i);
|
|
180
|
+
suites.push(suite);
|
|
181
|
+
}
|
|
182
|
+
return suites;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Detect with context for fragmented data
|
|
186
|
+
*/
|
|
187
|
+
detectWithContext(buffer, context, options) {
|
|
188
|
+
const connectionId = this.createConnectionId(context);
|
|
189
|
+
// Get or create buffer accumulator for this connection
|
|
190
|
+
let accumulator = TlsDetector.fragmentedBuffers.get(connectionId);
|
|
191
|
+
if (!accumulator) {
|
|
192
|
+
accumulator = new BufferAccumulator();
|
|
193
|
+
TlsDetector.fragmentedBuffers.set(connectionId, accumulator);
|
|
194
|
+
}
|
|
195
|
+
// Add new data
|
|
196
|
+
accumulator.append(buffer);
|
|
197
|
+
// Try detection on accumulated data
|
|
198
|
+
const result = this.detect(accumulator.getBuffer(), options);
|
|
199
|
+
// If detection is complete or we have too much data, clean up
|
|
200
|
+
if (result?.isComplete || accumulator.length() > 65536) {
|
|
201
|
+
TlsDetector.fragmentedBuffers.delete(connectionId);
|
|
202
|
+
}
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxzLWRldGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZGV0ZWN0aW9uL2RldGVjdG9ycy90bHMtZGV0ZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFLSCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlELHdCQUF3QjtBQUN4QixPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFakcseURBQXlEO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUVuRjs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBQ3RCOztPQUVHO2FBQ3FCLHdCQUFtQixHQUFHLENBQUMsQ0FBQztJQUVoRDs7T0FFRzthQUNZLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBRXhFOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsT0FBdUY7UUFDaEgsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDaEksQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQWMsRUFBRSxPQUEyQjtRQUNoRCwrQkFBK0I7UUFDL0IsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELGdD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
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Protocol Detection Module
|
|
3
|
+
*
|
|
4
|
+
* This module provides unified protocol detection capabilities for
|
|
5
|
+
* both TLS and HTTP protocols, extracting connection information
|
|
6
|
+
* without consuming the data stream.
|
|
7
|
+
*/
|
|
8
|
+
export * from './protocol-detector.js';
|
|
9
|
+
export * from './models/detection-types.js';
|
|
10
|
+
export * from './models/interfaces.js';
|
|
11
|
+
export * from './detectors/tls-detector.js';
|
|
12
|
+
export * from './detectors/http-detector.js';
|
|
13
|
+
export * from './detectors/quick-detector.js';
|
|
14
|
+
export * from './detectors/routing-extractor.js';
|
|
15
|
+
export * from './utils/buffer-utils.js';
|
|
16
|
+
export * from './utils/parser-utils.js';
|
|
17
|
+
export * from './utils/fragment-manager.js';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Protocol Detection Module
|
|
3
|
+
*
|
|
4
|
+
* This module provides unified protocol detection capabilities for
|
|
5
|
+
* both TLS and HTTP protocols, extracting connection information
|
|
6
|
+
* without consuming the data stream.
|
|
7
|
+
*/
|
|
8
|
+
// Main detector
|
|
9
|
+
export * from './protocol-detector.js';
|
|
10
|
+
// Models
|
|
11
|
+
export * from './models/detection-types.js';
|
|
12
|
+
export * from './models/interfaces.js';
|
|
13
|
+
// Individual detectors
|
|
14
|
+
export * from './detectors/tls-detector.js';
|
|
15
|
+
export * from './detectors/http-detector.js';
|
|
16
|
+
export * from './detectors/quick-detector.js';
|
|
17
|
+
export * from './detectors/routing-extractor.js';
|
|
18
|
+
// Utilities
|
|
19
|
+
export * from './utils/buffer-utils.js';
|
|
20
|
+
export * from './utils/parser-utils.js';
|
|
21
|
+
export * from './utils/fragment-manager.js';
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXRlY3Rpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsZ0JBQWdCO0FBQ2hCLGNBQWMsd0JBQXdCLENBQUM7QUFFdkMsU0FBUztBQUNULGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx3QkFBd0IsQ0FBQztBQUV2Qyx1QkFBdUI7QUFDdkIsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxrQ0FBa0MsQ0FBQztBQUVqRCxZQUFZO0FBQ1osY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUMifQ==
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for protocol detection
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Supported protocol types that can be detected
|
|
6
|
+
*/
|
|
7
|
+
export type TProtocolType = 'tls' | 'http' | 'unknown';
|
|
8
|
+
/**
|
|
9
|
+
* HTTP method types
|
|
10
|
+
*/
|
|
11
|
+
export type THttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS' | 'CONNECT' | 'TRACE';
|
|
12
|
+
/**
|
|
13
|
+
* TLS version identifiers
|
|
14
|
+
*/
|
|
15
|
+
export type TTlsVersion = 'SSLv3' | 'TLSv1.0' | 'TLSv1.1' | 'TLSv1.2' | 'TLSv1.3';
|
|
16
|
+
/**
|
|
17
|
+
* Connection information extracted from protocol detection
|
|
18
|
+
*/
|
|
19
|
+
export interface IConnectionInfo {
|
|
20
|
+
/**
|
|
21
|
+
* The detected protocol type
|
|
22
|
+
*/
|
|
23
|
+
protocol: TProtocolType;
|
|
24
|
+
/**
|
|
25
|
+
* Domain/hostname extracted from the connection
|
|
26
|
+
* - For TLS: from SNI extension
|
|
27
|
+
* - For HTTP: from Host header
|
|
28
|
+
*/
|
|
29
|
+
domain?: string;
|
|
30
|
+
/**
|
|
31
|
+
* HTTP-specific fields
|
|
32
|
+
*/
|
|
33
|
+
method?: THttpMethod;
|
|
34
|
+
path?: string;
|
|
35
|
+
httpVersion?: string;
|
|
36
|
+
headers?: Record<string, string>;
|
|
37
|
+
/**
|
|
38
|
+
* TLS-specific fields
|
|
39
|
+
*/
|
|
40
|
+
tlsVersion?: TTlsVersion;
|
|
41
|
+
sni?: string;
|
|
42
|
+
alpn?: string[];
|
|
43
|
+
cipherSuites?: number[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Result of protocol detection
|
|
47
|
+
*/
|
|
48
|
+
export interface IDetectionResult {
|
|
49
|
+
/**
|
|
50
|
+
* The detected protocol type
|
|
51
|
+
*/
|
|
52
|
+
protocol: TProtocolType;
|
|
53
|
+
/**
|
|
54
|
+
* Extracted connection information
|
|
55
|
+
*/
|
|
56
|
+
connectionInfo: IConnectionInfo;
|
|
57
|
+
/**
|
|
58
|
+
* Any remaining buffer data after detection headers
|
|
59
|
+
* This can be used to continue processing the stream
|
|
60
|
+
*/
|
|
61
|
+
remainingBuffer?: Buffer;
|
|
62
|
+
/**
|
|
63
|
+
* Whether the detection is complete or needs more data
|
|
64
|
+
*/
|
|
65
|
+
isComplete: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Minimum bytes needed for complete detection (if incomplete)
|
|
68
|
+
*/
|
|
69
|
+
bytesNeeded?: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Options for protocol detection
|
|
73
|
+
*/
|
|
74
|
+
export interface IDetectionOptions {
|
|
75
|
+
/**
|
|
76
|
+
* Maximum bytes to buffer for detection (default: 8192)
|
|
77
|
+
*/
|
|
78
|
+
maxBufferSize?: number;
|
|
79
|
+
/**
|
|
80
|
+
* Timeout for detection in milliseconds (default: 5000)
|
|
81
|
+
*/
|
|
82
|
+
timeout?: number;
|
|
83
|
+
/**
|
|
84
|
+
* Whether to extract full headers or just essential info
|
|
85
|
+
*/
|
|
86
|
+
extractFullHeaders?: boolean;
|
|
87
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for protocol detection
|
|
3
|
+
*/
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0aW9uLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZGV0ZWN0aW9uL21vZGVscy9kZXRlY3Rpb24tdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUcifQ==
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface definitions for protocol detection components
|
|
3
|
+
*/
|
|
4
|
+
import type { IDetectionResult, IDetectionOptions } from './detection-types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Interface for protocol detectors
|
|
7
|
+
*/
|
|
8
|
+
export interface IProtocolDetector {
|
|
9
|
+
/**
|
|
10
|
+
* Detect protocol from buffer data
|
|
11
|
+
* @param buffer The buffer to analyze
|
|
12
|
+
* @param options Detection options
|
|
13
|
+
* @returns Detection result or null if protocol cannot be determined
|
|
14
|
+
*/
|
|
15
|
+
detect(buffer: Buffer, options?: IDetectionOptions): IDetectionResult | null;
|
|
16
|
+
/**
|
|
17
|
+
* Check if buffer potentially contains this protocol
|
|
18
|
+
* @param buffer The buffer to check
|
|
19
|
+
* @returns True if buffer might contain this protocol
|
|
20
|
+
*/
|
|
21
|
+
canHandle(buffer: Buffer): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Get the minimum bytes needed for detection
|
|
24
|
+
*/
|
|
25
|
+
getMinimumBytes(): number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Interface for connection tracking during fragmented detection
|
|
29
|
+
*/
|
|
30
|
+
export interface IConnectionTracker {
|
|
31
|
+
/**
|
|
32
|
+
* Connection identifier
|
|
33
|
+
*/
|
|
34
|
+
id: string;
|
|
35
|
+
/**
|
|
36
|
+
* Accumulated buffer data
|
|
37
|
+
*/
|
|
38
|
+
buffer: Buffer;
|
|
39
|
+
/**
|
|
40
|
+
* Timestamp of first data
|
|
41
|
+
*/
|
|
42
|
+
startTime: number;
|
|
43
|
+
/**
|
|
44
|
+
* Current detection state
|
|
45
|
+
*/
|
|
46
|
+
state: 'detecting' | 'complete' | 'failed';
|
|
47
|
+
/**
|
|
48
|
+
* Partial detection result (if any)
|
|
49
|
+
*/
|
|
50
|
+
partialResult?: Partial<IDetectionResult>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Interface for buffer accumulator (handles fragmented data)
|
|
54
|
+
*/
|
|
55
|
+
export interface IBufferAccumulator {
|
|
56
|
+
/**
|
|
57
|
+
* Add data to accumulator
|
|
58
|
+
*/
|
|
59
|
+
append(data: Buffer): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get accumulated buffer
|
|
62
|
+
*/
|
|
63
|
+
getBuffer(): Buffer;
|
|
64
|
+
/**
|
|
65
|
+
* Get buffer length
|
|
66
|
+
*/
|
|
67
|
+
length(): number;
|
|
68
|
+
/**
|
|
69
|
+
* Clear accumulated data
|
|
70
|
+
*/
|
|
71
|
+
clear(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Check if accumulator has enough data
|
|
74
|
+
*/
|
|
75
|
+
hasMinimumBytes(minBytes: number): boolean;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Detection events
|
|
79
|
+
*/
|
|
80
|
+
export interface IDetectionEvents {
|
|
81
|
+
/**
|
|
82
|
+
* Emitted when protocol is successfully detected
|
|
83
|
+
*/
|
|
84
|
+
detected: (result: IDetectionResult) => void;
|
|
85
|
+
/**
|
|
86
|
+
* Emitted when detection fails
|
|
87
|
+
*/
|
|
88
|
+
failed: (error: Error) => void;
|
|
89
|
+
/**
|
|
90
|
+
* Emitted when detection times out
|
|
91
|
+
*/
|
|
92
|
+
timeout: () => void;
|
|
93
|
+
/**
|
|
94
|
+
* Emitted when more data is needed
|
|
95
|
+
*/
|
|
96
|
+
needMoreData: (bytesNeeded: number) => void;
|
|
97
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface definitions for protocol detection components
|
|
3
|
+
*/
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2RldGVjdGlvbi9tb2RlbHMvaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRyJ9
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol Detector V2
|
|
3
|
+
*
|
|
4
|
+
* Simplified protocol detection using the new architecture
|
|
5
|
+
*/
|
|
6
|
+
import type { IDetectionResult, IDetectionOptions } from './models/detection-types.js';
|
|
7
|
+
import type { IConnectionContext } from '../protocols/common/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Main protocol detector class - V2
|
|
10
|
+
*/
|
|
11
|
+
export declare class ProtocolDetectorV2 {
|
|
12
|
+
private fragmentManager;
|
|
13
|
+
private tlsDetector;
|
|
14
|
+
private httpDetector;
|
|
15
|
+
constructor();
|
|
16
|
+
/**
|
|
17
|
+
* Detect protocol from buffer data
|
|
18
|
+
*/
|
|
19
|
+
detect(buffer: Buffer, options?: IDetectionOptions): Promise<IDetectionResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Detect protocol with connection context for fragmented data
|
|
22
|
+
*/
|
|
23
|
+
detectWithContext(buffer: Buffer, context: IConnectionContext, options?: IDetectionOptions): Promise<IDetectionResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Clean up resources
|
|
26
|
+
*/
|
|
27
|
+
cleanup(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Destroy detector instance
|
|
30
|
+
*/
|
|
31
|
+
destroy(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Extract domain from connection info
|
|
34
|
+
*/
|
|
35
|
+
static extractDomain(connectionInfo: any): string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Create a connection context from parameters
|
|
38
|
+
*/
|
|
39
|
+
static createConnectionContext(params: {
|
|
40
|
+
sourceIp?: string;
|
|
41
|
+
sourcePort?: number;
|
|
42
|
+
destIp?: string;
|
|
43
|
+
destPort?: number;
|
|
44
|
+
socketId?: string;
|
|
45
|
+
}): IConnectionContext;
|
|
46
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol Detector V2
|
|
3
|
+
*
|
|
4
|
+
* Simplified protocol detection using the new architecture
|
|
5
|
+
*/
|
|
6
|
+
import { TlsDetectorV2 } from './detectors/tls-detector-v2.js';
|
|
7
|
+
import { HttpDetectorV2 } from './detectors/http-detector-v2.js';
|
|
8
|
+
import { DetectionFragmentManager } from './utils/fragment-manager.js';
|
|
9
|
+
/**
|
|
10
|
+
* Main protocol detector class - V2
|
|
11
|
+
*/
|
|
12
|
+
export class ProtocolDetectorV2 {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.fragmentManager = new DetectionFragmentManager();
|
|
15
|
+
this.tlsDetector = new TlsDetectorV2(this.fragmentManager);
|
|
16
|
+
this.httpDetector = new HttpDetectorV2(this.fragmentManager);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Detect protocol from buffer data
|
|
20
|
+
*/
|
|
21
|
+
async detect(buffer, options) {
|
|
22
|
+
// Quick sanity check
|
|
23
|
+
if (!buffer || buffer.length === 0) {
|
|
24
|
+
return {
|
|
25
|
+
protocol: 'unknown',
|
|
26
|
+
connectionInfo: { protocol: 'unknown' },
|
|
27
|
+
isComplete: true
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// Try TLS detection first (more specific)
|
|
31
|
+
if (this.tlsDetector.canHandle(buffer)) {
|
|
32
|
+
const tlsResult = this.tlsDetector.detect(buffer, options);
|
|
33
|
+
if (tlsResult) {
|
|
34
|
+
return tlsResult;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Try HTTP detection
|
|
38
|
+
if (this.httpDetector.canHandle(buffer)) {
|
|
39
|
+
const httpResult = this.httpDetector.detect(buffer, options);
|
|
40
|
+
if (httpResult) {
|
|
41
|
+
return httpResult;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Neither TLS nor HTTP
|
|
45
|
+
return {
|
|
46
|
+
protocol: 'unknown',
|
|
47
|
+
connectionInfo: { protocol: 'unknown' },
|
|
48
|
+
isComplete: true
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Detect protocol with connection context for fragmented data
|
|
53
|
+
*/
|
|
54
|
+
async detectWithContext(buffer, context, options) {
|
|
55
|
+
// Quick sanity check
|
|
56
|
+
if (!buffer || buffer.length === 0) {
|
|
57
|
+
return {
|
|
58
|
+
protocol: 'unknown',
|
|
59
|
+
connectionInfo: { protocol: 'unknown' },
|
|
60
|
+
isComplete: true
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// First peek to determine protocol type
|
|
64
|
+
if (this.tlsDetector.canHandle(buffer)) {
|
|
65
|
+
const result = this.tlsDetector.detectWithContext(buffer, context, options);
|
|
66
|
+
if (result) {
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (this.httpDetector.canHandle(buffer)) {
|
|
71
|
+
const result = this.httpDetector.detectWithContext(buffer, context, options);
|
|
72
|
+
if (result) {
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Can't determine protocol
|
|
77
|
+
return {
|
|
78
|
+
protocol: 'unknown',
|
|
79
|
+
connectionInfo: { protocol: 'unknown' },
|
|
80
|
+
isComplete: false,
|
|
81
|
+
bytesNeeded: Math.max(this.tlsDetector.getMinimumBytes(), this.httpDetector.getMinimumBytes())
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Clean up resources
|
|
86
|
+
*/
|
|
87
|
+
cleanup() {
|
|
88
|
+
this.fragmentManager.cleanup();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Destroy detector instance
|
|
92
|
+
*/
|
|
93
|
+
destroy() {
|
|
94
|
+
this.fragmentManager.destroy();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract domain from connection info
|
|
98
|
+
*/
|
|
99
|
+
static extractDomain(connectionInfo) {
|
|
100
|
+
return connectionInfo.domain || connectionInfo.sni || connectionInfo.host;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create a connection context from parameters
|
|
104
|
+
*/
|
|
105
|
+
static createConnectionContext(params) {
|
|
106
|
+
return {
|
|
107
|
+
id: params.socketId,
|
|
108
|
+
sourceIp: params.sourceIp || 'unknown',
|
|
109
|
+
sourcePort: params.sourcePort || 0,
|
|
110
|
+
destIp: params.destIp || 'unknown',
|
|
111
|
+
destPort: params.destPort || 0,
|
|
112
|
+
timestamp: Date.now()
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wtZGV0ZWN0b3ItdjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZXRlY3Rpb24vcHJvdG9jb2wtZGV0ZWN0b3ItdjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUlILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFdkU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBSzdCO1FBQ0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFjLEVBQUUsT0FBMkI7UUFDdEQscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPO2dCQUNMLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFO2dCQUN2QyxVQUFVLEVBQUUsSUFBSTthQUNqQixDQUFDO1FBQ0osQ0FBQztRQUVELDBDQUEwQztRQUMxQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNELElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFFRCxxQkFBcUI7UUFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3RCxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLE9BQU8sVUFBVSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLE9BQU87WUFDTCxRQUFRLEVBQUUsU0FBUztZQUNuQixjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFO1lBQ3ZDLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQ3JCLE1BQWMsRUFDZCxPQUEyQixFQUMzQixPQUEyQjtRQUUzQixxQkFBcUI7UUFDckIsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLE9BQU87Z0JBQ0wsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLGNBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7Z0JBQ3ZDLFVBQVUsRUFBRSxJQUFJO2FBQ2pCLENBQUM7UUFDSixDQUFDO1FBRUQsd0NBQXdDO1FBQ3hDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDNUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0UsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixPQUFPO1lBQ0wsUUFBUSxFQUFFLFNBQVM7WUFDbkIsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtZQUN2QyxVQUFVLEVBQUUsS0FBSztZQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsRUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FDcEM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGFBQWEsQ0FBQyxjQUFtQjtRQUN0QyxPQUFPLGNBQWMsQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxNQU05QjtRQUNDLE9BQU87WUFDTCxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDbkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksU0FBUztZQUN0QyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxDQUFDO1lBQ2xDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLFNBQVM7WUFDbEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQztZQUM5QixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtTQUN0QixDQUFDO0lBQ0osQ0FBQztDQUNGIn0=
|