@lagless/relay-client 0.0.33
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/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/lib/relay-connection.d.ts +37 -0
- package/dist/lib/relay-connection.d.ts.map +1 -0
- package/dist/lib/relay-connection.js +139 -0
- package/dist/lib/relay-input-provider.d.ts +105 -0
- package/dist/lib/relay-input-provider.d.ts.map +1 -0
- package/dist/lib/relay-input-provider.js +284 -0
- package/dist/lib/types.d.ts +9 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +3 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +40 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './lib/types.js';
|
|
2
|
+
export { RelayConnection, type RelayConnectionEvents } from './lib/relay-connection.js';
|
|
3
|
+
export { RelayInputProvider } from './lib/relay-input-provider.js';
|
|
4
|
+
export type { ServerHelloData } from '@lagless/net-wire';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type ServerHelloData, type FanoutData, type CancelInputData, type PongData, type TickInputData, type StateResponseData, type PlayerFinishedData } from '@lagless/net-wire';
|
|
2
|
+
import { type RelayConnectionConfig } from './types.js';
|
|
3
|
+
export interface RelayConnectionEvents {
|
|
4
|
+
onServerHello(data: ServerHelloData): void;
|
|
5
|
+
onTickInputFanout(data: FanoutData): void;
|
|
6
|
+
onCancelInput(data: CancelInputData): void;
|
|
7
|
+
onPong(data: PongData): void;
|
|
8
|
+
onStateRequest(requestId: number): void;
|
|
9
|
+
onStateResponse(data: StateResponseData): void;
|
|
10
|
+
onConnected(): void;
|
|
11
|
+
onDisconnected(): void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Thin WebSocket wrapper for relay server communication.
|
|
15
|
+
* Handles binary protocol parsing and ping interval management.
|
|
16
|
+
*/
|
|
17
|
+
export declare class RelayConnection {
|
|
18
|
+
private readonly _config;
|
|
19
|
+
private readonly _events;
|
|
20
|
+
private _ws;
|
|
21
|
+
private _pingInterval;
|
|
22
|
+
private _pingCount;
|
|
23
|
+
private _connected;
|
|
24
|
+
constructor(_config: RelayConnectionConfig, _events: RelayConnectionEvents);
|
|
25
|
+
get isConnected(): boolean;
|
|
26
|
+
connect(): void;
|
|
27
|
+
disconnect(): void;
|
|
28
|
+
sendTickInputBatch(inputs: ReadonlyArray<TickInputData>): void;
|
|
29
|
+
sendStateResponse(data: StateResponseData): void;
|
|
30
|
+
sendPlayerFinished(data: PlayerFinishedData): void;
|
|
31
|
+
sendPing(): void;
|
|
32
|
+
private sendBinary;
|
|
33
|
+
private handleBinaryMessage;
|
|
34
|
+
private startPingInterval;
|
|
35
|
+
private stopPingInterval;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=relay-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-connection.d.ts","sourceRoot":"","sources":["../../src/lib/relay-connection.ts"],"names":[],"mappings":"AACA,OAAO,EAaL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,qBAAqB,EAI3B,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3C,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/C,WAAW,IAAI,IAAI,CAAC;IACpB,cAAc,IAAI,IAAI,CAAC;CACxB;AAID;;;GAGG;AACH,qBAAa,eAAe;IAOxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAAS;gBAGR,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,qBAAqB;IAGjD,IAAW,WAAW,IAAI,OAAO,CAEhC;IAEM,OAAO,IAAI,IAAI;IA2Cf,UAAU,IAAI,IAAI;IAclB,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,IAAI;IAK9D,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAIhD,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAIlD,QAAQ,IAAI,IAAI;IAMvB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,gBAAgB;CAMzB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { createLogger } from '@lagless/misc';
|
|
2
|
+
import { MsgType, unpackHeader, unpackServerHello, unpackTickInputFanout, unpackCancelInput, unpackPong, unpackStateRequest, unpackStateResponse, packTickInputBatch, packPing, packStateResponse, packPlayerFinished, } from '@lagless/net-wire';
|
|
3
|
+
import { PING_WARMUP_INTERVAL_MS, PING_WARMUP_COUNT, PING_STEADY_INTERVAL_MS, } from './types.js';
|
|
4
|
+
const log = createLogger('RelayConnection');
|
|
5
|
+
// ─── RelayConnection ────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* Thin WebSocket wrapper for relay server communication.
|
|
8
|
+
* Handles binary protocol parsing and ping interval management.
|
|
9
|
+
*/
|
|
10
|
+
export class RelayConnection {
|
|
11
|
+
_config;
|
|
12
|
+
_events;
|
|
13
|
+
_ws = null;
|
|
14
|
+
_pingInterval = null;
|
|
15
|
+
_pingCount = 0;
|
|
16
|
+
_connected = false;
|
|
17
|
+
constructor(_config, _events) {
|
|
18
|
+
this._config = _config;
|
|
19
|
+
this._events = _events;
|
|
20
|
+
}
|
|
21
|
+
get isConnected() {
|
|
22
|
+
return this._connected;
|
|
23
|
+
}
|
|
24
|
+
connect() {
|
|
25
|
+
if (this._ws) {
|
|
26
|
+
// Allow reconnect if previous WS is already closed/closing
|
|
27
|
+
if (this._ws.readyState === WebSocket.CLOSED || this._ws.readyState === WebSocket.CLOSING) {
|
|
28
|
+
this._ws = null;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
log.warn('Already connected, ignoring connect()');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const url = `${this._config.serverUrl}/match/${this._config.matchId}?token=${encodeURIComponent(this._config.token)}`;
|
|
36
|
+
log.info(`Connecting to ${url}`);
|
|
37
|
+
this._ws = new WebSocket(url);
|
|
38
|
+
this._ws.binaryType = 'arraybuffer';
|
|
39
|
+
this._ws.onopen = () => {
|
|
40
|
+
this._connected = true;
|
|
41
|
+
log.info('Connected');
|
|
42
|
+
this.startPingInterval();
|
|
43
|
+
this._events.onConnected();
|
|
44
|
+
};
|
|
45
|
+
this._ws.onmessage = (event) => {
|
|
46
|
+
if (event.data instanceof ArrayBuffer) {
|
|
47
|
+
this.handleBinaryMessage(event.data);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
this._ws.onclose = () => {
|
|
51
|
+
this._connected = false;
|
|
52
|
+
this._ws = null;
|
|
53
|
+
this.stopPingInterval();
|
|
54
|
+
log.info('Disconnected');
|
|
55
|
+
this._events.onDisconnected();
|
|
56
|
+
};
|
|
57
|
+
this._ws.onerror = () => {
|
|
58
|
+
log.error('WebSocket error');
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
disconnect() {
|
|
62
|
+
this.stopPingInterval();
|
|
63
|
+
if (this._ws) {
|
|
64
|
+
this._ws.onclose = null;
|
|
65
|
+
this._ws.onmessage = null;
|
|
66
|
+
this._ws.onerror = null;
|
|
67
|
+
this._ws.close();
|
|
68
|
+
this._ws = null;
|
|
69
|
+
}
|
|
70
|
+
this._connected = false;
|
|
71
|
+
}
|
|
72
|
+
// ─── Sending ──────────────────────────────────────────
|
|
73
|
+
sendTickInputBatch(inputs) {
|
|
74
|
+
if (inputs.length === 0)
|
|
75
|
+
return;
|
|
76
|
+
this.sendBinary(packTickInputBatch(inputs));
|
|
77
|
+
}
|
|
78
|
+
sendStateResponse(data) {
|
|
79
|
+
this.sendBinary(packStateResponse(data));
|
|
80
|
+
}
|
|
81
|
+
sendPlayerFinished(data) {
|
|
82
|
+
this.sendBinary(packPlayerFinished(data));
|
|
83
|
+
}
|
|
84
|
+
sendPing() {
|
|
85
|
+
this.sendBinary(packPing(performance.now()));
|
|
86
|
+
}
|
|
87
|
+
// ─── Private ──────────────────────────────────────────
|
|
88
|
+
sendBinary(data) {
|
|
89
|
+
if (!this._ws || this._ws.readyState !== WebSocket.OPEN)
|
|
90
|
+
return;
|
|
91
|
+
this._ws.send(data);
|
|
92
|
+
}
|
|
93
|
+
handleBinaryMessage(data) {
|
|
94
|
+
if (data.byteLength < 2)
|
|
95
|
+
return;
|
|
96
|
+
const header = unpackHeader(data);
|
|
97
|
+
switch (header.type) {
|
|
98
|
+
case MsgType.ServerHello:
|
|
99
|
+
this._events.onServerHello(unpackServerHello(data));
|
|
100
|
+
break;
|
|
101
|
+
case MsgType.TickInputFanout:
|
|
102
|
+
this._events.onTickInputFanout(unpackTickInputFanout(data));
|
|
103
|
+
break;
|
|
104
|
+
case MsgType.CancelInput:
|
|
105
|
+
this._events.onCancelInput(unpackCancelInput(data));
|
|
106
|
+
break;
|
|
107
|
+
case MsgType.Pong:
|
|
108
|
+
this._events.onPong(unpackPong(data));
|
|
109
|
+
break;
|
|
110
|
+
case MsgType.StateRequest:
|
|
111
|
+
this._events.onStateRequest(unpackStateRequest(data));
|
|
112
|
+
break;
|
|
113
|
+
case MsgType.StateResponse:
|
|
114
|
+
this._events.onStateResponse(unpackStateResponse(data));
|
|
115
|
+
break;
|
|
116
|
+
default:
|
|
117
|
+
log.warn(`Unknown message type: ${header.type}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
startPingInterval() {
|
|
121
|
+
this.stopPingInterval();
|
|
122
|
+
this._pingCount = 0;
|
|
123
|
+
this.sendPing();
|
|
124
|
+
this._pingInterval = setInterval(() => {
|
|
125
|
+
this.sendPing();
|
|
126
|
+
this._pingCount++;
|
|
127
|
+
if (this._pingCount === PING_WARMUP_COUNT) {
|
|
128
|
+
this.stopPingInterval();
|
|
129
|
+
this._pingInterval = setInterval(() => this.sendPing(), PING_STEADY_INTERVAL_MS);
|
|
130
|
+
}
|
|
131
|
+
}, PING_WARMUP_INTERVAL_MS);
|
|
132
|
+
}
|
|
133
|
+
stopPingInterval() {
|
|
134
|
+
if (this._pingInterval !== null) {
|
|
135
|
+
clearInterval(this._pingInterval);
|
|
136
|
+
this._pingInterval = null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { AbstractInputProvider, type InputRegistry, type ECSConfig } from '@lagless/core';
|
|
2
|
+
import { ClockSync, InputDelayController, type ServerHelloData, type StateResponseData, type FanoutData, type CancelInputData, type PongData } from '@lagless/net-wire';
|
|
3
|
+
import type { RelayConnection } from './relay-connection.js';
|
|
4
|
+
/**
|
|
5
|
+
* Input provider for relay-based multiplayer.
|
|
6
|
+
*
|
|
7
|
+
* Handles:
|
|
8
|
+
* - Local input prediction (adds to history + sends to server)
|
|
9
|
+
* - Remote input injection (from TickInputFanout)
|
|
10
|
+
* - CancelInput rollback
|
|
11
|
+
* - Clock synchronization
|
|
12
|
+
* - Adaptive input delay
|
|
13
|
+
* - State transfer for late-join
|
|
14
|
+
*/
|
|
15
|
+
export declare class RelayInputProvider extends AbstractInputProvider {
|
|
16
|
+
playerSlot: number;
|
|
17
|
+
private readonly _clockSync;
|
|
18
|
+
private readonly _inputDelayController;
|
|
19
|
+
private readonly _serverHello;
|
|
20
|
+
private _resolveServerHello;
|
|
21
|
+
private _firstHelloReceived;
|
|
22
|
+
private _connection;
|
|
23
|
+
private _rollbackCount;
|
|
24
|
+
/**
|
|
25
|
+
* Minimum tick that needs rollback. Consumed (reset) each frame by
|
|
26
|
+
* `getInvalidateRollbackTick()`.
|
|
27
|
+
*/
|
|
28
|
+
private _invalidateRollbackTick;
|
|
29
|
+
constructor(playerSlot: number, ecsConfig: ECSConfig, inputRegistry: InputRegistry);
|
|
30
|
+
get clockSync(): ClockSync;
|
|
31
|
+
get inputDelayController(): InputDelayController;
|
|
32
|
+
get rollbackCount(): number;
|
|
33
|
+
/**
|
|
34
|
+
* Resolves with the first ServerHello received from the server.
|
|
35
|
+
* Await this before creating the ECSSimulation to ensure the
|
|
36
|
+
* correct PRNG seed is available for ECSConfig.
|
|
37
|
+
*/
|
|
38
|
+
get serverHello(): Promise<ServerHelloData>;
|
|
39
|
+
get connection(): RelayConnection | null;
|
|
40
|
+
setConnection(connection: RelayConnection): void;
|
|
41
|
+
getInvalidateRollbackTick(): number | undefined;
|
|
42
|
+
update(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Handle ServerHello from server.
|
|
45
|
+
*
|
|
46
|
+
* First call: resolves the `serverHello` promise so the game client
|
|
47
|
+
* can create ECSConfig with the correct seed before constructing the simulation.
|
|
48
|
+
*
|
|
49
|
+
* Subsequent calls (reconnect): syncs the simulation clock to the
|
|
50
|
+
* server's tick so client inputs are not rejected as TooOld.
|
|
51
|
+
*/
|
|
52
|
+
handleServerHello(data: ServerHelloData): void;
|
|
53
|
+
/**
|
|
54
|
+
* Handle TickInputFanout from server.
|
|
55
|
+
* Adds remote inputs to history, triggers rollback if needed.
|
|
56
|
+
*/
|
|
57
|
+
handleTickInputFanout(data: FanoutData): void;
|
|
58
|
+
/**
|
|
59
|
+
* Handle CancelInput from server.
|
|
60
|
+
* Removes the rejected input and triggers rollback.
|
|
61
|
+
*/
|
|
62
|
+
handleCancelInput(data: CancelInputData): void;
|
|
63
|
+
/**
|
|
64
|
+
* Handle Pong from server.
|
|
65
|
+
* Updates clock sync, corrects clock drift, and adjusts input delay.
|
|
66
|
+
*/
|
|
67
|
+
handlePong(data: PongData): void;
|
|
68
|
+
/**
|
|
69
|
+
* Handle StateRequest from server (for late-join state transfer).
|
|
70
|
+
* Exports current simulation state and sends to server.
|
|
71
|
+
*/
|
|
72
|
+
handleStateRequest(requestId: number): void;
|
|
73
|
+
/**
|
|
74
|
+
* Handle StateResponse from server (reconnect state transfer).
|
|
75
|
+
* Applies the received state to the simulation and resets all provider state.
|
|
76
|
+
*/
|
|
77
|
+
handleStateResponse(data: StateResponseData): void;
|
|
78
|
+
/**
|
|
79
|
+
* Sync the simulation clock to the server's tick.
|
|
80
|
+
* Used on reconnect — the state transfer will overwrite everything else.
|
|
81
|
+
*/
|
|
82
|
+
private _syncClockToServer;
|
|
83
|
+
/**
|
|
84
|
+
* Send this frame's local inputs to the server as a single batch.
|
|
85
|
+
*/
|
|
86
|
+
private sendBufferedInputs;
|
|
87
|
+
/**
|
|
88
|
+
* Convert a TickInputData (from network) to an RPC (for history).
|
|
89
|
+
*/
|
|
90
|
+
private tickInputToRPC;
|
|
91
|
+
/**
|
|
92
|
+
* Pack an RPC's data into binary payload for network transmission.
|
|
93
|
+
*/
|
|
94
|
+
private packRpcPayload;
|
|
95
|
+
/**
|
|
96
|
+
* Unpack binary payload into input data.
|
|
97
|
+
*/
|
|
98
|
+
private unpackInputPayload;
|
|
99
|
+
/**
|
|
100
|
+
* Request a rollback to a specific tick.
|
|
101
|
+
* Keeps the minimum (earliest) tick that needs rollback.
|
|
102
|
+
*/
|
|
103
|
+
private requestRollback;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=relay-input-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-input-provider.d.ts","sourceRoot":"","sources":["../../src/lib/relay-input-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAO,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/F,OAAO,EACL,SAAS,EAAE,oBAAoB,EAE/B,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAC5C,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EACrD,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D;;;;;;;;;;GAUG;AACH,qBAAa,kBAAmB,SAAQ,qBAAqB;IAC3C,UAAU,EAAE,MAAM,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAuB;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2B;IACxD,OAAO,CAAC,mBAAmB,CAAmC;IAC9D,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,cAAc,CAAK;IAE3B;;;OAGG;IACH,OAAO,CAAC,uBAAuB,CAAiC;gBAG9D,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa;IAiB9B,IAAW,SAAS,IAAI,SAAS,CAEhC;IAED,IAAW,oBAAoB,IAAI,oBAAoB,CAEtD;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED;;;;OAIG;IACH,IAAW,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC,CAEjD;IAID,IAAW,UAAU,IAAI,eAAe,GAAG,IAAI,CAE9C;IAEM,aAAa,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAMvC,yBAAyB,IAAI,MAAM,GAAG,SAAS;IAM/C,MAAM,IAAI,IAAI;IAQ9B;;;;;;;;OAQG;IACI,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAWrD;;;OAGG;IACI,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IA8BpD;;;OAGG;IACI,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAUrD;;;OAGG;IACI,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IA4CvC;;;OAGG;IACI,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAoBlD;;;OAGG;IACI,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAkBzD;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;OAGG;IACH,OAAO,CAAC,eAAe;CAMxB"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { AbstractInputProvider, RPC } from '@lagless/core';
|
|
2
|
+
// eslint-disable-next-line @nx/enforce-module-boundaries -- direct dep, used for input payload packing
|
|
3
|
+
import { InputBinarySchema } from '@lagless/binary';
|
|
4
|
+
import { ClockSync, InputDelayController, TickInputKind, } from '@lagless/net-wire';
|
|
5
|
+
import { createLogger } from '@lagless/misc';
|
|
6
|
+
const log = createLogger('RelayInputProvider');
|
|
7
|
+
/**
|
|
8
|
+
* Input provider for relay-based multiplayer.
|
|
9
|
+
*
|
|
10
|
+
* Handles:
|
|
11
|
+
* - Local input prediction (adds to history + sends to server)
|
|
12
|
+
* - Remote input injection (from TickInputFanout)
|
|
13
|
+
* - CancelInput rollback
|
|
14
|
+
* - Clock synchronization
|
|
15
|
+
* - Adaptive input delay
|
|
16
|
+
* - State transfer for late-join
|
|
17
|
+
*/
|
|
18
|
+
export class RelayInputProvider extends AbstractInputProvider {
|
|
19
|
+
playerSlot;
|
|
20
|
+
_clockSync;
|
|
21
|
+
_inputDelayController;
|
|
22
|
+
_serverHello;
|
|
23
|
+
_resolveServerHello;
|
|
24
|
+
_firstHelloReceived = false;
|
|
25
|
+
_connection = null;
|
|
26
|
+
_rollbackCount = 0;
|
|
27
|
+
/**
|
|
28
|
+
* Minimum tick that needs rollback. Consumed (reset) each frame by
|
|
29
|
+
* `getInvalidateRollbackTick()`.
|
|
30
|
+
*/
|
|
31
|
+
_invalidateRollbackTick = undefined;
|
|
32
|
+
constructor(playerSlot, ecsConfig, inputRegistry) {
|
|
33
|
+
super(ecsConfig, inputRegistry);
|
|
34
|
+
this.playerSlot = playerSlot;
|
|
35
|
+
this._clockSync = new ClockSync();
|
|
36
|
+
this._inputDelayController = new InputDelayController(ecsConfig.minInputDelayTick, ecsConfig.maxInputDelayTick, ecsConfig.initialInputDelayTick);
|
|
37
|
+
this._serverHello = new Promise((resolve) => {
|
|
38
|
+
this._resolveServerHello = resolve;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// ─── Public Getters ─────────────────────────────────────
|
|
42
|
+
get clockSync() {
|
|
43
|
+
return this._clockSync;
|
|
44
|
+
}
|
|
45
|
+
get inputDelayController() {
|
|
46
|
+
return this._inputDelayController;
|
|
47
|
+
}
|
|
48
|
+
get rollbackCount() {
|
|
49
|
+
return this._rollbackCount;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Resolves with the first ServerHello received from the server.
|
|
53
|
+
* Await this before creating the ECSSimulation to ensure the
|
|
54
|
+
* correct PRNG seed is available for ECSConfig.
|
|
55
|
+
*/
|
|
56
|
+
get serverHello() {
|
|
57
|
+
return this._serverHello;
|
|
58
|
+
}
|
|
59
|
+
// ─── Connection ─────────────────────────────────────────
|
|
60
|
+
get connection() {
|
|
61
|
+
return this._connection;
|
|
62
|
+
}
|
|
63
|
+
setConnection(connection) {
|
|
64
|
+
this._connection = connection;
|
|
65
|
+
}
|
|
66
|
+
// ─── AbstractInputProvider overrides ────────────────────
|
|
67
|
+
getInvalidateRollbackTick() {
|
|
68
|
+
const tick = this._invalidateRollbackTick;
|
|
69
|
+
this._invalidateRollbackTick = undefined;
|
|
70
|
+
return tick;
|
|
71
|
+
}
|
|
72
|
+
update() {
|
|
73
|
+
super.update();
|
|
74
|
+
this.sendBufferedInputs();
|
|
75
|
+
}
|
|
76
|
+
// ─── Network Event Handlers ─────────────────────────────
|
|
77
|
+
// Called by RelayConnection (or directly in tests)
|
|
78
|
+
/**
|
|
79
|
+
* Handle ServerHello from server.
|
|
80
|
+
*
|
|
81
|
+
* First call: resolves the `serverHello` promise so the game client
|
|
82
|
+
* can create ECSConfig with the correct seed before constructing the simulation.
|
|
83
|
+
*
|
|
84
|
+
* Subsequent calls (reconnect): syncs the simulation clock to the
|
|
85
|
+
* server's tick so client inputs are not rejected as TooOld.
|
|
86
|
+
*/
|
|
87
|
+
handleServerHello(data) {
|
|
88
|
+
if (!this._firstHelloReceived) {
|
|
89
|
+
this._firstHelloReceived = true;
|
|
90
|
+
this._resolveServerHello(data);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Reconnect: sync clock only (state transfer will overwrite everything)
|
|
94
|
+
this._syncClockToServer(data);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Handle TickInputFanout from server.
|
|
98
|
+
* Adds remote inputs to history, triggers rollback if needed.
|
|
99
|
+
*/
|
|
100
|
+
handleTickInputFanout(data) {
|
|
101
|
+
const currentTick = this._simulation?.tick ?? 0;
|
|
102
|
+
for (const input of data.inputs) {
|
|
103
|
+
// Skip our own client inputs — already in history from prediction
|
|
104
|
+
if (input.kind === TickInputKind.Client && input.playerSlot === this.playerSlot) {
|
|
105
|
+
log.debug(`Fanout SKIP own: tick=${input.tick} slot=${input.playerSlot} seq=${input.seq}`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const rpc = this.tickInputToRPC(input);
|
|
109
|
+
this.addRemoteRpc(rpc);
|
|
110
|
+
const needsRollback = input.tick <= currentTick;
|
|
111
|
+
log.debug(`Fanout REMOTE: inputId=${rpc.inputId} tick=${input.tick} slot=${input.playerSlot} kind=${input.kind} seq=${input.seq} localTick=${currentTick} rollback=${needsRollback}`);
|
|
112
|
+
// If remote input is for a tick we already simulated → need rollback
|
|
113
|
+
if (needsRollback) {
|
|
114
|
+
this.requestRollback(input.tick);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Update PhaseNudger with server's authoritative tick
|
|
118
|
+
if (this._simulation) {
|
|
119
|
+
this._simulation.clock.phaseNudger.onServerTickHint(data.serverTick, this._simulation.tick);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Handle CancelInput from server.
|
|
124
|
+
* Removes the rejected input and triggers rollback.
|
|
125
|
+
*/
|
|
126
|
+
handleCancelInput(data) {
|
|
127
|
+
const reasonNames = ['TooOld', 'TooFarFuture', 'InvalidSlot'];
|
|
128
|
+
log.warn(`CANCEL received: tick=${data.tick} seq=${data.seq} slot=${data.playerSlot} reason=${reasonNames[data.reason] ?? data.reason}`);
|
|
129
|
+
this.removeRpcAt(data.playerSlot, data.tick, data.seq);
|
|
130
|
+
this.requestRollback(data.tick);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Handle Pong from server.
|
|
134
|
+
* Updates clock sync, corrects clock drift, and adjusts input delay.
|
|
135
|
+
*/
|
|
136
|
+
handlePong(data) {
|
|
137
|
+
const clientReceiveMs = performance.now();
|
|
138
|
+
const becameReady = this._clockSync.updateFromPong(clientReceiveMs, data);
|
|
139
|
+
if (becameReady && this._simulation) {
|
|
140
|
+
this._simulation.clock.phaseNudger.activate();
|
|
141
|
+
}
|
|
142
|
+
// Correct clock drift using server tick from Pong
|
|
143
|
+
if (this._simulation) {
|
|
144
|
+
const rtt = clientReceiveMs - data.cSend;
|
|
145
|
+
const oneWayTicks = Math.round((rtt / 2) / this._frameLength);
|
|
146
|
+
const estimatedServerTick = data.sTick + oneWayTicks;
|
|
147
|
+
const localTargetTick = Math.floor(this._simulation.clock.accumulatedTime / this._frameLength);
|
|
148
|
+
const drift = estimatedServerTick - localTargetTick;
|
|
149
|
+
if (this._simulation.clock.phaseNudger.isActive) {
|
|
150
|
+
// PhaseNudger active: feed it server tick hints from Pong
|
|
151
|
+
// (breaks deadlock where rejected inputs → no fanout → no hints)
|
|
152
|
+
this._simulation.clock.phaseNudger.onServerTickHint(estimatedServerTick, this._simulation.tick);
|
|
153
|
+
}
|
|
154
|
+
else if (Math.abs(drift) > 1) {
|
|
155
|
+
// PhaseNudger not yet active: hard sync if drifted more than 1 tick
|
|
156
|
+
const correctionMs = drift * this._frameLength;
|
|
157
|
+
log.info(`Pong clock correction: drift=${drift} ticks, localTarget=${localTargetTick} estServer=${estimatedServerTick} rtt=${rtt.toFixed(1)}ms`);
|
|
158
|
+
this._simulation.clock.setAccumulatedTime(this._simulation.clock.accumulatedTime + correctionMs);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Recompute input delay based on network conditions
|
|
162
|
+
if (this._clockSync.isReady) {
|
|
163
|
+
const newDelay = this._inputDelayController.recompute(this._frameLength, this._clockSync.rttEwmaMs, this._clockSync.jitterEwmaMs);
|
|
164
|
+
this.setInputDelay(newDelay);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Handle StateRequest from server (for late-join state transfer).
|
|
169
|
+
* Exports current simulation state and sends to server.
|
|
170
|
+
*/
|
|
171
|
+
handleStateRequest(requestId) {
|
|
172
|
+
if (!this._simulation) {
|
|
173
|
+
log.warn('StateRequest received but simulation not initialized');
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const state = this._simulation.mem.exportSnapshot();
|
|
177
|
+
const tick = this._simulation.tick;
|
|
178
|
+
const hash = this._simulation.mem.getHash();
|
|
179
|
+
log.info(`Responding to StateRequest #${requestId}: tick=${tick}, hash=0x${hash.toString(16)}`);
|
|
180
|
+
this._connection?.sendStateResponse({
|
|
181
|
+
requestId,
|
|
182
|
+
tick,
|
|
183
|
+
hash,
|
|
184
|
+
state,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Handle StateResponse from server (reconnect state transfer).
|
|
189
|
+
* Applies the received state to the simulation and resets all provider state.
|
|
190
|
+
*/
|
|
191
|
+
handleStateResponse(data) {
|
|
192
|
+
if (!this._simulation) {
|
|
193
|
+
log.warn('StateResponse received but simulation not initialized');
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
log.info(`State transfer: tick=${data.tick}, hash=0x${data.hash.toString(16)}, size=${data.state.byteLength}`);
|
|
197
|
+
this._simulation.applyExternalState(data.state, data.tick);
|
|
198
|
+
this._rpcHistory.clear();
|
|
199
|
+
this._invalidateRollbackTick = undefined;
|
|
200
|
+
this._clockSync.reset();
|
|
201
|
+
this._currentInputDelay = this.ecsConfig.initialInputDelayTick;
|
|
202
|
+
this.resetSequences();
|
|
203
|
+
}
|
|
204
|
+
// ─── Private ──────────────────────────────────────────
|
|
205
|
+
/**
|
|
206
|
+
* Sync the simulation clock to the server's tick.
|
|
207
|
+
* Used on reconnect — the state transfer will overwrite everything else.
|
|
208
|
+
*/
|
|
209
|
+
_syncClockToServer(data) {
|
|
210
|
+
if (!this._simulation)
|
|
211
|
+
return;
|
|
212
|
+
const beforeTick = this._simulation.tick;
|
|
213
|
+
this._simulation.clock.setAccumulatedTime(data.serverTick * this._frameLength);
|
|
214
|
+
log.info(`Clock synced: beforeTick=${beforeTick} → serverTick=${data.serverTick} (${(data.serverTick * this._frameLength).toFixed(0)}ms) playerSlot=${this.playerSlot}`);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Send this frame's local inputs to the server as a single batch.
|
|
218
|
+
*/
|
|
219
|
+
sendBufferedInputs() {
|
|
220
|
+
if (!this._connection)
|
|
221
|
+
return;
|
|
222
|
+
const buffer = this.getFrameRPCBuffer();
|
|
223
|
+
if (buffer.length === 0)
|
|
224
|
+
return;
|
|
225
|
+
const inputs = [];
|
|
226
|
+
for (const rpc of buffer) {
|
|
227
|
+
log.debug(`SEND: inputId=${rpc.inputId} tick=${rpc.meta.tick} slot=${rpc.meta.playerSlot} seq=${rpc.meta.seq} simTick=${this._simulation?.tick ?? '?'}`);
|
|
228
|
+
inputs.push({
|
|
229
|
+
tick: rpc.meta.tick,
|
|
230
|
+
playerSlot: rpc.meta.playerSlot,
|
|
231
|
+
seq: rpc.meta.seq,
|
|
232
|
+
kind: TickInputKind.Client,
|
|
233
|
+
payload: this.packRpcPayload(rpc),
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
log.debug(`SEND BATCH: ${inputs.length} inputs, wsOpen=${this._connection.isConnected}`);
|
|
237
|
+
this._connection.sendTickInputBatch(inputs);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Convert a TickInputData (from network) to an RPC (for history).
|
|
241
|
+
*/
|
|
242
|
+
tickInputToRPC(input) {
|
|
243
|
+
// Unpack the payload to get inputId, ordinal, and values
|
|
244
|
+
// The payload is an InputBinarySchema-packed batch
|
|
245
|
+
const unpacked = this.unpackInputPayload(input.payload);
|
|
246
|
+
return new RPC(unpacked.inputId, {
|
|
247
|
+
tick: input.tick,
|
|
248
|
+
seq: input.seq,
|
|
249
|
+
ordinal: unpacked.ordinal,
|
|
250
|
+
playerSlot: input.playerSlot,
|
|
251
|
+
}, unpacked.values);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Pack an RPC's data into binary payload for network transmission.
|
|
255
|
+
*/
|
|
256
|
+
packRpcPayload(rpc) {
|
|
257
|
+
const buffer = InputBinarySchema.packBatch(this.inputRegistry, [{
|
|
258
|
+
inputId: rpc.inputId,
|
|
259
|
+
ordinal: rpc.meta.ordinal,
|
|
260
|
+
values: rpc.data,
|
|
261
|
+
}]);
|
|
262
|
+
return new Uint8Array(buffer);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Unpack binary payload into input data.
|
|
266
|
+
*/
|
|
267
|
+
unpackInputPayload(payload) {
|
|
268
|
+
const unpacked = InputBinarySchema.unpackBatch(this.inputRegistry, payload.buffer);
|
|
269
|
+
if (unpacked.length !== 1) {
|
|
270
|
+
throw new Error(`Expected 1 input in payload, got ${unpacked.length}`);
|
|
271
|
+
}
|
|
272
|
+
return unpacked[0];
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Request a rollback to a specific tick.
|
|
276
|
+
* Keeps the minimum (earliest) tick that needs rollback.
|
|
277
|
+
*/
|
|
278
|
+
requestRollback(tick) {
|
|
279
|
+
this._rollbackCount++;
|
|
280
|
+
if (this._invalidateRollbackTick === undefined || tick < this._invalidateRollbackTick) {
|
|
281
|
+
this._invalidateRollbackTick = tick;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface RelayConnectionConfig {
|
|
2
|
+
readonly serverUrl: string;
|
|
3
|
+
readonly matchId: string;
|
|
4
|
+
readonly token: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const PING_WARMUP_INTERVAL_MS = 150;
|
|
7
|
+
export declare const PING_WARMUP_COUNT = 5;
|
|
8
|
+
export declare const PING_STEADY_INTERVAL_MS = 1000;
|
|
9
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,uBAAuB,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.d.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/modules/index.d.ts","../src/lib/types.ts","../../misc/dist/lib/now.d.ts","../../misc/dist/lib/uuid.d.ts","../../misc/dist/lib/ring-buffer.d.ts","../../misc/dist/lib/snapshot-history.d.ts","../../misc/dist/lib/phase-nudger.d.ts","../../misc/dist/lib/simulation-clock.d.ts","../../misc/dist/lib/transform2d-utils.d.ts","../../misc/dist/lib/visual-smoother-2d.d.ts","../../misc/dist/lib/logger.d.ts","../../misc/dist/index.d.ts","../../binary/dist/lib/binary.d.ts","../../binary/dist/lib/types.d.ts","../../binary/dist/index.d.ts","../../net-wire/dist/lib/protocol.d.ts","../../net-wire/dist/lib/clock-sync.d.ts","../../net-wire/dist/lib/input-delay-controller.d.ts","../../net-wire/dist/lib/tick-input-buffer.d.ts","../../net-wire/dist/index.d.ts","../src/lib/relay-connection.ts","../../core/dist/lib/types/abstract-filter.d.ts","../../core/dist/lib/types/ecs-types.d.ts","../../core/dist/lib/types/index.d.ts","../../core/dist/lib/prefab.d.ts","../../core/dist/lib/di/di-container.d.ts","../../core/dist/lib/di/di-decorators.d.ts","../../core/dist/lib/di/index.d.ts","../../core/dist/lib/ecs-config.d.ts","../../core/dist/lib/mem/abstract-memory.interface.d.ts","../../core/dist/lib/mem/managers/components-manager.d.ts","../../core/dist/lib/mem/managers/filters-manager.d.ts","../../core/dist/lib/mem/managers/entities-manager.d.ts","../../core/dist/lib/mem/managers/singletons-manager.d.ts","../../core/dist/lib/mem/managers/player-resources-manager.d.ts","../../core/dist/lib/mem/managers/tick-manager.d.ts","../../core/dist/lib/mem/managers/prng-manager.d.ts","../../core/dist/lib/mem/mem.d.ts","../../core/dist/lib/mem/index.d.ts","../../core/dist/lib/input/rpc.d.ts","../../core/dist/lib/input/input-registry.d.ts","../../core/dist/lib/input/rpc-history.d.ts","../../core/dist/lib/input/abstract-input-provider.d.ts","../../core/dist/lib/input/local-input-provider.d.ts","../../core/dist/lib/input/input-provider-di-token.d.ts","../../core/dist/lib/input/replay-input-provider.d.ts","../../core/dist/lib/input/index.d.ts","../../core/dist/lib/signals/event-emitter.d.ts","../../core/dist/lib/signals/signal.d.ts","../../core/dist/lib/ecs-simulation.d.ts","../../core/dist/lib/ecs-runner.d.ts","../../core/dist/lib/hash-verification/divergence.signal.d.ts","../../core/dist/lib/hash-verification/abstract-hash-verification.system.d.ts","../../core/dist/lib/hash-verification/create-hash-reporter.d.ts","../../core/dist/lib/hash-verification/index.d.ts","../../core/dist/index.d.ts","../src/lib/relay-input-provider.ts","../src/index.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/dom-events.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/inspector.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/sea.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@20.19.9/node_modules/@types/node/index.d.ts"],"fileIdsList":[[72,73,123,166],[73,123,166],[72,123,166],[83,84,87,88,98,106,108,109,110,114,123,166],[123,166],[85,123,166],[85,86,123,166],[83,87,88,106,108,109,123,166],[71,83,88,98,106,108,123,166],[83,88,94,102,111,123,166],[83,110,123,166],[108,123,166],[111,112,113,123,166],[83,88,99,100,101,109,123,166],[99,100,101,102,103,104,105,123,166],[102,123,166],[83,123,166],[88,100,102,123,166],[83,99,100,123,166],[74,123,166],[92,94,96,97,123,166],[74,83,88,89,123,166],[74,83,84,88,89,90,91,123,166],[74,88,89,123,166],[74,83,89,123,166],[74,89,123,166],[83,88,90,91,92,93,94,95,96,123,166],[74,83,123,166],[88,107,123,166],[74,81,123,166],[81,82,123,166],[62,63,64,65,67,68,69,70,123,166],[66,123,166],[75,76,77,78,123,166],[74,75,123,166],[60,61,79,80,116,123,166],[60,61,71,79,123,166],[60,71,74,79,80,115,123,166],[60,123,166],[123,163,166],[123,165,166],[166],[123,166,171,200],[123,166,167,172,178,179,186,197,208],[123,166,167,168,178,186],[118,119,120,123,166],[123,166,169,209],[123,166,170,171,179,187],[123,166,171,197,205],[123,166,172,174,178,186],[123,165,166,173],[123,166,174,175],[123,166,176,178],[123,165,166,178],[123,166,178,179,180,197,208],[123,166,178,179,180,193,197,200],[123,161,166],[123,166,174,178,181,186,197,208],[123,166,178,179,181,182,186,197,205,208],[123,166,181,183,197,205,208],[121,122,123,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214],[123,166,178,184],[123,166,185,208,213],[123,166,174,178,186,197],[123,166,187],[123,166,188],[123,165,166,189],[123,163,164,165,166,167,168,169,170,171,172,173,174,175,176,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214],[123,166,191],[123,166,192],[123,166,178,193,194],[123,166,193,195,209,211],[123,166,178,197,198,200],[123,166,199,200],[123,166,197,198],[123,166,200],[123,166,201],[123,163,166,197,202],[123,166,178,203,204],[123,166,203,204],[123,166,171,186,197,205],[123,166,206],[123,166,186,207],[123,166,181,192,208],[123,166,171,209],[123,166,197,210],[123,166,185,211],[123,166,212],[123,166,178,180,189,197,200,208,211,213],[123,166,197,214],[59,123,166],[123,133,137,166,208],[123,133,166,197,208],[123,128,166],[123,130,133,166,205,208],[123,166,186,205],[123,166,215],[123,128,166,215],[123,130,133,166,186,208],[123,125,126,129,132,166,178,197,208],[123,133,140,166],[123,125,131,166],[123,133,154,155,166],[123,129,133,166,200,208,215],[123,154,166,215],[123,127,128,166,215],[123,133,166],[123,127,128,129,130,131,132,133,134,135,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,155,156,157,158,159,160,166],[123,133,148,166],[123,133,140,141,166],[123,131,133,141,142,166],[123,132,166],[123,125,128,133,166],[123,133,137,141,142,166],[123,137,166],[123,131,133,136,166,208],[123,125,130,133,140,166],[123,166,197],[123,128,133,154,166,213,215]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"b8f34dd1757f68e03262b1ca3ddfa668a855b872f8bdd5224d6f993a7b37dc2c","impliedFormat":99},{"version":"09df675640c4a1cc0ad80db5b27ababbe98fd1ddb47341832a5c7add32cf3a1d","signature":"954cca308b794d31e8bd7b80cecec5f454bc9b9a4b39b91f583e2dfc8dabde7d","impliedFormat":99},{"version":"b6c4414ae580cf1ab858f1851520f1d0cee1ca59117ca7e836116cf9618c8819","impliedFormat":99},{"version":"1c440fad2b3f198c3b034257840dcf2999a41770d0b2cfccfc047189d98df18f","impliedFormat":99},{"version":"ef9f67b0f0bd71f90d52d8589b3b3c45e1267129b13f874c049a805ecd7ac37f","impliedFormat":99},{"version":"3d26b5544141b556e3b263e78bbe30fe9927f48f58a3ade62c0de58b4d41d9a4","impliedFormat":99},{"version":"d1beb1ffdddb2cf5fe1e58557c8783d3070680c6165bc6652993ed2a7bf48f38","impliedFormat":99},{"version":"4e3121b5b60b986fa48641a69098b66f0b37c876a973fb0d671394b09913752c","impliedFormat":99},{"version":"6573f1553e8ab870f43047dac35527ec3281a9f1c57c4f2be9872306a6dbe5ae","impliedFormat":99},{"version":"899a34e4f158e0b0ef1a72b566bf4041edeef09d0547f8882f740ec5dfd2c775","impliedFormat":99},{"version":"6b42cbd9637a7b84238d4cd7212e5405d9a3274f505a1cc8dc008f5ef7cbce12","impliedFormat":99},{"version":"23c7c084d919b1a6d948a8a0952a18969caaf0740f19651f046d978440b06d57","impliedFormat":99},{"version":"ac089737c8fddcff7af3b4b11d52ceb4053ecacb1e408186981a121b45d471ae","impliedFormat":99},{"version":"ddd386b335a31a931a79bb4a4194e4ad53836920f3eb847f9239577df45f0ada","impliedFormat":99},{"version":"21c5388dfa2af6acd9a77f68ace5f393e5f1163b371a7c4346742ebf0e102117","impliedFormat":99},{"version":"f1d219537856b85b587d64dbf8233115cc3b5a20d5a9ca29d71ab82f1d40fdeb","impliedFormat":99},{"version":"0adc1e3975856b12a811ab06af29a2d9e343b06e48c826f3c72bd7ceaf4be54f","impliedFormat":99},{"version":"4a169791aad1f002f3412ce6ed18bff156d2e97a645e1c5c6ba07dfcae10c1d3","impliedFormat":99},{"version":"e2264c936ae9474c390623d8b41ae4ee992554cac7f3f20109e22ef27725e764","impliedFormat":99},{"version":"03474982ddfb89dd5b162522e3e2a2c91ea40656a9e901bf71541402124a9bdf","impliedFormat":99},{"version":"8d1cb7c9ba84c62de25fd2671b1758eecb2d81113bf4d90bd1a836bb8c79231b","signature":"87bddd4f07117b616006c6b429a2aaee917d04ee609cbe00cbf8ee1c5be9d701","impliedFormat":99},{"version":"23ad1fa9322c6e341b8b1fd6bb93a6720ab1d0d10a0eda74652818d3ff3392e2","impliedFormat":99},{"version":"1595bfc83b235176aa8bc3ad7baed759964ca2127cefc014faa3d4647d362c6f","impliedFormat":99},{"version":"f8d0edd14faea72f0e9a0384f41910d26e3b0006f71451c330c34d1a1494ce33","impliedFormat":99},{"version":"85b8fe3f00141026c0fc749a2f23ac4ae5d030458ca2ed4598587ea0521e2eae","impliedFormat":99},{"version":"130f6370a530b3643e2214b630d3e2e123d76a0233e8e590f3509e072c906ea5","impliedFormat":99},{"version":"f7238b26bc44bf22e4d833995e2b61a73b8da62693303e4289b0456e0209fbd8","impliedFormat":99},{"version":"db4ff4c463764d1c94308182062ecd2d25472f52f00bee4acbe5a44b2f569852","impliedFormat":99},{"version":"42d790b95977358d889f7a229b5d6ddcdd0b349f3dc17f1fce23ed1981d627e9","impliedFormat":99},{"version":"61f587866ef1f487c3a8867926cd5f0d98052da7d4c374d23db8041086d56022","impliedFormat":99},{"version":"232cf2b08cd445b215cc34e8d7c3d942685deac6c335e2d6d5e3d3b450790fbe","impliedFormat":99},{"version":"16399c7ec44051bd6a1b0b5978c8eeadf92f92af2dd7ed92f4387d5402fd415b","impliedFormat":99},{"version":"7eccc5df9b04689731abffad3c85c330094f9385cc008af7b16e9bb684a01a81","impliedFormat":99},{"version":"c4dafacf7638b0b53ac6c0260e519a75700cf5e8e10f428980d3be0cf0bb5a43","impliedFormat":99},{"version":"a7252718aa03403a5bd897641ddfbd2c66874be55c5179bf960dbcb338332935","impliedFormat":99},{"version":"81bc54177adc5150443aa53fce811a6cd2fc68115de3a902938c9b11397b7b48","impliedFormat":99},{"version":"7e5098b7265fec8f1c07dfd86987713c004b6e9a89794b3fd53ae4e43b3a34a4","impliedFormat":99},{"version":"3792ab1424d2cc9fb3cea0a4532a989bd4648d5c0e3eec5ef0c0c2c789917639","impliedFormat":99},{"version":"ceb663d013c4ac93b76bc90aefaf643bb60fc47bf8d79a463c36c817788cab6b","impliedFormat":99},{"version":"be7dd117709b70c08c3dd3cad6db949b2add05c993965956aad087f28d0d4f1f","impliedFormat":99},{"version":"bb29fc63ec33f6ec97b45f8c80ed7f43108d33de088e1d2d3c3ad6fba8b07db9","impliedFormat":99},{"version":"ff8695b8c6fe2488fd76353671004ec63e8a87f3d82f35bdf55bdb5e304ee5ee","impliedFormat":99},{"version":"fb3663bfd2e5d316dbdd5210b0633a58cf1ec0c598735f9755d564e8dc0a7744","impliedFormat":99},{"version":"ae1bc79abc2d1b8cbc665ad296a21271359f8b9a591e62f868ac950e33b8adfb","impliedFormat":99},{"version":"2f41588912cfb2144c054c6841f22079faaf4d027b0c6372cb301cdcf996ca57","impliedFormat":99},{"version":"c48b92e464ec9eed3b29550d84f6ae59e072e7c5dfe1f4478739d730b02364b5","impliedFormat":99},{"version":"a3ee61aa8774ff2edc883442f88cd099324ac1941561cbedcc796a4e38f252aa","impliedFormat":99},{"version":"f4be38602c24316b0641a63db2c87edf760e1d07cb6c6f6101341eb60c0c36cb","impliedFormat":99},{"version":"5d73a3f0d5320a3d3ff77641407741c12192011a379ae8d4b487fbb5797950c1","impliedFormat":99},{"version":"c33414c55b8a3c3226672bd5b28267ea137ee8ae179765d637ec33a74ba6ecf2","impliedFormat":99},{"version":"79d6ace059374ba2d5ec4dabbea4e76568af5d32cad07996ad5476a057a299ec","impliedFormat":99},{"version":"01e68235fbff64c79c96de8c5f7127a51239beac5f644986fbb5557029512e4d","impliedFormat":99},{"version":"a1b9159487e86199143afa0f4594fec1168eeebe51459fc77a612cdc7f78fbb5","impliedFormat":99},{"version":"94ca152a91b6e52e515f7bea6cfb1d4ab55e461416cdb0fa3cf0a6a6f5c763d3","impliedFormat":99},{"version":"dee8a8603abae94cfa038ab6775bd8bc0d21081f9d1f0feb9880971be2dc10e4","impliedFormat":99},{"version":"bde3d9ee3993b92b21309fc76225337b74c1ea7a82b8752edbf1c2cd6648c314","impliedFormat":99},{"version":"9561ebbbd1a4ec60bbbd0e35311aaaa725e14911bca39011194ebe6274c55451","signature":"dce322762c7aaa63b937486a679b3bd07879dba1441b11969d8eb66fd4859b93","impliedFormat":99},{"version":"37c2a11511c5d061c22bd64c29e6e94b0f67508f371614e4d3b6be2e618b723d","impliedFormat":99},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"49a5a44f2e68241a1d2bd9ec894535797998841c09729e506a7cbfcaa40f2180","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"1ca84b44ad1d8e4576f24904d8b95dd23b94ea67e1575f89614ac90062fc67f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d586db0a09a9495ebb5dece28f54df9684bfbd6e1f568426ca153126dac4a40","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"567b7f607f400873151d7bc63a049514b53c3c00f5f56e9e95695d93b66a138e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"84c1930e33d1bb12ad01bcbe11d656f9646bd21b2fb2afd96e8e10615a021aef","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4b87f767c7bc841511113c876a6b8bf1fd0cb0b718c888ad84478b372ec486b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d04e3640dd9eb67f7f1e5bd3d0bf96c784666f7aefc8ac1537af6f2d38d4c29","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"2bf469abae4cc9c0f340d4e05d9d26e37f936f9c8ca8f007a6534f109dcc77e4","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ada07543808f3b967624645a8e1ccd446f8b01ade47842acf1328aec899fed0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4c21aaa8257d7950a5b75a251d9075b6a371208fc948c9c8402f6690ef3b5b55","impliedFormat":1},{"version":"b5895e6353a5d708f55d8685c38a235c3a6d8138e374dee8ceb8ffde5aa8002a","impliedFormat":1},{"version":"54c4f21f578864961efc94e8f42bc893a53509e886370ec7dd602e0151b9266c","impliedFormat":1},{"version":"de735eca2c51dd8b860254e9fdb6d9ec19fe402dfe597c23090841ce3937cfc5","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"5155da3047ef977944d791a2188ff6e6c225f6975cc1910ab7bb6838ab84cede","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"e16d218a30f6a6810b57f7e968124eaa08c7bb366133ea34bbf01e7cd6b8c0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb8692dea24c27821f77e397272d9ed2eda0b95e4a75beb0fdda31081d15a8ae","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"5b6844ad931dcc1d3aca53268f4bd671428421464b1286746027aede398094f2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"0dbcebe2126d03936c70545e96a6e41007cf065be38a1ce4d32a39fcedefead4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"461e54289e6287e8494a0178ba18182acce51a02bca8dea219149bf2cf96f105","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"e31e51c55800014d926e3f74208af49cb7352803619855c89296074d1ecbb524","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"dfb96ba5177b68003deec9e773c47257da5c4c8a74053d8956389d832df72002","affectsGlobalScope":true,"impliedFormat":1},{"version":"92d3070580cf72b4bb80959b7f16ede9a3f39e6f4ef2ac87cfa4561844fdc69f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3dffd70e6375b872f0b4e152de4ae682d762c61a24881ecc5eb9f04c5caf76f","impliedFormat":1},{"version":"613deebaec53731ff6b74fe1a89f094b708033db6396b601df3e6d5ab0ec0a47","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"e56eb632f0281c9f8210eb8c86cc4839a427a4ffffcfd2a5e40b956050b3e042","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"cac793cc47c29e26e4ac3601dcb00b4435ebed26203485790e44f2ad8b6ad847","impliedFormat":1}],"root":[61,80,116,117],"options":{"composite":true,"declarationMap":true,"emitDeclarationOnly":false,"emitDecoratorMetadata":true,"experimentalDecorators":true,"importHelpers":true,"module":199,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUnusedLocals":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./tsconfig.lib.tsbuildinfo"},"referencedMap":[[74,1],[72,2],[73,3],[115,4],[85,5],[86,6],[87,7],[88,5],[110,8],[109,9],[112,10],[113,11],[111,12],[114,13],[102,14],[106,15],[104,16],[100,17],[103,16],[105,18],[101,19],[99,17],[89,20],[98,21],[90,22],[92,23],[91,22],[94,22],[96,24],[93,25],[95,26],[97,27],[84,28],[107,5],[108,29],[81,20],[82,30],[83,31],[71,32],[70,5],[62,5],[66,5],[64,5],[67,33],[65,5],[68,5],[63,5],[69,5],[79,34],[76,35],[77,5],[75,20],[78,5],[117,36],[80,37],[116,38],[61,39],[163,40],[164,40],[165,41],[123,42],[166,43],[167,44],[168,45],[118,5],[121,46],[119,5],[120,5],[169,47],[170,48],[171,49],[172,50],[173,51],[174,52],[175,52],[177,5],[176,53],[178,54],[179,55],[180,56],[162,57],[122,5],[181,58],[182,59],[183,60],[215,61],[184,62],[185,63],[186,64],[187,65],[188,66],[189,67],[190,68],[191,69],[192,70],[193,71],[194,71],[195,72],[196,5],[197,73],[199,74],[198,75],[200,76],[201,77],[202,78],[203,79],[204,80],[205,81],[206,82],[207,83],[208,84],[209,85],[210,86],[211,87],[212,88],[213,89],[214,90],[124,5],[60,91],[59,5],[57,5],[58,5],[10,5],[12,5],[11,5],[2,5],[13,5],[14,5],[15,5],[16,5],[17,5],[18,5],[19,5],[20,5],[3,5],[21,5],[22,5],[4,5],[23,5],[27,5],[24,5],[25,5],[26,5],[28,5],[29,5],[30,5],[5,5],[31,5],[32,5],[33,5],[34,5],[6,5],[38,5],[35,5],[36,5],[37,5],[39,5],[7,5],[40,5],[45,5],[46,5],[41,5],[42,5],[43,5],[44,5],[8,5],[50,5],[47,5],[48,5],[49,5],[51,5],[9,5],[52,5],[53,5],[54,5],[56,5],[55,5],[1,5],[140,92],[150,93],[139,92],[160,94],[131,95],[130,96],[159,97],[153,98],[158,99],[133,100],[147,101],[132,102],[156,103],[128,104],[127,97],[157,105],[129,106],[134,107],[135,5],[138,107],[125,5],[161,108],[151,109],[142,110],[143,111],[145,112],[141,113],[144,114],[154,97],[136,115],[137,116],[146,117],[126,118],[149,109],[148,107],[152,5],[155,119]],"latestChangedDtsFile":"./lib/relay-input-provider.d.ts","version":"5.9.3"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lagless/relay-client",
|
|
3
|
+
"version": "0.0.33",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/ppauel/lagless",
|
|
8
|
+
"directory": "libs/relay-client"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"module": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": "./package.json",
|
|
16
|
+
".": {
|
|
17
|
+
"@lagless/source": "./src/index.ts",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js",
|
|
20
|
+
"default": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"nx": {
|
|
24
|
+
"sourceRoot": "libs/relay-client/src"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@swc/helpers": "~0.5.11",
|
|
28
|
+
"@lagless/core": "0.0.33",
|
|
29
|
+
"@lagless/binary": "0.0.33",
|
|
30
|
+
"@lagless/misc": "0.0.33",
|
|
31
|
+
"@lagless/net-wire": "0.0.33"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist",
|
|
35
|
+
"README.md"
|
|
36
|
+
],
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
}
|
|
40
|
+
}
|