nmarshall commited on
Commit
052e900
·
1 Parent(s): 066a44a

gameplay: port client command byte rewriting

Browse files
crates/urt-gameplay/src/bin/urt-client-processing.rs CHANGED
@@ -59,6 +59,32 @@ fn main() {
59
  out.route == ClientRoute::Continue
60
  );
61
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  _ => panic!("unknown policy"),
63
  }
64
  }
 
59
  out.route == ClientRoute::Continue
60
  );
61
  }
62
+ "command" => {
63
+ assert_eq!(w.len(), 13);
64
+ let mut state = CommandState {
65
+ angles: w[4..7].try_into().unwrap(),
66
+ saved: w[7..10].try_into().unwrap(),
67
+ buttons: w[10],
68
+ move_word: w[11],
69
+ };
70
+ rewrite_client_command(
71
+ &mut state,
72
+ CommandControl {
73
+ pause: w[0],
74
+ mode: w[1],
75
+ flags: w[2],
76
+ block: w[3],
77
+ },
78
+ );
79
+ println!(
80
+ r#"{{"angles":{},"saved":{},"buttons":{},"move_word":{},"command_time":{}}}"#,
81
+ list(&state.angles),
82
+ list(&state.saved),
83
+ state.buttons,
84
+ state.move_word,
85
+ w[12]
86
+ );
87
+ }
88
  _ => panic!("unknown policy"),
89
  }
90
  }
crates/urt-gameplay/src/client_processing.rs CHANGED
@@ -127,3 +127,91 @@ mod routing_tests {
127
  );
128
  }
129
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  );
128
  }
129
  }
130
+
131
+ #[derive(Clone, Copy, Debug, PartialEq, Eq)]
132
+ pub struct CommandState {
133
+ pub angles: [u32; 3],
134
+ pub saved: [u32; 3],
135
+ pub buttons: u32,
136
+ pub move_word: u32,
137
+ }
138
+ #[derive(Clone, Copy, Debug, PartialEq, Eq)]
139
+ pub struct CommandControl {
140
+ pub pause: u32,
141
+ pub mode: u32,
142
+ pub flags: u32,
143
+ pub block: u32,
144
+ }
145
+ /// Original154256: lock restores saved angles; otherwise refresh the saved copy.
146
+ /// Byte stores clear movement while preserving the adjacent low command byte.
147
+ pub fn rewrite_client_command(state: &mut CommandState, control: CommandControl) {
148
+ let locked = control.pause & 1 != 0 || control.mode == 10 && control.flags & 16 != 0;
149
+ if locked {
150
+ state.angles = state.saved;
151
+ } else {
152
+ state.saved = state.angles;
153
+ }
154
+ if locked || control.block != 0 {
155
+ state.buttons = 0;
156
+ state.move_word &= 255;
157
+ }
158
+ }
159
+ #[cfg(test)]
160
+ mod command_tests {
161
+ use super::*;
162
+ fn state() -> CommandState {
163
+ CommandState {
164
+ angles: [1, 2, 3],
165
+ saved: [4, 5, 6],
166
+ buttons: 7,
167
+ move_word: 0x807fff42,
168
+ }
169
+ }
170
+ #[test]
171
+ fn pause_bit_selection_and_angle_direction_are_preserved() {
172
+ let mut s = state();
173
+ rewrite_client_command(
174
+ &mut s,
175
+ CommandControl {
176
+ pause: 2,
177
+ mode: 0,
178
+ flags: 16,
179
+ block: 0,
180
+ },
181
+ );
182
+ assert_eq!(s.saved, [1, 2, 3]);
183
+ assert_eq!(s.move_word, 0x807fff42);
184
+ let mut s = state();
185
+ rewrite_client_command(
186
+ &mut s,
187
+ CommandControl {
188
+ pause: 1,
189
+ mode: 0,
190
+ flags: 0,
191
+ block: 0,
192
+ },
193
+ );
194
+ assert_eq!(s.angles, [4, 5, 6]);
195
+ assert_eq!(s.saved, [4, 5, 6]);
196
+ assert_eq!(s.move_word, 0x42);
197
+ assert_eq!(s.buttons, 0);
198
+ }
199
+ #[test]
200
+ fn server_override_masks_bytes_after_saving_angles() {
201
+ let mut s = state();
202
+ s.move_word = 0x010203ff;
203
+ rewrite_client_command(
204
+ &mut s,
205
+ CommandControl {
206
+ pause: 0,
207
+ mode: 0,
208
+ flags: 0,
209
+ block: 1,
210
+ },
211
+ );
212
+ assert_eq!(s.saved, [1, 2, 3]);
213
+ assert_eq!(s.angles, [1, 2, 3]);
214
+ assert_eq!(s.move_word, 255);
215
+ assert_eq!(s.buttons, 0);
216
+ }
217
+ }
docs/FINDINGS.md CHANGED
@@ -1885,3 +1885,5 @@ RE-974: Sixteen source154210-prefix paths recover intermission precedence, team3
1885
  RE-975: Rust matches16 source routing cases, preserving intermission precedence and spectator callback suppression. Typed effects carry source slot/command-time inputs and keep actual callback bodies outside this contract. Unit tests cover outer-gate precedence and spectator-word suppression without conflating normal clients with routed ones. [Evidence](research/RUST_CLIENT_ROUTING.md).
1886
 
1887
  RE-976: Forty-eight source command-rewrite cases recover pause-mask1 and mode10/client-mask16 locking, saved-angle restore versus update, and independent server override. Clearing bytes493..495 preserves the low byte492 and command timestamp; buttons clear separately. Other pause bits alone do not trigger this lock. Native later movement execution remains outside this fragment. [Evidence](research/QVM_CLIENT_COMMAND_REWRITE.md).
 
 
 
1885
  RE-975: Rust matches16 source routing cases, preserving intermission precedence and spectator callback suppression. Typed effects carry source slot/command-time inputs and keep actual callback bodies outside this contract. Unit tests cover outer-gate precedence and spectator-word suppression without conflating normal clients with routed ones. [Evidence](research/RUST_CLIENT_ROUTING.md).
1886
 
1887
  RE-976: Forty-eight source command-rewrite cases recover pause-mask1 and mode10/client-mask16 locking, saved-angle restore versus update, and independent server override. Clearing bytes493..495 preserves the low byte492 and command timestamp; buttons clear separately. Other pause bits alone do not trigger this lock. Native later movement execution remains outside this fragment. [Evidence](research/QVM_CLIENT_COMMAND_REWRITE.md).
1888
+
1889
+ RE-977: Rust matches48 source command rewrites, retaining pause-mask1 selection, mode10/client-mask16 locking, saved-angle direction and independent server masking. The low adjacent command byte survives clearing movement bytes, and command time is not modified by this API. Unit tests cover non-locking pause bits, angle restore/save order and low-byte preservation. [Evidence](research/RUST_CLIENT_COMMAND_REWRITE.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -1939,3 +1939,5 @@ RE-964–973 completed timer deadline/phase/recovery contracts, whole-body compo
1939
  - [x] RE-975 Rust early client routing with captured callbacks ([evidence](research/RUST_CLIENT_ROUTING.md)).
1940
 
1941
  - [x] RE-976 Original command angle preservation and movement-byte masking ([evidence](research/QVM_CLIENT_COMMAND_REWRITE.md)).
 
 
 
1939
  - [x] RE-975 Rust early client routing with captured callbacks ([evidence](research/RUST_CLIENT_ROUTING.md)).
1940
 
1941
  - [x] RE-976 Original command angle preservation and movement-byte masking ([evidence](research/QVM_CLIENT_COMMAND_REWRITE.md)).
1942
+
1943
+ - [x] RE-977 Rust client command rewriting and byte preservation ([evidence](research/RUST_CLIENT_COMMAND_REWRITE.md)).
docs/RESEARCH_LEDGER.md CHANGED
@@ -2577,3 +2577,7 @@ Rust matches16 source routing cases, preserving intermission precedence and spec
2577
  ## 2026-10-28 — RE-976 Original command angle preservation and movement-byte masking
2578
 
2579
  Forty-eight source command-rewrite cases recover pause-mask1 and mode10/client-mask16 locking, saved-angle restore versus update, and independent server override. Clearing bytes493..495 preserves the low byte492 and command timestamp; buttons clear separately. Other pause bits alone do not trigger this lock. Native later movement execution remains outside this fragment. Focused `cargo xtask test-group qvm-client-command-rewrite` passes with deterministic report regeneration, relevant regressions and storage/documentation/whitespace checks. Full suite deferred to the tenth-commit boundary. Original assets unchanged; native IO effects remain captured.
 
 
 
 
 
2577
  ## 2026-10-28 — RE-976 Original command angle preservation and movement-byte masking
2578
 
2579
  Forty-eight source command-rewrite cases recover pause-mask1 and mode10/client-mask16 locking, saved-angle restore versus update, and independent server override. Clearing bytes493..495 preserves the low byte492 and command timestamp; buttons clear separately. Other pause bits alone do not trigger this lock. Native later movement execution remains outside this fragment. Focused `cargo xtask test-group qvm-client-command-rewrite` passes with deterministic report regeneration, relevant regressions and storage/documentation/whitespace checks. Full suite deferred to the tenth-commit boundary. Original assets unchanged; native IO effects remain captured.
2580
+
2581
+ ## 2026-10-28 — RE-977 Rust client command rewriting and byte preservation
2582
+
2583
+ Rust matches48 source command rewrites, retaining pause-mask1 selection, mode10/client-mask16 locking, saved-angle direction and independent server masking. The low adjacent command byte survives clearing movement bytes, and command time is not modified by this API. Unit tests cover non-locking pause bits, angle restore/save order and low-byte preservation. Focused `cargo xtask test-group rust-client-command-rewrite` passes with deterministic report regeneration, relevant regressions and storage/documentation/whitespace checks. Full suite deferred to the tenth-commit boundary. Original assets unchanged; native IO effects remain captured.
docs/REVERSE_ENGINEERING_TODO.md CHANGED
@@ -1976,3 +1976,5 @@ RE-964–973 recover the complete bounded timer body and its caller timing prefi
1976
  - [x] RE-975 Rust early client routing with captured callbacks ([evidence](research/RUST_CLIENT_ROUTING.md)).
1977
 
1978
  - [x] RE-976 Original command angle preservation and movement-byte masking ([evidence](research/QVM_CLIENT_COMMAND_REWRITE.md)).
 
 
 
1976
  - [x] RE-975 Rust early client routing with captured callbacks ([evidence](research/RUST_CLIENT_ROUTING.md)).
1977
 
1978
  - [x] RE-976 Original command angle preservation and movement-byte masking ([evidence](research/QVM_CLIENT_COMMAND_REWRITE.md)).
1979
+
1980
+ - [x] RE-977 Rust client command rewriting and byte preservation ([evidence](research/RUST_CLIENT_COMMAND_REWRITE.md)).
docs/research/README.md CHANGED
@@ -1511,3 +1511,5 @@ The extension collector adds five focused tests for native tail calls, command-r
1511
  - [RE-975: Rust early client routing with captured callbacks](RUST_CLIENT_ROUTING.md).
1512
 
1513
  - [RE-976: Original command angle preservation and movement-byte masking](QVM_CLIENT_COMMAND_REWRITE.md).
 
 
 
1511
  - [RE-975: Rust early client routing with captured callbacks](RUST_CLIENT_ROUTING.md).
1512
 
1513
  - [RE-976: Original command angle preservation and movement-byte masking](QVM_CLIENT_COMMAND_REWRITE.md).
1514
+
1515
+ - [RE-977: Rust client command rewriting and byte preservation](RUST_CLIENT_COMMAND_REWRITE.md).
docs/research/RUST_CLIENT_COMMAND_REWRITE.md ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # Rust client command rewriting and byte preservation
2
+
3
+ RE-977. Focused validation: `cargo xtask test-group rust-client-command-rewrite`. [Machine report](rust-client-command-rewrite.json).
4
+
5
+ Rust matches48 source command rewrites, retaining pause-mask1 selection, mode10/client-mask16 locking, saved-angle direction and independent server masking. The low adjacent command byte survives clearing movement bytes, and command time is not modified by this API. Unit tests cover non-locking pause bits, angle restore/save order and low-byte preservation.
docs/research/rust-client-command-rewrite.json ADDED
@@ -0,0 +1,1543 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "limits": "Finite source/Rust contract parity; native time/file/network replies remain supplied or captured.",
3
+ "probes": [
4
+ {
5
+ "rust": {
6
+ "angles": [
7
+ 2864434397,
8
+ 2147483647,
9
+ 7
10
+ ],
11
+ "buttons": 305419896,
12
+ "command_time": 12345,
13
+ "move_word": 2155872066,
14
+ "saved": [
15
+ 2864434397,
16
+ 2147483647,
17
+ 7
18
+ ]
19
+ },
20
+ "source": {
21
+ "angles": [
22
+ 2864434397,
23
+ 2147483647,
24
+ 7
25
+ ],
26
+ "buttons": 305419896,
27
+ "command_time": 12345,
28
+ "move_word": 2155872066,
29
+ "saved": [
30
+ 2864434397,
31
+ 2147483647,
32
+ 7
33
+ ]
34
+ }
35
+ },
36
+ {
37
+ "rust": {
38
+ "angles": [
39
+ 2864434397,
40
+ 2147483647,
41
+ 7
42
+ ],
43
+ "buttons": 305419896,
44
+ "command_time": 12345,
45
+ "move_word": 16909311,
46
+ "saved": [
47
+ 2864434397,
48
+ 2147483647,
49
+ 7
50
+ ]
51
+ },
52
+ "source": {
53
+ "angles": [
54
+ 2864434397,
55
+ 2147483647,
56
+ 7
57
+ ],
58
+ "buttons": 305419896,
59
+ "command_time": 12345,
60
+ "move_word": 16909311,
61
+ "saved": [
62
+ 2864434397,
63
+ 2147483647,
64
+ 7
65
+ ]
66
+ }
67
+ },
68
+ {
69
+ "rust": {
70
+ "angles": [
71
+ 2864434397,
72
+ 2147483647,
73
+ 7
74
+ ],
75
+ "buttons": 0,
76
+ "command_time": 12345,
77
+ "move_word": 66,
78
+ "saved": [
79
+ 2864434397,
80
+ 2147483647,
81
+ 7
82
+ ]
83
+ },
84
+ "source": {
85
+ "angles": [
86
+ 2864434397,
87
+ 2147483647,
88
+ 7
89
+ ],
90
+ "buttons": 0,
91
+ "command_time": 12345,
92
+ "move_word": 66,
93
+ "saved": [
94
+ 2864434397,
95
+ 2147483647,
96
+ 7
97
+ ]
98
+ }
99
+ },
100
+ {
101
+ "rust": {
102
+ "angles": [
103
+ 2864434397,
104
+ 2147483647,
105
+ 7
106
+ ],
107
+ "buttons": 0,
108
+ "command_time": 12345,
109
+ "move_word": 255,
110
+ "saved": [
111
+ 2864434397,
112
+ 2147483647,
113
+ 7
114
+ ]
115
+ },
116
+ "source": {
117
+ "angles": [
118
+ 2864434397,
119
+ 2147483647,
120
+ 7
121
+ ],
122
+ "buttons": 0,
123
+ "command_time": 12345,
124
+ "move_word": 255,
125
+ "saved": [
126
+ 2864434397,
127
+ 2147483647,
128
+ 7
129
+ ]
130
+ }
131
+ },
132
+ {
133
+ "rust": {
134
+ "angles": [
135
+ 2864434397,
136
+ 2147483647,
137
+ 7
138
+ ],
139
+ "buttons": 305419896,
140
+ "command_time": 12345,
141
+ "move_word": 2155872066,
142
+ "saved": [
143
+ 2864434397,
144
+ 2147483647,
145
+ 7
146
+ ]
147
+ },
148
+ "source": {
149
+ "angles": [
150
+ 2864434397,
151
+ 2147483647,
152
+ 7
153
+ ],
154
+ "buttons": 305419896,
155
+ "command_time": 12345,
156
+ "move_word": 2155872066,
157
+ "saved": [
158
+ 2864434397,
159
+ 2147483647,
160
+ 7
161
+ ]
162
+ }
163
+ },
164
+ {
165
+ "rust": {
166
+ "angles": [
167
+ 2864434397,
168
+ 2147483647,
169
+ 7
170
+ ],
171
+ "buttons": 305419896,
172
+ "command_time": 12345,
173
+ "move_word": 16909311,
174
+ "saved": [
175
+ 2864434397,
176
+ 2147483647,
177
+ 7
178
+ ]
179
+ },
180
+ "source": {
181
+ "angles": [
182
+ 2864434397,
183
+ 2147483647,
184
+ 7
185
+ ],
186
+ "buttons": 305419896,
187
+ "command_time": 12345,
188
+ "move_word": 16909311,
189
+ "saved": [
190
+ 2864434397,
191
+ 2147483647,
192
+ 7
193
+ ]
194
+ }
195
+ },
196
+ {
197
+ "rust": {
198
+ "angles": [
199
+ 2864434397,
200
+ 2147483647,
201
+ 7
202
+ ],
203
+ "buttons": 0,
204
+ "command_time": 12345,
205
+ "move_word": 66,
206
+ "saved": [
207
+ 2864434397,
208
+ 2147483647,
209
+ 7
210
+ ]
211
+ },
212
+ "source": {
213
+ "angles": [
214
+ 2864434397,
215
+ 2147483647,
216
+ 7
217
+ ],
218
+ "buttons": 0,
219
+ "command_time": 12345,
220
+ "move_word": 66,
221
+ "saved": [
222
+ 2864434397,
223
+ 2147483647,
224
+ 7
225
+ ]
226
+ }
227
+ },
228
+ {
229
+ "rust": {
230
+ "angles": [
231
+ 2864434397,
232
+ 2147483647,
233
+ 7
234
+ ],
235
+ "buttons": 0,
236
+ "command_time": 12345,
237
+ "move_word": 255,
238
+ "saved": [
239
+ 2864434397,
240
+ 2147483647,
241
+ 7
242
+ ]
243
+ },
244
+ "source": {
245
+ "angles": [
246
+ 2864434397,
247
+ 2147483647,
248
+ 7
249
+ ],
250
+ "buttons": 0,
251
+ "command_time": 12345,
252
+ "move_word": 255,
253
+ "saved": [
254
+ 2864434397,
255
+ 2147483647,
256
+ 7
257
+ ]
258
+ }
259
+ },
260
+ {
261
+ "rust": {
262
+ "angles": [
263
+ 2864434397,
264
+ 2147483647,
265
+ 7
266
+ ],
267
+ "buttons": 305419896,
268
+ "command_time": 12345,
269
+ "move_word": 2155872066,
270
+ "saved": [
271
+ 2864434397,
272
+ 2147483647,
273
+ 7
274
+ ]
275
+ },
276
+ "source": {
277
+ "angles": [
278
+ 2864434397,
279
+ 2147483647,
280
+ 7
281
+ ],
282
+ "buttons": 305419896,
283
+ "command_time": 12345,
284
+ "move_word": 2155872066,
285
+ "saved": [
286
+ 2864434397,
287
+ 2147483647,
288
+ 7
289
+ ]
290
+ }
291
+ },
292
+ {
293
+ "rust": {
294
+ "angles": [
295
+ 2864434397,
296
+ 2147483647,
297
+ 7
298
+ ],
299
+ "buttons": 305419896,
300
+ "command_time": 12345,
301
+ "move_word": 16909311,
302
+ "saved": [
303
+ 2864434397,
304
+ 2147483647,
305
+ 7
306
+ ]
307
+ },
308
+ "source": {
309
+ "angles": [
310
+ 2864434397,
311
+ 2147483647,
312
+ 7
313
+ ],
314
+ "buttons": 305419896,
315
+ "command_time": 12345,
316
+ "move_word": 16909311,
317
+ "saved": [
318
+ 2864434397,
319
+ 2147483647,
320
+ 7
321
+ ]
322
+ }
323
+ },
324
+ {
325
+ "rust": {
326
+ "angles": [
327
+ 2864434397,
328
+ 2147483647,
329
+ 7
330
+ ],
331
+ "buttons": 0,
332
+ "command_time": 12345,
333
+ "move_word": 66,
334
+ "saved": [
335
+ 2864434397,
336
+ 2147483647,
337
+ 7
338
+ ]
339
+ },
340
+ "source": {
341
+ "angles": [
342
+ 2864434397,
343
+ 2147483647,
344
+ 7
345
+ ],
346
+ "buttons": 0,
347
+ "command_time": 12345,
348
+ "move_word": 66,
349
+ "saved": [
350
+ 2864434397,
351
+ 2147483647,
352
+ 7
353
+ ]
354
+ }
355
+ },
356
+ {
357
+ "rust": {
358
+ "angles": [
359
+ 2864434397,
360
+ 2147483647,
361
+ 7
362
+ ],
363
+ "buttons": 0,
364
+ "command_time": 12345,
365
+ "move_word": 255,
366
+ "saved": [
367
+ 2864434397,
368
+ 2147483647,
369
+ 7
370
+ ]
371
+ },
372
+ "source": {
373
+ "angles": [
374
+ 2864434397,
375
+ 2147483647,
376
+ 7
377
+ ],
378
+ "buttons": 0,
379
+ "command_time": 12345,
380
+ "move_word": 255,
381
+ "saved": [
382
+ 2864434397,
383
+ 2147483647,
384
+ 7
385
+ ]
386
+ }
387
+ },
388
+ {
389
+ "rust": {
390
+ "angles": [
391
+ 287454020,
392
+ 2147483648,
393
+ 4294967295
394
+ ],
395
+ "buttons": 0,
396
+ "command_time": 12345,
397
+ "move_word": 66,
398
+ "saved": [
399
+ 287454020,
400
+ 2147483648,
401
+ 4294967295
402
+ ]
403
+ },
404
+ "source": {
405
+ "angles": [
406
+ 287454020,
407
+ 2147483648,
408
+ 4294967295
409
+ ],
410
+ "buttons": 0,
411
+ "command_time": 12345,
412
+ "move_word": 66,
413
+ "saved": [
414
+ 287454020,
415
+ 2147483648,
416
+ 4294967295
417
+ ]
418
+ }
419
+ },
420
+ {
421
+ "rust": {
422
+ "angles": [
423
+ 287454020,
424
+ 2147483648,
425
+ 4294967295
426
+ ],
427
+ "buttons": 0,
428
+ "command_time": 12345,
429
+ "move_word": 255,
430
+ "saved": [
431
+ 287454020,
432
+ 2147483648,
433
+ 4294967295
434
+ ]
435
+ },
436
+ "source": {
437
+ "angles": [
438
+ 287454020,
439
+ 2147483648,
440
+ 4294967295
441
+ ],
442
+ "buttons": 0,
443
+ "command_time": 12345,
444
+ "move_word": 255,
445
+ "saved": [
446
+ 287454020,
447
+ 2147483648,
448
+ 4294967295
449
+ ]
450
+ }
451
+ },
452
+ {
453
+ "rust": {
454
+ "angles": [
455
+ 287454020,
456
+ 2147483648,
457
+ 4294967295
458
+ ],
459
+ "buttons": 0,
460
+ "command_time": 12345,
461
+ "move_word": 66,
462
+ "saved": [
463
+ 287454020,
464
+ 2147483648,
465
+ 4294967295
466
+ ]
467
+ },
468
+ "source": {
469
+ "angles": [
470
+ 287454020,
471
+ 2147483648,
472
+ 4294967295
473
+ ],
474
+ "buttons": 0,
475
+ "command_time": 12345,
476
+ "move_word": 66,
477
+ "saved": [
478
+ 287454020,
479
+ 2147483648,
480
+ 4294967295
481
+ ]
482
+ }
483
+ },
484
+ {
485
+ "rust": {
486
+ "angles": [
487
+ 287454020,
488
+ 2147483648,
489
+ 4294967295
490
+ ],
491
+ "buttons": 0,
492
+ "command_time": 12345,
493
+ "move_word": 255,
494
+ "saved": [
495
+ 287454020,
496
+ 2147483648,
497
+ 4294967295
498
+ ]
499
+ },
500
+ "source": {
501
+ "angles": [
502
+ 287454020,
503
+ 2147483648,
504
+ 4294967295
505
+ ],
506
+ "buttons": 0,
507
+ "command_time": 12345,
508
+ "move_word": 255,
509
+ "saved": [
510
+ 287454020,
511
+ 2147483648,
512
+ 4294967295
513
+ ]
514
+ }
515
+ },
516
+ {
517
+ "rust": {
518
+ "angles": [
519
+ 287454020,
520
+ 2147483648,
521
+ 4294967295
522
+ ],
523
+ "buttons": 0,
524
+ "command_time": 12345,
525
+ "move_word": 66,
526
+ "saved": [
527
+ 287454020,
528
+ 2147483648,
529
+ 4294967295
530
+ ]
531
+ },
532
+ "source": {
533
+ "angles": [
534
+ 287454020,
535
+ 2147483648,
536
+ 4294967295
537
+ ],
538
+ "buttons": 0,
539
+ "command_time": 12345,
540
+ "move_word": 66,
541
+ "saved": [
542
+ 287454020,
543
+ 2147483648,
544
+ 4294967295
545
+ ]
546
+ }
547
+ },
548
+ {
549
+ "rust": {
550
+ "angles": [
551
+ 287454020,
552
+ 2147483648,
553
+ 4294967295
554
+ ],
555
+ "buttons": 0,
556
+ "command_time": 12345,
557
+ "move_word": 255,
558
+ "saved": [
559
+ 287454020,
560
+ 2147483648,
561
+ 4294967295
562
+ ]
563
+ },
564
+ "source": {
565
+ "angles": [
566
+ 287454020,
567
+ 2147483648,
568
+ 4294967295
569
+ ],
570
+ "buttons": 0,
571
+ "command_time": 12345,
572
+ "move_word": 255,
573
+ "saved": [
574
+ 287454020,
575
+ 2147483648,
576
+ 4294967295
577
+ ]
578
+ }
579
+ },
580
+ {
581
+ "rust": {
582
+ "angles": [
583
+ 287454020,
584
+ 2147483648,
585
+ 4294967295
586
+ ],
587
+ "buttons": 0,
588
+ "command_time": 12345,
589
+ "move_word": 66,
590
+ "saved": [
591
+ 287454020,
592
+ 2147483648,
593
+ 4294967295
594
+ ]
595
+ },
596
+ "source": {
597
+ "angles": [
598
+ 287454020,
599
+ 2147483648,
600
+ 4294967295
601
+ ],
602
+ "buttons": 0,
603
+ "command_time": 12345,
604
+ "move_word": 66,
605
+ "saved": [
606
+ 287454020,
607
+ 2147483648,
608
+ 4294967295
609
+ ]
610
+ }
611
+ },
612
+ {
613
+ "rust": {
614
+ "angles": [
615
+ 287454020,
616
+ 2147483648,
617
+ 4294967295
618
+ ],
619
+ "buttons": 0,
620
+ "command_time": 12345,
621
+ "move_word": 255,
622
+ "saved": [
623
+ 287454020,
624
+ 2147483648,
625
+ 4294967295
626
+ ]
627
+ },
628
+ "source": {
629
+ "angles": [
630
+ 287454020,
631
+ 2147483648,
632
+ 4294967295
633
+ ],
634
+ "buttons": 0,
635
+ "command_time": 12345,
636
+ "move_word": 255,
637
+ "saved": [
638
+ 287454020,
639
+ 2147483648,
640
+ 4294967295
641
+ ]
642
+ }
643
+ },
644
+ {
645
+ "rust": {
646
+ "angles": [
647
+ 287454020,
648
+ 2147483648,
649
+ 4294967295
650
+ ],
651
+ "buttons": 0,
652
+ "command_time": 12345,
653
+ "move_word": 66,
654
+ "saved": [
655
+ 287454020,
656
+ 2147483648,
657
+ 4294967295
658
+ ]
659
+ },
660
+ "source": {
661
+ "angles": [
662
+ 287454020,
663
+ 2147483648,
664
+ 4294967295
665
+ ],
666
+ "buttons": 0,
667
+ "command_time": 12345,
668
+ "move_word": 66,
669
+ "saved": [
670
+ 287454020,
671
+ 2147483648,
672
+ 4294967295
673
+ ]
674
+ }
675
+ },
676
+ {
677
+ "rust": {
678
+ "angles": [
679
+ 287454020,
680
+ 2147483648,
681
+ 4294967295
682
+ ],
683
+ "buttons": 0,
684
+ "command_time": 12345,
685
+ "move_word": 255,
686
+ "saved": [
687
+ 287454020,
688
+ 2147483648,
689
+ 4294967295
690
+ ]
691
+ },
692
+ "source": {
693
+ "angles": [
694
+ 287454020,
695
+ 2147483648,
696
+ 4294967295
697
+ ],
698
+ "buttons": 0,
699
+ "command_time": 12345,
700
+ "move_word": 255,
701
+ "saved": [
702
+ 287454020,
703
+ 2147483648,
704
+ 4294967295
705
+ ]
706
+ }
707
+ },
708
+ {
709
+ "rust": {
710
+ "angles": [
711
+ 287454020,
712
+ 2147483648,
713
+ 4294967295
714
+ ],
715
+ "buttons": 0,
716
+ "command_time": 12345,
717
+ "move_word": 66,
718
+ "saved": [
719
+ 287454020,
720
+ 2147483648,
721
+ 4294967295
722
+ ]
723
+ },
724
+ "source": {
725
+ "angles": [
726
+ 287454020,
727
+ 2147483648,
728
+ 4294967295
729
+ ],
730
+ "buttons": 0,
731
+ "command_time": 12345,
732
+ "move_word": 66,
733
+ "saved": [
734
+ 287454020,
735
+ 2147483648,
736
+ 4294967295
737
+ ]
738
+ }
739
+ },
740
+ {
741
+ "rust": {
742
+ "angles": [
743
+ 287454020,
744
+ 2147483648,
745
+ 4294967295
746
+ ],
747
+ "buttons": 0,
748
+ "command_time": 12345,
749
+ "move_word": 255,
750
+ "saved": [
751
+ 287454020,
752
+ 2147483648,
753
+ 4294967295
754
+ ]
755
+ },
756
+ "source": {
757
+ "angles": [
758
+ 287454020,
759
+ 2147483648,
760
+ 4294967295
761
+ ],
762
+ "buttons": 0,
763
+ "command_time": 12345,
764
+ "move_word": 255,
765
+ "saved": [
766
+ 287454020,
767
+ 2147483648,
768
+ 4294967295
769
+ ]
770
+ }
771
+ },
772
+ {
773
+ "rust": {
774
+ "angles": [
775
+ 287454020,
776
+ 2147483648,
777
+ 4294967295
778
+ ],
779
+ "buttons": 0,
780
+ "command_time": 12345,
781
+ "move_word": 66,
782
+ "saved": [
783
+ 287454020,
784
+ 2147483648,
785
+ 4294967295
786
+ ]
787
+ },
788
+ "source": {
789
+ "angles": [
790
+ 287454020,
791
+ 2147483648,
792
+ 4294967295
793
+ ],
794
+ "buttons": 0,
795
+ "command_time": 12345,
796
+ "move_word": 66,
797
+ "saved": [
798
+ 287454020,
799
+ 2147483648,
800
+ 4294967295
801
+ ]
802
+ }
803
+ },
804
+ {
805
+ "rust": {
806
+ "angles": [
807
+ 287454020,
808
+ 2147483648,
809
+ 4294967295
810
+ ],
811
+ "buttons": 0,
812
+ "command_time": 12345,
813
+ "move_word": 255,
814
+ "saved": [
815
+ 287454020,
816
+ 2147483648,
817
+ 4294967295
818
+ ]
819
+ },
820
+ "source": {
821
+ "angles": [
822
+ 287454020,
823
+ 2147483648,
824
+ 4294967295
825
+ ],
826
+ "buttons": 0,
827
+ "command_time": 12345,
828
+ "move_word": 255,
829
+ "saved": [
830
+ 287454020,
831
+ 2147483648,
832
+ 4294967295
833
+ ]
834
+ }
835
+ },
836
+ {
837
+ "rust": {
838
+ "angles": [
839
+ 287454020,
840
+ 2147483648,
841
+ 4294967295
842
+ ],
843
+ "buttons": 0,
844
+ "command_time": 12345,
845
+ "move_word": 66,
846
+ "saved": [
847
+ 287454020,
848
+ 2147483648,
849
+ 4294967295
850
+ ]
851
+ },
852
+ "source": {
853
+ "angles": [
854
+ 287454020,
855
+ 2147483648,
856
+ 4294967295
857
+ ],
858
+ "buttons": 0,
859
+ "command_time": 12345,
860
+ "move_word": 66,
861
+ "saved": [
862
+ 287454020,
863
+ 2147483648,
864
+ 4294967295
865
+ ]
866
+ }
867
+ },
868
+ {
869
+ "rust": {
870
+ "angles": [
871
+ 287454020,
872
+ 2147483648,
873
+ 4294967295
874
+ ],
875
+ "buttons": 0,
876
+ "command_time": 12345,
877
+ "move_word": 255,
878
+ "saved": [
879
+ 287454020,
880
+ 2147483648,
881
+ 4294967295
882
+ ]
883
+ },
884
+ "source": {
885
+ "angles": [
886
+ 287454020,
887
+ 2147483648,
888
+ 4294967295
889
+ ],
890
+ "buttons": 0,
891
+ "command_time": 12345,
892
+ "move_word": 255,
893
+ "saved": [
894
+ 287454020,
895
+ 2147483648,
896
+ 4294967295
897
+ ]
898
+ }
899
+ },
900
+ {
901
+ "rust": {
902
+ "angles": [
903
+ 287454020,
904
+ 2147483648,
905
+ 4294967295
906
+ ],
907
+ "buttons": 0,
908
+ "command_time": 12345,
909
+ "move_word": 66,
910
+ "saved": [
911
+ 287454020,
912
+ 2147483648,
913
+ 4294967295
914
+ ]
915
+ },
916
+ "source": {
917
+ "angles": [
918
+ 287454020,
919
+ 2147483648,
920
+ 4294967295
921
+ ],
922
+ "buttons": 0,
923
+ "command_time": 12345,
924
+ "move_word": 66,
925
+ "saved": [
926
+ 287454020,
927
+ 2147483648,
928
+ 4294967295
929
+ ]
930
+ }
931
+ },
932
+ {
933
+ "rust": {
934
+ "angles": [
935
+ 287454020,
936
+ 2147483648,
937
+ 4294967295
938
+ ],
939
+ "buttons": 0,
940
+ "command_time": 12345,
941
+ "move_word": 255,
942
+ "saved": [
943
+ 287454020,
944
+ 2147483648,
945
+ 4294967295
946
+ ]
947
+ },
948
+ "source": {
949
+ "angles": [
950
+ 287454020,
951
+ 2147483648,
952
+ 4294967295
953
+ ],
954
+ "buttons": 0,
955
+ "command_time": 12345,
956
+ "move_word": 255,
957
+ "saved": [
958
+ 287454020,
959
+ 2147483648,
960
+ 4294967295
961
+ ]
962
+ }
963
+ },
964
+ {
965
+ "rust": {
966
+ "angles": [
967
+ 287454020,
968
+ 2147483648,
969
+ 4294967295
970
+ ],
971
+ "buttons": 0,
972
+ "command_time": 12345,
973
+ "move_word": 66,
974
+ "saved": [
975
+ 287454020,
976
+ 2147483648,
977
+ 4294967295
978
+ ]
979
+ },
980
+ "source": {
981
+ "angles": [
982
+ 287454020,
983
+ 2147483648,
984
+ 4294967295
985
+ ],
986
+ "buttons": 0,
987
+ "command_time": 12345,
988
+ "move_word": 66,
989
+ "saved": [
990
+ 287454020,
991
+ 2147483648,
992
+ 4294967295
993
+ ]
994
+ }
995
+ },
996
+ {
997
+ "rust": {
998
+ "angles": [
999
+ 287454020,
1000
+ 2147483648,
1001
+ 4294967295
1002
+ ],
1003
+ "buttons": 0,
1004
+ "command_time": 12345,
1005
+ "move_word": 255,
1006
+ "saved": [
1007
+ 287454020,
1008
+ 2147483648,
1009
+ 4294967295
1010
+ ]
1011
+ },
1012
+ "source": {
1013
+ "angles": [
1014
+ 287454020,
1015
+ 2147483648,
1016
+ 4294967295
1017
+ ],
1018
+ "buttons": 0,
1019
+ "command_time": 12345,
1020
+ "move_word": 255,
1021
+ "saved": [
1022
+ 287454020,
1023
+ 2147483648,
1024
+ 4294967295
1025
+ ]
1026
+ }
1027
+ },
1028
+ {
1029
+ "rust": {
1030
+ "angles": [
1031
+ 2864434397,
1032
+ 2147483647,
1033
+ 7
1034
+ ],
1035
+ "buttons": 305419896,
1036
+ "command_time": 12345,
1037
+ "move_word": 2155872066,
1038
+ "saved": [
1039
+ 2864434397,
1040
+ 2147483647,
1041
+ 7
1042
+ ]
1043
+ },
1044
+ "source": {
1045
+ "angles": [
1046
+ 2864434397,
1047
+ 2147483647,
1048
+ 7
1049
+ ],
1050
+ "buttons": 305419896,
1051
+ "command_time": 12345,
1052
+ "move_word": 2155872066,
1053
+ "saved": [
1054
+ 2864434397,
1055
+ 2147483647,
1056
+ 7
1057
+ ]
1058
+ }
1059
+ },
1060
+ {
1061
+ "rust": {
1062
+ "angles": [
1063
+ 2864434397,
1064
+ 2147483647,
1065
+ 7
1066
+ ],
1067
+ "buttons": 305419896,
1068
+ "command_time": 12345,
1069
+ "move_word": 16909311,
1070
+ "saved": [
1071
+ 2864434397,
1072
+ 2147483647,
1073
+ 7
1074
+ ]
1075
+ },
1076
+ "source": {
1077
+ "angles": [
1078
+ 2864434397,
1079
+ 2147483647,
1080
+ 7
1081
+ ],
1082
+ "buttons": 305419896,
1083
+ "command_time": 12345,
1084
+ "move_word": 16909311,
1085
+ "saved": [
1086
+ 2864434397,
1087
+ 2147483647,
1088
+ 7
1089
+ ]
1090
+ }
1091
+ },
1092
+ {
1093
+ "rust": {
1094
+ "angles": [
1095
+ 2864434397,
1096
+ 2147483647,
1097
+ 7
1098
+ ],
1099
+ "buttons": 0,
1100
+ "command_time": 12345,
1101
+ "move_word": 66,
1102
+ "saved": [
1103
+ 2864434397,
1104
+ 2147483647,
1105
+ 7
1106
+ ]
1107
+ },
1108
+ "source": {
1109
+ "angles": [
1110
+ 2864434397,
1111
+ 2147483647,
1112
+ 7
1113
+ ],
1114
+ "buttons": 0,
1115
+ "command_time": 12345,
1116
+ "move_word": 66,
1117
+ "saved": [
1118
+ 2864434397,
1119
+ 2147483647,
1120
+ 7
1121
+ ]
1122
+ }
1123
+ },
1124
+ {
1125
+ "rust": {
1126
+ "angles": [
1127
+ 2864434397,
1128
+ 2147483647,
1129
+ 7
1130
+ ],
1131
+ "buttons": 0,
1132
+ "command_time": 12345,
1133
+ "move_word": 255,
1134
+ "saved": [
1135
+ 2864434397,
1136
+ 2147483647,
1137
+ 7
1138
+ ]
1139
+ },
1140
+ "source": {
1141
+ "angles": [
1142
+ 2864434397,
1143
+ 2147483647,
1144
+ 7
1145
+ ],
1146
+ "buttons": 0,
1147
+ "command_time": 12345,
1148
+ "move_word": 255,
1149
+ "saved": [
1150
+ 2864434397,
1151
+ 2147483647,
1152
+ 7
1153
+ ]
1154
+ }
1155
+ },
1156
+ {
1157
+ "rust": {
1158
+ "angles": [
1159
+ 2864434397,
1160
+ 2147483647,
1161
+ 7
1162
+ ],
1163
+ "buttons": 305419896,
1164
+ "command_time": 12345,
1165
+ "move_word": 2155872066,
1166
+ "saved": [
1167
+ 2864434397,
1168
+ 2147483647,
1169
+ 7
1170
+ ]
1171
+ },
1172
+ "source": {
1173
+ "angles": [
1174
+ 2864434397,
1175
+ 2147483647,
1176
+ 7
1177
+ ],
1178
+ "buttons": 305419896,
1179
+ "command_time": 12345,
1180
+ "move_word": 2155872066,
1181
+ "saved": [
1182
+ 2864434397,
1183
+ 2147483647,
1184
+ 7
1185
+ ]
1186
+ }
1187
+ },
1188
+ {
1189
+ "rust": {
1190
+ "angles": [
1191
+ 2864434397,
1192
+ 2147483647,
1193
+ 7
1194
+ ],
1195
+ "buttons": 305419896,
1196
+ "command_time": 12345,
1197
+ "move_word": 16909311,
1198
+ "saved": [
1199
+ 2864434397,
1200
+ 2147483647,
1201
+ 7
1202
+ ]
1203
+ },
1204
+ "source": {
1205
+ "angles": [
1206
+ 2864434397,
1207
+ 2147483647,
1208
+ 7
1209
+ ],
1210
+ "buttons": 305419896,
1211
+ "command_time": 12345,
1212
+ "move_word": 16909311,
1213
+ "saved": [
1214
+ 2864434397,
1215
+ 2147483647,
1216
+ 7
1217
+ ]
1218
+ }
1219
+ },
1220
+ {
1221
+ "rust": {
1222
+ "angles": [
1223
+ 2864434397,
1224
+ 2147483647,
1225
+ 7
1226
+ ],
1227
+ "buttons": 0,
1228
+ "command_time": 12345,
1229
+ "move_word": 66,
1230
+ "saved": [
1231
+ 2864434397,
1232
+ 2147483647,
1233
+ 7
1234
+ ]
1235
+ },
1236
+ "source": {
1237
+ "angles": [
1238
+ 2864434397,
1239
+ 2147483647,
1240
+ 7
1241
+ ],
1242
+ "buttons": 0,
1243
+ "command_time": 12345,
1244
+ "move_word": 66,
1245
+ "saved": [
1246
+ 2864434397,
1247
+ 2147483647,
1248
+ 7
1249
+ ]
1250
+ }
1251
+ },
1252
+ {
1253
+ "rust": {
1254
+ "angles": [
1255
+ 2864434397,
1256
+ 2147483647,
1257
+ 7
1258
+ ],
1259
+ "buttons": 0,
1260
+ "command_time": 12345,
1261
+ "move_word": 255,
1262
+ "saved": [
1263
+ 2864434397,
1264
+ 2147483647,
1265
+ 7
1266
+ ]
1267
+ },
1268
+ "source": {
1269
+ "angles": [
1270
+ 2864434397,
1271
+ 2147483647,
1272
+ 7
1273
+ ],
1274
+ "buttons": 0,
1275
+ "command_time": 12345,
1276
+ "move_word": 255,
1277
+ "saved": [
1278
+ 2864434397,
1279
+ 2147483647,
1280
+ 7
1281
+ ]
1282
+ }
1283
+ },
1284
+ {
1285
+ "rust": {
1286
+ "angles": [
1287
+ 2864434397,
1288
+ 2147483647,
1289
+ 7
1290
+ ],
1291
+ "buttons": 305419896,
1292
+ "command_time": 12345,
1293
+ "move_word": 2155872066,
1294
+ "saved": [
1295
+ 2864434397,
1296
+ 2147483647,
1297
+ 7
1298
+ ]
1299
+ },
1300
+ "source": {
1301
+ "angles": [
1302
+ 2864434397,
1303
+ 2147483647,
1304
+ 7
1305
+ ],
1306
+ "buttons": 305419896,
1307
+ "command_time": 12345,
1308
+ "move_word": 2155872066,
1309
+ "saved": [
1310
+ 2864434397,
1311
+ 2147483647,
1312
+ 7
1313
+ ]
1314
+ }
1315
+ },
1316
+ {
1317
+ "rust": {
1318
+ "angles": [
1319
+ 2864434397,
1320
+ 2147483647,
1321
+ 7
1322
+ ],
1323
+ "buttons": 305419896,
1324
+ "command_time": 12345,
1325
+ "move_word": 16909311,
1326
+ "saved": [
1327
+ 2864434397,
1328
+ 2147483647,
1329
+ 7
1330
+ ]
1331
+ },
1332
+ "source": {
1333
+ "angles": [
1334
+ 2864434397,
1335
+ 2147483647,
1336
+ 7
1337
+ ],
1338
+ "buttons": 305419896,
1339
+ "command_time": 12345,
1340
+ "move_word": 16909311,
1341
+ "saved": [
1342
+ 2864434397,
1343
+ 2147483647,
1344
+ 7
1345
+ ]
1346
+ }
1347
+ },
1348
+ {
1349
+ "rust": {
1350
+ "angles": [
1351
+ 2864434397,
1352
+ 2147483647,
1353
+ 7
1354
+ ],
1355
+ "buttons": 0,
1356
+ "command_time": 12345,
1357
+ "move_word": 66,
1358
+ "saved": [
1359
+ 2864434397,
1360
+ 2147483647,
1361
+ 7
1362
+ ]
1363
+ },
1364
+ "source": {
1365
+ "angles": [
1366
+ 2864434397,
1367
+ 2147483647,
1368
+ 7
1369
+ ],
1370
+ "buttons": 0,
1371
+ "command_time": 12345,
1372
+ "move_word": 66,
1373
+ "saved": [
1374
+ 2864434397,
1375
+ 2147483647,
1376
+ 7
1377
+ ]
1378
+ }
1379
+ },
1380
+ {
1381
+ "rust": {
1382
+ "angles": [
1383
+ 2864434397,
1384
+ 2147483647,
1385
+ 7
1386
+ ],
1387
+ "buttons": 0,
1388
+ "command_time": 12345,
1389
+ "move_word": 255,
1390
+ "saved": [
1391
+ 2864434397,
1392
+ 2147483647,
1393
+ 7
1394
+ ]
1395
+ },
1396
+ "source": {
1397
+ "angles": [
1398
+ 2864434397,
1399
+ 2147483647,
1400
+ 7
1401
+ ],
1402
+ "buttons": 0,
1403
+ "command_time": 12345,
1404
+ "move_word": 255,
1405
+ "saved": [
1406
+ 2864434397,
1407
+ 2147483647,
1408
+ 7
1409
+ ]
1410
+ }
1411
+ },
1412
+ {
1413
+ "rust": {
1414
+ "angles": [
1415
+ 287454020,
1416
+ 2147483648,
1417
+ 4294967295
1418
+ ],
1419
+ "buttons": 0,
1420
+ "command_time": 12345,
1421
+ "move_word": 66,
1422
+ "saved": [
1423
+ 287454020,
1424
+ 2147483648,
1425
+ 4294967295
1426
+ ]
1427
+ },
1428
+ "source": {
1429
+ "angles": [
1430
+ 287454020,
1431
+ 2147483648,
1432
+ 4294967295
1433
+ ],
1434
+ "buttons": 0,
1435
+ "command_time": 12345,
1436
+ "move_word": 66,
1437
+ "saved": [
1438
+ 287454020,
1439
+ 2147483648,
1440
+ 4294967295
1441
+ ]
1442
+ }
1443
+ },
1444
+ {
1445
+ "rust": {
1446
+ "angles": [
1447
+ 287454020,
1448
+ 2147483648,
1449
+ 4294967295
1450
+ ],
1451
+ "buttons": 0,
1452
+ "command_time": 12345,
1453
+ "move_word": 255,
1454
+ "saved": [
1455
+ 287454020,
1456
+ 2147483648,
1457
+ 4294967295
1458
+ ]
1459
+ },
1460
+ "source": {
1461
+ "angles": [
1462
+ 287454020,
1463
+ 2147483648,
1464
+ 4294967295
1465
+ ],
1466
+ "buttons": 0,
1467
+ "command_time": 12345,
1468
+ "move_word": 255,
1469
+ "saved": [
1470
+ 287454020,
1471
+ 2147483648,
1472
+ 4294967295
1473
+ ]
1474
+ }
1475
+ },
1476
+ {
1477
+ "rust": {
1478
+ "angles": [
1479
+ 287454020,
1480
+ 2147483648,
1481
+ 4294967295
1482
+ ],
1483
+ "buttons": 0,
1484
+ "command_time": 12345,
1485
+ "move_word": 66,
1486
+ "saved": [
1487
+ 287454020,
1488
+ 2147483648,
1489
+ 4294967295
1490
+ ]
1491
+ },
1492
+ "source": {
1493
+ "angles": [
1494
+ 287454020,
1495
+ 2147483648,
1496
+ 4294967295
1497
+ ],
1498
+ "buttons": 0,
1499
+ "command_time": 12345,
1500
+ "move_word": 66,
1501
+ "saved": [
1502
+ 287454020,
1503
+ 2147483648,
1504
+ 4294967295
1505
+ ]
1506
+ }
1507
+ },
1508
+ {
1509
+ "rust": {
1510
+ "angles": [
1511
+ 287454020,
1512
+ 2147483648,
1513
+ 4294967295
1514
+ ],
1515
+ "buttons": 0,
1516
+ "command_time": 12345,
1517
+ "move_word": 255,
1518
+ "saved": [
1519
+ 287454020,
1520
+ 2147483648,
1521
+ 4294967295
1522
+ ]
1523
+ },
1524
+ "source": {
1525
+ "angles": [
1526
+ 287454020,
1527
+ 2147483648,
1528
+ 4294967295
1529
+ ],
1530
+ "buttons": 0,
1531
+ "command_time": 12345,
1532
+ "move_word": 255,
1533
+ "saved": [
1534
+ 287454020,
1535
+ 2147483648,
1536
+ 4294967295
1537
+ ]
1538
+ }
1539
+ }
1540
+ ],
1541
+ "source_report": "docs/research/qvm-client-command-rewrite.json",
1542
+ "source_report_sha256": "c202d4d3374af1f7c83f1948d7dc643504d81fcbdd3c4c8628f8af220f5ff691"
1543
+ }
docs/research/rust-health-impulse.json CHANGED
@@ -2985,7 +2985,7 @@
2985
  "exit_code": 2
2986
  }
2987
  ],
2988
- "rust_unit_tests": 232,
2989
  "source_report": "docs/research/qvm-health-impulse.json",
2990
  "source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
2991
  }
 
2985
  "exit_code": 2
2986
  }
2987
  ],
2988
+ "rust_unit_tests": 234,
2989
  "source_report": "docs/research/qvm-health-impulse.json",
2990
  "source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
2991
  }
scripts/analyze_rust_client_command_rewrite.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Compare recovered Rust policy with original QVM fixtures."""
2
+ import hashlib,json,os,subprocess
3
+ from pathlib import Path
4
+ from analyze_qvm import write_json
5
+ from rust_lifecycle_support import result
6
+
7
+ def main():
8
+ subprocess.run(['cargo','build','--offline','--package','urt-gameplay','--bin','urt-client-processing'],check=True,capture_output=True)
9
+ binary=Path(os.environ.get('CARGO_TARGET_DIR','target'))/'debug'/'urt-client-processing'
10
+ path=Path('docs/research/qvm-client-command-rewrite.json');data=path.read_bytes();probes=[]
11
+ for p in json.loads(data)['probes']:
12
+ probes.append(dict(source={k:p[k] for k in ['angles', 'saved', 'buttons', 'move_word', 'command_time']},rust=result(binary,'command',encode(p['input']))))
13
+ write_json(Path('docs/research/rust-client-command-rewrite.json'),dict(source_report=str(path),source_report_sha256=hashlib.sha256(data).hexdigest(),probes=probes,limits='Finite source/Rust contract parity; native time/file/network replies remain supplied or captured.'))
14
+
15
+ def encode(a):return [a['pause'],a['mode'],a['flags'],a['block'],*a['angles'],*a['saved'],a['buttons'],a['move_word'],a['command_time']]
16
+ if __name__=='__main__':main()
scripts/test_rust_client_command_rewrite.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import hashlib,json,unittest
2
+ from pathlib import Path
3
+ class PortTests(unittest.TestCase):
4
+ def test_original_parity(self):
5
+ r=json.loads(Path('docs/research/rust-client-command-rewrite.json').read_text());self.assertGreaterEqual(len(r['probes']),12)
6
+ for p in r['probes']:self.assertEqual(p['source'],p['rust'])
7
+ def test_identity(self):
8
+ r=json.loads(Path('docs/research/rust-client-command-rewrite.json').read_text());self.assertEqual(hashlib.sha256(Path(r['source_report']).read_bytes()).hexdigest(),r['source_report_sha256'])
9
+ if __name__=='__main__':unittest.main()
xtask/checks.tsv CHANGED
@@ -3570,3 +3570,25 @@ report scripts/analyze_qvm_client_command_rewrite.py docs/research/qvm-client-co
3570
  edge docs/research/qvm-client-command-rewrite.json scripts/test_qvm_client_command_rewrite.py
3571
  group qvm-client-command-rewrite scripts/analyze_qvm_client_command_rewrite.py
3572
  edge scripts/analyze_qvm_client_command_rewrite.py scripts/analyze_qvm_resumer_audit.py
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3570
  edge docs/research/qvm-client-command-rewrite.json scripts/test_qvm_client_command_rewrite.py
3571
  group qvm-client-command-rewrite scripts/analyze_qvm_client_command_rewrite.py
3572
  edge scripts/analyze_qvm_client_command_rewrite.py scripts/analyze_qvm_resumer_audit.py
3573
+ report scripts/analyze_rust_client_command_rewrite.py docs/research/rust-client-command-rewrite.json
3574
+ edge docs/research/rust-client-command-rewrite.json scripts/test_rust_client_command_rewrite.py
3575
+ group rust-client-command-rewrite scripts/analyze_rust_client_command_rewrite.py
3576
+ edge scripts/analyze_rust_client_command_rewrite.py scripts/analyze_qvm_resumer_audit.py
3577
+ edge Cargo.toml scripts/analyze_rust_client_command_rewrite.py
3578
+ edge Cargo.lock scripts/analyze_rust_client_command_rewrite.py
3579
+ edge crates/urt-gameplay/Cargo.toml scripts/analyze_rust_client_command_rewrite.py
3580
+ edge crates/urt-gameplay/src/lib.rs scripts/analyze_rust_client_command_rewrite.py
3581
+ edge crates/urt-gameplay/src/filter_loading.rs scripts/analyze_rust_client_command_rewrite.py
3582
+ edge crates/urt-gameplay/src/filter_lifecycle.rs scripts/analyze_rust_client_command_rewrite.py
3583
+ edge crates/urt-gameplay/src/native_policy.rs scripts/analyze_rust_client_command_rewrite.py
3584
+ edge crates/urt-gameplay/src/bin/urt-filter-loading.rs scripts/analyze_rust_client_command_rewrite.py
3585
+ edge crates/urt-gameplay/src/qvm_format.rs scripts/analyze_rust_client_command_rewrite.py
3586
+ edge docs/research/qvm-client-command-rewrite.json scripts/analyze_rust_client_command_rewrite.py
3587
+ group rust-client-command-rewrite scripts/analyze_rust_health_impulse.py
3588
+ group gameplay scripts/analyze_rust_client_command_rewrite.py
3589
+ edge crates/urt-gameplay/src/filter_commands.rs scripts/analyze_rust_client_command_rewrite.py
3590
+ edge crates/urt-gameplay/src/bin/urt-filter-commands.rs scripts/analyze_rust_client_command_rewrite.py
3591
+ edge crates/urt-gameplay/src/client_timer.rs scripts/analyze_rust_client_command_rewrite.py
3592
+ edge crates/urt-gameplay/src/bin/urt-client-timer.rs scripts/analyze_rust_client_command_rewrite.py
3593
+ edge crates/urt-gameplay/src/client_processing.rs scripts/analyze_rust_client_command_rewrite.py
3594
+ edge crates/urt-gameplay/src/bin/urt-client-processing.rs scripts/analyze_rust_client_command_rewrite.py