@b0xs/recorder 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/README.md +89 -0
- package/dist/api/client.d.ts +111 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +186 -0
- package/dist/api/client.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +104 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/login.d.ts +7 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +154 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/record.d.ts +14 -0
- package/dist/cli/commands/record.d.ts.map +1 -0
- package/dist/cli/commands/record.js +244 -0
- package/dist/cli/commands/record.js.map +1 -0
- package/dist/core/chunk-uploader.d.ts +52 -0
- package/dist/core/chunk-uploader.d.ts.map +1 -0
- package/dist/core/chunk-uploader.js +180 -0
- package/dist/core/chunk-uploader.js.map +1 -0
- package/dist/core/pty-manager.d.ts +72 -0
- package/dist/core/pty-manager.d.ts.map +1 -0
- package/dist/core/pty-manager.js +205 -0
- package/dist/core/pty-manager.js.map +1 -0
- package/dist/core/recorder.d.ts +104 -0
- package/dist/core/recorder.d.ts.map +1 -0
- package/dist/core/recorder.js +330 -0
- package/dist/core/recorder.js.map +1 -0
- package/dist/core/stream-client.d.ts +62 -0
- package/dist/core/stream-client.d.ts.map +1 -0
- package/dist/core/stream-client.js +185 -0
- package/dist/core/stream-client.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/auth-store.d.ts +37 -0
- package/dist/storage/auth-store.d.ts.map +1 -0
- package/dist/storage/auth-store.js +168 -0
- package/dist/storage/auth-store.js.map +1 -0
- package/dist/storage/config-store.d.ts +74 -0
- package/dist/storage/config-store.d.ts.map +1 -0
- package/dist/storage/config-store.js +164 -0
- package/dist/storage/config-store.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-uploader.js","sourceRoot":"","sources":["../../src/core/chunk-uploader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PTY Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages pseudo-terminal spawning and I/O capture
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
export interface PTYManagerOptions {
|
|
8
|
+
command?: string;
|
|
9
|
+
shell?: string;
|
|
10
|
+
cols?: number;
|
|
11
|
+
rows?: number;
|
|
12
|
+
cwd?: string;
|
|
13
|
+
env?: {
|
|
14
|
+
[key: string]: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface PTYData {
|
|
18
|
+
type: 'OUTPUT' | 'INPUT';
|
|
19
|
+
data: Buffer;
|
|
20
|
+
streamId?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface PTYResize {
|
|
23
|
+
cols: number;
|
|
24
|
+
rows: number;
|
|
25
|
+
}
|
|
26
|
+
export interface PTYCommand {
|
|
27
|
+
command: string;
|
|
28
|
+
timestamp: number;
|
|
29
|
+
}
|
|
30
|
+
export declare class PTYManager extends EventEmitter {
|
|
31
|
+
private ptyProcess;
|
|
32
|
+
private commandBuffer;
|
|
33
|
+
private promptPatterns;
|
|
34
|
+
private isRunning;
|
|
35
|
+
constructor(promptPatterns?: string[]);
|
|
36
|
+
/**
|
|
37
|
+
* Spawn a new PTY
|
|
38
|
+
*/
|
|
39
|
+
spawn(options?: PTYManagerOptions): void;
|
|
40
|
+
/**
|
|
41
|
+
* Handle data from PTY
|
|
42
|
+
*/
|
|
43
|
+
private handleData;
|
|
44
|
+
/**
|
|
45
|
+
* Detect command boundaries using prompt patterns
|
|
46
|
+
*/
|
|
47
|
+
private detectCommand;
|
|
48
|
+
/**
|
|
49
|
+
* Write data to PTY (user input)
|
|
50
|
+
*/
|
|
51
|
+
write(data: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Resize PTY
|
|
54
|
+
*/
|
|
55
|
+
resize(cols: number, rows: number): void;
|
|
56
|
+
/**
|
|
57
|
+
* Kill PTY process
|
|
58
|
+
*/
|
|
59
|
+
kill(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Check if PTY is running
|
|
62
|
+
*/
|
|
63
|
+
isActive(): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Get current terminal size
|
|
66
|
+
*/
|
|
67
|
+
getSize(): {
|
|
68
|
+
cols: number;
|
|
69
|
+
rows: number;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=pty-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty-manager.d.ts","sourceRoot":"","sources":["../../src/core/pty-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACjC;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,cAAc,CAAW;IACjC,OAAO,CAAC,SAAS,CAAkB;gBAEvB,cAAc,CAAC,EAAE,MAAM,EAAE;IAWrC;;OAEG;IACH,KAAK,CAAC,OAAO,GAAE,iBAAsB,GAAG,IAAI;IA8D5C;;OAEG;IACH,OAAO,CAAC,UAAU;IAelB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiCrB;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMzB;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOxC;;OAEG;IACH,IAAI,IAAI,IAAI;IAeZ;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,OAAO,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;CAM1C"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PTY Manager
|
|
4
|
+
*
|
|
5
|
+
* Manages pseudo-terminal spawning and I/O capture
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.PTYManager = void 0;
|
|
42
|
+
const pty = __importStar(require("node-pty"));
|
|
43
|
+
const events_1 = require("events");
|
|
44
|
+
class PTYManager extends events_1.EventEmitter {
|
|
45
|
+
constructor(promptPatterns) {
|
|
46
|
+
super();
|
|
47
|
+
this.ptyProcess = null;
|
|
48
|
+
this.commandBuffer = '';
|
|
49
|
+
this.isRunning = false;
|
|
50
|
+
// Default prompt patterns
|
|
51
|
+
this.promptPatterns = (promptPatterns || [
|
|
52
|
+
'\\$\\s$', // $
|
|
53
|
+
'#\\s$', // #
|
|
54
|
+
'[\\w@\\-]+:[^\\$#]*[\\$#]\\s$', // user@host:path$
|
|
55
|
+
]).map(pattern => new RegExp(pattern));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Spawn a new PTY
|
|
59
|
+
*/
|
|
60
|
+
spawn(options = {}) {
|
|
61
|
+
const shell = options.shell || process.env.SHELL || '/bin/bash';
|
|
62
|
+
const cols = options.cols || process.stdout.columns || 80;
|
|
63
|
+
const rows = options.rows || process.stdout.rows || 24;
|
|
64
|
+
const cwd = options.cwd || process.cwd();
|
|
65
|
+
const env = options.env || process.env;
|
|
66
|
+
// Spawn PTY
|
|
67
|
+
const args = options.command ? ['-c', options.command] : [];
|
|
68
|
+
this.ptyProcess = pty.spawn(shell, args, {
|
|
69
|
+
name: 'xterm-256color',
|
|
70
|
+
cols,
|
|
71
|
+
rows,
|
|
72
|
+
cwd,
|
|
73
|
+
env: env,
|
|
74
|
+
});
|
|
75
|
+
this.isRunning = true;
|
|
76
|
+
// Handle data (output from PTY)
|
|
77
|
+
this.ptyProcess.onData((data) => {
|
|
78
|
+
this.handleData(data);
|
|
79
|
+
});
|
|
80
|
+
// Handle exit
|
|
81
|
+
this.ptyProcess.onExit(({ exitCode, signal }) => {
|
|
82
|
+
this.isRunning = false;
|
|
83
|
+
this.emit('exit', { exitCode, signal });
|
|
84
|
+
});
|
|
85
|
+
// Handle stdin from user
|
|
86
|
+
process.stdin.on('data', (data) => {
|
|
87
|
+
if (this.ptyProcess && this.isRunning) {
|
|
88
|
+
this.ptyProcess.write(data.toString());
|
|
89
|
+
// Emit input event
|
|
90
|
+
this.emit('input', {
|
|
91
|
+
type: 'INPUT',
|
|
92
|
+
data,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// Handle terminal resize
|
|
97
|
+
process.stdout.on('resize', () => {
|
|
98
|
+
if (this.ptyProcess && this.isRunning) {
|
|
99
|
+
const newCols = process.stdout.columns || 80;
|
|
100
|
+
const newRows = process.stdout.rows || 24;
|
|
101
|
+
this.resize(newCols, newRows);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
// Enable raw mode for stdin
|
|
105
|
+
if (process.stdin.setRawMode) {
|
|
106
|
+
process.stdin.setRawMode(true);
|
|
107
|
+
}
|
|
108
|
+
process.stdin.resume();
|
|
109
|
+
this.emit('spawn', { cols, rows });
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Handle data from PTY
|
|
113
|
+
*/
|
|
114
|
+
handleData(data) {
|
|
115
|
+
// Write to stdout (mirror to user)
|
|
116
|
+
process.stdout.write(data);
|
|
117
|
+
// Emit output event
|
|
118
|
+
this.emit('output', {
|
|
119
|
+
type: 'OUTPUT',
|
|
120
|
+
data: Buffer.from(data),
|
|
121
|
+
streamId: 0, // stdout
|
|
122
|
+
});
|
|
123
|
+
// Try to detect commands
|
|
124
|
+
this.detectCommand(data);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Detect command boundaries using prompt patterns
|
|
128
|
+
*/
|
|
129
|
+
detectCommand(data) {
|
|
130
|
+
this.commandBuffer += data;
|
|
131
|
+
// Keep buffer reasonable size (last 1000 chars)
|
|
132
|
+
if (this.commandBuffer.length > 1000) {
|
|
133
|
+
this.commandBuffer = this.commandBuffer.slice(-1000);
|
|
134
|
+
}
|
|
135
|
+
// Check for prompt patterns
|
|
136
|
+
for (const pattern of this.promptPatterns) {
|
|
137
|
+
if (pattern.test(this.commandBuffer)) {
|
|
138
|
+
// Extract potential command
|
|
139
|
+
const lines = this.commandBuffer.split('\n');
|
|
140
|
+
// The command is usually the line before the prompt
|
|
141
|
+
if (lines.length >= 2) {
|
|
142
|
+
const commandLine = lines[lines.length - 2]?.trim();
|
|
143
|
+
if (commandLine && commandLine.length > 0 && !pattern.test(commandLine)) {
|
|
144
|
+
this.emit('command', {
|
|
145
|
+
command: commandLine,
|
|
146
|
+
timestamp: Date.now(),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Reset buffer after detecting prompt
|
|
151
|
+
this.commandBuffer = '';
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Write data to PTY (user input)
|
|
158
|
+
*/
|
|
159
|
+
write(data) {
|
|
160
|
+
if (this.ptyProcess && this.isRunning) {
|
|
161
|
+
this.ptyProcess.write(data);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Resize PTY
|
|
166
|
+
*/
|
|
167
|
+
resize(cols, rows) {
|
|
168
|
+
if (this.ptyProcess && this.isRunning) {
|
|
169
|
+
this.ptyProcess.resize(cols, rows);
|
|
170
|
+
this.emit('resize', { cols, rows });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Kill PTY process
|
|
175
|
+
*/
|
|
176
|
+
kill() {
|
|
177
|
+
if (this.ptyProcess && this.isRunning) {
|
|
178
|
+
this.isRunning = false;
|
|
179
|
+
// Restore terminal
|
|
180
|
+
if (process.stdin.setRawMode) {
|
|
181
|
+
process.stdin.setRawMode(false);
|
|
182
|
+
}
|
|
183
|
+
process.stdin.pause();
|
|
184
|
+
this.ptyProcess.kill();
|
|
185
|
+
this.ptyProcess = null;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if PTY is running
|
|
190
|
+
*/
|
|
191
|
+
isActive() {
|
|
192
|
+
return this.isRunning;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get current terminal size
|
|
196
|
+
*/
|
|
197
|
+
getSize() {
|
|
198
|
+
return {
|
|
199
|
+
cols: process.stdout.columns || 80,
|
|
200
|
+
rows: process.stdout.rows || 24,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
exports.PTYManager = PTYManager;
|
|
205
|
+
//# sourceMappingURL=pty-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty-manager.js","sourceRoot":"","sources":["../../src/core/pty-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recorder
|
|
3
|
+
*
|
|
4
|
+
* Main orchestrator that coordinates PTY, encoder, and uploader
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
import { PTYManagerOptions } from './pty-manager';
|
|
8
|
+
import { APIClient } from '../api/client';
|
|
9
|
+
export interface RecorderOptions {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
userId: string;
|
|
12
|
+
apiClient: APIClient;
|
|
13
|
+
terminalSize: {
|
|
14
|
+
cols: number;
|
|
15
|
+
rows: number;
|
|
16
|
+
};
|
|
17
|
+
chunkDuration?: number;
|
|
18
|
+
compression?: boolean;
|
|
19
|
+
streaming?: {
|
|
20
|
+
enabled: boolean;
|
|
21
|
+
wsUrl: string;
|
|
22
|
+
streamToken: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface RecordingStats {
|
|
26
|
+
duration: number;
|
|
27
|
+
chunksUploaded: number;
|
|
28
|
+
framesRecorded: number;
|
|
29
|
+
eventsRecorded: number;
|
|
30
|
+
bytesEncoded: number;
|
|
31
|
+
}
|
|
32
|
+
export declare class Recorder extends EventEmitter {
|
|
33
|
+
private sessionId;
|
|
34
|
+
private userId;
|
|
35
|
+
private apiClient;
|
|
36
|
+
private encoder;
|
|
37
|
+
private ptyManager;
|
|
38
|
+
private uploader;
|
|
39
|
+
private streamClient;
|
|
40
|
+
private sessionStartTime;
|
|
41
|
+
private chunkFlushInterval;
|
|
42
|
+
private chunkDuration;
|
|
43
|
+
private isRecording;
|
|
44
|
+
private isPaused;
|
|
45
|
+
private stats;
|
|
46
|
+
constructor(options: RecorderOptions);
|
|
47
|
+
/**
|
|
48
|
+
* Start recording
|
|
49
|
+
*/
|
|
50
|
+
start(ptyOptions?: PTYManagerOptions): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Handle PTY output
|
|
53
|
+
*/
|
|
54
|
+
private handlePtyOutput;
|
|
55
|
+
/**
|
|
56
|
+
* Handle PTY input
|
|
57
|
+
*/
|
|
58
|
+
private handlePtyInput;
|
|
59
|
+
/**
|
|
60
|
+
* Handle PTY resize
|
|
61
|
+
*/
|
|
62
|
+
private handlePtyResize;
|
|
63
|
+
/**
|
|
64
|
+
* Handle detected command
|
|
65
|
+
*/
|
|
66
|
+
private handlePtyCommand;
|
|
67
|
+
/**
|
|
68
|
+
* Handle PTY exit
|
|
69
|
+
*/
|
|
70
|
+
private handlePtyExit;
|
|
71
|
+
/**
|
|
72
|
+
* Flush current chunk and upload
|
|
73
|
+
*/
|
|
74
|
+
private flushChunk;
|
|
75
|
+
/**
|
|
76
|
+
* Pause recording
|
|
77
|
+
*/
|
|
78
|
+
pause(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Resume recording
|
|
81
|
+
*/
|
|
82
|
+
resume(): void;
|
|
83
|
+
/**
|
|
84
|
+
* Stop recording
|
|
85
|
+
*/
|
|
86
|
+
stop(): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Get recording stats
|
|
89
|
+
*/
|
|
90
|
+
getStats(): RecordingStats;
|
|
91
|
+
/**
|
|
92
|
+
* Check if recording
|
|
93
|
+
*/
|
|
94
|
+
isActive(): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Check if paused
|
|
97
|
+
*/
|
|
98
|
+
isPausedState(): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Get session URL
|
|
101
|
+
*/
|
|
102
|
+
getSessionUrl(): string;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=recorder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../src/core/recorder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAc,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,QAAS,SAAQ,YAAY;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,kBAAkB,CAA+B;IACzD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,KAAK,CAMX;gBAEU,OAAO,EAAE,eAAe;IAkDpC;;OAEG;IACG,KAAK,CAAC,UAAU,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6D9D;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;OAEG;YACW,aAAa;IAO3B;;OAEG;YACW,UAAU;IAsBxB;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,MAAM,IAAI,IAAI;IASd;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD3B;;OAEG;IACH,QAAQ,IAAI,cAAc;IAO1B;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,aAAa,IAAI,MAAM;CAGxB"}
|