-
Notifications
You must be signed in to change notification settings - Fork 0
/
tarpaulin-report.html
660 lines (618 loc) · 324 KB
/
tarpaulin-report.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style>html, body {
margin: 0;
padding: 0;
}
.app {
margin: 10px;
padding: 0;
}
.files-list {
margin: 10px 0 0;
width: 100%;
border-collapse: collapse;
}
.files-list__head {
border: 1px solid #999;
}
.files-list__head > tr > th {
padding: 10px;
border: 1px solid #999;
text-align: left;
font-weight: normal;
background: #ddd;
}
.files-list__body {
}
.files-list__file {
cursor: pointer;
}
.files-list__file:hover {
background: #ccf;
}
.files-list__file > td {
padding: 10px;
border: 1px solid #999;
}
.files-list__file > td:first-child::before {
content: '\01F4C4';
margin-right: 1em;
}
.files-list__file_low {
background: #fcc;
}
.files-list__file_medium {
background: #ffc;
}
.files-list__file_high {
background: #cfc;
}
.files-list__file_folder > td:first-child::before {
content: '\01F4C1';
margin-right: 1em;
}
.file-header {
border: 1px solid #999;
display: flex;
justify-content: space-between;
align-items: center;
}
.file-header__back {
margin: 10px;
cursor: pointer;
flex-shrink: 0;
flex-grow: 0;
text-decoration: underline;
color: #338;
}
.file-header__name {
margin: 10px;
flex-shrink: 2;
flex-grow: 2;
}
.file-header__stat {
margin: 10px;
flex-shrink: 0;
flex-grow: 0;
}
.file-content {
margin: 10px 0 0;
border: 1px solid #999;
padding: 10px;
}
.code-line {
margin: 0;
padding: 0.3em;
height: 1em;
}
.code-line_covered {
background: #cfc;
}
.code-line_uncovered {
background: #fcc;
}
</style>
</head>
<body>
<div id="root"></div>
<script>
var data = {"files":[{"path":["/","home","dan","dev","dan-rusty-chess","src","app.rs"],"content":"use crate::{chess_board::SquareIndex, chess_move::ChessMove};\n\npub struct App {\n pub ui_buffer: String,\n available_moves: Vec\u003cChessMove\u003e,\n selected_square: Option\u003cSquareIndex\u003e,\n}\n\nimpl App {\n pub fn new() -\u003e Self {\n App {\n ui_buffer: String::new(),\n available_moves: Vec::new(),\n selected_square: None,\n }\n }\n\n pub fn add_available_move(\u0026mut self, available_move: \u0026ChessMove) {\n self.available_moves.push(*available_move);\n }\n\n pub fn available_moves(\u0026self) -\u003e \u0026Vec\u003cChessMove\u003e {\n \u0026self.available_moves\n }\n\n pub fn clear_input(\u0026mut self) {\n self.ui_buffer.clear();\n self.available_moves.clear();\n self.selected_square = None;\n }\n\n pub fn set_selected_square(\u0026mut self, square: u8) {\n self.selected_square = Some(square);\n }\n\n pub fn get_selected_square(\u0026self) -\u003e Option\u003cSquareIndex\u003e {\n self.selected_square\n }\n}\n","traces":[{"line":10,"address":[759868,759712],"length":1,"stats":{"Line":0},"fn_name":"new"},{"line":12,"address":[759725],"length":1,"stats":{"Line":0},"fn_name":null},{"line":13,"address":[759740],"length":1,"stats":{"Line":0},"fn_name":null},{"line":18,"address":[759888],"length":1,"stats":{"Line":0},"fn_name":"add_available_move"},{"line":19,"address":[759905],"length":1,"stats":{"Line":0},"fn_name":null},{"line":22,"address":[759936],"length":1,"stats":{"Line":0},"fn_name":"available_moves"},{"line":23,"address":[759944],"length":1,"stats":{"Line":0},"fn_name":null},{"line":26,"address":[759952],"length":1,"stats":{"Line":0},"fn_name":"clear_input"},{"line":27,"address":[759965],"length":1,"stats":{"Line":0},"fn_name":null},{"line":28,"address":[759974],"length":1,"stats":{"Line":0},"fn_name":null},{"line":29,"address":[759987],"length":1,"stats":{"Line":0},"fn_name":null},{"line":32,"address":[760016],"length":1,"stats":{"Line":0},"fn_name":"set_selected_square"},{"line":33,"address":[760032],"length":1,"stats":{"Line":0},"fn_name":null},{"line":36,"address":[760064],"length":1,"stats":{"Line":0},"fn_name":"get_selected_square"},{"line":37,"address":[760069],"length":1,"stats":{"Line":0},"fn_name":null}],"covered":0,"coverable":15},{"path":["/","home","dan","dev","dan-rusty-chess","src","chess_board.rs"],"content":"use crate::{chess_move::ChessMove, piece::Piece};\nuse std::str;\n\npub type SquareIndex = u8;\npub type FileIndex = u8;\npub type RankIndex = u8;\n\npub const TOTAL_RANKS: RankIndex = 8;\npub const TOTAL_FILES: FileIndex = 8;\npub const TOTAL_SQUARES: SquareIndex = TOTAL_RANKS * TOTAL_FILES;\n\npub struct ChessBoard {\n board: [Option\u003cPiece\u003e; TOTAL_SQUARES as usize],\n highlit: [bool; TOTAL_SQUARES as usize],\n}\n\nimpl ChessBoard {\n pub fn new() -\u003e ChessBoard {\n const INIT: Option\u003cPiece\u003e = None;\n ChessBoard {\n board: [INIT; TOTAL_SQUARES as usize],\n highlit: [false; TOTAL_SQUARES as usize],\n }\n }\n pub fn from_fen(fen: \u0026str) -\u003e ChessBoard {\n let mut board = ChessBoard::new();\n\n let mut fen_sections = fen.split(' ');\n\n let mut file: SquareIndex = 0;\n let mut rank: SquareIndex = TOTAL_RANKS - 1;\n\n let piece_placements = fen_sections.next().unwrap_or(\"\");\n\n for piece_placement in piece_placements.chars() {\n if piece_placement.is_digit(10) {\n file += piece_placement.to_digit(10).unwrap_or_default() as u8\n } else if piece_placement == '/' {\n rank -= 1;\n file = 0;\n } else {\n let ix = ChessBoard::square_from_file_and_rank(file, rank).unwrap();\n let piece = Piece::new(piece_placement);\n board.board[ix as usize] = Some(piece);\n file += 1;\n }\n }\n\n board\n }\n pub fn get_piece(\u0026self, square_index: SquareIndex) -\u003e \u0026Option\u003cPiece\u003e {\n \u0026self.board[square_index as usize]\n }\n pub fn get_pieces_on_rank(\u0026self, rank: usize) -\u003e \u0026[Option\u003cPiece\u003e] {\n let start = (rank - 1) * TOTAL_FILES as usize;\n \u0026self.board[start..start + TOTAL_FILES as usize]\n }\n\n // pub fn draw(\u0026self) -\u003e String {\n // let mut output: String = format!(\"\");\n\n // output.push_str(\" a b c d e f g h\\n\");\n\n // for rank in (1..=TOTAL_RANKS).rev() {\n // output.push_str(\u0026format!(\"{} \", rank));\n // for (i, piece) in self.get_pieces_on_rank(rank.into()).iter().enumerate() {\n // let coloured_symbol: ColoredString;\n\n // if let Some(piece) = piece {\n // let piece_symbol = \u0026format!(\"{} \", piece.get_graphic());\n // let piece_symbol = if piece.is_black() {\n // piece_symbol.truecolor(0, 0, 0)\n // } else {\n // piece_symbol.truecolor(240, 240, 240)\n // };\n // coloured_symbol = piece_symbol;\n // } else {\n // let piece_symbol = \u0026format!(\"{} \", \" \");\n // coloured_symbol = piece_symbol.white();\n // }\n\n // let square_index: SquareIndex =\n // ChessBoard::square_from_file_and_rank(i as u8, rank - 1).unwrap();\n // if (i + (rank as usize)) % 2 == 0 {\n // if self.is_highlit(square_index) {\n // output\n // .push_str(\u0026format!(\"{}\", coloured_symbol.on_truecolor(255, 189, 123)));\n // } else {\n // output.push_str(\u0026format!(\"{}\", coloured_symbol.on_truecolor(168, 123, 80)));\n // }\n // } else {\n // if self.is_highlit(square_index) {\n // output.push_str(\u0026format!(\"{}\", coloured_symbol.on_truecolor(240, 179, 64)));\n // } else {\n // output.push_str(\u0026format!(\"{}\", coloured_symbol.on_truecolor(100, 70, 25)));\n // }\n // }\n // }\n // output.push_str(\u0026format!(\" {} \", rank));\n\n // output += \"\\n\";\n // }\n // output.push_str(\" a b c d e f g h\");\n\n // output\n // }\n\n pub fn square_from_notation(notation: \u0026str) -\u003e Option\u003cSquareIndex\u003e {\n let files = \"abcdefgh\";\n let ranks = \"12345678\";\n let mut notation_chars = notation.chars();\n\n let file = notation_chars.next();\n let rank = notation_chars.next();\n\n let file_ix = files.find(file?);\n let rank_ix = ranks.find(rank?);\n\n Some((file_ix? + rank_ix? * 8).try_into().unwrap())\n }\n\n pub fn square_to_notation(index: SquareIndex) -\u003e Option\u003cString\u003e {\n let files = \"abcdefgh\";\n let ranks = \"12345678\";\n\n let (file_ix, rank_ix) = ChessBoard::square_to_file_and_rank(index);\n\n let file = files.chars().nth(file_ix.try_into().unwrap());\n let rank = ranks.chars().nth(rank_ix.try_into().unwrap());\n\n Some(format!(\"{}{}\", file?, rank?))\n }\n\n pub fn square_from_file_and_rank(file: FileIndex, rank: RankIndex) -\u003e Option\u003cSquareIndex\u003e {\n let ix = rank * TOTAL_RANKS + file;\n\n if ix \u003e= TOTAL_SQUARES {\n None\n } else {\n Some(ix)\n }\n }\n\n pub fn square_to_file_and_rank(square_index: SquareIndex) -\u003e (FileIndex, RankIndex) {\n let file_ix = square_index % TOTAL_FILES;\n let rank_ix = square_index / TOTAL_RANKS;\n\n (file_ix, rank_ix)\n }\n\n pub fn generate_moves(\u0026self, index: SquareIndex) -\u003e Vec\u003cChessMove\u003e {\n if let Some(piece) = self.get_piece(index) {\n piece.generate_moves(self, index)\n } else {\n vec![]\n }\n }\n\n pub fn reset_highlights(\u0026mut self) {\n self.highlit = [false; TOTAL_SQUARES as usize];\n }\n\n pub fn highlight_square(\u0026mut self, index: SquareIndex, highlight: bool) {\n self.highlit[index as usize] = highlight;\n }\n\n pub fn is_highlit(\u0026self, index: SquareIndex) -\u003e bool {\n self.highlit[index as usize]\n }\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n\n #[test]\n fn test_from_notation() {\n assert_eq!(ChessBoard::square_from_notation(\"a1\"), Some(0));\n assert_eq!(ChessBoard::square_from_notation(\"a8\"), Some(56));\n assert_eq!(ChessBoard::square_from_notation(\"h1\"), Some(7));\n assert_eq!(ChessBoard::square_from_notation(\"h8\"), Some(63));\n assert_eq!(ChessBoard::square_from_notation(\"dan\"), None);\n assert_eq!(ChessBoard::square_from_notation(\"123\"), None);\n assert_eq!(ChessBoard::square_from_notation(\"\"), None);\n }\n\n #[test]\n fn test_to_notation() {\n assert_eq!(ChessBoard::square_to_notation(0), Some(\"a1\".to_string()));\n assert_eq!(ChessBoard::square_to_notation(56), Some(\"a8\".to_string()));\n assert_eq!(ChessBoard::square_to_notation(7), Some(\"h1\".to_string()));\n assert_eq!(ChessBoard::square_to_notation(63), Some(\"h8\".to_string()));\n assert_eq!(ChessBoard::square_to_notation(255), None);\n assert_eq!(ChessBoard::square_to_notation(u8::MAX), None);\n assert_eq!(ChessBoard::square_to_notation(64), None);\n }\n\n #[test]\n fn test_to_and_from_file_ranks() {\n let square = ChessBoard::square_from_file_and_rank(1, 1).unwrap();\n assert_eq!(\"b2\", ChessBoard::square_to_notation(square).unwrap());\n }\n}\n","traces":[{"line":18,"address":[709024],"length":1,"stats":{"Line":12},"fn_name":"new"},{"line":21,"address":[709041],"length":1,"stats":{"Line":1},"fn_name":null},{"line":22,"address":[709145],"length":1,"stats":{"Line":12},"fn_name":null},{"line":25,"address":[709232,710511],"length":1,"stats":{"Line":11},"fn_name":"from_fen"},{"line":26,"address":[709284],"length":1,"stats":{"Line":12},"fn_name":null},{"line":28,"address":[709307],"length":1,"stats":{"Line":1},"fn_name":null},{"line":30,"address":[709331],"length":1,"stats":{"Line":12},"fn_name":null},{"line":31,"address":[709339],"length":1,"stats":{"Line":1},"fn_name":null},{"line":33,"address":[709426,709347],"length":1,"stats":{"Line":13},"fn_name":null},{"line":35,"address":[709628,709482],"length":1,"stats":{"Line":13},"fn_name":null},{"line":36,"address":[709762,709651],"length":1,"stats":{"Line":22},"fn_name":null},{"line":37,"address":[709695,709767],"length":1,"stats":{"Line":1},"fn_name":null},{"line":38,"address":[710416,710473,709676],"length":1,"stats":{"Line":11},"fn_name":null},{"line":39,"address":[709799,710458,710478],"length":1,"stats":{"Line":9},"fn_name":null},{"line":40,"address":[710465],"length":1,"stats":{"Line":1},"fn_name":null},{"line":42,"address":[709828],"length":1,"stats":{"Line":4},"fn_name":null},{"line":43,"address":[709917],"length":1,"stats":{"Line":12},"fn_name":null},{"line":44,"address":[709928,710306],"length":1,"stats":{"Line":3},"fn_name":null},{"line":45,"address":[710421,710409,710267],"length":1,"stats":{"Line":4},"fn_name":null},{"line":51,"address":[710528],"length":1,"stats":{"Line":1},"fn_name":"get_piece"},{"line":52,"address":[710549,710597],"length":1,"stats":{"Line":12},"fn_name":null},{"line":54,"address":[710624],"length":1,"stats":{"Line":0},"fn_name":"get_pieces_on_rank"},{"line":55,"address":[710643,710754],"length":1,"stats":{"Line":0},"fn_name":null},{"line":56,"address":[710799,710736],"length":1,"stats":{"Line":0},"fn_name":null},{"line":108,"address":[710896],"length":1,"stats":{"Line":1},"fn_name":"square_from_notation"},{"line":109,"address":[710919],"length":1,"stats":{"Line":1},"fn_name":null},{"line":110,"address":[710946],"length":1,"stats":{"Line":1},"fn_name":null},{"line":111,"address":[710973],"length":1,"stats":{"Line":1},"fn_name":null},{"line":113,"address":[710988],"length":1,"stats":{"Line":10},"fn_name":null},{"line":114,"address":[711009],"length":1,"stats":{"Line":1},"fn_name":null},{"line":116,"address":[711034],"length":1,"stats":{"Line":9},"fn_name":null},{"line":117,"address":[711156],"length":1,"stats":{"Line":2},"fn_name":null},{"line":119,"address":[711270],"length":1,"stats":{"Line":12},"fn_name":null},{"line":122,"address":[711616],"length":1,"stats":{"Line":1},"fn_name":"square_to_notation"},{"line":123,"address":[711643],"length":1,"stats":{"Line":1},"fn_name":null},{"line":124,"address":[711670],"length":1,"stats":{"Line":1},"fn_name":null},{"line":126,"address":[711697],"length":1,"stats":{"Line":1},"fn_name":null},{"line":128,"address":[711735],"length":1,"stats":{"Line":2},"fn_name":null},{"line":129,"address":[711831],"length":1,"stats":{"Line":2},"fn_name":null},{"line":131,"address":[712039,711937],"length":1,"stats":{"Line":4},"fn_name":null},{"line":134,"address":[712432],"length":1,"stats":{"Line":1},"fn_name":"square_from_file_and_rank"},{"line":135,"address":[712454,712536],"length":1,"stats":{"Line":1},"fn_name":null},{"line":137,"address":[712530,712579],"length":1,"stats":{"Line":3},"fn_name":null},{"line":138,"address":[712581],"length":1,"stats":{"Line":0},"fn_name":null},{"line":140,"address":[712570],"length":1,"stats":{"Line":4},"fn_name":null},{"line":144,"address":[712608],"length":1,"stats":{"Line":1},"fn_name":"square_to_file_and_rank"},{"line":145,"address":[712628],"length":1,"stats":{"Line":1},"fn_name":null},{"line":146,"address":[712616,712632],"length":1,"stats":{"Line":2},"fn_name":null},{"line":148,"address":[712636],"length":1,"stats":{"Line":2},"fn_name":null},{"line":151,"address":[712656],"length":1,"stats":{"Line":1},"fn_name":"generate_moves"},{"line":152,"address":[712698],"length":1,"stats":{"Line":12},"fn_name":null},{"line":153,"address":[712769],"length":1,"stats":{"Line":1},"fn_name":null},{"line":155,"address":[712784],"length":1,"stats":{"Line":1},"fn_name":null},{"line":159,"address":[712800],"length":1,"stats":{"Line":0},"fn_name":"reset_highlights"},{"line":160,"address":[712805],"length":1,"stats":{"Line":0},"fn_name":null},{"line":163,"address":[712832],"length":1,"stats":{"Line":0},"fn_name":"highlight_square"},{"line":164,"address":[712865,712919],"length":1,"stats":{"Line":0},"fn_name":null},{"line":167,"address":[712944],"length":1,"stats":{"Line":0},"fn_name":"is_highlit"},{"line":168,"address":[712965,713018],"length":1,"stats":{"Line":0},"fn_name":null},{"line":177,"address":[563488],"length":1,"stats":{"Line":3},"fn_name":"test_from_notation"},{"line":178,"address":[563680,563495],"length":1,"stats":{"Line":1},"fn_name":null},{"line":179,"address":[563631,563724,563878],"length":1,"stats":{"Line":2},"fn_name":null},{"line":180,"address":[563922,563829,564058],"length":1,"stats":{"Line":2},"fn_name":null},{"line":181,"address":[564015,564102,564238],"length":1,"stats":{"Line":2},"fn_name":null},{"line":182,"address":[564195,564418,564282],"length":1,"stats":{"Line":2},"fn_name":null},{"line":183,"address":[564462,564375,564597],"length":1,"stats":{"Line":2},"fn_name":null},{"line":184,"address":[564752,564555,564641],"length":1,"stats":{"Line":2},"fn_name":null},{"line":188,"address":[564800,565170],"length":1,"stats":{"Line":3},"fn_name":"test_to_notation"},{"line":189,"address":[564807],"length":1,"stats":{"Line":1},"fn_name":null},{"line":190,"address":[565185],"length":1,"stats":{"Line":1},"fn_name":null},{"line":191,"address":[565544],"length":1,"stats":{"Line":1},"fn_name":null},{"line":192,"address":[565891],"length":1,"stats":{"Line":1},"fn_name":null},{"line":193,"address":[566238],"length":1,"stats":{"Line":1},"fn_name":null},{"line":194,"address":[566470],"length":1,"stats":{"Line":1},"fn_name":null},{"line":195,"address":[566702],"length":1,"stats":{"Line":1},"fn_name":null},{"line":199,"address":[567224,566944],"length":1,"stats":{"Line":3},"fn_name":"test_to_and_from_file_ranks"},{"line":200,"address":[566951],"length":1,"stats":{"Line":1},"fn_name":null},{"line":201,"address":[567015],"length":1,"stats":{"Line":1},"fn_name":null}],"covered":68,"coverable":78},{"path":["/","home","dan","dev","dan-rusty-chess","src","chess_move.rs"],"content":"use crate::chess_board::{ChessBoard, SquareIndex, TOTAL_FILES, TOTAL_RANKS};\n\n#[derive(Clone, Copy)]\n\npub struct ChessMove {\n pub source: SquareIndex,\n pub destination: SquareIndex,\n}\n\npub trait MoveGenerator {\n fn generate_moves(\u0026self, chess_board: \u0026ChessBoard, source: SquareIndex) -\u003e Vec\u003cChessMove\u003e;\n}\n\npub struct StraightSlidingMoves {\n max_moves: u8,\n}\nimpl StraightSlidingMoves {\n pub fn new(max_moves: u8) -\u003e Self {\n Self { max_moves }\n }\n}\nimpl MoveGenerator for StraightSlidingMoves {\n fn generate_moves(\u0026self, chess_board: \u0026ChessBoard, source: SquareIndex) -\u003e Vec\u003cChessMove\u003e {\n static DIRECTIONS: [(i8, i8); 4] = [(1, 0), (0, 1), (-1, 0), (0, -1)];\n\n generate_moves(\n chess_board,\n source,\n self.max_moves,\n \u0026DIRECTIONS,\n true,\n false,\n )\n }\n}\n\npub struct PawnMoves {\n file_direction: i8,\n double_step_rank: u8,\n}\nimpl PawnMoves {\n pub fn new(file_direction: i8, double_step_rank: u8) -\u003e Self {\n Self {\n file_direction,\n double_step_rank,\n }\n }\n}\nimpl MoveGenerator for PawnMoves {\n fn generate_moves(\u0026self, chess_board: \u0026ChessBoard, source: SquareIndex) -\u003e Vec\u003cChessMove\u003e {\n let directions: [(i8, i8); 1] = [(0, self.file_direction)];\n\n let (_, rank_ix) = ChessBoard::square_to_file_and_rank(source);\n\n let forward_moves = generate_moves(\n chess_board,\n source,\n if self.double_step_rank == rank_ix + 1 {\n 2\n } else {\n 1\n },\n \u0026directions,\n false,\n false,\n );\n\n let take_directions: [(i8, i8); 2] = [(-1, self.file_direction), (1, self.file_direction)];\n\n let taking_moves = generate_moves(chess_board, source, 1, \u0026take_directions, true, true);\n\n [forward_moves, taking_moves].concat()\n }\n}\n\npub struct DiagonalSlidingMoves {\n max_moves: u8,\n}\nimpl DiagonalSlidingMoves {\n pub fn new(max_moves: u8) -\u003e Self {\n Self { max_moves }\n }\n}\nimpl MoveGenerator for DiagonalSlidingMoves {\n fn generate_moves(\u0026self, chess_board: \u0026ChessBoard, source: SquareIndex) -\u003e Vec\u003cChessMove\u003e {\n static DIRECTIONS: [(i8, i8); 4] = [(1, 1), (1, -1), (-1, 1), (-1, -1)];\n\n generate_moves(\n chess_board,\n source,\n self.max_moves,\n \u0026DIRECTIONS,\n true,\n false,\n )\n }\n}\n\npub struct JumpingMoves {\n max_moves: u8,\n}\nimpl JumpingMoves {\n pub fn new(max_moves: u8) -\u003e Self {\n Self { max_moves }\n }\n}\nimpl MoveGenerator for JumpingMoves {\n fn generate_moves(\u0026self, chess_board: \u0026ChessBoard, source: SquareIndex) -\u003e Vec\u003cChessMove\u003e {\n static DIRECTIONS: [(i8, i8); 8] = [\n (1, 2),\n (-1, -2),\n (2, 1),\n (-2, -1),\n (1, -2),\n (-1, 2),\n (2, -1),\n (-2, 1),\n ];\n\n generate_moves(\n chess_board,\n source,\n self.max_moves,\n \u0026DIRECTIONS,\n true,\n false,\n )\n }\n}\n\nfn generate_moves(\n chess_board: \u0026ChessBoard,\n source: u8,\n max_moves: u8,\n directions: \u0026[(i8, i8)],\n takes_enemy: bool,\n must_take_enemy: bool,\n) -\u003e Vec\u003cChessMove\u003e {\n let mut moves: Vec\u003cChessMove\u003e = Vec::new();\n let (file_ix, rank_ix) = ChessBoard::square_to_file_and_rank(source);\n\n for (df, dr) in directions {\n let mut file_ix = file_ix as i8 + df;\n let mut rank_ix = rank_ix as i8 + dr;\n\n let mut count = 0;\n while file_ix \u003e= 0\n \u0026\u0026 file_ix \u003c TOTAL_FILES as i8\n \u0026\u0026 rank_ix \u003e= 0\n \u0026\u0026 rank_ix \u003c TOTAL_RANKS as i8\n {\n let destination = ChessBoard::square_from_file_and_rank(file_ix as u8, rank_ix as u8);\n\n if let Some(destination) = destination {\n let chess_move = ChessMove {\n source,\n destination,\n };\n\n if let Some(piece) = chess_board.get_piece(destination) {\n if takes_enemy\n \u0026\u0026 piece.is_enemy(chess_board.get_piece(source).as_ref().unwrap())\n {\n moves.push(chess_move);\n }\n\n break;\n } else {\n if !must_take_enemy {\n moves.push(chess_move);\n }\n }\n }\n\n count += 1;\n if count == max_moves {\n break;\n }\n file_ix += df;\n rank_ix += dr;\n }\n }\n moves\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n\n #[test]\n fn test_rook_moves_from_a8() {\n let chess_board = ChessBoard::from_fen(\"r7/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"b8\", \"c8\", \"d8\", \"e8\", \"f8\", \"g8\", \"h8\", \"a7\", \"a6\", \"a5\", \"a4\", \"a3\", \"a2\", \"a1\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_rook_moves_from_a1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/r7 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"b1\", \"c1\", \"d1\", \"e1\", \"f1\", \"g1\", \"h1\", \"a2\", \"a3\", \"a4\", \"a5\", \"a6\", \"a7\", \"a8\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_rook_moves_from_h8() {\n let chess_board = ChessBoard::from_fen(\"7r/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"g8\", \"f8\", \"e8\", \"d8\", \"c8\", \"b8\", \"a8\", \"h7\", \"h6\", \"h5\", \"h4\", \"h3\", \"h2\", \"h1\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_rook_moves_from_h1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/7r w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"g1\", \"f1\", \"e1\", \"d1\", \"c1\", \"b1\", \"a1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"h7\", \"h8\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_bishop_moves_from_a8() {\n let chess_board = ChessBoard::from_fen(\"b7/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"b7\", \"c6\", \"d5\", \"e4\", \"f3\", \"g2\", \"h1\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_bishop_moves_from_h8() {\n let chess_board = ChessBoard::from_fen(\"7b/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"g7\", \"f6\", \"e5\", \"d4\", \"c3\", \"b2\", \"a1\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_bishop_moves_from_a1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/b7 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"b2\", \"c3\", \"d4\", \"e5\", \"f6\", \"g7\", \"h8\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_bishop_moves_from_h1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/7b w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"g2\", \"f3\", \"e4\", \"d5\", \"c6\", \"b7\", \"a8\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_king_moves() {\n let chess_board = ChessBoard::from_fen(\"8/1k6/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"b7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a6\", \"a7\", \"a8\", \"b6\", \"b8\", \"c6\", \"c7\", \"c8\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_king_moves_from_e1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/4K3 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"e1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"d1\", \"d2\", \"e2\", \"f2\", \"f1\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_king_moves_from_e8() {\n let chess_board = ChessBoard::from_fen(\"4k3/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"e8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"d8\", \"f8\", \"d7\", \"e7\", \"f7\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_queen_moves() {\n let chess_board = ChessBoard::from_fen(\"8/1q6/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"b7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"a7\", \"c7\", \"d7\", \"e7\", \"f7\", \"g7\", \"h7\", \"b1\", \"b2\", \"b3\", \"b4\", \"b5\", \"b6\", \"b8\",\n \"a8\", \"c6\", \"d5\", \"e4\", \"f3\", \"g2\", \"h1\", \"c8\", \"a6\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_more_queen_moves() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/7Q w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"a1\", \"a8\", \"b1\", \"b7\", \"c1\", \"c6\", \"d1\", \"d5\", \"e1\", \"e4\", \"f1\", \"f3\", \"g1\", \"g2\",\n \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"h7\", \"h8\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_no_moves_for_empty_squares() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves: Vec\u003cString\u003e = vec![];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_knight_moves_from_a8() {\n let chess_board = ChessBoard::from_fen(\"n7/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"c7\", \"b6\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_knight_moves_from_h8() {\n let chess_board = ChessBoard::from_fen(\"7n/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"f7\", \"g6\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_knight_moves_from_a1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/n7 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"c2\", \"b3\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_knight_moves_from_h1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/7n w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"f2\", \"g3\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_knight_moves_from_d5() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/3n4/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"d5\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"c7\", \"e7\", \"c3\", \"e3\", \"b6\", \"b4\", \"f6\", \"f4\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_white_pawn_moves_from_a2() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/P7/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a2\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a3\", \"a4\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_white_pawn_moves_from_a7() {\n let chess_board = ChessBoard::from_fen(\"8/P7/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a8\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_black_pawn_moves_from_a7() {\n let chess_board = ChessBoard::from_fen(\"8/p7/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a6\", \"a5\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_black_pawn_moves_from_a2() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/p7/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a2\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a1\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_rooks_can_be_blocked() {\n let chess_board = ChessBoard::from_fen(\"r3r3/8/r7/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"b8\", \"c8\", \"d8\", \"a7\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_rooks_block_and_take() {\n let chess_board = ChessBoard::from_fen(\"r3R3/8/r7/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"b8\", \"c8\", \"d8\", \"a7\", \"e8\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_pawns_block_and_take() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/ppp/PPP/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"b4\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a5\", \"c5\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_pawns_starting_square_moves_blocked_all_squares() {\n let chess_board = ChessBoard::from_fen(\"8/ppp/R/1R/2R/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves: Vec\u003cString\u003e = vec![];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_pawns_starting_square_moves_blocked_one_square_away() {\n let chess_board = ChessBoard::from_fen(\"8/ppp/R/1R/2R/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"b7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a6\", \"b6\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_pawns_starting_square_moves_not_blocked() {\n let chess_board = ChessBoard::from_fen(\"8/ppp/R/1R/2R/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"c7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"c6\", \"c5\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n}\n","traces":[{"line":18,"address":[784640],"length":1,"stats":{"Line":3},"fn_name":"new"},{"line":23,"address":[784672],"length":1,"stats":{"Line":3},"fn_name":"generate_moves"},{"line":42,"address":[784768],"length":1,"stats":{"Line":2},"fn_name":"new"},{"line":50,"address":[785380,784800],"length":1,"stats":{"Line":2},"fn_name":"generate_moves"},{"line":51,"address":[784856],"length":1,"stats":{"Line":2},"fn_name":null},{"line":53,"address":[784883],"length":1,"stats":{"Line":2},"fn_name":null},{"line":58,"address":[784980,784911],"length":1,"stats":{"Line":3},"fn_name":null},{"line":59,"address":[784982],"length":1,"stats":{"Line":1},"fn_name":null},{"line":61,"address":[784975],"length":1,"stats":{"Line":1},"fn_name":null},{"line":63,"address":[784996],"length":1,"stats":{"Line":1},"fn_name":null},{"line":68,"address":[785056],"length":1,"stats":{"Line":1},"fn_name":null},{"line":70,"address":[785146],"length":1,"stats":{"Line":2},"fn_name":null},{"line":72,"address":[785204],"length":1,"stats":{"Line":2},"fn_name":null},{"line":80,"address":[785472],"length":1,"stats":{"Line":1},"fn_name":"new"},{"line":85,"address":[785504],"length":1,"stats":{"Line":3},"fn_name":"generate_moves"},{"line":103,"address":[785600],"length":1,"stats":{"Line":4},"fn_name":"new"},{"line":108,"address":[785632],"length":1,"stats":{"Line":4},"fn_name":"generate_moves"},{"line":131,"address":[785728,786931],"length":1,"stats":{"Line":1},"fn_name":"generate_moves"},{"line":139,"address":[785889],"length":1,"stats":{"Line":10},"fn_name":null},{"line":140,"address":[785901],"length":1,"stats":{"Line":1},"fn_name":null},{"line":142,"address":[786130,785969,786036],"length":1,"stats":{"Line":21},"fn_name":null},{"line":143,"address":[786176],"length":1,"stats":{"Line":1},"fn_name":null},{"line":144,"address":[786210],"length":1,"stats":{"Line":10},"fn_name":null},{"line":146,"address":[786235],"length":1,"stats":{"Line":1},"fn_name":null},{"line":147,"address":[786274,786243,786314,786354],"length":1,"stats":{"Line":46},"fn_name":null},{"line":148,"address":[786263],"length":1,"stats":{"Line":1},"fn_name":null},{"line":149,"address":[786303],"length":1,"stats":{"Line":1},"fn_name":null},{"line":150,"address":[786343],"length":1,"stats":{"Line":1},"fn_name":null},{"line":152,"address":[786377],"length":1,"stats":{"Line":1},"fn_name":null},{"line":154,"address":[786430,786471],"length":1,"stats":{"Line":24},"fn_name":null},{"line":160,"address":[786463,786495,786538],"length":1,"stats":{"Line":14},"fn_name":null},{"line":161,"address":[786766,786592,786872],"length":1,"stats":{"Line":12},"fn_name":null},{"line":162,"address":[786791],"length":1,"stats":{"Line":2},"fn_name":null},{"line":164,"address":[786903],"length":1,"stats":{"Line":1},"fn_name":null},{"line":169,"address":[786612],"length":1,"stats":{"Line":1},"fn_name":null},{"line":170,"address":[786628],"length":1,"stats":{"Line":12},"fn_name":null},{"line":175,"address":[786507,786667,786689],"length":1,"stats":{"Line":13},"fn_name":null},{"line":176,"address":[786674],"length":1,"stats":{"Line":1},"fn_name":null},{"line":179,"address":[786734],"length":1,"stats":{"Line":4},"fn_name":null},{"line":180,"address":[786754],"length":1,"stats":{"Line":1},"fn_name":null},{"line":191,"address":[517509,517504],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":192,"address":[679735],"length":1,"stats":{"Line":1},"fn_name":null},{"line":193,"address":[679866,679760],"length":1,"stats":{"Line":2},"fn_name":null},{"line":194,"address":[679873],"length":1,"stats":{"Line":1},"fn_name":null},{"line":196,"address":[679907,680001],"length":1,"stats":{"Line":2},"fn_name":null},{"line":198,"address":[517536,517559],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":201,"address":[680043],"length":1,"stats":{"Line":1},"fn_name":null},{"line":202,"address":[680144],"length":1,"stats":{"Line":1},"fn_name":null},{"line":205,"address":[680486],"length":1,"stats":{"Line":1},"fn_name":null},{"line":207,"address":[680701,680585],"length":1,"stats":{"Line":1},"fn_name":null},{"line":211,"address":[517616,517621],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":212,"address":[680839],"length":1,"stats":{"Line":1},"fn_name":null},{"line":213,"address":[680864,680970],"length":1,"stats":{"Line":2},"fn_name":null},{"line":214,"address":[680977],"length":1,"stats":{"Line":1},"fn_name":null},{"line":216,"address":[681011,681105],"length":1,"stats":{"Line":2},"fn_name":null},{"line":218,"address":[517648,517671],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":221,"address":[681147],"length":1,"stats":{"Line":1},"fn_name":null},{"line":222,"address":[681248],"length":1,"stats":{"Line":1},"fn_name":null},{"line":225,"address":[681590],"length":1,"stats":{"Line":1},"fn_name":null},{"line":227,"address":[681689,681805],"length":1,"stats":{"Line":1},"fn_name":null},{"line":231,"address":[517733,517728],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":232,"address":[681943],"length":1,"stats":{"Line":1},"fn_name":null},{"line":233,"address":[682074,681968],"length":1,"stats":{"Line":2},"fn_name":null},{"line":234,"address":[682081],"length":1,"stats":{"Line":1},"fn_name":null},{"line":236,"address":[682115,682209],"length":1,"stats":{"Line":2},"fn_name":null},{"line":238,"address":[517783,517760],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":241,"address":[682251],"length":1,"stats":{"Line":1},"fn_name":null},{"line":242,"address":[682352],"length":1,"stats":{"Line":1},"fn_name":null},{"line":245,"address":[682694],"length":1,"stats":{"Line":1},"fn_name":null},{"line":247,"address":[682909,682793],"length":1,"stats":{"Line":1},"fn_name":null},{"line":251,"address":[517845,517840],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":252,"address":[683047],"length":1,"stats":{"Line":1},"fn_name":null},{"line":253,"address":[683178,683072],"length":1,"stats":{"Line":2},"fn_name":null},{"line":254,"address":[683185],"length":1,"stats":{"Line":1},"fn_name":null},{"line":256,"address":[683219,683313],"length":1,"stats":{"Line":2},"fn_name":null},{"line":258,"address":[517872,517895],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":261,"address":[683355],"length":1,"stats":{"Line":1},"fn_name":null},{"line":262,"address":[683456],"length":1,"stats":{"Line":1},"fn_name":null},{"line":265,"address":[683798],"length":1,"stats":{"Line":1},"fn_name":null},{"line":267,"address":[683897,684013],"length":1,"stats":{"Line":1},"fn_name":null},{"line":271,"address":[517952,517957],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":272,"address":[684151],"length":1,"stats":{"Line":1},"fn_name":null},{"line":273,"address":[684176,684282],"length":1,"stats":{"Line":2},"fn_name":null},{"line":274,"address":[684289],"length":1,"stats":{"Line":1},"fn_name":null},{"line":276,"address":[684417,684323],"length":1,"stats":{"Line":2},"fn_name":null},{"line":278,"address":[517984,518007],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":281,"address":[684459],"length":1,"stats":{"Line":1},"fn_name":null},{"line":282,"address":[684560],"length":1,"stats":{"Line":1},"fn_name":null},{"line":283,"address":[684733],"length":1,"stats":{"Line":1},"fn_name":null},{"line":285,"address":[684948,684832],"length":1,"stats":{"Line":1},"fn_name":null},{"line":289,"address":[518064,518069],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":290,"address":[685079],"length":1,"stats":{"Line":1},"fn_name":null},{"line":291,"address":[685104,685210],"length":1,"stats":{"Line":2},"fn_name":null},{"line":292,"address":[685217],"length":1,"stats":{"Line":1},"fn_name":null},{"line":294,"address":[685251,685345],"length":1,"stats":{"Line":2},"fn_name":null},{"line":296,"address":[518096,518119],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":299,"address":[685387],"length":1,"stats":{"Line":1},"fn_name":null},{"line":300,"address":[685488],"length":1,"stats":{"Line":1},"fn_name":null},{"line":301,"address":[685661],"length":1,"stats":{"Line":1},"fn_name":null},{"line":303,"address":[685760,685876],"length":1,"stats":{"Line":1},"fn_name":null},{"line":307,"address":[518176,518181],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":308,"address":[686007],"length":1,"stats":{"Line":1},"fn_name":null},{"line":309,"address":[686138,686032],"length":1,"stats":{"Line":2},"fn_name":null},{"line":310,"address":[686145],"length":1,"stats":{"Line":1},"fn_name":null},{"line":312,"address":[686273,686179],"length":1,"stats":{"Line":2},"fn_name":null},{"line":314,"address":[518231,518208],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":317,"address":[686315],"length":1,"stats":{"Line":1},"fn_name":null},{"line":318,"address":[686416],"length":1,"stats":{"Line":1},"fn_name":null},{"line":319,"address":[686589],"length":1,"stats":{"Line":1},"fn_name":null},{"line":321,"address":[686688,686804],"length":1,"stats":{"Line":1},"fn_name":null},{"line":325,"address":[518288,518293],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":326,"address":[686935],"length":1,"stats":{"Line":1},"fn_name":null},{"line":327,"address":[686960,687066],"length":1,"stats":{"Line":2},"fn_name":null},{"line":328,"address":[687073],"length":1,"stats":{"Line":1},"fn_name":null},{"line":330,"address":[687201,687107],"length":1,"stats":{"Line":2},"fn_name":null},{"line":332,"address":[518343,518320],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":335,"address":[687243],"length":1,"stats":{"Line":1},"fn_name":null},{"line":336,"address":[687344],"length":1,"stats":{"Line":1},"fn_name":null},{"line":337,"address":[687517],"length":1,"stats":{"Line":1},"fn_name":null},{"line":339,"address":[687616,687732],"length":1,"stats":{"Line":1},"fn_name":null},{"line":343,"address":[518405,518400],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":344,"address":[687863],"length":1,"stats":{"Line":1},"fn_name":null},{"line":345,"address":[687994,687888],"length":1,"stats":{"Line":2},"fn_name":null},{"line":346,"address":[688001],"length":1,"stats":{"Line":1},"fn_name":null},{"line":348,"address":[688035,688129],"length":1,"stats":{"Line":2},"fn_name":null},{"line":350,"address":[518432,518455],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":353,"address":[688171],"length":1,"stats":{"Line":1},"fn_name":null},{"line":354,"address":[688272],"length":1,"stats":{"Line":1},"fn_name":null},{"line":355,"address":[688464],"length":1,"stats":{"Line":1},"fn_name":null},{"line":357,"address":[688563,688679],"length":1,"stats":{"Line":1},"fn_name":null},{"line":361,"address":[518512,518517],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":362,"address":[688807],"length":1,"stats":{"Line":1},"fn_name":null},{"line":363,"address":[688938,688832],"length":1,"stats":{"Line":2},"fn_name":null},{"line":364,"address":[688945],"length":1,"stats":{"Line":1},"fn_name":null},{"line":366,"address":[689073,688979],"length":1,"stats":{"Line":2},"fn_name":null},{"line":368,"address":[518544,518567],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":371,"address":[689115],"length":1,"stats":{"Line":1},"fn_name":null},{"line":372,"address":[689216],"length":1,"stats":{"Line":1},"fn_name":null},{"line":373,"address":[689351],"length":1,"stats":{"Line":1},"fn_name":null},{"line":375,"address":[689566,689450],"length":1,"stats":{"Line":1},"fn_name":null},{"line":379,"address":[518624,518629],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":380,"address":[689703],"length":1,"stats":{"Line":1},"fn_name":null},{"line":381,"address":[689728,689834],"length":1,"stats":{"Line":2},"fn_name":null},{"line":382,"address":[689841],"length":1,"stats":{"Line":1},"fn_name":null},{"line":384,"address":[689969,689875],"length":1,"stats":{"Line":2},"fn_name":null},{"line":386,"address":[518679,518656],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":389,"address":[690011],"length":1,"stats":{"Line":1},"fn_name":null},{"line":390,"address":[690112],"length":1,"stats":{"Line":1},"fn_name":null},{"line":391,"address":[690247],"length":1,"stats":{"Line":1},"fn_name":null},{"line":393,"address":[690462,690346],"length":1,"stats":{"Line":1},"fn_name":null},{"line":397,"address":[518736,518741],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":398,"address":[690599],"length":1,"stats":{"Line":1},"fn_name":null},{"line":399,"address":[690730,690624],"length":1,"stats":{"Line":2},"fn_name":null},{"line":400,"address":[690737],"length":1,"stats":{"Line":1},"fn_name":null},{"line":402,"address":[690771,690865],"length":1,"stats":{"Line":2},"fn_name":null},{"line":404,"address":[518768,518791],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":407,"address":[690907],"length":1,"stats":{"Line":1},"fn_name":null},{"line":408,"address":[691008],"length":1,"stats":{"Line":1},"fn_name":null},{"line":412,"address":[691575],"length":1,"stats":{"Line":1},"fn_name":null},{"line":414,"address":[691790,691674],"length":1,"stats":{"Line":1},"fn_name":null},{"line":418,"address":[518853,518848],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":419,"address":[691927],"length":1,"stats":{"Line":1},"fn_name":null},{"line":420,"address":[692058,691952],"length":1,"stats":{"Line":2},"fn_name":null},{"line":421,"address":[692065],"length":1,"stats":{"Line":1},"fn_name":null},{"line":423,"address":[692193,692099],"length":1,"stats":{"Line":2},"fn_name":null},{"line":425,"address":[518903,518880],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":428,"address":[692235],"length":1,"stats":{"Line":1},"fn_name":null},{"line":429,"address":[692336],"length":1,"stats":{"Line":1},"fn_name":null},{"line":433,"address":[692853],"length":1,"stats":{"Line":1},"fn_name":null},{"line":435,"address":[692952,693068],"length":1,"stats":{"Line":1},"fn_name":null},{"line":439,"address":[518960,518965],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":440,"address":[693207],"length":1,"stats":{"Line":1},"fn_name":null},{"line":441,"address":[693229,693332],"length":1,"stats":{"Line":2},"fn_name":null},{"line":442,"address":[693339],"length":1,"stats":{"Line":1},"fn_name":null},{"line":444,"address":[693370,693464],"length":1,"stats":{"Line":2},"fn_name":null},{"line":446,"address":[518992,519015],"length":1,"stats":{"Line":0},"fn_name":"{closure#0}"},{"line":449,"address":[693506],"length":1,"stats":{"Line":1},"fn_name":null},{"line":450,"address":[693597],"length":1,"stats":{"Line":1},"fn_name":null},{"line":451,"address":[693616],"length":1,"stats":{"Line":1},"fn_name":null},{"line":453,"address":[693712,693826],"length":1,"stats":{"Line":1},"fn_name":null},{"line":457,"address":[519072,519077],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":458,"address":[693959],"length":1,"stats":{"Line":1},"fn_name":null},{"line":459,"address":[694090,693984],"length":1,"stats":{"Line":2},"fn_name":null},{"line":460,"address":[694097],"length":1,"stats":{"Line":1},"fn_name":null},{"line":462,"address":[694225,694131],"length":1,"stats":{"Line":2},"fn_name":null},{"line":464,"address":[519104,519127],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":467,"address":[694267],"length":1,"stats":{"Line":1},"fn_name":null},{"line":468,"address":[694368],"length":1,"stats":{"Line":1},"fn_name":null},{"line":469,"address":[694446],"length":1,"stats":{"Line":1},"fn_name":null},{"line":471,"address":[694661,694545],"length":1,"stats":{"Line":1},"fn_name":null},{"line":475,"address":[519189,519184],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":476,"address":[694791],"length":1,"stats":{"Line":1},"fn_name":null},{"line":477,"address":[694816,694922],"length":1,"stats":{"Line":2},"fn_name":null},{"line":478,"address":[694929],"length":1,"stats":{"Line":1},"fn_name":null},{"line":480,"address":[695057,694963],"length":1,"stats":{"Line":2},"fn_name":null},{"line":482,"address":[519216,519239],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":485,"address":[695099],"length":1,"stats":{"Line":1},"fn_name":null},{"line":486,"address":[695200],"length":1,"stats":{"Line":1},"fn_name":null},{"line":487,"address":[695278],"length":1,"stats":{"Line":1},"fn_name":null},{"line":489,"address":[695493,695377],"length":1,"stats":{"Line":1},"fn_name":null},{"line":493,"address":[519296,519301],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":494,"address":[695623],"length":1,"stats":{"Line":1},"fn_name":null},{"line":495,"address":[695648,695754],"length":1,"stats":{"Line":2},"fn_name":null},{"line":496,"address":[695761],"length":1,"stats":{"Line":1},"fn_name":null},{"line":498,"address":[695889,695795],"length":1,"stats":{"Line":2},"fn_name":null},{"line":500,"address":[519328,519351],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":503,"address":[695931],"length":1,"stats":{"Line":1},"fn_name":null},{"line":504,"address":[696032],"length":1,"stats":{"Line":1},"fn_name":null},{"line":505,"address":[696110],"length":1,"stats":{"Line":1},"fn_name":null},{"line":507,"address":[696325,696209],"length":1,"stats":{"Line":1},"fn_name":null},{"line":511,"address":[519408,519413],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":512,"address":[696455],"length":1,"stats":{"Line":1},"fn_name":null},{"line":513,"address":[696586,696480],"length":1,"stats":{"Line":2},"fn_name":null},{"line":514,"address":[696593],"length":1,"stats":{"Line":1},"fn_name":null},{"line":516,"address":[696721,696627],"length":1,"stats":{"Line":2},"fn_name":null},{"line":518,"address":[519440,519463],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":521,"address":[696763],"length":1,"stats":{"Line":1},"fn_name":null},{"line":522,"address":[696864],"length":1,"stats":{"Line":1},"fn_name":null},{"line":523,"address":[696942],"length":1,"stats":{"Line":1},"fn_name":null},{"line":525,"address":[697041,697157],"length":1,"stats":{"Line":1},"fn_name":null},{"line":529,"address":[519520,519525],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":530,"address":[697287],"length":1,"stats":{"Line":1},"fn_name":null},{"line":531,"address":[697312,697418],"length":1,"stats":{"Line":2},"fn_name":null},{"line":532,"address":[697425],"length":1,"stats":{"Line":1},"fn_name":null},{"line":534,"address":[697553,697459],"length":1,"stats":{"Line":2},"fn_name":null},{"line":536,"address":[519575,519552],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":539,"address":[697595],"length":1,"stats":{"Line":1},"fn_name":null},{"line":540,"address":[697696],"length":1,"stats":{"Line":1},"fn_name":null},{"line":541,"address":[697888],"length":1,"stats":{"Line":1},"fn_name":null},{"line":543,"address":[697987,698103],"length":1,"stats":{"Line":1},"fn_name":null},{"line":547,"address":[519637,519632],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":548,"address":[698231],"length":1,"stats":{"Line":1},"fn_name":null},{"line":549,"address":[698362,698256],"length":1,"stats":{"Line":2},"fn_name":null},{"line":550,"address":[698369],"length":1,"stats":{"Line":1},"fn_name":null},{"line":552,"address":[698497,698403],"length":1,"stats":{"Line":2},"fn_name":null},{"line":554,"address":[519664,519687],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":557,"address":[698539],"length":1,"stats":{"Line":1},"fn_name":null},{"line":558,"address":[698640],"length":1,"stats":{"Line":1},"fn_name":null},{"line":559,"address":[698718],"length":1,"stats":{"Line":1},"fn_name":null},{"line":561,"address":[698817,698933],"length":1,"stats":{"Line":1},"fn_name":null},{"line":565,"address":[519749,519744],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":566,"address":[699063],"length":1,"stats":{"Line":1},"fn_name":null},{"line":567,"address":[699194,699088],"length":1,"stats":{"Line":2},"fn_name":null},{"line":568,"address":[699201],"length":1,"stats":{"Line":1},"fn_name":null},{"line":570,"address":[699235,699329],"length":1,"stats":{"Line":2},"fn_name":null},{"line":572,"address":[519776,519799],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":575,"address":[699371],"length":1,"stats":{"Line":1},"fn_name":null},{"line":576,"address":[699472],"length":1,"stats":{"Line":1},"fn_name":null},{"line":577,"address":[699531],"length":1,"stats":{"Line":1},"fn_name":null},{"line":579,"address":[699746,699630],"length":1,"stats":{"Line":1},"fn_name":null},{"line":583,"address":[519856,519861],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":584,"address":[699879],"length":1,"stats":{"Line":1},"fn_name":null},{"line":585,"address":[699904,700010],"length":1,"stats":{"Line":2},"fn_name":null},{"line":586,"address":[700017],"length":1,"stats":{"Line":1},"fn_name":null},{"line":588,"address":[700145,700051],"length":1,"stats":{"Line":2},"fn_name":null},{"line":590,"address":[519888,519911],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":593,"address":[700187],"length":1,"stats":{"Line":1},"fn_name":null},{"line":594,"address":[700288],"length":1,"stats":{"Line":1},"fn_name":null},{"line":595,"address":[700366],"length":1,"stats":{"Line":1},"fn_name":null},{"line":597,"address":[700465,700581],"length":1,"stats":{"Line":1},"fn_name":null},{"line":601,"address":[519973,519968],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":602,"address":[700711],"length":1,"stats":{"Line":1},"fn_name":null},{"line":603,"address":[700842,700736],"length":1,"stats":{"Line":2},"fn_name":null},{"line":604,"address":[700849],"length":1,"stats":{"Line":1},"fn_name":null},{"line":606,"address":[700977,700883],"length":1,"stats":{"Line":2},"fn_name":null},{"line":608,"address":[520023,520000],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":611,"address":[701019],"length":1,"stats":{"Line":1},"fn_name":null},{"line":612,"address":[701120],"length":1,"stats":{"Line":1},"fn_name":null},{"line":613,"address":[701179],"length":1,"stats":{"Line":1},"fn_name":null},{"line":615,"address":[701394,701278],"length":1,"stats":{"Line":1},"fn_name":null},{"line":619,"address":[520085,520080],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":620,"address":[701527],"length":1,"stats":{"Line":1},"fn_name":null},{"line":621,"address":[701552,701658],"length":1,"stats":{"Line":2},"fn_name":null},{"line":622,"address":[701665],"length":1,"stats":{"Line":1},"fn_name":null},{"line":624,"address":[701699,701793],"length":1,"stats":{"Line":2},"fn_name":null},{"line":626,"address":[520112,520135],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":629,"address":[701835],"length":1,"stats":{"Line":1},"fn_name":null},{"line":630,"address":[701936],"length":1,"stats":{"Line":1},"fn_name":null},{"line":631,"address":[702052],"length":1,"stats":{"Line":1},"fn_name":null},{"line":633,"address":[702267,702151],"length":1,"stats":{"Line":1},"fn_name":null},{"line":637,"address":[520192,520197],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":638,"address":[702407],"length":1,"stats":{"Line":1},"fn_name":null},{"line":639,"address":[702432,702538],"length":1,"stats":{"Line":2},"fn_name":null},{"line":640,"address":[702545],"length":1,"stats":{"Line":1},"fn_name":null},{"line":642,"address":[702673,702579],"length":1,"stats":{"Line":2},"fn_name":null},{"line":644,"address":[520247,520224],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":647,"address":[702715],"length":1,"stats":{"Line":1},"fn_name":null},{"line":648,"address":[702816],"length":1,"stats":{"Line":1},"fn_name":null},{"line":649,"address":[702951],"length":1,"stats":{"Line":1},"fn_name":null},{"line":651,"address":[703050,703166],"length":1,"stats":{"Line":1},"fn_name":null},{"line":655,"address":[520304,520309],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":656,"address":[703303],"length":1,"stats":{"Line":1},"fn_name":null},{"line":657,"address":[703328,703434],"length":1,"stats":{"Line":2},"fn_name":null},{"line":658,"address":[703441],"length":1,"stats":{"Line":1},"fn_name":null},{"line":660,"address":[703569,703475],"length":1,"stats":{"Line":2},"fn_name":null},{"line":662,"address":[520359,520336],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":665,"address":[703611],"length":1,"stats":{"Line":1},"fn_name":null},{"line":666,"address":[703712],"length":1,"stats":{"Line":1},"fn_name":null},{"line":667,"address":[703790],"length":1,"stats":{"Line":1},"fn_name":null},{"line":669,"address":[704005,703889],"length":1,"stats":{"Line":1},"fn_name":null},{"line":673,"address":[520416,520421],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":674,"address":[704135],"length":1,"stats":{"Line":1},"fn_name":null},{"line":675,"address":[704157,704260],"length":1,"stats":{"Line":2},"fn_name":null},{"line":676,"address":[704267],"length":1,"stats":{"Line":1},"fn_name":null},{"line":678,"address":[704298,704392],"length":1,"stats":{"Line":2},"fn_name":null},{"line":680,"address":[520471,520448],"length":1,"stats":{"Line":0},"fn_name":"{closure#0}"},{"line":683,"address":[704434],"length":1,"stats":{"Line":1},"fn_name":null},{"line":684,"address":[704525],"length":1,"stats":{"Line":1},"fn_name":null},{"line":685,"address":[704544],"length":1,"stats":{"Line":1},"fn_name":null},{"line":687,"address":[704640,704754],"length":1,"stats":{"Line":1},"fn_name":null},{"line":691,"address":[520528,520533],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":692,"address":[704887],"length":1,"stats":{"Line":1},"fn_name":null},{"line":693,"address":[704912,705018],"length":1,"stats":{"Line":2},"fn_name":null},{"line":694,"address":[705025],"length":1,"stats":{"Line":1},"fn_name":null},{"line":696,"address":[705059,705153],"length":1,"stats":{"Line":2},"fn_name":null},{"line":698,"address":[520583,520560],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":701,"address":[705195],"length":1,"stats":{"Line":1},"fn_name":null},{"line":702,"address":[705296],"length":1,"stats":{"Line":1},"fn_name":null},{"line":703,"address":[705374],"length":1,"stats":{"Line":1},"fn_name":null},{"line":705,"address":[705589,705473],"length":1,"stats":{"Line":1},"fn_name":null},{"line":709,"address":[520645,520640],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":710,"address":[705719],"length":1,"stats":{"Line":1},"fn_name":null},{"line":711,"address":[705744,705850],"length":1,"stats":{"Line":2},"fn_name":null},{"line":712,"address":[705857],"length":1,"stats":{"Line":1},"fn_name":null},{"line":714,"address":[705985,705891],"length":1,"stats":{"Line":2},"fn_name":null},{"line":716,"address":[520695,520672],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":719,"address":[706027],"length":1,"stats":{"Line":1},"fn_name":null},{"line":720,"address":[706128],"length":1,"stats":{"Line":1},"fn_name":null},{"line":721,"address":[706206],"length":1,"stats":{"Line":1},"fn_name":null},{"line":723,"address":[706421,706305],"length":1,"stats":{"Line":1},"fn_name":null}],"covered":328,"coverable":330},{"path":["/","home","dan","dev","dan-rusty-chess","src","main.rs"],"content":"use crate::app::App;\nuse crate::chess_board::ChessBoard;\n\nmod app;\nmod chess_board;\nmod chess_move;\nmod piece;\nmod ui;\n\nuse crossterm::{\n event::{self, Event as CEvent, KeyCode},\n terminal::{disable_raw_mode, enable_raw_mode},\n};\nuse std::io::stdout;\nuse std::sync::mpsc;\nuse std::thread;\nuse std::time::{Duration, Instant};\nuse tui::{backend::CrosstermBackend, Terminal};\n\nenum Event\u003cI\u003e {\n Input(I),\n Tick,\n}\n\nfn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n let matches = clap::App::new(env!(\"CARGO_PKG_NAME\"))\n .about(\"♞ Dan's Rusty Chess ♞\")\n .arg(\n clap::Arg::with_name(\"fen\")\n .short(\"f\")\n .long(\"fen\")\n .help(\"Start game with fen string\")\n .takes_value(true),\n )\n .get_matches();\n\n let fen = matches\n .value_of(\"fen\")\n .unwrap_or(\"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1\");\n\n start_ui(fen)\n}\n\npub fn start_ui(fen: \u0026str) -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n let mut chessboard = chess_board::ChessBoard::from_fen(fen);\n let mut app = App::new();\n\n // Configure Crossterm backend for tui\n let stdout = stdout();\n enable_raw_mode()?;\n let backend = CrosstermBackend::new(stdout);\n let mut terminal = Terminal::new(backend)?;\n terminal.clear()?;\n\n let (tx, rx) = mpsc::channel();\n let tick_rate = Duration::from_millis(200);\n thread::spawn(move || {\n let mut last_tick = Instant::now();\n loop {\n let timeout = tick_rate\n .checked_sub(last_tick.elapsed())\n .unwrap_or_else(|| Duration::from_secs(0));\n\n if event::poll(timeout).expect(\"poll works\") {\n if let CEvent::Key(key) = event::read().expect(\"can read events\") {\n tx.send(Event::Input(key)).expect(\"can send events\");\n }\n }\n\n if last_tick.elapsed() \u003e= tick_rate {\n if tx.send(Event::Tick).is_ok() {\n last_tick = Instant::now();\n }\n }\n }\n });\n\n loop {\n terminal.draw(|rect| ui::draw(rect, \u0026app, \u0026chessboard))?;\n\n match rx.recv()? {\n Event::Input(event) =\u003e match (event.modifiers, event.code) {\n (event::KeyModifiers::CONTROL, KeyCode::Char('c')) =\u003e {\n // disable_raw_mode()?;\n // terminal.show_cursor()?;\n break;\n }\n (event::KeyModifiers::NONE, KeyCode::Backspace) =\u003e {\n app.ui_buffer.pop();\n }\n (event::KeyModifiers::NONE, KeyCode::Enter) =\u003e {\n let square_notation = app.ui_buffer.clone();\n app.clear_input();\n chessboard.reset_highlights();\n\n if let Some(square) = ChessBoard::square_from_notation(\u0026square_notation) {\n let moves = chessboard.generate_moves(square);\n app.set_selected_square(square);\n\n moves.iter().for_each(|m| {\n chessboard.highlight_square(m.destination, true);\n app.add_available_move(m);\n });\n }\n }\n (event::KeyModifiers::NONE, KeyCode::Char(c)) =\u003e {\n app.ui_buffer.push(c);\n }\n _ =\u003e {}\n },\n _ =\u003e {}\n }\n }\n\n // Restore the terminal and close application\n terminal.clear()?;\n terminal.show_cursor()?;\n disable_raw_mode()?;\n\n Ok(())\n}\n","traces":[{"line":25,"address":[596096,596470],"length":1,"stats":{"Line":0},"fn_name":"main"},{"line":26,"address":[596109,596402,596449],"length":1,"stats":{"Line":0},"fn_name":null},{"line":29,"address":[596292,596185],"length":1,"stats":{"Line":0},"fn_name":null},{"line":37,"address":[596501,596623],"length":1,"stats":{"Line":0},"fn_name":null},{"line":41,"address":[596639],"length":1,"stats":{"Line":0},"fn_name":null},{"line":44,"address":[596688,600782],"length":1,"stats":{"Line":0},"fn_name":"start_ui"},{"line":45,"address":[596723],"length":1,"stats":{"Line":0},"fn_name":null},{"line":46,"address":[596752],"length":1,"stats":{"Line":0},"fn_name":null},{"line":49,"address":[596826,596759],"length":1,"stats":{"Line":0},"fn_name":null},{"line":50,"address":[596890,596834,596966,597127],"length":1,"stats":{"Line":0},"fn_name":null},{"line":51,"address":[596948,597180],"length":1,"stats":{"Line":0},"fn_name":null},{"line":52,"address":[597196,597582,597474],"length":1,"stats":{"Line":0},"fn_name":null},{"line":53,"address":[597756,597625,597448,597829,597934],"length":1,"stats":{"Line":0},"fn_name":null},{"line":55,"address":[597819,597979],"length":1,"stats":{"Line":0},"fn_name":null},{"line":56,"address":[598056],"length":1,"stats":{"Line":0},"fn_name":null},{"line":57,"address":[598108],"length":1,"stats":{"Line":0},"fn_name":null},{"line":58,"address":[659215],"length":1,"stats":{"Line":0},"fn_name":null},{"line":60,"address":[659324,659400],"length":1,"stats":{"Line":0},"fn_name":null},{"line":61,"address":[659339],"length":1,"stats":{"Line":0},"fn_name":null},{"line":62,"address":[659152,659156],"length":1,"stats":{"Line":0},"fn_name":"{closure#0}"},{"line":64,"address":[659455],"length":1,"stats":{"Line":0},"fn_name":null},{"line":65,"address":[659553],"length":1,"stats":{"Line":0},"fn_name":null},{"line":66,"address":[659730],"length":1,"stats":{"Line":0},"fn_name":null},{"line":70,"address":[659522,659948],"length":1,"stats":{"Line":0},"fn_name":null},{"line":71,"address":[660185,660007],"length":1,"stats":{"Line":0},"fn_name":null},{"line":72,"address":[660140],"length":1,"stats":{"Line":0},"fn_name":null},{"line":79,"address":[660208,660243],"length":1,"stats":{"Line":0},"fn_name":"{closure#1}"},{"line":81,"address":[598490,598682],"length":1,"stats":{"Line":0},"fn_name":null},{"line":82,"address":[599006,599750],"length":1,"stats":{"Line":0},"fn_name":null},{"line":89,"address":[599745,599208],"length":1,"stats":{"Line":0},"fn_name":null},{"line":92,"address":[599218],"length":1,"stats":{"Line":0},"fn_name":null},{"line":93,"address":[599287],"length":1,"stats":{"Line":0},"fn_name":null},{"line":94,"address":[599302],"length":1,"stats":{"Line":0},"fn_name":null},{"line":96,"address":[599358],"length":1,"stats":{"Line":0},"fn_name":null},{"line":97,"address":[599485],"length":1,"stats":{"Line":0},"fn_name":null},{"line":98,"address":[599540],"length":1,"stats":{"Line":0},"fn_name":null},{"line":100,"address":[599566,599645],"length":1,"stats":{"Line":0},"fn_name":null},{"line":101,"address":[660280],"length":1,"stats":{"Line":0},"fn_name":null},{"line":102,"address":[660307],"length":1,"stats":{"Line":0},"fn_name":null},{"line":106,"address":[599245],"length":1,"stats":{"Line":0},"fn_name":null},{"line":107,"address":[599267],"length":1,"stats":{"Line":0},"fn_name":null},{"line":116,"address":[599958,600054,599772],"length":1,"stats":{"Line":0},"fn_name":null},{"line":117,"address":[600340,600244,600091,599941],"length":1,"stats":{"Line":0},"fn_name":null},{"line":118,"address":[600367,600597,600225,600447],"length":1,"stats":{"Line":0},"fn_name":null},{"line":120,"address":[600417],"length":1,"stats":{"Line":0},"fn_name":null}],"covered":0,"coverable":45},{"path":["/","home","dan","dev","dan-rusty-chess","src","piece.rs"],"content":"use crate::{\n chess_board::{ChessBoard, SquareIndex},\n chess_move::{\n ChessMove, DiagonalSlidingMoves, JumpingMoves, MoveGenerator, PawnMoves,\n StraightSlidingMoves,\n },\n};\n\npub struct Piece {\n symbol: char,\n move_generators: Vec\u003cBox\u003cdyn MoveGenerator\u003e\u003e,\n}\n\nimpl Piece {\n pub fn new(symbol: char) -\u003e Piece {\n Piece {\n symbol,\n move_generators: Piece::get_move_generators(symbol),\n }\n }\n\n pub fn get_graphic(self: \u0026Piece) -\u003e char {\n match self.symbol.to_ascii_uppercase() {\n 'R' =\u003e '\\u{265C}',\n 'r' =\u003e '\\u{2656}',\n 'N' =\u003e '\\u{265E}',\n 'n' =\u003e '\\u{2658}',\n 'B' =\u003e '\\u{265D}',\n 'b' =\u003e '\\u{2657}',\n 'K' =\u003e '\\u{265A}',\n 'k' =\u003e '\\u{2654}',\n 'Q' =\u003e '\\u{265B}',\n 'q' =\u003e '\\u{2655}',\n 'P' =\u003e '\\u{265F}',\n 'p' =\u003e '\\u{2659}',\n _ =\u003e ' ',\n }\n }\n fn get_move_generators(symbol: char) -\u003e Vec\u003cBox\u003cdyn MoveGenerator\u003e\u003e {\n match symbol {\n 'R' | 'r' =\u003e vec![Box::new(StraightSlidingMoves::new(7))],\n 'N' | 'n' =\u003e vec![Box::new(JumpingMoves::new(1))],\n 'B' | 'b' =\u003e vec![Box::new(DiagonalSlidingMoves::new(7))],\n 'Q' | 'q' =\u003e vec![\n Box::new(StraightSlidingMoves::new(7)),\n Box::new(DiagonalSlidingMoves::new(7)),\n ],\n 'K' | 'k' =\u003e vec![\n Box::new(StraightSlidingMoves::new(1)),\n Box::new(DiagonalSlidingMoves::new(1)),\n ],\n 'P' =\u003e vec![Box::new(PawnMoves::new(1, 2))],\n 'p' =\u003e vec![Box::new(PawnMoves::new(-1, 7))],\n\n _ =\u003e vec![],\n }\n }\n pub fn is_black(self: \u0026Piece) -\u003e bool {\n self.symbol.is_lowercase()\n }\n pub fn is_white(self: \u0026Piece) -\u003e bool {\n !self.is_black()\n }\n\n pub fn generate_moves(\n self: \u0026Piece,\n chess_board: \u0026ChessBoard,\n source: SquareIndex,\n ) -\u003e Vec\u003cChessMove\u003e {\n let mut moves: Vec\u003cChessMove\u003e = Vec::new();\n for move_generator in \u0026self.move_generators {\n moves.append(\u0026mut move_generator.generate_moves(chess_board, source));\n }\n moves\n }\n\n pub fn is_enemy(\u0026self, other: \u0026Piece) -\u003e bool {\n self.is_black() == other.is_white()\n }\n}\n","traces":[{"line":15,"address":[559472],"length":1,"stats":{"Line":1},"fn_name":"new"},{"line":18,"address":[559494],"length":1,"stats":{"Line":12},"fn_name":null},{"line":22,"address":[559552],"length":1,"stats":{"Line":0},"fn_name":"get_graphic"},{"line":23,"address":[559561],"length":1,"stats":{"Line":0},"fn_name":null},{"line":24,"address":[559622],"length":1,"stats":{"Line":0},"fn_name":null},{"line":25,"address":[559632],"length":1,"stats":{"Line":0},"fn_name":null},{"line":26,"address":[559642],"length":1,"stats":{"Line":0},"fn_name":null},{"line":27,"address":[559652],"length":1,"stats":{"Line":0},"fn_name":null},{"line":28,"address":[559662],"length":1,"stats":{"Line":0},"fn_name":null},{"line":29,"address":[559672],"length":1,"stats":{"Line":0},"fn_name":null},{"line":30,"address":[559682],"length":1,"stats":{"Line":0},"fn_name":null},{"line":31,"address":[559692],"length":1,"stats":{"Line":0},"fn_name":null},{"line":32,"address":[559702],"length":1,"stats":{"Line":0},"fn_name":null},{"line":33,"address":[559712],"length":1,"stats":{"Line":0},"fn_name":null},{"line":34,"address":[559722],"length":1,"stats":{"Line":0},"fn_name":null},{"line":35,"address":[559732],"length":1,"stats":{"Line":0},"fn_name":null},{"line":36,"address":[559612],"length":1,"stats":{"Line":0},"fn_name":null},{"line":39,"address":[559760,560393],"length":1,"stats":{"Line":1},"fn_name":"get_move_generators"},{"line":40,"address":[559792],"length":1,"stats":{"Line":12},"fn_name":null},{"line":41,"address":[562347,559852,562242],"length":1,"stats":{"Line":18},"fn_name":null},{"line":42,"address":[559880,562125,562019],"length":1,"stats":{"Line":8},"fn_name":null},{"line":43,"address":[559908,561796,561902],"length":1,"stats":{"Line":4},"fn_name":null},{"line":44,"address":[561416,561635,559936],"length":1,"stats":{"Line":1},"fn_name":null},{"line":45,"address":[561286,561488],"length":1,"stats":{"Line":2},"fn_name":null},{"line":46,"address":[561516],"length":1,"stats":{"Line":1},"fn_name":null},{"line":48,"address":[559964,561116,560894],"length":1,"stats":{"Line":3},"fn_name":null},{"line":49,"address":[560966,560764],"length":1,"stats":{"Line":6},"fn_name":null},{"line":50,"address":[560994],"length":1,"stats":{"Line":3},"fn_name":null},{"line":52,"address":[560434,560626,559992],"length":1,"stats":{"Line":6},"fn_name":null},{"line":53,"address":[560087,560020,560279],"length":1,"stats":{"Line":4},"fn_name":null},{"line":55,"address":[559842],"length":1,"stats":{"Line":0},"fn_name":null},{"line":58,"address":[562448],"length":1,"stats":{"Line":4},"fn_name":"is_black"},{"line":59,"address":[562457],"length":1,"stats":{"Line":4},"fn_name":null},{"line":61,"address":[562496],"length":1,"stats":{"Line":4},"fn_name":"is_white"},{"line":62,"address":[562505],"length":1,"stats":{"Line":2},"fn_name":null},{"line":65,"address":[562544,562862],"length":1,"stats":{"Line":12},"fn_name":"generate_moves"},{"line":70,"address":[562600],"length":1,"stats":{"Line":1},"fn_name":null},{"line":71,"address":[562610,562691,562757],"length":1,"stats":{"Line":25},"fn_name":null},{"line":72,"address":[562770],"length":1,"stats":{"Line":1},"fn_name":null},{"line":77,"address":[562880],"length":1,"stats":{"Line":4},"fn_name":"is_enemy"},{"line":78,"address":[562899],"length":1,"stats":{"Line":4},"fn_name":null}],"covered":25,"coverable":41},{"path":["/","home","dan","dev","dan-rusty-chess","src","ui.rs"],"content":"use tui::backend::Backend;\nuse tui::layout::{Alignment, Constraint, Direction, Layout};\nuse tui::style::{Color, Style};\nuse tui::text::{Span, Spans};\nuse tui::widgets::{Block, BorderType, Borders, Paragraph};\nuse tui::Frame;\nuse unicode_width::UnicodeWidthStr;\n\nuse crate::app::App;\nuse crate::chess_board::{ChessBoard, SquareIndex, TOTAL_RANKS};\n// use crate::app::App;\n\npub fn draw\u003cB\u003e(rect: \u0026mut Frame\u003cB\u003e, app: \u0026App, chessboard: \u0026ChessBoard)\nwhere\n B: Backend,\n{\n let size = rect.size();\n // check_size(\u0026size);\n\n // Vertical layout\n let chunks = Layout::default()\n .direction(Direction::Vertical)\n .constraints([Constraint::Length(3), Constraint::Min(12)].as_ref())\n .split(size);\n\n let main_chunks = Layout::default()\n .direction(Direction::Horizontal)\n .constraints([Constraint::Length(23), Constraint::Min(12)].as_ref())\n .split(chunks[1]);\n\n // Add widgets\n let title = draw_title();\n let chessboard = draw_chessboard(chessboard);\n let user_input = draw_user_input(app);\n rect.render_widget(title, chunks[0]);\n // rect.render_widget(main_chunks, chunks[1]);\n rect.render_widget(chessboard, main_chunks[0]);\n rect.render_widget(user_input, main_chunks[1]);\n\n rect.set_cursor(\n main_chunks[1].x + app.ui_buffer.width() as u16 + 1,\n main_chunks[1].y + 2,\n )\n}\n\nfn draw_title\u003c'a\u003e() -\u003e Paragraph\u003c'a\u003e {\n Paragraph::new(\"♞ Dan's Rusty Chess ♞\")\n .style(Style::default().fg(Color::LightCyan))\n .alignment(Alignment::Center)\n .block(\n Block::default()\n .borders(Borders::ALL)\n .style(Style::default().fg(Color::White))\n .border_type(BorderType::Plain),\n )\n}\n\nfn draw_user_input(app: \u0026App) -\u003e Paragraph {\n let mut ui_texts = vec![\n Spans::from(\"Enter square to show moves: \".to_string()),\n Spans::from(app.ui_buffer.to_string()),\n ];\n\n if let Some(square) = app.get_selected_square() {\n let notationed_moves: Vec\u003cString\u003e = app\n .available_moves()\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n let text = format!(\n \"Moves for {} are: \",\n ChessBoard::square_to_notation(square).unwrap()\n );\n ui_texts.push(Spans::from(text));\n ui_texts.push(Spans::from(notationed_moves.join(\",\")));\n }\n\n Paragraph::new(ui_texts)\n .style(Style::default().fg(Color::LightCyan))\n .alignment(Alignment::Left)\n .block(\n Block::default()\n .borders(Borders::ALL)\n .style(Style::default().fg(Color::White))\n .border_type(BorderType::Plain),\n )\n}\n\nfn draw_chessboard(chessboard: \u0026ChessBoard) -\u003e Paragraph {\n let mut board_lines: Vec\u003cSpans\u003e = Vec::new();\n\n board_lines.push(Spans::from(vec![Span::raw(\" a b c d e f g h\")]));\n\n for rank in (1..=TOTAL_RANKS).rev() {\n let mut board_line: Vec\u003cSpan\u003e = Vec::new();\n board_line.push(Span::raw(format!(\"{} \", rank)));\n\n for (i, piece) in chessboard\n .get_pieces_on_rank(rank.into())\n .iter()\n .enumerate()\n {\n let piece_symbol;\n let square_colour;\n let mut piece_colour = Color::White;\n\n if let Some(piece) = piece {\n piece_symbol = format!(\"{} \", piece.get_graphic());\n piece_colour = if piece.is_black() {\n Color::Black\n } else {\n Color::White\n };\n } else {\n piece_symbol = \" \".to_string();\n }\n\n let square_index: SquareIndex =\n ChessBoard::square_from_file_and_rank(i as u8, rank - 1).unwrap();\n if (i + (rank as usize)) % 2 == 0 {\n square_colour = if chessboard.is_highlit(square_index) {\n Color::Rgb(255, 189, 123)\n } else {\n Color::Rgb(168, 123, 80)\n }\n } else {\n square_colour = if chessboard.is_highlit(square_index) {\n Color::Rgb(240, 179, 64)\n } else {\n Color::Rgb(100, 70, 25)\n }\n }\n\n board_line.push(Span::styled(\n piece_symbol,\n Style::default().fg(piece_colour).bg(square_colour),\n ));\n }\n board_line.push(Span::raw(format!(\" {}\", rank)));\n\n board_lines.push(Spans::from(board_line));\n }\n board_lines.push(Spans::from(vec![Span::raw(\" a b c d e f g h\")]));\n\n let chessboard_ui = Paragraph::new(board_lines)\n .alignment(Alignment::Left)\n .block(\n Block::default()\n .borders(Borders::ALL)\n .style(Style::default().fg(Color::White))\n .border_type(BorderType::Plain),\n );\n\n chessboard_ui\n}\n\n// fn check_size(rect: \u0026Rect) {\n// if rect.width \u003c 52 {\n// panic!(\"Require width \u003e= 52, (got {})\", rect.width);\n// }\n// if rect.height \u003c 10 {\n// panic!(\"Require height \u003e= 28, (got {})\", rect.height);\n// }\n// }\n","traces":[{"line":13,"address":[750240,750616],"length":1,"stats":{"Line":0},"fn_name":"draw\u003ctui::backend::crossterm::CrosstermBackend\u003cstd::io::stdio::Stdout\u003e\u003e"},{"line":17,"address":[750295],"length":1,"stats":{"Line":0},"fn_name":null},{"line":21,"address":[750410,750492,750581,750388],"length":1,"stats":{"Line":0},"fn_name":null},{"line":22,"address":[750402,750444],"length":1,"stats":{"Line":0},"fn_name":null},{"line":23,"address":[750631,750452,750523],"length":1,"stats":{"Line":0},"fn_name":null},{"line":24,"address":[750647,750565],"length":1,"stats":{"Line":0},"fn_name":null},{"line":26,"address":[750846,750704,750769,750989],"length":1,"stats":{"Line":0},"fn_name":null},{"line":27,"address":[750804,750761],"length":1,"stats":{"Line":0},"fn_name":null},{"line":28,"address":[750877,750954,750812],"length":1,"stats":{"Line":0},"fn_name":null},{"line":29,"address":[751024,750922,750978],"length":1,"stats":{"Line":0},"fn_name":null},{"line":32,"address":[751092],"length":1,"stats":{"Line":0},"fn_name":null},{"line":33,"address":[751148],"length":1,"stats":{"Line":0},"fn_name":null},{"line":34,"address":[751240,751195],"length":1,"stats":{"Line":0},"fn_name":null},{"line":35,"address":[751248,751730,751461],"length":1,"stats":{"Line":0},"fn_name":null},{"line":37,"address":[751759,751552,752007],"length":1,"stats":{"Line":0},"fn_name":null},{"line":38,"address":[752158,751847,752039],"length":1,"stats":{"Line":0},"fn_name":null},{"line":40,"address":[752447],"length":1,"stats":{"Line":0},"fn_name":null},{"line":41,"address":[752126,752374,752190],"length":1,"stats":{"Line":0},"fn_name":null},{"line":42,"address":[752460,752342,752409],"length":1,"stats":{"Line":0},"fn_name":null},{"line":46,"address":[574944,575340],"length":1,"stats":{"Line":0},"fn_name":"draw_title"},{"line":47,"address":[574961,575311,575243,575826],"length":1,"stats":{"Line":0},"fn_name":null},{"line":48,"address":[575295,575355,575018],"length":1,"stats":{"Line":0},"fn_name":null},{"line":49,"address":[575303,575371],"length":1,"stats":{"Line":0},"fn_name":null},{"line":51,"address":[575699,575767,575379],"length":1,"stats":{"Line":0},"fn_name":null},{"line":52,"address":[575468],"length":1,"stats":{"Line":0},"fn_name":null},{"line":53,"address":[575802,575476,575751],"length":1,"stats":{"Line":0},"fn_name":null},{"line":54,"address":[575759],"length":1,"stats":{"Line":0},"fn_name":null},{"line":58,"address":[575904,576296],"length":1,"stats":{"Line":0},"fn_name":"draw_user_input"},{"line":59,"address":[576319,575943,576158,576076],"length":1,"stats":{"Line":0},"fn_name":null},{"line":60,"address":[576014],"length":1,"stats":{"Line":0},"fn_name":null},{"line":61,"address":[576124],"length":1,"stats":{"Line":0},"fn_name":null},{"line":64,"address":[576442,576327],"length":1,"stats":{"Line":0},"fn_name":null},{"line":65,"address":[576552,576463],"length":1,"stats":{"Line":0},"fn_name":null},{"line":68,"address":[752624,752647],"length":1,"stats":{"Line":0},"fn_name":"{closure#0}"},{"line":70,"address":[577067,576770],"length":1,"stats":{"Line":0},"fn_name":null},{"line":72,"address":[576673],"length":1,"stats":{"Line":0},"fn_name":null},{"line":74,"address":[577124,577008],"length":1,"stats":{"Line":0},"fn_name":null},{"line":75,"address":[577131],"length":1,"stats":{"Line":0},"fn_name":null},{"line":78,"address":[578092,577274,577507,576478,577575],"length":1,"stats":{"Line":0},"fn_name":null},{"line":79,"address":[577610,577559,577282],"length":1,"stats":{"Line":0},"fn_name":null},{"line":80,"address":[577567,577629],"length":1,"stats":{"Line":0},"fn_name":null},{"line":82,"address":[577637,577962,578030],"length":1,"stats":{"Line":0},"fn_name":null},{"line":83,"address":[577729],"length":1,"stats":{"Line":0},"fn_name":null},{"line":84,"address":[578014,578065,577737],"length":1,"stats":{"Line":0},"fn_name":null},{"line":85,"address":[578022],"length":1,"stats":{"Line":0},"fn_name":null},{"line":89,"address":[582401,578208],"length":1,"stats":{"Line":0},"fn_name":"draw_chessboard"},{"line":90,"address":[578247],"length":1,"stats":{"Line":0},"fn_name":null},{"line":92,"address":[578327,578438],"length":1,"stats":{"Line":0},"fn_name":null},{"line":94,"address":[578595,578986,581526],"length":1,"stats":{"Line":0},"fn_name":null},{"line":95,"address":[579000],"length":1,"stats":{"Line":0},"fn_name":null},{"line":96,"address":[579207,579019],"length":1,"stats":{"Line":0},"fn_name":null},{"line":98,"address":[581224,579355,579676],"length":1,"stats":{"Line":0},"fn_name":null},{"line":99,"address":[579316],"length":1,"stats":{"Line":0},"fn_name":null},{"line":105,"address":[579724],"length":1,"stats":{"Line":0},"fn_name":null},{"line":107,"address":[580285,579732,579888],"length":1,"stats":{"Line":0},"fn_name":null},{"line":108,"address":[579985,579788],"length":1,"stats":{"Line":0},"fn_name":null},{"line":109,"address":[580232,580261,580271],"length":1,"stats":{"Line":0},"fn_name":null},{"line":110,"address":[580263],"length":1,"stats":{"Line":0},"fn_name":null},{"line":112,"address":[580253],"length":1,"stats":{"Line":0},"fn_name":null},{"line":115,"address":[579805],"length":1,"stats":{"Line":0},"fn_name":null},{"line":118,"address":[580304,579946],"length":1,"stats":{"Line":0},"fn_name":null},{"line":120,"address":[580785,580411],"length":1,"stats":{"Line":0},"fn_name":null},{"line":121,"address":[580493,580699,580737,580771],"length":1,"stats":{"Line":0},"fn_name":null},{"line":122,"address":[580739],"length":1,"stats":{"Line":0},"fn_name":null},{"line":124,"address":[580705],"length":1,"stats":{"Line":0},"fn_name":null},{"line":127,"address":[580578,580522,580612],"length":1,"stats":{"Line":0},"fn_name":null},{"line":128,"address":[580580],"length":1,"stats":{"Line":0},"fn_name":null},{"line":130,"address":[580546],"length":1,"stats":{"Line":0},"fn_name":null},{"line":134,"address":[581190,581114],"length":1,"stats":{"Line":0},"fn_name":null},{"line":135,"address":[580626],"length":1,"stats":{"Line":0},"fn_name":null},{"line":136,"address":[580800,580674,580955],"length":1,"stats":{"Line":0},"fn_name":null},{"line":139,"address":[579615,581264],"length":1,"stats":{"Line":0},"fn_name":null},{"line":141,"address":[581428],"length":1,"stats":{"Line":0},"fn_name":null},{"line":143,"address":[581563,578968],"length":1,"stats":{"Line":0},"fn_name":null},{"line":145,"address":[581817,582315,581746],"length":1,"stats":{"Line":0},"fn_name":null},{"line":146,"address":[581852,581809],"length":1,"stats":{"Line":0},"fn_name":null},{"line":148,"address":[582253,581860,582185],"length":1,"stats":{"Line":0},"fn_name":null},{"line":149,"address":[581952],"length":1,"stats":{"Line":0},"fn_name":null},{"line":150,"address":[582288,582237,581960],"length":1,"stats":{"Line":0},"fn_name":null},{"line":151,"address":[582245],"length":1,"stats":{"Line":0},"fn_name":null}],"covered":0,"coverable":80}]};
var previousData = {"files":[{"path":["/","home","dan","dev","dan-rusty-chess","src","app.rs"],"content":"use crate::{chess_board::SquareIndex, chess_move::ChessMove};\n\npub struct App {\n pub ui_buffer: String,\n available_moves: Vec\u003cChessMove\u003e,\n selected_square: Option\u003cSquareIndex\u003e,\n}\n\nimpl App {\n pub fn new() -\u003e Self {\n App {\n ui_buffer: String::new(),\n available_moves: Vec::new(),\n selected_square: None,\n }\n }\n\n pub fn add_available_move(\u0026mut self, available_move: \u0026ChessMove) {\n self.available_moves.push(*available_move);\n }\n\n pub fn available_moves(\u0026self) -\u003e \u0026Vec\u003cChessMove\u003e {\n \u0026self.available_moves\n }\n\n pub fn clear_input(\u0026mut self) {\n self.ui_buffer.clear();\n self.available_moves.clear();\n self.selected_square = None;\n }\n\n pub fn set_selected_square(\u0026mut self, square: u8) {\n self.selected_square = Some(square);\n }\n\n pub fn get_selected_square(\u0026self) -\u003e Option\u003cSquareIndex\u003e {\n self.selected_square\n }\n}\n","traces":[{"line":10,"address":[759712,759868],"length":1,"stats":{"Line":0},"fn_name":"new"},{"line":12,"address":[759725],"length":1,"stats":{"Line":0},"fn_name":null},{"line":13,"address":[759740],"length":1,"stats":{"Line":0},"fn_name":null},{"line":18,"address":[759888],"length":1,"stats":{"Line":0},"fn_name":"add_available_move"},{"line":19,"address":[759905],"length":1,"stats":{"Line":0},"fn_name":null},{"line":22,"address":[759936],"length":1,"stats":{"Line":0},"fn_name":"available_moves"},{"line":23,"address":[759944],"length":1,"stats":{"Line":0},"fn_name":null},{"line":26,"address":[759952],"length":1,"stats":{"Line":0},"fn_name":"clear_input"},{"line":27,"address":[759965],"length":1,"stats":{"Line":0},"fn_name":null},{"line":28,"address":[759974],"length":1,"stats":{"Line":0},"fn_name":null},{"line":29,"address":[759987],"length":1,"stats":{"Line":0},"fn_name":null},{"line":32,"address":[760016],"length":1,"stats":{"Line":0},"fn_name":"set_selected_square"},{"line":33,"address":[760032],"length":1,"stats":{"Line":0},"fn_name":null},{"line":36,"address":[760064],"length":1,"stats":{"Line":0},"fn_name":"get_selected_square"},{"line":37,"address":[760069],"length":1,"stats":{"Line":0},"fn_name":null}],"covered":0,"coverable":15},{"path":["/","home","dan","dev","dan-rusty-chess","src","chess_board.rs"],"content":"use crate::{chess_move::ChessMove, piece::Piece};\nuse std::str;\n\npub type SquareIndex = u8;\npub type FileIndex = u8;\npub type RankIndex = u8;\n\npub const TOTAL_RANKS: RankIndex = 8;\npub const TOTAL_FILES: FileIndex = 8;\npub const TOTAL_SQUARES: SquareIndex = TOTAL_RANKS * TOTAL_FILES;\n\npub struct ChessBoard {\n board: [Option\u003cPiece\u003e; TOTAL_SQUARES as usize],\n highlit: [bool; TOTAL_SQUARES as usize],\n}\n\nimpl ChessBoard {\n pub fn new() -\u003e ChessBoard {\n const INIT: Option\u003cPiece\u003e = None;\n ChessBoard {\n board: [INIT; TOTAL_SQUARES as usize],\n highlit: [false; TOTAL_SQUARES as usize],\n }\n }\n pub fn from_fen(fen: \u0026str) -\u003e ChessBoard {\n let mut board = ChessBoard::new();\n\n let mut fen_sections = fen.split(' ');\n\n let mut file: SquareIndex = 0;\n let mut rank: SquareIndex = TOTAL_RANKS - 1;\n\n let piece_placements = fen_sections.next().unwrap_or(\"\");\n\n for piece_placement in piece_placements.chars() {\n if piece_placement.is_digit(10) {\n file += piece_placement.to_digit(10).unwrap_or_default() as u8\n } else if piece_placement == '/' {\n rank -= 1;\n file = 0;\n } else {\n let ix = ChessBoard::square_from_file_and_rank(file, rank).unwrap();\n let piece = Piece::new(piece_placement);\n board.board[ix as usize] = Some(piece);\n file += 1;\n }\n }\n\n board\n }\n pub fn get_piece(\u0026self, square_index: SquareIndex) -\u003e \u0026Option\u003cPiece\u003e {\n \u0026self.board[square_index as usize]\n }\n pub fn get_pieces_on_rank(\u0026self, rank: usize) -\u003e \u0026[Option\u003cPiece\u003e] {\n let start = (rank - 1) * TOTAL_FILES as usize;\n \u0026self.board[start..start + TOTAL_FILES as usize]\n }\n\n // pub fn draw(\u0026self) -\u003e String {\n // let mut output: String = format!(\"\");\n\n // output.push_str(\" a b c d e f g h\\n\");\n\n // for rank in (1..=TOTAL_RANKS).rev() {\n // output.push_str(\u0026format!(\"{} \", rank));\n // for (i, piece) in self.get_pieces_on_rank(rank.into()).iter().enumerate() {\n // let coloured_symbol: ColoredString;\n\n // if let Some(piece) = piece {\n // let piece_symbol = \u0026format!(\"{} \", piece.get_graphic());\n // let piece_symbol = if piece.is_black() {\n // piece_symbol.truecolor(0, 0, 0)\n // } else {\n // piece_symbol.truecolor(240, 240, 240)\n // };\n // coloured_symbol = piece_symbol;\n // } else {\n // let piece_symbol = \u0026format!(\"{} \", \" \");\n // coloured_symbol = piece_symbol.white();\n // }\n\n // let square_index: SquareIndex =\n // ChessBoard::square_from_file_and_rank(i as u8, rank - 1).unwrap();\n // if (i + (rank as usize)) % 2 == 0 {\n // if self.is_highlit(square_index) {\n // output\n // .push_str(\u0026format!(\"{}\", coloured_symbol.on_truecolor(255, 189, 123)));\n // } else {\n // output.push_str(\u0026format!(\"{}\", coloured_symbol.on_truecolor(168, 123, 80)));\n // }\n // } else {\n // if self.is_highlit(square_index) {\n // output.push_str(\u0026format!(\"{}\", coloured_symbol.on_truecolor(240, 179, 64)));\n // } else {\n // output.push_str(\u0026format!(\"{}\", coloured_symbol.on_truecolor(100, 70, 25)));\n // }\n // }\n // }\n // output.push_str(\u0026format!(\" {} \", rank));\n\n // output += \"\\n\";\n // }\n // output.push_str(\" a b c d e f g h\");\n\n // output\n // }\n\n pub fn square_from_notation(notation: \u0026str) -\u003e Option\u003cSquareIndex\u003e {\n let files = \"abcdefgh\";\n let ranks = \"12345678\";\n let mut notation_chars = notation.chars();\n\n let file = notation_chars.next();\n let rank = notation_chars.next();\n\n let file_ix = files.find(file?);\n let rank_ix = ranks.find(rank?);\n\n Some((file_ix? + rank_ix? * 8).try_into().unwrap())\n }\n\n pub fn square_to_notation(index: SquareIndex) -\u003e Option\u003cString\u003e {\n let files = \"abcdefgh\";\n let ranks = \"12345678\";\n\n let (file_ix, rank_ix) = ChessBoard::square_to_file_and_rank(index);\n\n let file = files.chars().nth(file_ix.try_into().unwrap());\n let rank = ranks.chars().nth(rank_ix.try_into().unwrap());\n\n Some(format!(\"{}{}\", file?, rank?))\n }\n\n pub fn square_from_file_and_rank(file: FileIndex, rank: RankIndex) -\u003e Option\u003cSquareIndex\u003e {\n let ix = rank * TOTAL_RANKS + file;\n\n if ix \u003e= TOTAL_SQUARES {\n None\n } else {\n Some(ix)\n }\n }\n\n pub fn square_to_file_and_rank(square_index: SquareIndex) -\u003e (FileIndex, RankIndex) {\n let file_ix = square_index % TOTAL_FILES;\n let rank_ix = square_index / TOTAL_RANKS;\n\n (file_ix, rank_ix)\n }\n\n pub fn generate_moves(\u0026self, index: SquareIndex) -\u003e Vec\u003cChessMove\u003e {\n if let Some(piece) = self.get_piece(index) {\n piece.generate_moves(self, index)\n } else {\n vec![]\n }\n }\n\n pub fn reset_highlights(\u0026mut self) {\n self.highlit = [false; TOTAL_SQUARES as usize];\n }\n\n pub fn highlight_square(\u0026mut self, index: SquareIndex, highlight: bool) {\n self.highlit[index as usize] = highlight;\n }\n\n pub fn is_highlit(\u0026self, index: SquareIndex) -\u003e bool {\n self.highlit[index as usize]\n }\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n\n #[test]\n fn test_from_notation() {\n assert_eq!(ChessBoard::square_from_notation(\"a1\"), Some(0));\n assert_eq!(ChessBoard::square_from_notation(\"a8\"), Some(56));\n assert_eq!(ChessBoard::square_from_notation(\"h1\"), Some(7));\n assert_eq!(ChessBoard::square_from_notation(\"h8\"), Some(63));\n assert_eq!(ChessBoard::square_from_notation(\"dan\"), None);\n assert_eq!(ChessBoard::square_from_notation(\"123\"), None);\n assert_eq!(ChessBoard::square_from_notation(\"\"), None);\n }\n\n #[test]\n fn test_to_notation() {\n assert_eq!(ChessBoard::square_to_notation(0), Some(\"a1\".to_string()));\n assert_eq!(ChessBoard::square_to_notation(56), Some(\"a8\".to_string()));\n assert_eq!(ChessBoard::square_to_notation(7), Some(\"h1\".to_string()));\n assert_eq!(ChessBoard::square_to_notation(63), Some(\"h8\".to_string()));\n assert_eq!(ChessBoard::square_to_notation(255), None);\n assert_eq!(ChessBoard::square_to_notation(u8::MAX), None);\n assert_eq!(ChessBoard::square_to_notation(64), None);\n }\n\n #[test]\n fn test_to_and_from_file_ranks() {\n let square = ChessBoard::square_from_file_and_rank(1, 1).unwrap();\n assert_eq!(\"b2\", ChessBoard::square_to_notation(square).unwrap());\n }\n}\n","traces":[{"line":18,"address":[709024],"length":1,"stats":{"Line":13},"fn_name":"new"},{"line":21,"address":[709041],"length":1,"stats":{"Line":13},"fn_name":null},{"line":22,"address":[709145],"length":1,"stats":{"Line":13},"fn_name":null},{"line":25,"address":[709232,710511],"length":1,"stats":{"Line":13},"fn_name":"from_fen"},{"line":26,"address":[709284],"length":1,"stats":{"Line":13},"fn_name":null},{"line":28,"address":[709307],"length":1,"stats":{"Line":13},"fn_name":null},{"line":30,"address":[709331],"length":1,"stats":{"Line":13},"fn_name":null},{"line":31,"address":[709339],"length":1,"stats":{"Line":13},"fn_name":null},{"line":33,"address":[709347,709426],"length":1,"stats":{"Line":26},"fn_name":null},{"line":35,"address":[709628,709482],"length":1,"stats":{"Line":26},"fn_name":null},{"line":36,"address":[709651,709762],"length":1,"stats":{"Line":24},"fn_name":null},{"line":37,"address":[709767,709695],"length":1,"stats":{"Line":11},"fn_name":null},{"line":38,"address":[710416,709676,710473],"length":1,"stats":{"Line":24},"fn_name":null},{"line":39,"address":[710458,710478,709799],"length":1,"stats":{"Line":18},"fn_name":null},{"line":40,"address":[710465],"length":1,"stats":{"Line":9},"fn_name":null},{"line":42,"address":[709828],"length":1,"stats":{"Line":2},"fn_name":null},{"line":43,"address":[709917],"length":1,"stats":{"Line":4},"fn_name":null},{"line":44,"address":[710306,709928],"length":1,"stats":{"Line":10},"fn_name":null},{"line":45,"address":[710421,710267,710409],"length":1,"stats":{"Line":23},"fn_name":null},{"line":51,"address":[710528],"length":1,"stats":{"Line":13},"fn_name":"get_piece"},{"line":52,"address":[710549,710597],"length":1,"stats":{"Line":13},"fn_name":null},{"line":54,"address":[710624],"length":1,"stats":{"Line":0},"fn_name":"get_pieces_on_rank"},{"line":55,"address":[710754,710643],"length":1,"stats":{"Line":0},"fn_name":null},{"line":56,"address":[710799,710736],"length":1,"stats":{"Line":0},"fn_name":null},{"line":108,"address":[710896],"length":1,"stats":{"Line":1},"fn_name":"square_from_notation"},{"line":109,"address":[710919],"length":1,"stats":{"Line":1},"fn_name":null},{"line":110,"address":[710946],"length":1,"stats":{"Line":1},"fn_name":null},{"line":111,"address":[710973],"length":1,"stats":{"Line":1},"fn_name":null},{"line":113,"address":[710988],"length":1,"stats":{"Line":1},"fn_name":null},{"line":114,"address":[711009],"length":1,"stats":{"Line":1},"fn_name":null},{"line":116,"address":[711034],"length":1,"stats":{"Line":1},"fn_name":null},{"line":117,"address":[711156],"length":1,"stats":{"Line":1},"fn_name":null},{"line":119,"address":[711270],"length":1,"stats":{"Line":1},"fn_name":null},{"line":122,"address":[711616],"length":1,"stats":{"Line":1},"fn_name":"square_to_notation"},{"line":123,"address":[711643],"length":1,"stats":{"Line":1},"fn_name":null},{"line":124,"address":[711670],"length":1,"stats":{"Line":1},"fn_name":null},{"line":126,"address":[711697],"length":1,"stats":{"Line":1},"fn_name":null},{"line":128,"address":[711735],"length":1,"stats":{"Line":2},"fn_name":null},{"line":129,"address":[711831],"length":1,"stats":{"Line":2},"fn_name":null},{"line":131,"address":[712039,711937],"length":1,"stats":{"Line":4},"fn_name":null},{"line":134,"address":[712432],"length":1,"stats":{"Line":1},"fn_name":"square_from_file_and_rank"},{"line":135,"address":[712536,712454],"length":1,"stats":{"Line":1},"fn_name":null},{"line":137,"address":[712530,712579],"length":1,"stats":{"Line":2},"fn_name":null},{"line":138,"address":[712581],"length":1,"stats":{"Line":0},"fn_name":null},{"line":140,"address":[712570],"length":1,"stats":{"Line":1},"fn_name":null},{"line":144,"address":[712608],"length":1,"stats":{"Line":1},"fn_name":"square_to_file_and_rank"},{"line":145,"address":[712628],"length":1,"stats":{"Line":2},"fn_name":null},{"line":146,"address":[712616,712632],"length":1,"stats":{"Line":3},"fn_name":null},{"line":148,"address":[712636],"length":1,"stats":{"Line":2},"fn_name":null},{"line":151,"address":[712656],"length":1,"stats":{"Line":13},"fn_name":"generate_moves"},{"line":152,"address":[712698],"length":1,"stats":{"Line":13},"fn_name":null},{"line":153,"address":[712769],"length":1,"stats":{"Line":13},"fn_name":null},{"line":155,"address":[712784],"length":1,"stats":{"Line":1},"fn_name":null},{"line":159,"address":[712800],"length":1,"stats":{"Line":0},"fn_name":"reset_highlights"},{"line":160,"address":[712805],"length":1,"stats":{"Line":0},"fn_name":null},{"line":163,"address":[712832],"length":1,"stats":{"Line":0},"fn_name":"highlight_square"},{"line":164,"address":[712919,712865],"length":1,"stats":{"Line":0},"fn_name":null},{"line":167,"address":[712944],"length":1,"stats":{"Line":0},"fn_name":"is_highlit"},{"line":168,"address":[712965,713018],"length":1,"stats":{"Line":0},"fn_name":null},{"line":177,"address":[563488],"length":1,"stats":{"Line":3},"fn_name":"test_from_notation"},{"line":178,"address":[563680,563495],"length":1,"stats":{"Line":1},"fn_name":null},{"line":179,"address":[563724,563878,563631],"length":1,"stats":{"Line":2},"fn_name":null},{"line":180,"address":[563829,564058,563922],"length":1,"stats":{"Line":2},"fn_name":null},{"line":181,"address":[564102,564238,564015],"length":1,"stats":{"Line":2},"fn_name":null},{"line":182,"address":[564195,564282,564418],"length":1,"stats":{"Line":2},"fn_name":null},{"line":183,"address":[564462,564375,564597],"length":1,"stats":{"Line":2},"fn_name":null},{"line":184,"address":[564641,564555,564752],"length":1,"stats":{"Line":2},"fn_name":null},{"line":188,"address":[565170,564800],"length":1,"stats":{"Line":3},"fn_name":"test_to_notation"},{"line":189,"address":[564807],"length":1,"stats":{"Line":1},"fn_name":null},{"line":190,"address":[565185],"length":1,"stats":{"Line":1},"fn_name":null},{"line":191,"address":[565544],"length":1,"stats":{"Line":1},"fn_name":null},{"line":192,"address":[565891],"length":1,"stats":{"Line":1},"fn_name":null},{"line":193,"address":[566238],"length":1,"stats":{"Line":1},"fn_name":null},{"line":194,"address":[566470],"length":1,"stats":{"Line":1},"fn_name":null},{"line":195,"address":[566702],"length":1,"stats":{"Line":1},"fn_name":null},{"line":199,"address":[567224,566944],"length":1,"stats":{"Line":3},"fn_name":"test_to_and_from_file_ranks"},{"line":200,"address":[566951],"length":1,"stats":{"Line":1},"fn_name":null},{"line":201,"address":[567015],"length":1,"stats":{"Line":1},"fn_name":null}],"covered":68,"coverable":78},{"path":["/","home","dan","dev","dan-rusty-chess","src","chess_move.rs"],"content":"use crate::chess_board::{ChessBoard, SquareIndex, TOTAL_FILES, TOTAL_RANKS};\n\n#[derive(Clone, Copy)]\n\npub struct ChessMove {\n pub source: SquareIndex,\n pub destination: SquareIndex,\n}\n\npub trait MoveGenerator {\n fn generate_moves(\u0026self, chess_board: \u0026ChessBoard, source: SquareIndex) -\u003e Vec\u003cChessMove\u003e;\n}\n\npub struct StraightSlidingMoves {\n max_moves: u8,\n}\nimpl StraightSlidingMoves {\n pub fn new(max_moves: u8) -\u003e Self {\n Self { max_moves }\n }\n}\nimpl MoveGenerator for StraightSlidingMoves {\n fn generate_moves(\u0026self, chess_board: \u0026ChessBoard, source: SquareIndex) -\u003e Vec\u003cChessMove\u003e {\n static DIRECTIONS: [(i8, i8); 4] = [(1, 0), (0, 1), (-1, 0), (0, -1)];\n\n generate_moves(\n chess_board,\n source,\n self.max_moves,\n \u0026DIRECTIONS,\n true,\n false,\n )\n }\n}\n\npub struct PawnMoves {\n file_direction: i8,\n double_step_rank: u8,\n}\nimpl PawnMoves {\n pub fn new(file_direction: i8, double_step_rank: u8) -\u003e Self {\n Self {\n file_direction,\n double_step_rank,\n }\n }\n}\nimpl MoveGenerator for PawnMoves {\n fn generate_moves(\u0026self, chess_board: \u0026ChessBoard, source: SquareIndex) -\u003e Vec\u003cChessMove\u003e {\n let directions: [(i8, i8); 1] = [(0, self.file_direction)];\n\n let (_, rank_ix) = ChessBoard::square_to_file_and_rank(source);\n\n let forward_moves = generate_moves(\n chess_board,\n source,\n if self.double_step_rank == rank_ix + 1 {\n 2\n } else {\n 1\n },\n \u0026directions,\n false,\n false,\n );\n\n let take_directions: [(i8, i8); 2] = [(-1, self.file_direction), (1, self.file_direction)];\n\n let taking_moves = generate_moves(chess_board, source, 1, \u0026take_directions, true, true);\n\n [forward_moves, taking_moves].concat()\n }\n}\n\npub struct DiagonalSlidingMoves {\n max_moves: u8,\n}\nimpl DiagonalSlidingMoves {\n pub fn new(max_moves: u8) -\u003e Self {\n Self { max_moves }\n }\n}\nimpl MoveGenerator for DiagonalSlidingMoves {\n fn generate_moves(\u0026self, chess_board: \u0026ChessBoard, source: SquareIndex) -\u003e Vec\u003cChessMove\u003e {\n static DIRECTIONS: [(i8, i8); 4] = [(1, 1), (1, -1), (-1, 1), (-1, -1)];\n\n generate_moves(\n chess_board,\n source,\n self.max_moves,\n \u0026DIRECTIONS,\n true,\n false,\n )\n }\n}\n\npub struct JumpingMoves {\n max_moves: u8,\n}\nimpl JumpingMoves {\n pub fn new(max_moves: u8) -\u003e Self {\n Self { max_moves }\n }\n}\nimpl MoveGenerator for JumpingMoves {\n fn generate_moves(\u0026self, chess_board: \u0026ChessBoard, source: SquareIndex) -\u003e Vec\u003cChessMove\u003e {\n static DIRECTIONS: [(i8, i8); 8] = [\n (1, 2),\n (-1, -2),\n (2, 1),\n (-2, -1),\n (1, -2),\n (-1, 2),\n (2, -1),\n (-2, 1),\n ];\n\n generate_moves(\n chess_board,\n source,\n self.max_moves,\n \u0026DIRECTIONS,\n true,\n false,\n )\n }\n}\n\nfn generate_moves(\n chess_board: \u0026ChessBoard,\n source: u8,\n max_moves: u8,\n directions: \u0026[(i8, i8)],\n takes_enemy: bool,\n must_take_enemy: bool,\n) -\u003e Vec\u003cChessMove\u003e {\n let mut moves: Vec\u003cChessMove\u003e = Vec::new();\n let (file_ix, rank_ix) = ChessBoard::square_to_file_and_rank(source);\n\n for (df, dr) in directions {\n let mut file_ix = file_ix as i8 + df;\n let mut rank_ix = rank_ix as i8 + dr;\n\n let mut count = 0;\n while file_ix \u003e= 0\n \u0026\u0026 file_ix \u003c TOTAL_FILES as i8\n \u0026\u0026 rank_ix \u003e= 0\n \u0026\u0026 rank_ix \u003c TOTAL_RANKS as i8\n {\n let destination = ChessBoard::square_from_file_and_rank(file_ix as u8, rank_ix as u8);\n\n if let Some(destination) = destination {\n let chess_move = ChessMove {\n source,\n destination,\n };\n\n if let Some(piece) = chess_board.get_piece(destination) {\n if takes_enemy\n \u0026\u0026 piece.is_enemy(chess_board.get_piece(source).as_ref().unwrap())\n {\n moves.push(chess_move);\n }\n\n break;\n } else {\n if !must_take_enemy {\n moves.push(chess_move);\n }\n }\n }\n\n count += 1;\n if count == max_moves {\n break;\n }\n file_ix += df;\n rank_ix += dr;\n }\n }\n moves\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n\n #[test]\n fn test_rook_moves_from_a8() {\n let chess_board = ChessBoard::from_fen(\"r7/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"b8\", \"c8\", \"d8\", \"e8\", \"f8\", \"g8\", \"h8\", \"a7\", \"a6\", \"a5\", \"a4\", \"a3\", \"a2\", \"a1\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_rook_moves_from_a1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/r7 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"b1\", \"c1\", \"d1\", \"e1\", \"f1\", \"g1\", \"h1\", \"a2\", \"a3\", \"a4\", \"a5\", \"a6\", \"a7\", \"a8\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_rook_moves_from_h8() {\n let chess_board = ChessBoard::from_fen(\"7r/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"g8\", \"f8\", \"e8\", \"d8\", \"c8\", \"b8\", \"a8\", \"h7\", \"h6\", \"h5\", \"h4\", \"h3\", \"h2\", \"h1\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_rook_moves_from_h1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/7r w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"g1\", \"f1\", \"e1\", \"d1\", \"c1\", \"b1\", \"a1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"h7\", \"h8\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_bishop_moves_from_a8() {\n let chess_board = ChessBoard::from_fen(\"b7/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"b7\", \"c6\", \"d5\", \"e4\", \"f3\", \"g2\", \"h1\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_bishop_moves_from_h8() {\n let chess_board = ChessBoard::from_fen(\"7b/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"g7\", \"f6\", \"e5\", \"d4\", \"c3\", \"b2\", \"a1\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_bishop_moves_from_a1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/b7 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"b2\", \"c3\", \"d4\", \"e5\", \"f6\", \"g7\", \"h8\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_bishop_moves_from_h1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/7b w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"g2\", \"f3\", \"e4\", \"d5\", \"c6\", \"b7\", \"a8\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_king_moves() {\n let chess_board = ChessBoard::from_fen(\"8/1k6/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"b7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a6\", \"a7\", \"a8\", \"b6\", \"b8\", \"c6\", \"c7\", \"c8\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_king_moves_from_e1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/4K3 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"e1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"d1\", \"d2\", \"e2\", \"f2\", \"f1\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_king_moves_from_e8() {\n let chess_board = ChessBoard::from_fen(\"4k3/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"e8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"d8\", \"f8\", \"d7\", \"e7\", \"f7\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_queen_moves() {\n let chess_board = ChessBoard::from_fen(\"8/1q6/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"b7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"a7\", \"c7\", \"d7\", \"e7\", \"f7\", \"g7\", \"h7\", \"b1\", \"b2\", \"b3\", \"b4\", \"b5\", \"b6\", \"b8\",\n \"a8\", \"c6\", \"d5\", \"e4\", \"f3\", \"g2\", \"h1\", \"c8\", \"a6\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_more_queen_moves() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/7Q w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\n \"a1\", \"a8\", \"b1\", \"b7\", \"c1\", \"c6\", \"d1\", \"d5\", \"e1\", \"e4\", \"f1\", \"f3\", \"g1\", \"g2\",\n \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"h7\", \"h8\",\n ];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_no_moves_for_empty_squares() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves: Vec\u003cString\u003e = vec![];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_knight_moves_from_a8() {\n let chess_board = ChessBoard::from_fen(\"n7/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"c7\", \"b6\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_knight_moves_from_h8() {\n let chess_board = ChessBoard::from_fen(\"7n/8/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"f7\", \"g6\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_knight_moves_from_a1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/n7 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"c2\", \"b3\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_knight_moves_from_h1() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/8/7n w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"h1\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"f2\", \"g3\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_knight_moves_from_d5() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/3n4/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"d5\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"c7\", \"e7\", \"c3\", \"e3\", \"b6\", \"b4\", \"f6\", \"f4\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_white_pawn_moves_from_a2() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/P7/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a2\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a3\", \"a4\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_white_pawn_moves_from_a7() {\n let chess_board = ChessBoard::from_fen(\"8/P7/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a8\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_black_pawn_moves_from_a7() {\n let chess_board = ChessBoard::from_fen(\"8/p7/8/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a6\", \"a5\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_black_pawn_moves_from_a2() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/8/8/8/p7/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a2\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a1\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_rooks_can_be_blocked() {\n let chess_board = ChessBoard::from_fen(\"r3r3/8/r7/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"b8\", \"c8\", \"d8\", \"a7\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_rooks_block_and_take() {\n let chess_board = ChessBoard::from_fen(\"r3R3/8/r7/8/8/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a8\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"b8\", \"c8\", \"d8\", \"a7\", \"e8\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_pawns_block_and_take() {\n let chess_board = ChessBoard::from_fen(\"8/8/8/ppp/PPP/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"b4\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a5\", \"c5\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_pawns_starting_square_moves_blocked_all_squares() {\n let chess_board = ChessBoard::from_fen(\"8/ppp/R/1R/2R/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"a7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves: Vec\u003cString\u003e = vec![];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_pawns_starting_square_moves_blocked_one_square_away() {\n let chess_board = ChessBoard::from_fen(\"8/ppp/R/1R/2R/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"b7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"a6\", \"b6\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n\n #[test]\n fn test_pawns_starting_square_moves_not_blocked() {\n let chess_board = ChessBoard::from_fen(\"8/ppp/R/1R/2R/8/8/8 w KQkq - 0 1\");\n let square = ChessBoard::square_from_notation(\"c7\").unwrap();\n let moves = chess_board.generate_moves(square);\n\n let mut notationed_moves: Vec\u003cString\u003e = moves\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n\n notationed_moves.sort();\n let mut expected_moves = vec![\"c6\", \"c5\"];\n expected_moves.sort();\n\n assert_eq!(notationed_moves, expected_moves)\n }\n}\n","traces":[{"line":18,"address":[784640],"length":1,"stats":{"Line":3},"fn_name":"new"},{"line":23,"address":[784672],"length":1,"stats":{"Line":3},"fn_name":"generate_moves"},{"line":42,"address":[784768],"length":1,"stats":{"Line":2},"fn_name":"new"},{"line":50,"address":[784800,785380],"length":1,"stats":{"Line":2},"fn_name":"generate_moves"},{"line":51,"address":[784856],"length":1,"stats":{"Line":2},"fn_name":null},{"line":53,"address":[784883],"length":1,"stats":{"Line":2},"fn_name":null},{"line":58,"address":[784911,784980],"length":1,"stats":{"Line":3},"fn_name":null},{"line":59,"address":[784982],"length":1,"stats":{"Line":1},"fn_name":null},{"line":61,"address":[784975],"length":1,"stats":{"Line":1},"fn_name":null},{"line":63,"address":[784996],"length":1,"stats":{"Line":1},"fn_name":null},{"line":68,"address":[785056],"length":1,"stats":{"Line":1},"fn_name":null},{"line":70,"address":[785146],"length":1,"stats":{"Line":1},"fn_name":null},{"line":72,"address":[785204],"length":1,"stats":{"Line":2},"fn_name":null},{"line":80,"address":[785472],"length":1,"stats":{"Line":4},"fn_name":"new"},{"line":85,"address":[785504],"length":1,"stats":{"Line":4},"fn_name":"generate_moves"},{"line":103,"address":[785600],"length":1,"stats":{"Line":4},"fn_name":"new"},{"line":108,"address":[785632],"length":1,"stats":{"Line":4},"fn_name":"generate_moves"},{"line":131,"address":[786931,785728],"length":1,"stats":{"Line":11},"fn_name":"generate_moves"},{"line":139,"address":[785889],"length":1,"stats":{"Line":11},"fn_name":null},{"line":140,"address":[785901],"length":1,"stats":{"Line":11},"fn_name":null},{"line":142,"address":[786036,785969,786130],"length":1,"stats":{"Line":35},"fn_name":null},{"line":143,"address":[786176],"length":1,"stats":{"Line":13},"fn_name":null},{"line":144,"address":[786210],"length":1,"stats":{"Line":13},"fn_name":null},{"line":146,"address":[786235],"length":1,"stats":{"Line":13},"fn_name":null},{"line":147,"address":[786314,786354,786243,786274],"length":1,"stats":{"Line":56},"fn_name":null},{"line":148,"address":[786263],"length":1,"stats":{"Line":13},"fn_name":null},{"line":149,"address":[786303],"length":1,"stats":{"Line":14},"fn_name":null},{"line":150,"address":[786343],"length":1,"stats":{"Line":15},"fn_name":null},{"line":152,"address":[786377],"length":1,"stats":{"Line":15},"fn_name":null},{"line":154,"address":[786471,786430],"length":1,"stats":{"Line":30},"fn_name":null},{"line":160,"address":[786538,786495,786463],"length":1,"stats":{"Line":45},"fn_name":null},{"line":161,"address":[786766,786592,786872],"length":1,"stats":{"Line":12},"fn_name":null},{"line":162,"address":[786791],"length":1,"stats":{"Line":2},"fn_name":null},{"line":164,"address":[786903],"length":1,"stats":{"Line":1},"fn_name":null},{"line":169,"address":[786612],"length":1,"stats":{"Line":15},"fn_name":null},{"line":170,"address":[786628],"length":1,"stats":{"Line":15},"fn_name":null},{"line":175,"address":[786507,786667,786689],"length":1,"stats":{"Line":30},"fn_name":null},{"line":176,"address":[786674],"length":1,"stats":{"Line":15},"fn_name":null},{"line":179,"address":[786734],"length":1,"stats":{"Line":6},"fn_name":null},{"line":180,"address":[786754],"length":1,"stats":{"Line":6},"fn_name":null},{"line":191,"address":[517504,517509],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":192,"address":[679735],"length":1,"stats":{"Line":1},"fn_name":null},{"line":193,"address":[679760,679866],"length":1,"stats":{"Line":2},"fn_name":null},{"line":194,"address":[679873],"length":1,"stats":{"Line":1},"fn_name":null},{"line":196,"address":[680001,679907],"length":1,"stats":{"Line":2},"fn_name":null},{"line":198,"address":[517559,517536],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":201,"address":[680043],"length":1,"stats":{"Line":1},"fn_name":null},{"line":202,"address":[680144],"length":1,"stats":{"Line":1},"fn_name":null},{"line":205,"address":[680486],"length":1,"stats":{"Line":1},"fn_name":null},{"line":207,"address":[680585,680701],"length":1,"stats":{"Line":1},"fn_name":null},{"line":211,"address":[517621,517616],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":212,"address":[680839],"length":1,"stats":{"Line":1},"fn_name":null},{"line":213,"address":[680864,680970],"length":1,"stats":{"Line":2},"fn_name":null},{"line":214,"address":[680977],"length":1,"stats":{"Line":1},"fn_name":null},{"line":216,"address":[681011,681105],"length":1,"stats":{"Line":2},"fn_name":null},{"line":218,"address":[517671,517648],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":221,"address":[681147],"length":1,"stats":{"Line":1},"fn_name":null},{"line":222,"address":[681248],"length":1,"stats":{"Line":1},"fn_name":null},{"line":225,"address":[681590],"length":1,"stats":{"Line":1},"fn_name":null},{"line":227,"address":[681805,681689],"length":1,"stats":{"Line":1},"fn_name":null},{"line":231,"address":[517733,517728],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":232,"address":[681943],"length":1,"stats":{"Line":1},"fn_name":null},{"line":233,"address":[682074,681968],"length":1,"stats":{"Line":2},"fn_name":null},{"line":234,"address":[682081],"length":1,"stats":{"Line":1},"fn_name":null},{"line":236,"address":[682115,682209],"length":1,"stats":{"Line":2},"fn_name":null},{"line":238,"address":[517783,517760],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":241,"address":[682251],"length":1,"stats":{"Line":1},"fn_name":null},{"line":242,"address":[682352],"length":1,"stats":{"Line":1},"fn_name":null},{"line":245,"address":[682694],"length":1,"stats":{"Line":1},"fn_name":null},{"line":247,"address":[682909,682793],"length":1,"stats":{"Line":1},"fn_name":null},{"line":251,"address":[517840,517845],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":252,"address":[683047],"length":1,"stats":{"Line":1},"fn_name":null},{"line":253,"address":[683072,683178],"length":1,"stats":{"Line":2},"fn_name":null},{"line":254,"address":[683185],"length":1,"stats":{"Line":1},"fn_name":null},{"line":256,"address":[683313,683219],"length":1,"stats":{"Line":2},"fn_name":null},{"line":258,"address":[517895,517872],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":261,"address":[683355],"length":1,"stats":{"Line":1},"fn_name":null},{"line":262,"address":[683456],"length":1,"stats":{"Line":1},"fn_name":null},{"line":265,"address":[683798],"length":1,"stats":{"Line":1},"fn_name":null},{"line":267,"address":[684013,683897],"length":1,"stats":{"Line":1},"fn_name":null},{"line":271,"address":[517952,517957],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":272,"address":[684151],"length":1,"stats":{"Line":1},"fn_name":null},{"line":273,"address":[684176,684282],"length":1,"stats":{"Line":2},"fn_name":null},{"line":274,"address":[684289],"length":1,"stats":{"Line":1},"fn_name":null},{"line":276,"address":[684323,684417],"length":1,"stats":{"Line":2},"fn_name":null},{"line":278,"address":[517984,518007],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":281,"address":[684459],"length":1,"stats":{"Line":1},"fn_name":null},{"line":282,"address":[684560],"length":1,"stats":{"Line":1},"fn_name":null},{"line":283,"address":[684733],"length":1,"stats":{"Line":1},"fn_name":null},{"line":285,"address":[684948,684832],"length":1,"stats":{"Line":1},"fn_name":null},{"line":289,"address":[518069,518064],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":290,"address":[685079],"length":1,"stats":{"Line":1},"fn_name":null},{"line":291,"address":[685104,685210],"length":1,"stats":{"Line":2},"fn_name":null},{"line":292,"address":[685217],"length":1,"stats":{"Line":1},"fn_name":null},{"line":294,"address":[685251,685345],"length":1,"stats":{"Line":2},"fn_name":null},{"line":296,"address":[518119,518096],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":299,"address":[685387],"length":1,"stats":{"Line":1},"fn_name":null},{"line":300,"address":[685488],"length":1,"stats":{"Line":1},"fn_name":null},{"line":301,"address":[685661],"length":1,"stats":{"Line":1},"fn_name":null},{"line":303,"address":[685876,685760],"length":1,"stats":{"Line":1},"fn_name":null},{"line":307,"address":[518181,518176],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":308,"address":[686007],"length":1,"stats":{"Line":1},"fn_name":null},{"line":309,"address":[686032,686138],"length":1,"stats":{"Line":2},"fn_name":null},{"line":310,"address":[686145],"length":1,"stats":{"Line":1},"fn_name":null},{"line":312,"address":[686179,686273],"length":1,"stats":{"Line":2},"fn_name":null},{"line":314,"address":[518231,518208],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":317,"address":[686315],"length":1,"stats":{"Line":1},"fn_name":null},{"line":318,"address":[686416],"length":1,"stats":{"Line":1},"fn_name":null},{"line":319,"address":[686589],"length":1,"stats":{"Line":1},"fn_name":null},{"line":321,"address":[686804,686688],"length":1,"stats":{"Line":1},"fn_name":null},{"line":325,"address":[518293,518288],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":326,"address":[686935],"length":1,"stats":{"Line":1},"fn_name":null},{"line":327,"address":[687066,686960],"length":1,"stats":{"Line":2},"fn_name":null},{"line":328,"address":[687073],"length":1,"stats":{"Line":1},"fn_name":null},{"line":330,"address":[687107,687201],"length":1,"stats":{"Line":2},"fn_name":null},{"line":332,"address":[518343,518320],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":335,"address":[687243],"length":1,"stats":{"Line":1},"fn_name":null},{"line":336,"address":[687344],"length":1,"stats":{"Line":1},"fn_name":null},{"line":337,"address":[687517],"length":1,"stats":{"Line":1},"fn_name":null},{"line":339,"address":[687616,687732],"length":1,"stats":{"Line":1},"fn_name":null},{"line":343,"address":[518405,518400],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":344,"address":[687863],"length":1,"stats":{"Line":1},"fn_name":null},{"line":345,"address":[687994,687888],"length":1,"stats":{"Line":2},"fn_name":null},{"line":346,"address":[688001],"length":1,"stats":{"Line":1},"fn_name":null},{"line":348,"address":[688129,688035],"length":1,"stats":{"Line":2},"fn_name":null},{"line":350,"address":[518455,518432],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":353,"address":[688171],"length":1,"stats":{"Line":1},"fn_name":null},{"line":354,"address":[688272],"length":1,"stats":{"Line":1},"fn_name":null},{"line":355,"address":[688464],"length":1,"stats":{"Line":1},"fn_name":null},{"line":357,"address":[688679,688563],"length":1,"stats":{"Line":1},"fn_name":null},{"line":361,"address":[518512,518517],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":362,"address":[688807],"length":1,"stats":{"Line":1},"fn_name":null},{"line":363,"address":[688938,688832],"length":1,"stats":{"Line":2},"fn_name":null},{"line":364,"address":[688945],"length":1,"stats":{"Line":1},"fn_name":null},{"line":366,"address":[688979,689073],"length":1,"stats":{"Line":2},"fn_name":null},{"line":368,"address":[518567,518544],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":371,"address":[689115],"length":1,"stats":{"Line":1},"fn_name":null},{"line":372,"address":[689216],"length":1,"stats":{"Line":1},"fn_name":null},{"line":373,"address":[689351],"length":1,"stats":{"Line":1},"fn_name":null},{"line":375,"address":[689450,689566],"length":1,"stats":{"Line":1},"fn_name":null},{"line":379,"address":[518624,518629],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":380,"address":[689703],"length":1,"stats":{"Line":1},"fn_name":null},{"line":381,"address":[689834,689728],"length":1,"stats":{"Line":2},"fn_name":null},{"line":382,"address":[689841],"length":1,"stats":{"Line":1},"fn_name":null},{"line":384,"address":[689969,689875],"length":1,"stats":{"Line":2},"fn_name":null},{"line":386,"address":[518679,518656],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":389,"address":[690011],"length":1,"stats":{"Line":1},"fn_name":null},{"line":390,"address":[690112],"length":1,"stats":{"Line":1},"fn_name":null},{"line":391,"address":[690247],"length":1,"stats":{"Line":1},"fn_name":null},{"line":393,"address":[690346,690462],"length":1,"stats":{"Line":1},"fn_name":null},{"line":397,"address":[518741,518736],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":398,"address":[690599],"length":1,"stats":{"Line":1},"fn_name":null},{"line":399,"address":[690624,690730],"length":1,"stats":{"Line":2},"fn_name":null},{"line":400,"address":[690737],"length":1,"stats":{"Line":1},"fn_name":null},{"line":402,"address":[690771,690865],"length":1,"stats":{"Line":2},"fn_name":null},{"line":404,"address":[518791,518768],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":407,"address":[690907],"length":1,"stats":{"Line":1},"fn_name":null},{"line":408,"address":[691008],"length":1,"stats":{"Line":1},"fn_name":null},{"line":412,"address":[691575],"length":1,"stats":{"Line":1},"fn_name":null},{"line":414,"address":[691790,691674],"length":1,"stats":{"Line":1},"fn_name":null},{"line":418,"address":[518848,518853],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":419,"address":[691927],"length":1,"stats":{"Line":1},"fn_name":null},{"line":420,"address":[692058,691952],"length":1,"stats":{"Line":2},"fn_name":null},{"line":421,"address":[692065],"length":1,"stats":{"Line":1},"fn_name":null},{"line":423,"address":[692193,692099],"length":1,"stats":{"Line":2},"fn_name":null},{"line":425,"address":[518880,518903],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":428,"address":[692235],"length":1,"stats":{"Line":1},"fn_name":null},{"line":429,"address":[692336],"length":1,"stats":{"Line":1},"fn_name":null},{"line":433,"address":[692853],"length":1,"stats":{"Line":1},"fn_name":null},{"line":435,"address":[692952,693068],"length":1,"stats":{"Line":1},"fn_name":null},{"line":439,"address":[518960,518965],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":440,"address":[693207],"length":1,"stats":{"Line":1},"fn_name":null},{"line":441,"address":[693229,693332],"length":1,"stats":{"Line":2},"fn_name":null},{"line":442,"address":[693339],"length":1,"stats":{"Line":1},"fn_name":null},{"line":444,"address":[693370,693464],"length":1,"stats":{"Line":2},"fn_name":null},{"line":446,"address":[519015,518992],"length":1,"stats":{"Line":0},"fn_name":"{closure#0}"},{"line":449,"address":[693506],"length":1,"stats":{"Line":1},"fn_name":null},{"line":450,"address":[693597],"length":1,"stats":{"Line":1},"fn_name":null},{"line":451,"address":[693616],"length":1,"stats":{"Line":1},"fn_name":null},{"line":453,"address":[693826,693712],"length":1,"stats":{"Line":1},"fn_name":null},{"line":457,"address":[519077,519072],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":458,"address":[693959],"length":1,"stats":{"Line":1},"fn_name":null},{"line":459,"address":[693984,694090],"length":1,"stats":{"Line":2},"fn_name":null},{"line":460,"address":[694097],"length":1,"stats":{"Line":1},"fn_name":null},{"line":462,"address":[694225,694131],"length":1,"stats":{"Line":2},"fn_name":null},{"line":464,"address":[519104,519127],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":467,"address":[694267],"length":1,"stats":{"Line":1},"fn_name":null},{"line":468,"address":[694368],"length":1,"stats":{"Line":1},"fn_name":null},{"line":469,"address":[694446],"length":1,"stats":{"Line":1},"fn_name":null},{"line":471,"address":[694545,694661],"length":1,"stats":{"Line":1},"fn_name":null},{"line":475,"address":[519189,519184],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":476,"address":[694791],"length":1,"stats":{"Line":1},"fn_name":null},{"line":477,"address":[694816,694922],"length":1,"stats":{"Line":2},"fn_name":null},{"line":478,"address":[694929],"length":1,"stats":{"Line":1},"fn_name":null},{"line":480,"address":[694963,695057],"length":1,"stats":{"Line":2},"fn_name":null},{"line":482,"address":[519239,519216],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":485,"address":[695099],"length":1,"stats":{"Line":1},"fn_name":null},{"line":486,"address":[695200],"length":1,"stats":{"Line":1},"fn_name":null},{"line":487,"address":[695278],"length":1,"stats":{"Line":1},"fn_name":null},{"line":489,"address":[695377,695493],"length":1,"stats":{"Line":1},"fn_name":null},{"line":493,"address":[519301,519296],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":494,"address":[695623],"length":1,"stats":{"Line":1},"fn_name":null},{"line":495,"address":[695648,695754],"length":1,"stats":{"Line":2},"fn_name":null},{"line":496,"address":[695761],"length":1,"stats":{"Line":1},"fn_name":null},{"line":498,"address":[695889,695795],"length":1,"stats":{"Line":2},"fn_name":null},{"line":500,"address":[519351,519328],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":503,"address":[695931],"length":1,"stats":{"Line":1},"fn_name":null},{"line":504,"address":[696032],"length":1,"stats":{"Line":1},"fn_name":null},{"line":505,"address":[696110],"length":1,"stats":{"Line":1},"fn_name":null},{"line":507,"address":[696209,696325],"length":1,"stats":{"Line":1},"fn_name":null},{"line":511,"address":[519413,519408],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":512,"address":[696455],"length":1,"stats":{"Line":1},"fn_name":null},{"line":513,"address":[696480,696586],"length":1,"stats":{"Line":2},"fn_name":null},{"line":514,"address":[696593],"length":1,"stats":{"Line":1},"fn_name":null},{"line":516,"address":[696627,696721],"length":1,"stats":{"Line":2},"fn_name":null},{"line":518,"address":[519463,519440],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":521,"address":[696763],"length":1,"stats":{"Line":1},"fn_name":null},{"line":522,"address":[696864],"length":1,"stats":{"Line":1},"fn_name":null},{"line":523,"address":[696942],"length":1,"stats":{"Line":1},"fn_name":null},{"line":525,"address":[697041,697157],"length":1,"stats":{"Line":1},"fn_name":null},{"line":529,"address":[519525,519520],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":530,"address":[697287],"length":1,"stats":{"Line":1},"fn_name":null},{"line":531,"address":[697312,697418],"length":1,"stats":{"Line":2},"fn_name":null},{"line":532,"address":[697425],"length":1,"stats":{"Line":1},"fn_name":null},{"line":534,"address":[697459,697553],"length":1,"stats":{"Line":2},"fn_name":null},{"line":536,"address":[519552,519575],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":539,"address":[697595],"length":1,"stats":{"Line":1},"fn_name":null},{"line":540,"address":[697696],"length":1,"stats":{"Line":1},"fn_name":null},{"line":541,"address":[697888],"length":1,"stats":{"Line":1},"fn_name":null},{"line":543,"address":[697987,698103],"length":1,"stats":{"Line":1},"fn_name":null},{"line":547,"address":[519637,519632],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":548,"address":[698231],"length":1,"stats":{"Line":1},"fn_name":null},{"line":549,"address":[698362,698256],"length":1,"stats":{"Line":2},"fn_name":null},{"line":550,"address":[698369],"length":1,"stats":{"Line":1},"fn_name":null},{"line":552,"address":[698403,698497],"length":1,"stats":{"Line":2},"fn_name":null},{"line":554,"address":[519687,519664],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":557,"address":[698539],"length":1,"stats":{"Line":1},"fn_name":null},{"line":558,"address":[698640],"length":1,"stats":{"Line":1},"fn_name":null},{"line":559,"address":[698718],"length":1,"stats":{"Line":1},"fn_name":null},{"line":561,"address":[698933,698817],"length":1,"stats":{"Line":1},"fn_name":null},{"line":565,"address":[519744,519749],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":566,"address":[699063],"length":1,"stats":{"Line":1},"fn_name":null},{"line":567,"address":[699088,699194],"length":1,"stats":{"Line":2},"fn_name":null},{"line":568,"address":[699201],"length":1,"stats":{"Line":1},"fn_name":null},{"line":570,"address":[699329,699235],"length":1,"stats":{"Line":2},"fn_name":null},{"line":572,"address":[519799,519776],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":575,"address":[699371],"length":1,"stats":{"Line":1},"fn_name":null},{"line":576,"address":[699472],"length":1,"stats":{"Line":1},"fn_name":null},{"line":577,"address":[699531],"length":1,"stats":{"Line":1},"fn_name":null},{"line":579,"address":[699746,699630],"length":1,"stats":{"Line":1},"fn_name":null},{"line":583,"address":[519861,519856],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":584,"address":[699879],"length":1,"stats":{"Line":1},"fn_name":null},{"line":585,"address":[699904,700010],"length":1,"stats":{"Line":2},"fn_name":null},{"line":586,"address":[700017],"length":1,"stats":{"Line":1},"fn_name":null},{"line":588,"address":[700145,700051],"length":1,"stats":{"Line":2},"fn_name":null},{"line":590,"address":[519911,519888],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":593,"address":[700187],"length":1,"stats":{"Line":1},"fn_name":null},{"line":594,"address":[700288],"length":1,"stats":{"Line":1},"fn_name":null},{"line":595,"address":[700366],"length":1,"stats":{"Line":1},"fn_name":null},{"line":597,"address":[700465,700581],"length":1,"stats":{"Line":1},"fn_name":null},{"line":601,"address":[519973,519968],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":602,"address":[700711],"length":1,"stats":{"Line":1},"fn_name":null},{"line":603,"address":[700736,700842],"length":1,"stats":{"Line":2},"fn_name":null},{"line":604,"address":[700849],"length":1,"stats":{"Line":1},"fn_name":null},{"line":606,"address":[700977,700883],"length":1,"stats":{"Line":2},"fn_name":null},{"line":608,"address":[520023,520000],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":611,"address":[701019],"length":1,"stats":{"Line":1},"fn_name":null},{"line":612,"address":[701120],"length":1,"stats":{"Line":1},"fn_name":null},{"line":613,"address":[701179],"length":1,"stats":{"Line":1},"fn_name":null},{"line":615,"address":[701278,701394],"length":1,"stats":{"Line":1},"fn_name":null},{"line":619,"address":[520080,520085],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":620,"address":[701527],"length":1,"stats":{"Line":1},"fn_name":null},{"line":621,"address":[701552,701658],"length":1,"stats":{"Line":2},"fn_name":null},{"line":622,"address":[701665],"length":1,"stats":{"Line":1},"fn_name":null},{"line":624,"address":[701699,701793],"length":1,"stats":{"Line":2},"fn_name":null},{"line":626,"address":[520135,520112],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":629,"address":[701835],"length":1,"stats":{"Line":1},"fn_name":null},{"line":630,"address":[701936],"length":1,"stats":{"Line":1},"fn_name":null},{"line":631,"address":[702052],"length":1,"stats":{"Line":1},"fn_name":null},{"line":633,"address":[702151,702267],"length":1,"stats":{"Line":1},"fn_name":null},{"line":637,"address":[520192,520197],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":638,"address":[702407],"length":1,"stats":{"Line":1},"fn_name":null},{"line":639,"address":[702432,702538],"length":1,"stats":{"Line":2},"fn_name":null},{"line":640,"address":[702545],"length":1,"stats":{"Line":1},"fn_name":null},{"line":642,"address":[702673,702579],"length":1,"stats":{"Line":2},"fn_name":null},{"line":644,"address":[520247,520224],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":647,"address":[702715],"length":1,"stats":{"Line":1},"fn_name":null},{"line":648,"address":[702816],"length":1,"stats":{"Line":1},"fn_name":null},{"line":649,"address":[702951],"length":1,"stats":{"Line":1},"fn_name":null},{"line":651,"address":[703166,703050],"length":1,"stats":{"Line":1},"fn_name":null},{"line":655,"address":[520309,520304],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":656,"address":[703303],"length":1,"stats":{"Line":1},"fn_name":null},{"line":657,"address":[703434,703328],"length":1,"stats":{"Line":2},"fn_name":null},{"line":658,"address":[703441],"length":1,"stats":{"Line":1},"fn_name":null},{"line":660,"address":[703569,703475],"length":1,"stats":{"Line":2},"fn_name":null},{"line":662,"address":[520359,520336],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":665,"address":[703611],"length":1,"stats":{"Line":1},"fn_name":null},{"line":666,"address":[703712],"length":1,"stats":{"Line":1},"fn_name":null},{"line":667,"address":[703790],"length":1,"stats":{"Line":1},"fn_name":null},{"line":669,"address":[703889,704005],"length":1,"stats":{"Line":1},"fn_name":null},{"line":673,"address":[520416,520421],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":674,"address":[704135],"length":1,"stats":{"Line":1},"fn_name":null},{"line":675,"address":[704260,704157],"length":1,"stats":{"Line":2},"fn_name":null},{"line":676,"address":[704267],"length":1,"stats":{"Line":1},"fn_name":null},{"line":678,"address":[704298,704392],"length":1,"stats":{"Line":2},"fn_name":null},{"line":680,"address":[520471,520448],"length":1,"stats":{"Line":0},"fn_name":"{closure#0}"},{"line":683,"address":[704434],"length":1,"stats":{"Line":1},"fn_name":null},{"line":684,"address":[704525],"length":1,"stats":{"Line":1},"fn_name":null},{"line":685,"address":[704544],"length":1,"stats":{"Line":1},"fn_name":null},{"line":687,"address":[704754,704640],"length":1,"stats":{"Line":1},"fn_name":null},{"line":691,"address":[520528,520533],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":692,"address":[704887],"length":1,"stats":{"Line":1},"fn_name":null},{"line":693,"address":[705018,704912],"length":1,"stats":{"Line":2},"fn_name":null},{"line":694,"address":[705025],"length":1,"stats":{"Line":1},"fn_name":null},{"line":696,"address":[705059,705153],"length":1,"stats":{"Line":2},"fn_name":null},{"line":698,"address":[520560,520583],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":701,"address":[705195],"length":1,"stats":{"Line":1},"fn_name":null},{"line":702,"address":[705296],"length":1,"stats":{"Line":1},"fn_name":null},{"line":703,"address":[705374],"length":1,"stats":{"Line":1},"fn_name":null},{"line":705,"address":[705473,705589],"length":1,"stats":{"Line":1},"fn_name":null},{"line":709,"address":[520640,520645],"length":1,"stats":{"Line":3},"fn_name":"{closure#0}"},{"line":710,"address":[705719],"length":1,"stats":{"Line":1},"fn_name":null},{"line":711,"address":[705744,705850],"length":1,"stats":{"Line":2},"fn_name":null},{"line":712,"address":[705857],"length":1,"stats":{"Line":1},"fn_name":null},{"line":714,"address":[705985,705891],"length":1,"stats":{"Line":2},"fn_name":null},{"line":716,"address":[520672,520695],"length":1,"stats":{"Line":2},"fn_name":"{closure#0}"},{"line":719,"address":[706027],"length":1,"stats":{"Line":1},"fn_name":null},{"line":720,"address":[706128],"length":1,"stats":{"Line":1},"fn_name":null},{"line":721,"address":[706206],"length":1,"stats":{"Line":1},"fn_name":null},{"line":723,"address":[706305,706421],"length":1,"stats":{"Line":1},"fn_name":null}],"covered":328,"coverable":330},{"path":["/","home","dan","dev","dan-rusty-chess","src","main.rs"],"content":"use crate::app::App;\nuse crate::chess_board::ChessBoard;\n\nmod app;\nmod chess_board;\nmod chess_move;\nmod piece;\nmod ui;\n\nuse crossterm::{\n event::{self, Event as CEvent, KeyCode},\n terminal::{disable_raw_mode, enable_raw_mode},\n};\nuse std::io::stdout;\nuse std::sync::mpsc;\nuse std::thread;\nuse std::time::{Duration, Instant};\nuse tui::{backend::CrosstermBackend, Terminal};\n\nenum Event\u003cI\u003e {\n Input(I),\n Tick,\n}\n\nfn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n let matches = clap::App::new(env!(\"CARGO_PKG_NAME\"))\n .about(\"♞ Dan's Rusty Chess ♞\")\n .arg(\n clap::Arg::with_name(\"fen\")\n .short(\"f\")\n .long(\"fen\")\n .help(\"Start game with fen string\")\n .takes_value(true),\n )\n .get_matches();\n\n let fen = matches\n .value_of(\"fen\")\n .unwrap_or(\"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1\");\n\n start_ui(fen)\n}\n\npub fn start_ui(fen: \u0026str) -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n let mut chessboard = chess_board::ChessBoard::from_fen(fen);\n let mut app = App::new();\n\n // Configure Crossterm backend for tui\n let stdout = stdout();\n enable_raw_mode()?;\n let backend = CrosstermBackend::new(stdout);\n let mut terminal = Terminal::new(backend)?;\n terminal.clear()?;\n\n let (tx, rx) = mpsc::channel();\n let tick_rate = Duration::from_millis(200);\n thread::spawn(move || {\n let mut last_tick = Instant::now();\n loop {\n let timeout = tick_rate\n .checked_sub(last_tick.elapsed())\n .unwrap_or_else(|| Duration::from_secs(0));\n\n if event::poll(timeout).expect(\"poll works\") {\n if let CEvent::Key(key) = event::read().expect(\"can read events\") {\n tx.send(Event::Input(key)).expect(\"can send events\");\n }\n }\n\n if last_tick.elapsed() \u003e= tick_rate {\n if tx.send(Event::Tick).is_ok() {\n last_tick = Instant::now();\n }\n }\n }\n });\n\n loop {\n terminal.draw(|rect| ui::draw(rect, \u0026app, \u0026chessboard))?;\n\n match rx.recv()? {\n Event::Input(event) =\u003e match (event.modifiers, event.code) {\n (event::KeyModifiers::CONTROL, KeyCode::Char('c')) =\u003e {\n // disable_raw_mode()?;\n // terminal.show_cursor()?;\n break;\n }\n (event::KeyModifiers::NONE, KeyCode::Backspace) =\u003e {\n app.ui_buffer.pop();\n }\n (event::KeyModifiers::NONE, KeyCode::Enter) =\u003e {\n let square_notation = app.ui_buffer.clone();\n app.clear_input();\n chessboard.reset_highlights();\n\n if let Some(square) = ChessBoard::square_from_notation(\u0026square_notation) {\n let moves = chessboard.generate_moves(square);\n app.set_selected_square(square);\n\n moves.iter().for_each(|m| {\n chessboard.highlight_square(m.destination, true);\n app.add_available_move(m);\n });\n }\n }\n (event::KeyModifiers::NONE, KeyCode::Char(c)) =\u003e {\n app.ui_buffer.push(c);\n }\n _ =\u003e {}\n },\n _ =\u003e {}\n }\n }\n\n // Restore the terminal and close application\n terminal.clear()?;\n terminal.show_cursor()?;\n disable_raw_mode()?;\n\n Ok(())\n}\n","traces":[{"line":25,"address":[596470,596096],"length":1,"stats":{"Line":0},"fn_name":"main"},{"line":26,"address":[596449,596402,596109],"length":1,"stats":{"Line":0},"fn_name":null},{"line":29,"address":[596292,596185],"length":1,"stats":{"Line":0},"fn_name":null},{"line":37,"address":[596623,596501],"length":1,"stats":{"Line":0},"fn_name":null},{"line":41,"address":[596639],"length":1,"stats":{"Line":0},"fn_name":null},{"line":44,"address":[600782,596688],"length":1,"stats":{"Line":0},"fn_name":"start_ui"},{"line":45,"address":[596723],"length":1,"stats":{"Line":0},"fn_name":null},{"line":46,"address":[596752],"length":1,"stats":{"Line":0},"fn_name":null},{"line":49,"address":[596826,596759],"length":1,"stats":{"Line":0},"fn_name":null},{"line":50,"address":[596966,596834,597127,596890],"length":1,"stats":{"Line":0},"fn_name":null},{"line":51,"address":[596948,597180],"length":1,"stats":{"Line":0},"fn_name":null},{"line":52,"address":[597474,597196,597582],"length":1,"stats":{"Line":0},"fn_name":null},{"line":53,"address":[597756,597448,597829,597625,597934],"length":1,"stats":{"Line":0},"fn_name":null},{"line":55,"address":[597819,597979],"length":1,"stats":{"Line":0},"fn_name":null},{"line":56,"address":[598056],"length":1,"stats":{"Line":0},"fn_name":null},{"line":57,"address":[598108],"length":1,"stats":{"Line":0},"fn_name":null},{"line":58,"address":[659215],"length":1,"stats":{"Line":0},"fn_name":null},{"line":60,"address":[659324,659400],"length":1,"stats":{"Line":0},"fn_name":null},{"line":61,"address":[659339],"length":1,"stats":{"Line":0},"fn_name":null},{"line":62,"address":[659152,659156],"length":1,"stats":{"Line":0},"fn_name":"{closure#0}"},{"line":64,"address":[659455],"length":1,"stats":{"Line":0},"fn_name":null},{"line":65,"address":[659553],"length":1,"stats":{"Line":0},"fn_name":null},{"line":66,"address":[659730],"length":1,"stats":{"Line":0},"fn_name":null},{"line":70,"address":[659948,659522],"length":1,"stats":{"Line":0},"fn_name":null},{"line":71,"address":[660007,660185],"length":1,"stats":{"Line":0},"fn_name":null},{"line":72,"address":[660140],"length":1,"stats":{"Line":0},"fn_name":null},{"line":79,"address":[660208,660243],"length":1,"stats":{"Line":0},"fn_name":"{closure#1}"},{"line":81,"address":[598682,598490],"length":1,"stats":{"Line":0},"fn_name":null},{"line":82,"address":[599006,599750],"length":1,"stats":{"Line":0},"fn_name":null},{"line":89,"address":[599208,599745],"length":1,"stats":{"Line":0},"fn_name":null},{"line":92,"address":[599218],"length":1,"stats":{"Line":0},"fn_name":null},{"line":93,"address":[599287],"length":1,"stats":{"Line":0},"fn_name":null},{"line":94,"address":[599302],"length":1,"stats":{"Line":0},"fn_name":null},{"line":96,"address":[599358],"length":1,"stats":{"Line":0},"fn_name":null},{"line":97,"address":[599485],"length":1,"stats":{"Line":0},"fn_name":null},{"line":98,"address":[599540],"length":1,"stats":{"Line":0},"fn_name":null},{"line":100,"address":[599645,599566],"length":1,"stats":{"Line":0},"fn_name":null},{"line":101,"address":[660280],"length":1,"stats":{"Line":0},"fn_name":null},{"line":102,"address":[660307],"length":1,"stats":{"Line":0},"fn_name":null},{"line":106,"address":[599245],"length":1,"stats":{"Line":0},"fn_name":null},{"line":107,"address":[599267],"length":1,"stats":{"Line":0},"fn_name":null},{"line":116,"address":[599958,599772,600054],"length":1,"stats":{"Line":0},"fn_name":null},{"line":117,"address":[600091,600340,600244,599941],"length":1,"stats":{"Line":0},"fn_name":null},{"line":118,"address":[600225,600367,600447,600597],"length":1,"stats":{"Line":0},"fn_name":null},{"line":120,"address":[600417],"length":1,"stats":{"Line":0},"fn_name":null}],"covered":0,"coverable":45},{"path":["/","home","dan","dev","dan-rusty-chess","src","piece.rs"],"content":"use crate::{\n chess_board::{ChessBoard, SquareIndex},\n chess_move::{\n ChessMove, DiagonalSlidingMoves, JumpingMoves, MoveGenerator, PawnMoves,\n StraightSlidingMoves,\n },\n};\n\npub struct Piece {\n symbol: char,\n move_generators: Vec\u003cBox\u003cdyn MoveGenerator\u003e\u003e,\n}\n\nimpl Piece {\n pub fn new(symbol: char) -\u003e Piece {\n Piece {\n symbol,\n move_generators: Piece::get_move_generators(symbol),\n }\n }\n\n pub fn get_graphic(self: \u0026Piece) -\u003e char {\n match self.symbol.to_ascii_uppercase() {\n 'R' =\u003e '\\u{265C}',\n 'r' =\u003e '\\u{2656}',\n 'N' =\u003e '\\u{265E}',\n 'n' =\u003e '\\u{2658}',\n 'B' =\u003e '\\u{265D}',\n 'b' =\u003e '\\u{2657}',\n 'K' =\u003e '\\u{265A}',\n 'k' =\u003e '\\u{2654}',\n 'Q' =\u003e '\\u{265B}',\n 'q' =\u003e '\\u{2655}',\n 'P' =\u003e '\\u{265F}',\n 'p' =\u003e '\\u{2659}',\n _ =\u003e ' ',\n }\n }\n fn get_move_generators(symbol: char) -\u003e Vec\u003cBox\u003cdyn MoveGenerator\u003e\u003e {\n match symbol {\n 'R' | 'r' =\u003e vec![Box::new(StraightSlidingMoves::new(7))],\n 'N' | 'n' =\u003e vec![Box::new(JumpingMoves::new(1))],\n 'B' | 'b' =\u003e vec![Box::new(DiagonalSlidingMoves::new(7))],\n 'Q' | 'q' =\u003e vec![\n Box::new(StraightSlidingMoves::new(7)),\n Box::new(DiagonalSlidingMoves::new(7)),\n ],\n 'K' | 'k' =\u003e vec![\n Box::new(StraightSlidingMoves::new(1)),\n Box::new(DiagonalSlidingMoves::new(1)),\n ],\n 'P' =\u003e vec![Box::new(PawnMoves::new(1, 2))],\n 'p' =\u003e vec![Box::new(PawnMoves::new(-1, 7))],\n\n _ =\u003e vec![],\n }\n }\n pub fn is_black(self: \u0026Piece) -\u003e bool {\n self.symbol.is_lowercase()\n }\n pub fn is_white(self: \u0026Piece) -\u003e bool {\n !self.is_black()\n }\n\n pub fn generate_moves(\n self: \u0026Piece,\n chess_board: \u0026ChessBoard,\n source: SquareIndex,\n ) -\u003e Vec\u003cChessMove\u003e {\n let mut moves: Vec\u003cChessMove\u003e = Vec::new();\n for move_generator in \u0026self.move_generators {\n moves.append(\u0026mut move_generator.generate_moves(chess_board, source));\n }\n moves\n }\n\n pub fn is_enemy(\u0026self, other: \u0026Piece) -\u003e bool {\n self.is_black() == other.is_white()\n }\n}\n","traces":[{"line":15,"address":[559472],"length":1,"stats":{"Line":4},"fn_name":"new"},{"line":18,"address":[559494],"length":1,"stats":{"Line":4},"fn_name":null},{"line":22,"address":[559552],"length":1,"stats":{"Line":0},"fn_name":"get_graphic"},{"line":23,"address":[559561],"length":1,"stats":{"Line":0},"fn_name":null},{"line":24,"address":[559622],"length":1,"stats":{"Line":0},"fn_name":null},{"line":25,"address":[559632],"length":1,"stats":{"Line":0},"fn_name":null},{"line":26,"address":[559642],"length":1,"stats":{"Line":0},"fn_name":null},{"line":27,"address":[559652],"length":1,"stats":{"Line":0},"fn_name":null},{"line":28,"address":[559662],"length":1,"stats":{"Line":0},"fn_name":null},{"line":29,"address":[559672],"length":1,"stats":{"Line":0},"fn_name":null},{"line":30,"address":[559682],"length":1,"stats":{"Line":0},"fn_name":null},{"line":31,"address":[559692],"length":1,"stats":{"Line":0},"fn_name":null},{"line":32,"address":[559702],"length":1,"stats":{"Line":0},"fn_name":null},{"line":33,"address":[559712],"length":1,"stats":{"Line":0},"fn_name":null},{"line":34,"address":[559722],"length":1,"stats":{"Line":0},"fn_name":null},{"line":35,"address":[559732],"length":1,"stats":{"Line":0},"fn_name":null},{"line":36,"address":[559612],"length":1,"stats":{"Line":0},"fn_name":null},{"line":39,"address":[560393,559760],"length":1,"stats":{"Line":4},"fn_name":"get_move_generators"},{"line":40,"address":[559792],"length":1,"stats":{"Line":13},"fn_name":null},{"line":41,"address":[559852,562347,562242],"length":1,"stats":{"Line":18},"fn_name":null},{"line":42,"address":[562019,562125,559880],"length":1,"stats":{"Line":8},"fn_name":null},{"line":43,"address":[559908,561902,561796],"length":1,"stats":{"Line":8},"fn_name":null},{"line":44,"address":[559936,561416,561635],"length":1,"stats":{"Line":1},"fn_name":null},{"line":45,"address":[561286,561488],"length":1,"stats":{"Line":2},"fn_name":null},{"line":46,"address":[561516],"length":1,"stats":{"Line":1},"fn_name":null},{"line":48,"address":[559964,560894,561116],"length":1,"stats":{"Line":3},"fn_name":null},{"line":49,"address":[560764,560966],"length":1,"stats":{"Line":6},"fn_name":null},{"line":50,"address":[560994],"length":1,"stats":{"Line":3},"fn_name":null},{"line":52,"address":[559992,560434,560626],"length":1,"stats":{"Line":6},"fn_name":null},{"line":53,"address":[560087,560020,560279],"length":1,"stats":{"Line":4},"fn_name":null},{"line":55,"address":[559842],"length":1,"stats":{"Line":0},"fn_name":null},{"line":58,"address":[562448],"length":1,"stats":{"Line":4},"fn_name":"is_black"},{"line":59,"address":[562457],"length":1,"stats":{"Line":4},"fn_name":null},{"line":61,"address":[562496],"length":1,"stats":{"Line":4},"fn_name":"is_white"},{"line":62,"address":[562505],"length":1,"stats":{"Line":2},"fn_name":null},{"line":65,"address":[562544,562862],"length":1,"stats":{"Line":13},"fn_name":"generate_moves"},{"line":70,"address":[562600],"length":1,"stats":{"Line":13},"fn_name":null},{"line":71,"address":[562610,562691,562757],"length":1,"stats":{"Line":39},"fn_name":null},{"line":72,"address":[562770],"length":1,"stats":{"Line":13},"fn_name":null},{"line":77,"address":[562880],"length":1,"stats":{"Line":4},"fn_name":"is_enemy"},{"line":78,"address":[562899],"length":1,"stats":{"Line":4},"fn_name":null}],"covered":25,"coverable":41},{"path":["/","home","dan","dev","dan-rusty-chess","src","ui.rs"],"content":"use tui::backend::Backend;\nuse tui::layout::{Alignment, Constraint, Direction, Layout};\nuse tui::style::{Color, Style};\nuse tui::text::{Span, Spans};\nuse tui::widgets::{Block, BorderType, Borders, Paragraph};\nuse tui::Frame;\nuse unicode_width::UnicodeWidthStr;\n\nuse crate::app::App;\nuse crate::chess_board::{ChessBoard, SquareIndex, TOTAL_RANKS};\n// use crate::app::App;\n\npub fn draw\u003cB\u003e(rect: \u0026mut Frame\u003cB\u003e, app: \u0026App, chessboard: \u0026ChessBoard)\nwhere\n B: Backend,\n{\n let size = rect.size();\n // check_size(\u0026size);\n\n // Vertical layout\n let chunks = Layout::default()\n .direction(Direction::Vertical)\n .constraints([Constraint::Length(3), Constraint::Min(12)].as_ref())\n .split(size);\n\n let main_chunks = Layout::default()\n .direction(Direction::Horizontal)\n .constraints([Constraint::Length(23), Constraint::Min(12)].as_ref())\n .split(chunks[1]);\n\n // Add widgets\n let title = draw_title();\n let chessboard = draw_chessboard(chessboard);\n let user_input = draw_user_input(app);\n rect.render_widget(title, chunks[0]);\n // rect.render_widget(main_chunks, chunks[1]);\n rect.render_widget(chessboard, main_chunks[0]);\n rect.render_widget(user_input, main_chunks[1]);\n\n rect.set_cursor(\n main_chunks[1].x + app.ui_buffer.width() as u16 + 1,\n main_chunks[1].y + 2,\n )\n}\n\nfn draw_title\u003c'a\u003e() -\u003e Paragraph\u003c'a\u003e {\n Paragraph::new(\"♞ Dan's Rusty Chess ♞\")\n .style(Style::default().fg(Color::LightCyan))\n .alignment(Alignment::Center)\n .block(\n Block::default()\n .borders(Borders::ALL)\n .style(Style::default().fg(Color::White))\n .border_type(BorderType::Plain),\n )\n}\n\nfn draw_user_input(app: \u0026App) -\u003e Paragraph {\n let mut ui_texts = vec![\n Spans::from(\"Enter square to show moves: \".to_string()),\n Spans::from(app.ui_buffer.to_string()),\n ];\n\n if let Some(square) = app.get_selected_square() {\n let notationed_moves: Vec\u003cString\u003e = app\n .available_moves()\n .iter()\n .map(|m| ChessBoard::square_to_notation(m.destination).unwrap())\n .collect();\n let text = format!(\n \"Moves for {} are: \",\n ChessBoard::square_to_notation(square).unwrap()\n );\n ui_texts.push(Spans::from(text));\n ui_texts.push(Spans::from(notationed_moves.join(\",\")));\n }\n\n Paragraph::new(ui_texts)\n .style(Style::default().fg(Color::LightCyan))\n .alignment(Alignment::Left)\n .block(\n Block::default()\n .borders(Borders::ALL)\n .style(Style::default().fg(Color::White))\n .border_type(BorderType::Plain),\n )\n}\n\nfn draw_chessboard(chessboard: \u0026ChessBoard) -\u003e Paragraph {\n let mut board_lines: Vec\u003cSpans\u003e = Vec::new();\n\n board_lines.push(Spans::from(vec![Span::raw(\" a b c d e f g h\")]));\n\n for rank in (1..=TOTAL_RANKS).rev() {\n let mut board_line: Vec\u003cSpan\u003e = Vec::new();\n board_line.push(Span::raw(format!(\"{} \", rank)));\n\n for (i, piece) in chessboard\n .get_pieces_on_rank(rank.into())\n .iter()\n .enumerate()\n {\n let piece_symbol;\n let square_colour;\n let mut piece_colour = Color::White;\n\n if let Some(piece) = piece {\n piece_symbol = format!(\"{} \", piece.get_graphic());\n piece_colour = if piece.is_black() {\n Color::Black\n } else {\n Color::White\n };\n } else {\n piece_symbol = \" \".to_string();\n }\n\n let square_index: SquareIndex =\n ChessBoard::square_from_file_and_rank(i as u8, rank - 1).unwrap();\n if (i + (rank as usize)) % 2 == 0 {\n square_colour = if chessboard.is_highlit(square_index) {\n Color::Rgb(255, 189, 123)\n } else {\n Color::Rgb(168, 123, 80)\n }\n } else {\n square_colour = if chessboard.is_highlit(square_index) {\n Color::Rgb(240, 179, 64)\n } else {\n Color::Rgb(100, 70, 25)\n }\n }\n\n board_line.push(Span::styled(\n piece_symbol,\n Style::default().fg(piece_colour).bg(square_colour),\n ));\n }\n board_line.push(Span::raw(format!(\" {}\", rank)));\n\n board_lines.push(Spans::from(board_line));\n }\n board_lines.push(Spans::from(vec![Span::raw(\" a b c d e f g h\")]));\n\n let chessboard_ui = Paragraph::new(board_lines)\n .alignment(Alignment::Left)\n .block(\n Block::default()\n .borders(Borders::ALL)\n .style(Style::default().fg(Color::White))\n .border_type(BorderType::Plain),\n );\n\n chessboard_ui\n}\n\n// fn check_size(rect: \u0026Rect) {\n// if rect.width \u003c 52 {\n// panic!(\"Require width \u003e= 52, (got {})\", rect.width);\n// }\n// if rect.height \u003c 10 {\n// panic!(\"Require height \u003e= 28, (got {})\", rect.height);\n// }\n// }\n","traces":[{"line":13,"address":[750240,750616],"length":1,"stats":{"Line":0},"fn_name":"draw\u003ctui::backend::crossterm::CrosstermBackend\u003cstd::io::stdio::Stdout\u003e\u003e"},{"line":17,"address":[750295],"length":1,"stats":{"Line":0},"fn_name":null},{"line":21,"address":[750410,750581,750492,750388],"length":1,"stats":{"Line":0},"fn_name":null},{"line":22,"address":[750402,750444],"length":1,"stats":{"Line":0},"fn_name":null},{"line":23,"address":[750631,750452,750523],"length":1,"stats":{"Line":0},"fn_name":null},{"line":24,"address":[750565,750647],"length":1,"stats":{"Line":0},"fn_name":null},{"line":26,"address":[750989,750769,750846,750704],"length":1,"stats":{"Line":0},"fn_name":null},{"line":27,"address":[750761,750804],"length":1,"stats":{"Line":0},"fn_name":null},{"line":28,"address":[750877,750954,750812],"length":1,"stats":{"Line":0},"fn_name":null},{"line":29,"address":[751024,750978,750922],"length":1,"stats":{"Line":0},"fn_name":null},{"line":32,"address":[751092],"length":1,"stats":{"Line":0},"fn_name":null},{"line":33,"address":[751148],"length":1,"stats":{"Line":0},"fn_name":null},{"line":34,"address":[751195,751240],"length":1,"stats":{"Line":0},"fn_name":null},{"line":35,"address":[751248,751461,751730],"length":1,"stats":{"Line":0},"fn_name":null},{"line":37,"address":[751759,752007,751552],"length":1,"stats":{"Line":0},"fn_name":null},{"line":38,"address":[751847,752158,752039],"length":1,"stats":{"Line":0},"fn_name":null},{"line":40,"address":[752447],"length":1,"stats":{"Line":0},"fn_name":null},{"line":41,"address":[752126,752374,752190],"length":1,"stats":{"Line":0},"fn_name":null},{"line":42,"address":[752460,752342,752409],"length":1,"stats":{"Line":0},"fn_name":null},{"line":46,"address":[575340,574944],"length":1,"stats":{"Line":0},"fn_name":"draw_title"},{"line":47,"address":[575826,575311,574961,575243],"length":1,"stats":{"Line":0},"fn_name":null},{"line":48,"address":[575295,575018,575355],"length":1,"stats":{"Line":0},"fn_name":null},{"line":49,"address":[575371,575303],"length":1,"stats":{"Line":0},"fn_name":null},{"line":51,"address":[575699,575767,575379],"length":1,"stats":{"Line":0},"fn_name":null},{"line":52,"address":[575468],"length":1,"stats":{"Line":0},"fn_name":null},{"line":53,"address":[575476,575751,575802],"length":1,"stats":{"Line":0},"fn_name":null},{"line":54,"address":[575759],"length":1,"stats":{"Line":0},"fn_name":null},{"line":58,"address":[576296,575904],"length":1,"stats":{"Line":0},"fn_name":"draw_user_input"},{"line":59,"address":[575943,576076,576158,576319],"length":1,"stats":{"Line":0},"fn_name":null},{"line":60,"address":[576014],"length":1,"stats":{"Line":0},"fn_name":null},{"line":61,"address":[576124],"length":1,"stats":{"Line":0},"fn_name":null},{"line":64,"address":[576442,576327],"length":1,"stats":{"Line":0},"fn_name":null},{"line":65,"address":[576463,576552],"length":1,"stats":{"Line":0},"fn_name":null},{"line":68,"address":[752624,752647],"length":1,"stats":{"Line":0},"fn_name":"{closure#0}"},{"line":70,"address":[576770,577067],"length":1,"stats":{"Line":0},"fn_name":null},{"line":72,"address":[576673],"length":1,"stats":{"Line":0},"fn_name":null},{"line":74,"address":[577008,577124],"length":1,"stats":{"Line":0},"fn_name":null},{"line":75,"address":[577131],"length":1,"stats":{"Line":0},"fn_name":null},{"line":78,"address":[577274,576478,578092,577575,577507],"length":1,"stats":{"Line":0},"fn_name":null},{"line":79,"address":[577559,577282,577610],"length":1,"stats":{"Line":0},"fn_name":null},{"line":80,"address":[577567,577629],"length":1,"stats":{"Line":0},"fn_name":null},{"line":82,"address":[578030,577962,577637],"length":1,"stats":{"Line":0},"fn_name":null},{"line":83,"address":[577729],"length":1,"stats":{"Line":0},"fn_name":null},{"line":84,"address":[577737,578014,578065],"length":1,"stats":{"Line":0},"fn_name":null},{"line":85,"address":[578022],"length":1,"stats":{"Line":0},"fn_name":null},{"line":89,"address":[578208,582401],"length":1,"stats":{"Line":0},"fn_name":"draw_chessboard"},{"line":90,"address":[578247],"length":1,"stats":{"Line":0},"fn_name":null},{"line":92,"address":[578327,578438],"length":1,"stats":{"Line":0},"fn_name":null},{"line":94,"address":[581526,578595,578986],"length":1,"stats":{"Line":0},"fn_name":null},{"line":95,"address":[579000],"length":1,"stats":{"Line":0},"fn_name":null},{"line":96,"address":[579019,579207],"length":1,"stats":{"Line":0},"fn_name":null},{"line":98,"address":[579355,579676,581224],"length":1,"stats":{"Line":0},"fn_name":null},{"line":99,"address":[579316],"length":1,"stats":{"Line":0},"fn_name":null},{"line":105,"address":[579724],"length":1,"stats":{"Line":0},"fn_name":null},{"line":107,"address":[580285,579732,579888],"length":1,"stats":{"Line":0},"fn_name":null},{"line":108,"address":[579788,579985],"length":1,"stats":{"Line":0},"fn_name":null},{"line":109,"address":[580271,580232,580261],"length":1,"stats":{"Line":0},"fn_name":null},{"line":110,"address":[580263],"length":1,"stats":{"Line":0},"fn_name":null},{"line":112,"address":[580253],"length":1,"stats":{"Line":0},"fn_name":null},{"line":115,"address":[579805],"length":1,"stats":{"Line":0},"fn_name":null},{"line":118,"address":[580304,579946],"length":1,"stats":{"Line":0},"fn_name":null},{"line":120,"address":[580411,580785],"length":1,"stats":{"Line":0},"fn_name":null},{"line":121,"address":[580771,580699,580493,580737],"length":1,"stats":{"Line":0},"fn_name":null},{"line":122,"address":[580739],"length":1,"stats":{"Line":0},"fn_name":null},{"line":124,"address":[580705],"length":1,"stats":{"Line":0},"fn_name":null},{"line":127,"address":[580522,580612,580578],"length":1,"stats":{"Line":0},"fn_name":null},{"line":128,"address":[580580],"length":1,"stats":{"Line":0},"fn_name":null},{"line":130,"address":[580546],"length":1,"stats":{"Line":0},"fn_name":null},{"line":134,"address":[581114,581190],"length":1,"stats":{"Line":0},"fn_name":null},{"line":135,"address":[580626],"length":1,"stats":{"Line":0},"fn_name":null},{"line":136,"address":[580800,580674,580955],"length":1,"stats":{"Line":0},"fn_name":null},{"line":139,"address":[581264,579615],"length":1,"stats":{"Line":0},"fn_name":null},{"line":141,"address":[581428],"length":1,"stats":{"Line":0},"fn_name":null},{"line":143,"address":[581563,578968],"length":1,"stats":{"Line":0},"fn_name":null},{"line":145,"address":[582315,581746,581817],"length":1,"stats":{"Line":0},"fn_name":null},{"line":146,"address":[581809,581852],"length":1,"stats":{"Line":0},"fn_name":null},{"line":148,"address":[582253,582185,581860],"length":1,"stats":{"Line":0},"fn_name":null},{"line":149,"address":[581952],"length":1,"stats":{"Line":0},"fn_name":null},{"line":150,"address":[581960,582237,582288],"length":1,"stats":{"Line":0},"fn_name":null},{"line":151,"address":[582245],"length":1,"stats":{"Line":0},"fn_name":null}],"covered":0,"coverable":80}]};
</script>
<script crossorigin>/** @license React v16.13.1
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
'use strict';(function(d,r){"object"===typeof exports&&"undefined"!==typeof module?r(exports):"function"===typeof define&&define.amd?define(["exports"],r):(d=d||self,r(d.React={}))})(this,function(d){function r(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}
function w(a,b,c){this.props=a;this.context=b;this.refs=ba;this.updater=c||ca}function da(){}function L(a,b,c){this.props=a;this.context=b;this.refs=ba;this.updater=c||ca}function ea(a,b,c){var g,e={},fa=null,d=null;if(null!=b)for(g in void 0!==b.ref&&(d=b.ref),void 0!==b.key&&(fa=""+b.key),b)ha.call(b,g)&&!ia.hasOwnProperty(g)&&(e[g]=b[g]);var h=arguments.length-2;if(1===h)e.children=c;else if(1<h){for(var k=Array(h),f=0;f<h;f++)k[f]=arguments[f+2];e.children=k}if(a&&a.defaultProps)for(g in h=a.defaultProps,
h)void 0===e[g]&&(e[g]=h[g]);return{$$typeof:x,type:a,key:fa,ref:d,props:e,_owner:M.current}}function va(a,b){return{$$typeof:x,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function N(a){return"object"===typeof a&&null!==a&&a.$$typeof===x}function wa(a){var b={"=":"=0",":":"=2"};return"$"+(""+a).replace(/[=:]/g,function(a){return b[a]})}function ja(a,b,c,g){if(C.length){var e=C.pop();e.result=a;e.keyPrefix=b;e.func=c;e.context=g;e.count=0;return e}return{result:a,keyPrefix:b,func:c,
context:g,count:0}}function ka(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>C.length&&C.push(a)}function O(a,b,c,g){var e=typeof a;if("undefined"===e||"boolean"===e)a=null;var d=!1;if(null===a)d=!0;else switch(e){case "string":case "number":d=!0;break;case "object":switch(a.$$typeof){case x:case xa:d=!0}}if(d)return c(g,a,""===b?"."+P(a,0):b),1;d=0;b=""===b?".":b+":";if(Array.isArray(a))for(var f=0;f<a.length;f++){e=a[f];var h=b+P(e,f);d+=O(e,h,c,g)}else if(null===a||
"object"!==typeof a?h=null:(h=la&&a[la]||a["@@iterator"],h="function"===typeof h?h:null),"function"===typeof h)for(a=h.call(a),f=0;!(e=a.next()).done;)e=e.value,h=b+P(e,f++),d+=O(e,h,c,g);else if("object"===e)throw c=""+a,Error(r(31,"[object Object]"===c?"object with keys {"+Object.keys(a).join(", ")+"}":c,""));return d}function Q(a,b,c){return null==a?0:O(a,"",b,c)}function P(a,b){return"object"===typeof a&&null!==a&&null!=a.key?wa(a.key):b.toString(36)}function ya(a,b,c){a.func.call(a.context,b,
a.count++)}function za(a,b,c){var g=a.result,e=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?R(a,g,c,function(a){return a}):null!=a&&(N(a)&&(a=va(a,e+(!a.key||b&&b.key===a.key?"":(""+a.key).replace(ma,"$&/")+"/")+c)),g.push(a))}function R(a,b,c,g,e){var d="";null!=c&&(d=(""+c).replace(ma,"$&/")+"/");b=ja(b,d,g,e);Q(a,za,b);ka(b)}function t(){var a=na.current;if(null===a)throw Error(r(321));return a}function S(a,b){var c=a.length;a.push(b);a:for(;;){var g=c-1>>>1,e=a[g];if(void 0!==
e&&0<D(e,b))a[g]=b,a[c]=e,c=g;else break a}}function n(a){a=a[0];return void 0===a?null:a}function E(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var g=0,e=a.length;g<e;){var d=2*(g+1)-1,f=a[d],h=d+1,k=a[h];if(void 0!==f&&0>D(f,c))void 0!==k&&0>D(k,f)?(a[g]=k,a[h]=c,g=h):(a[g]=f,a[d]=c,g=d);else if(void 0!==k&&0>D(k,c))a[g]=k,a[h]=c,g=h;else break a}}return b}return null}function D(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}function F(a){for(var b=n(u);null!==
b;){if(null===b.callback)E(u);else if(b.startTime<=a)E(u),b.sortIndex=b.expirationTime,S(p,b);else break;b=n(u)}}function T(a){y=!1;F(a);if(!v)if(null!==n(p))v=!0,z(U);else{var b=n(u);null!==b&&G(T,b.startTime-a)}}function U(a,b){v=!1;y&&(y=!1,V());H=!0;var c=m;try{F(b);for(l=n(p);null!==l&&(!(l.expirationTime>b)||a&&!W());){var g=l.callback;if(null!==g){l.callback=null;m=l.priorityLevel;var e=g(l.expirationTime<=b);b=q();"function"===typeof e?l.callback=e:l===n(p)&&E(p);F(b)}else E(p);l=n(p)}if(null!==
l)var d=!0;else{var f=n(u);null!==f&&G(T,f.startTime-b);d=!1}return d}finally{l=null,m=c,H=!1}}function oa(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var f="function"===typeof Symbol&&Symbol.for,x=f?Symbol.for("react.element"):60103,xa=f?Symbol.for("react.portal"):60106,Aa=f?Symbol.for("react.fragment"):60107,Ba=f?Symbol.for("react.strict_mode"):60108,Ca=f?Symbol.for("react.profiler"):60114,Da=f?Symbol.for("react.provider"):60109,
Ea=f?Symbol.for("react.context"):60110,Fa=f?Symbol.for("react.forward_ref"):60112,Ga=f?Symbol.for("react.suspense"):60113,Ha=f?Symbol.for("react.memo"):60115,Ia=f?Symbol.for("react.lazy"):60116,la="function"===typeof Symbol&&Symbol.iterator,pa=Object.getOwnPropertySymbols,Ja=Object.prototype.hasOwnProperty,Ka=Object.prototype.propertyIsEnumerable,I=function(){try{if(!Object.assign)return!1;var a=new String("abc");a[5]="de";if("5"===Object.getOwnPropertyNames(a)[0])return!1;var b={};for(a=0;10>a;a++)b["_"+
String.fromCharCode(a)]=a;if("0123456789"!==Object.getOwnPropertyNames(b).map(function(a){return b[a]}).join(""))return!1;var c={};"abcdefghijklmnopqrst".split("").forEach(function(a){c[a]=a});return"abcdefghijklmnopqrst"!==Object.keys(Object.assign({},c)).join("")?!1:!0}catch(g){return!1}}()?Object.assign:function(a,b){if(null===a||void 0===a)throw new TypeError("Object.assign cannot be called with null or undefined");var c=Object(a);for(var g,e=1;e<arguments.length;e++){var d=Object(arguments[e]);
for(var f in d)Ja.call(d,f)&&(c[f]=d[f]);if(pa){g=pa(d);for(var h=0;h<g.length;h++)Ka.call(d,g[h])&&(c[g[h]]=d[g[h]])}}return c},ca={isMounted:function(a){return!1},enqueueForceUpdate:function(a,b,c){},enqueueReplaceState:function(a,b,c,d){},enqueueSetState:function(a,b,c,d){}},ba={};w.prototype.isReactComponent={};w.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error(r(85));this.updater.enqueueSetState(this,a,b,"setState")};w.prototype.forceUpdate=
function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};da.prototype=w.prototype;f=L.prototype=new da;f.constructor=L;I(f,w.prototype);f.isPureReactComponent=!0;var M={current:null},ha=Object.prototype.hasOwnProperty,ia={key:!0,ref:!0,__self:!0,__source:!0},ma=/\/+/g,C=[],na={current:null},X;if("undefined"===typeof window||"function"!==typeof MessageChannel){var A=null,qa=null,ra=function(){if(null!==A)try{var a=q();A(!0,a);A=null}catch(b){throw setTimeout(ra,0),b;}},La=Date.now();var q=
function(){return Date.now()-La};var z=function(a){null!==A?setTimeout(z,0,a):(A=a,setTimeout(ra,0))};var G=function(a,b){qa=setTimeout(a,b)};var V=function(){clearTimeout(qa)};var W=function(){return!1};f=X=function(){}}else{var Y=window.performance,sa=window.Date,Ma=window.setTimeout,Na=window.clearTimeout;"undefined"!==typeof console&&(f=window.cancelAnimationFrame,"function"!==typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),
"function"!==typeof f&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));if("object"===typeof Y&&"function"===typeof Y.now)q=function(){return Y.now()};else{var Oa=sa.now();q=function(){return sa.now()-Oa}}var J=!1,K=null,Z=-1,ta=5,ua=0;W=function(){return q()>=ua};f=function(){};X=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"):
ta=0<a?Math.floor(1E3/a):5};var B=new MessageChannel,aa=B.port2;B.port1.onmessage=function(){if(null!==K){var a=q();ua=a+ta;try{K(!0,a)?aa.postMessage(null):(J=!1,K=null)}catch(b){throw aa.postMessage(null),b;}}else J=!1};z=function(a){K=a;J||(J=!0,aa.postMessage(null))};G=function(a,b){Z=Ma(function(){a(q())},b)};V=function(){Na(Z);Z=-1}}var p=[],u=[],Pa=1,l=null,m=3,H=!1,v=!1,y=!1,Qa=0;B={ReactCurrentDispatcher:na,ReactCurrentOwner:M,IsSomeRendererActing:{current:!1},assign:I};I(B,{Scheduler:{__proto__:null,
unstable_ImmediatePriority:1,unstable_UserBlockingPriority:2,unstable_NormalPriority:3,unstable_IdlePriority:5,unstable_LowPriority:4,unstable_runWithPriority:function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=m;m=a;try{return b()}finally{m=c}},unstable_next:function(a){switch(m){case 1:case 2:case 3:var b=3;break;default:b=m}var c=m;m=b;try{return a()}finally{m=c}},unstable_scheduleCallback:function(a,b,c){var d=q();if("object"===typeof c&&null!==c){var e=c.delay;
e="number"===typeof e&&0<e?d+e:d;c="number"===typeof c.timeout?c.timeout:oa(a)}else c=oa(a),e=d;c=e+c;a={id:Pa++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,S(u,a),null===n(p)&&a===n(u)&&(y?V():y=!0,G(T,e-d))):(a.sortIndex=c,S(p,a),v||H||(v=!0,z(U)));return a},unstable_cancelCallback:function(a){a.callback=null},unstable_wrapCallback:function(a){var b=m;return function(){var c=m;m=b;try{return a.apply(this,arguments)}finally{m=c}}},unstable_getCurrentPriorityLevel:function(){return m},
unstable_shouldYield:function(){var a=q();F(a);var b=n(p);return b!==l&&null!==l&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<l.expirationTime||W()},unstable_requestPaint:f,unstable_continueExecution:function(){v||H||(v=!0,z(U))},unstable_pauseExecution:function(){},unstable_getFirstCallbackNode:function(){return n(p)},get unstable_now(){return q},get unstable_forceFrameRate(){return X},unstable_Profiling:null},SchedulerTracing:{__proto__:null,__interactionsRef:null,__subscriberRef:null,
unstable_clear:function(a){return a()},unstable_getCurrent:function(){return null},unstable_getThreadID:function(){return++Qa},unstable_trace:function(a,b,c){return c()},unstable_wrap:function(a){return a},unstable_subscribe:function(a){},unstable_unsubscribe:function(a){}}});d.Children={map:function(a,b,c){if(null==a)return a;var d=[];R(a,d,null,b,c);return d},forEach:function(a,b,c){if(null==a)return a;b=ja(null,null,b,c);Q(a,ya,b);ka(b)},count:function(a){return Q(a,function(){return null},null)},
toArray:function(a){var b=[];R(a,b,null,function(a){return a});return b},only:function(a){if(!N(a))throw Error(r(143));return a}};d.Component=w;d.Fragment=Aa;d.Profiler=Ca;d.PureComponent=L;d.StrictMode=Ba;d.Suspense=Ga;d.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=B;d.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(r(267,a));var d=I({},a.props),e=a.key,f=a.ref,m=a._owner;if(null!=b){void 0!==b.ref&&(f=b.ref,m=M.current);void 0!==b.key&&(e=""+b.key);if(a.type&&a.type.defaultProps)var h=
a.type.defaultProps;for(k in b)ha.call(b,k)&&!ia.hasOwnProperty(k)&&(d[k]=void 0===b[k]&&void 0!==h?h[k]:b[k])}var k=arguments.length-2;if(1===k)d.children=c;else if(1<k){h=Array(k);for(var l=0;l<k;l++)h[l]=arguments[l+2];d.children=h}return{$$typeof:x,type:a.type,key:e,ref:f,props:d,_owner:m}};d.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:Ea,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:Da,_context:a};return a.Consumer=
a};d.createElement=ea;d.createFactory=function(a){var b=ea.bind(null,a);b.type=a;return b};d.createRef=function(){return{current:null}};d.forwardRef=function(a){return{$$typeof:Fa,render:a}};d.isValidElement=N;d.lazy=function(a){return{$$typeof:Ia,_ctor:a,_status:-1,_result:null}};d.memo=function(a,b){return{$$typeof:Ha,type:a,compare:void 0===b?null:b}};d.useCallback=function(a,b){return t().useCallback(a,b)};d.useContext=function(a,b){return t().useContext(a,b)};d.useDebugValue=function(a,b){};
d.useEffect=function(a,b){return t().useEffect(a,b)};d.useImperativeHandle=function(a,b,c){return t().useImperativeHandle(a,b,c)};d.useLayoutEffect=function(a,b){return t().useLayoutEffect(a,b)};d.useMemo=function(a,b){return t().useMemo(a,b)};d.useReducer=function(a,b,c){return t().useReducer(a,b,c)};d.useRef=function(a){return t().useRef(a)};d.useState=function(a){return t().useState(a)};d.version="16.13.1"});
</script>
<script crossorigin>/** @license React v16.13.1
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/*
Modernizr 3.0.0pre (Custom Build) | MIT
*/
'use strict';(function(I,ea){"object"===typeof exports&&"undefined"!==typeof module?ea(exports,require("react")):"function"===typeof define&&define.amd?define(["exports","react"],ea):(I=I||self,ea(I.ReactDOM={},I.React))})(this,function(I,ea){function k(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}
function ji(a,b,c,d,e,f,g,h,m){yb=!1;gc=null;ki.apply(li,arguments)}function mi(a,b,c,d,e,f,g,h,m){ji.apply(this,arguments);if(yb){if(yb){var n=gc;yb=!1;gc=null}else throw Error(k(198));hc||(hc=!0,pd=n)}}function lf(a,b,c){var d=a.type||"unknown-event";a.currentTarget=mf(c);mi(d,b,void 0,a);a.currentTarget=null}function nf(){if(ic)for(var a in cb){var b=cb[a],c=ic.indexOf(a);if(!(-1<c))throw Error(k(96,a));if(!jc[c]){if(!b.extractEvents)throw Error(k(97,a));jc[c]=b;c=b.eventTypes;for(var d in c){var e=
void 0;var f=c[d],g=b,h=d;if(qd.hasOwnProperty(h))throw Error(k(99,h));qd[h]=f;var m=f.phasedRegistrationNames;if(m){for(e in m)m.hasOwnProperty(e)&&of(m[e],g,h);e=!0}else f.registrationName?(of(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(k(98,d,a));}}}}function of(a,b,c){if(db[a])throw Error(k(100,a));db[a]=b;rd[a]=b.eventTypes[c].dependencies}function pf(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!cb.hasOwnProperty(c)||cb[c]!==d){if(cb[c])throw Error(k(102,c));cb[c]=
d;b=!0}}b&&nf()}function qf(a){if(a=rf(a)){if("function"!==typeof sd)throw Error(k(280));var b=a.stateNode;b&&(b=td(b),sd(a.stateNode,a.type,b))}}function sf(a){eb?fb?fb.push(a):fb=[a]:eb=a}function tf(){if(eb){var a=eb,b=fb;fb=eb=null;qf(a);if(b)for(a=0;a<b.length;a++)qf(b[a])}}function ud(){if(null!==eb||null!==fb)vd(),tf()}function uf(a,b,c){if(wd)return a(b,c);wd=!0;try{return vf(a,b,c)}finally{wd=!1,ud()}}function ni(a){if(wf.call(xf,a))return!0;if(wf.call(yf,a))return!1;if(oi.test(a))return xf[a]=
!0;yf[a]=!0;return!1}function pi(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case "function":case "symbol":return!0;case "boolean":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return"data-"!==a&&"aria-"!==a;default:return!1}}function qi(a,b,c,d){if(null===b||"undefined"===typeof b||pi(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function L(a,
b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}function xd(a,b,c,d){var e=E.hasOwnProperty(b)?E[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||"o"!==b[0]&&"O"!==b[0]||"n"!==b[1]&&"N"!==b[1]?!1:!0;f||(qi(b,c,e,d)&&(c=null),d||null===e?ni(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,""+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:"":c:(b=e.attributeName,
d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?"":""+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}function zb(a){if(null===a||"object"!==typeof a)return null;a=zf&&a[zf]||a["@@iterator"];return"function"===typeof a?a:null}function ri(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}function na(a){if(null==a)return null;
if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case Ma:return"Fragment";case gb:return"Portal";case kc:return"Profiler";case Af:return"StrictMode";case lc:return"Suspense";case yd:return"SuspenseList"}if("object"===typeof a)switch(a.$$typeof){case Bf:return"Context.Consumer";case Cf:return"Context.Provider";case zd:var b=a.render;b=b.displayName||b.name||"";return a.displayName||(""!==b?"ForwardRef("+b+")":"ForwardRef");case Ad:return na(a.type);
case Df:return na(a.render);case Ef:if(a=1===a._status?a._result:null)return na(a)}return null}function Bd(a){var b="";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c="";break a;default:var d=a._debugOwner,e=a._debugSource,f=na(a.type);c=null;d&&(c=na(d.type));d=f;f="";e?f=" (at "+e.fileName.replace(si,"")+":"+e.lineNumber+")":c&&(f=" (created by "+c+")");c="\n in "+(d||"Unknown")+f}b+=c;a=a.return}while(a);return b}function va(a){switch(typeof a){case "boolean":case "number":case "object":case "string":case "undefined":return a;
default:return""}}function Ff(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)}function ti(a){var b=Ff(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a,
b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=null;delete a[b]}}}}function mc(a){a._valueTracker||(a._valueTracker=ti(a))}function Gf(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=Ff(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Cd(a,b){var c=b.checked;return M({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=
c?c:a._wrapperState.initialChecked})}function Hf(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=va(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function If(a,b){b=b.checked;null!=b&&xd(a,"checked",b,!1)}function Dd(a,b){If(a,b);var c=va(b.value),d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=c)a.value=""+c}else a.value!==
""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?Ed(a,b.type,c):b.hasOwnProperty("defaultValue")&&Ed(a,b.type,va(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}function Jf(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!==d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;c||b===a.value||(a.value=
b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}function Ed(a,b,c){if("number"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}function ui(a){var b="";ea.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Fd(a,b){a=M({children:void 0},b);if(b=ui(b.children))a.children=b;return a}function hb(a,b,c,d){a=a.options;if(b){b={};
for(var e=0;e<c.length;e++)b["$"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty("$"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=""+va(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}function Gd(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(k(91));return M({},b,{value:void 0,defaultValue:void 0,children:""+a._wrapperState.initialValue})}
function Kf(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(k(92));if(Array.isArray(c)){if(!(1>=c.length))throw Error(k(93));c=c[0]}b=c}null==b&&(b="");c=b}a._wrapperState={initialValue:va(c)}}function Lf(a,b){var c=va(b.value),d=va(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d)}function Mf(a,b){b=a.textContent;b===a._wrapperState.initialValue&&""!==
b&&null!==b&&(a.value=b)}function Nf(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Hd(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?Nf(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}function nc(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}function oc(a){if(Id[a])return Id[a];
if(!ib[a])return a;var b=ib[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Of)return Id[a]=b[c];return a}function Jd(a){var b=Pf.get(a);void 0===b&&(b=new Map,Pf.set(a,b));return b}function Na(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Qf(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function Rf(a){if(Na(a)!==
a)throw Error(k(188));}function vi(a){var b=a.alternate;if(!b){b=Na(a);if(null===b)throw Error(k(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Rf(e),a;if(f===d)return Rf(e),b;f=f.sibling}throw Error(k(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=
f.child;h;){if(h===c){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(k(189));}}if(c.alternate!==d)throw Error(k(190));}if(3!==c.tag)throw Error(k(188));return c.stateNode.current===c?a:b}function Sf(a){a=vi(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}function jb(a,b){if(null==
b)throw Error(k(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}function Kd(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}function pc(a){null!==a&&(Ab=jb(Ab,a));a=Ab;Ab=null;if(a){Kd(a,wi);if(Ab)throw Error(k(95));if(hc)throw a=pd,hc=!1,pd=null,a;}}function Ld(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:
a}function Tf(a){if(!wa)return!1;a="on"+a;var b=a in document;b||(b=document.createElement("div"),b.setAttribute(a,"return;"),b="function"===typeof b[a]);return b}function Uf(a){a.topLevelType=null;a.nativeEvent=null;a.targetInst=null;a.ancestors.length=0;10>qc.length&&qc.push(a)}function Vf(a,b,c,d){if(qc.length){var e=qc.pop();e.topLevelType=a;e.eventSystemFlags=d;e.nativeEvent=b;e.targetInst=c;return e}return{topLevelType:a,eventSystemFlags:d,nativeEvent:b,targetInst:c,ancestors:[]}}function Wf(a){var b=
a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=Bb(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Ld(a.nativeEvent);d=a.topLevelType;var f=a.nativeEvent,g=a.eventSystemFlags;0===c&&(g|=64);for(var h=null,m=0;m<jc.length;m++){var n=jc[m];n&&(n=n.extractEvents(d,b,f,e,g))&&(h=jb(h,n))}pc(h)}}function Md(a,
b,c){if(!c.has(a)){switch(a){case "scroll":Cb(b,"scroll",!0);break;case "focus":case "blur":Cb(b,"focus",!0);Cb(b,"blur",!0);c.set("blur",null);c.set("focus",null);break;case "cancel":case "close":Tf(a)&&Cb(b,a,!0);break;case "invalid":case "submit":case "reset":break;default:-1===Db.indexOf(a)&&w(a,b)}c.set(a,null)}}function xi(a,b){var c=Jd(b);Nd.forEach(function(a){Md(a,b,c)});yi.forEach(function(a){Md(a,b,c)})}function Od(a,b,c,d,e){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:e,
container:d}}function Xf(a,b){switch(a){case "focus":case "blur":xa=null;break;case "dragenter":case "dragleave":ya=null;break;case "mouseover":case "mouseout":za=null;break;case "pointerover":case "pointerout":Eb.delete(b.pointerId);break;case "gotpointercapture":case "lostpointercapture":Fb.delete(b.pointerId)}}function Gb(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a=Od(b,c,d,e,f),null!==b&&(b=Hb(b),null!==b&&Yf(b)),a;a.eventSystemFlags|=d;return a}function zi(a,b,c,d,e){switch(b){case "focus":return xa=
Gb(xa,a,b,c,d,e),!0;case "dragenter":return ya=Gb(ya,a,b,c,d,e),!0;case "mouseover":return za=Gb(za,a,b,c,d,e),!0;case "pointerover":var f=e.pointerId;Eb.set(f,Gb(Eb.get(f)||null,a,b,c,d,e));return!0;case "gotpointercapture":return f=e.pointerId,Fb.set(f,Gb(Fb.get(f)||null,a,b,c,d,e)),!0}return!1}function Ai(a){var b=Bb(a.target);if(null!==b){var c=Na(b);if(null!==c)if(b=c.tag,13===b){if(b=Qf(c),null!==b){a.blockedOn=b;Pd(a.priority,function(){Bi(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=
3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function rc(a){if(null!==a.blockedOn)return!1;var b=Qd(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);if(null!==b){var c=Hb(b);null!==c&&Yf(c);a.blockedOn=b;return!1}return!0}function Zf(a,b,c){rc(a)&&c.delete(b)}function Ci(){for(Rd=!1;0<fa.length;){var a=fa[0];if(null!==a.blockedOn){a=Hb(a.blockedOn);null!==a&&Di(a);break}var b=Qd(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);null!==b?a.blockedOn=b:fa.shift()}null!==
xa&&rc(xa)&&(xa=null);null!==ya&&rc(ya)&&(ya=null);null!==za&&rc(za)&&(za=null);Eb.forEach(Zf);Fb.forEach(Zf)}function Ib(a,b){a.blockedOn===b&&(a.blockedOn=null,Rd||(Rd=!0,$f(ag,Ci)))}function bg(a){if(0<fa.length){Ib(fa[0],a);for(var b=1;b<fa.length;b++){var c=fa[b];c.blockedOn===a&&(c.blockedOn=null)}}null!==xa&&Ib(xa,a);null!==ya&&Ib(ya,a);null!==za&&Ib(za,a);b=function(b){return Ib(b,a)};Eb.forEach(b);Fb.forEach(b);for(b=0;b<Jb.length;b++)c=Jb[b],c.blockedOn===a&&(c.blockedOn=null);for(;0<Jb.length&&
(b=Jb[0],null===b.blockedOn);)Ai(b),null===b.blockedOn&&Jb.shift()}function Sd(a,b){for(var c=0;c<a.length;c+=2){var d=a[c],e=a[c+1],f="on"+(e[0].toUpperCase()+e.slice(1));f={phasedRegistrationNames:{bubbled:f,captured:f+"Capture"},dependencies:[d],eventPriority:b};Td.set(d,b);cg.set(d,f);dg[e]=f}}function w(a,b){Cb(b,a,!1)}function Cb(a,b,c){var d=Td.get(b);switch(void 0===d?2:d){case 0:d=Ei.bind(null,b,1,a);break;case 1:d=Fi.bind(null,b,1,a);break;default:d=sc.bind(null,b,1,a)}c?a.addEventListener(b,
d,!0):a.addEventListener(b,d,!1)}function Ei(a,b,c,d){Oa||vd();var e=sc,f=Oa;Oa=!0;try{eg(e,a,b,c,d)}finally{(Oa=f)||ud()}}function Fi(a,b,c,d){Gi(Hi,sc.bind(null,a,b,c,d))}function sc(a,b,c,d){if(tc)if(0<fa.length&&-1<Nd.indexOf(a))a=Od(null,a,b,c,d),fa.push(a);else{var e=Qd(a,b,c,d);if(null===e)Xf(a,d);else if(-1<Nd.indexOf(a))a=Od(e,a,b,c,d),fa.push(a);else if(!zi(e,a,b,c,d)){Xf(a,d);a=Vf(a,d,null,b);try{uf(Wf,a)}finally{Uf(a)}}}}function Qd(a,b,c,d){c=Ld(d);c=Bb(c);if(null!==c){var e=Na(c);if(null===
e)c=null;else{var f=e.tag;if(13===f){c=Qf(e);if(null!==c)return c;c=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;c=null}else e!==c&&(c=null)}}a=Vf(a,d,c,b);try{uf(Wf,a)}finally{Uf(a)}return null}function fg(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||Kb.hasOwnProperty(a)&&Kb[a]?(""+b).trim():b+"px"}function gg(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=fg(c,b[c],d);"float"===
c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}function Ud(a,b){if(b){if(Ii[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(k(137,a,""));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(k(60));if(!("object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML))throw Error(k(61));}if(null!=b.style&&"object"!==typeof b.style)throw Error(k(62,""));}}function Vd(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1;
default:return!0}}function oa(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=Jd(a);b=rd[b];for(var d=0;d<b.length;d++)Md(b[d],a,c)}function uc(){}function Wd(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function hg(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function ig(a,b){var c=hg(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,
offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=hg(c)}}function jg(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?jg(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function kg(){for(var a=window,b=Wd();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Wd(a.document)}return b}
function Xd(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}function lg(a,b){switch(a){case "button":case "input":case "select":case "textarea":return!!b.autoFocus}return!1}function Yd(a,b){return"textarea"===a||"option"===a||"noscript"===a||"string"===typeof b.children||"number"===typeof b.children||"object"===typeof b.dangerouslySetInnerHTML&&
null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}function kb(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}function mg(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===ng||c===Zd||c===$d){if(0===b)return a;b--}else c===og&&b++}a=a.previousSibling}return null}function Bb(a){var b=a[Aa];if(b)return b;for(var c=a.parentNode;c;){if(b=c[Lb]||c[Aa]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=mg(a);null!==
a;){if(c=a[Aa])return c;a=mg(a)}return b}a=c;c=a.parentNode}return null}function Hb(a){a=a[Aa]||a[Lb];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function Pa(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(k(33));}function ae(a){return a[vc]||null}function pa(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}function pg(a,b){var c=a.stateNode;if(!c)return null;var d=td(c);if(!d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":case "onMouseEnter":(d=
!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&"function"!==typeof c)throw Error(k(231,b,typeof c));return c}function qg(a,b,c){if(b=pg(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=jb(c._dispatchListeners,b),c._dispatchInstances=jb(c._dispatchInstances,a)}function Ji(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=pa(b);for(b=c.length;0<b--;)qg(c[b],
"captured",a);for(b=0;b<c.length;b++)qg(c[b],"bubbled",a)}}function be(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=pg(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=jb(c._dispatchListeners,b),c._dispatchInstances=jb(c._dispatchInstances,a))}function Ki(a){a&&a.dispatchConfig.registrationName&&be(a._targetInst,null,a)}function lb(a){Kd(a,Ji)}function rg(){if(wc)return wc;var a,b=ce,c=b.length,d,e="value"in Ba?Ba.value:Ba.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=
c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return wc=e.slice(a,1<d?1-d:void 0)}function xc(){return!0}function yc(){return!1}function R(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):"target"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?xc:yc;this.isPropagationStopped=yc;return this}function Li(a,b,c,d){if(this.eventPool.length){var e=
this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}function Mi(a){if(!(a instanceof this))throw Error(k(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function sg(a){a.eventPool=[];a.getPooled=Li;a.release=Mi}function tg(a,b){switch(a){case "keyup":return-1!==Ni.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "blur":return!0;default:return!1}}function ug(a){a=a.detail;return"object"===typeof a&&"data"in
a?a.data:null}function Oi(a,b){switch(a){case "compositionend":return ug(b);case "keypress":if(32!==b.which)return null;vg=!0;return wg;case "textInput":return a=b.data,a===wg&&vg?null:a;default:return null}}function Pi(a,b){if(mb)return"compositionend"===a||!de&&tg(a,b)?(a=rg(),wc=ce=Ba=null,mb=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;
case "compositionend":return xg&&"ko"!==b.locale?null:b.data;default:return null}}function yg(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return"input"===b?!!Qi[a.type]:"textarea"===b?!0:!1}function zg(a,b,c){a=R.getPooled(Ag.change,a,b,c);a.type="change";sf(c);lb(a);return a}function Ri(a){pc(a)}function zc(a){var b=Pa(a);if(Gf(b))return a}function Si(a,b){if("change"===a)return b}function Bg(){Mb&&(Mb.detachEvent("onpropertychange",Cg),Nb=Mb=null)}function Cg(a){if("value"===a.propertyName&&
zc(Nb))if(a=zg(Nb,a,Ld(a)),Oa)pc(a);else{Oa=!0;try{ee(Ri,a)}finally{Oa=!1,ud()}}}function Ti(a,b,c){"focus"===a?(Bg(),Mb=b,Nb=c,Mb.attachEvent("onpropertychange",Cg)):"blur"===a&&Bg()}function Ui(a,b){if("selectionchange"===a||"keyup"===a||"keydown"===a)return zc(Nb)}function Vi(a,b){if("click"===a)return zc(b)}function Wi(a,b){if("input"===a||"change"===a)return zc(b)}function Xi(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Yi[a])?!!b[a]:!1}function fe(a){return Xi}
function Zi(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}function Ob(a,b){if(Qa(a,b))return!0;if("object"!==typeof a||null===a||"object"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!$i.call(b,c[d])||!Qa(a[c[d]],b[c[d]]))return!1;return!0}function Dg(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(ge||null==nb||nb!==Wd(c))return null;c=nb;"selectionStart"in c&&Xd(c)?c={start:c.selectionStart,
end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return Pb&&Ob(Pb,c)?null:(Pb=c,a=R.getPooled(Eg.select,he,a,b),a.type="select",a.target=nb,lb(a),a)}function Ac(a){var b=a.keyCode;"charCode"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function q(a,b){0>ob||(a.current=ie[ob],ie[ob]=null,ob--)}function y(a,b,c){ob++;
ie[ob]=a.current;a.current=b}function pb(a,b){var c=a.type.contextTypes;if(!c)return Ca;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function N(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Fg(a,b,c){if(B.current!==Ca)throw Error(k(168));y(B,b);y(G,c)}
function Gg(a,b,c){var d=a.stateNode;a=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(k(108,na(b)||"Unknown",e));return M({},c,{},d)}function Bc(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Ca;Ra=B.current;y(B,a);y(G,G.current);return!0}function Hg(a,b,c){var d=a.stateNode;if(!d)throw Error(k(169));c?(a=Gg(a,b,Ra),d.__reactInternalMemoizedMergedChildContext=a,q(G),q(B),y(B,a)):q(G);y(G,c)}function Cc(){switch(aj()){case Dc:return 99;
case Ig:return 98;case Jg:return 97;case Kg:return 96;case Lg:return 95;default:throw Error(k(332));}}function Mg(a){switch(a){case 99:return Dc;case 98:return Ig;case 97:return Jg;case 96:return Kg;case 95:return Lg;default:throw Error(k(332));}}function Da(a,b){a=Mg(a);return bj(a,b)}function Ng(a,b,c){a=Mg(a);return je(a,b,c)}function Og(a){null===qa?(qa=[a],Ec=je(Dc,Pg)):qa.push(a);return Qg}function ha(){if(null!==Ec){var a=Ec;Ec=null;Rg(a)}Pg()}function Pg(){if(!ke&&null!==qa){ke=!0;var a=0;
try{var b=qa;Da(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});qa=null}catch(c){throw null!==qa&&(qa=qa.slice(a+1)),je(Dc,ha),c;}finally{ke=!1}}}function Fc(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function aa(a,b){if(a&&a.defaultProps){b=M({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}function le(){Gc=qb=Hc=null}function me(a){var b=Ic.current;q(Ic);a.type._context._currentValue=b}function Sg(a,b){for(;null!==a;){var c=
a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function rb(a,b){Hc=a;Gc=qb=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(ia=!0),a.firstContext=null)}function W(a,b){if(Gc!==a&&!1!==b&&0!==b){if("number"!==typeof b||1073741823===b)Gc=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===qb){if(null===
Hc)throw Error(k(308));qb=b;Hc.dependencies={expirationTime:0,firstContext:b,responders:null}}else qb=qb.next=b}return a._currentValue}function ne(a){a.updateQueue={baseState:a.memoizedState,baseQueue:null,shared:{pending:null},effects:null}}function oe(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,baseQueue:a.baseQueue,shared:a.shared,effects:a.effects})}function Ea(a,b){a={expirationTime:a,suspenseConfig:b,tag:Tg,payload:null,callback:null,next:null};return a.next=
a}function Fa(a,b){a=a.updateQueue;if(null!==a){a=a.shared;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}}function Ug(a,b){var c=a.alternate;null!==c&&oe(c,a);a=a.updateQueue;c=a.baseQueue;null===c?(a.baseQueue=b.next=b,b.next=b):(b.next=c.next,c.next=b)}function Qb(a,b,c,d){var e=a.updateQueue;Ga=!1;var f=e.baseQueue,g=e.shared.pending;if(null!==g){if(null!==f){var h=f.next;f.next=g.next;g.next=h}f=g;e.shared.pending=null;h=a.alternate;null!==h&&(h=h.updateQueue,null!==h&&
(h.baseQueue=g))}if(null!==f){h=f.next;var m=e.baseState,n=0,k=null,ba=null,l=null;if(null!==h){var p=h;do{g=p.expirationTime;if(g<d){var t={expirationTime:p.expirationTime,suspenseConfig:p.suspenseConfig,tag:p.tag,payload:p.payload,callback:p.callback,next:null};null===l?(ba=l=t,k=m):l=l.next=t;g>n&&(n=g)}else{null!==l&&(l=l.next={expirationTime:1073741823,suspenseConfig:p.suspenseConfig,tag:p.tag,payload:p.payload,callback:p.callback,next:null});Vg(g,p.suspenseConfig);a:{var q=a,r=p;g=b;t=c;switch(r.tag){case 1:q=
r.payload;if("function"===typeof q){m=q.call(t,m,g);break a}m=q;break a;case 3:q.effectTag=q.effectTag&-4097|64;case Tg:q=r.payload;g="function"===typeof q?q.call(t,m,g):q;if(null===g||void 0===g)break a;m=M({},m,g);break a;case Jc:Ga=!0}}null!==p.callback&&(a.effectTag|=32,g=e.effects,null===g?e.effects=[p]:g.push(p))}p=p.next;if(null===p||p===h)if(g=e.shared.pending,null===g)break;else p=f.next=g.next,g.next=h,e.baseQueue=f=g,e.shared.pending=null}while(1)}null===l?k=m:l.next=ba;e.baseState=k;e.baseQueue=
l;Kc(n);a.expirationTime=n;a.memoizedState=m}}function Wg(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=e;e=c;if("function"!==typeof d)throw Error(k(191,d));d.call(e)}}}function Lc(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:M({},b,c);a.memoizedState=c;0===a.expirationTime&&(a.updateQueue.baseState=c)}function Xg(a,b,c,d,e,f,g){a=a.stateNode;return"function"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,
f,g):b.prototype&&b.prototype.isPureReactComponent?!Ob(c,d)||!Ob(e,f):!0}function Yg(a,b,c){var d=!1,e=Ca;var f=b.contextType;"object"===typeof f&&null!==f?f=W(f):(e=N(b)?Ra:B.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?pb(a,e):Ca);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Mc;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}function Zg(a,
b,c,d){a=b.state;"function"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);"function"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Mc.enqueueReplaceState(b,b.state,null)}function pe(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=$g;ne(a);var f=b.contextType;"object"===typeof f&&null!==f?e.context=W(f):(f=N(b)?Ra:B.current,e.context=pb(a,f));Qb(a,c,e,d);e.state=a.memoizedState;f=b.getDerivedStateFromProps;
"function"===typeof f&&(Lc(a,b,f,c),e.state=a.memoizedState);"function"===typeof b.getDerivedStateFromProps||"function"===typeof e.getSnapshotBeforeUpdate||"function"!==typeof e.UNSAFE_componentWillMount&&"function"!==typeof e.componentWillMount||(b=e.state,"function"===typeof e.componentWillMount&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Mc.enqueueReplaceState(e,e.state,null),Qb(a,c,e,d),e.state=a.memoizedState);"function"===
typeof e.componentDidMount&&(a.effectTag|=4)}function Rb(a,b,c){a=c.ref;if(null!==a&&"function"!==typeof a&&"object"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(k(309));var d=c.stateNode}if(!d)throw Error(k(147,a));var e=""+a;if(null!==b&&null!==b.ref&&"function"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===$g&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if("string"!==typeof a)throw Error(k(284));if(!c._owner)throw Error(k(290,
a));}return a}function Nc(a,b){if("textarea"!==a.type)throw Error(k(31,"[object Object]"===Object.prototype.toString.call(b)?"object with keys {"+Object.keys(b).join(", ")+"}":b,""));}function ah(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,
b),b=b.sibling;return a}function e(a,b){a=Sa(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=qe(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function m(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props),d.ref=Rb(a,b,c),d.return=a,d;d=Oc(c.type,
c.key,c.props,null,a.mode,d);d.ref=Rb(a,b,c);d.return=a;return d}function n(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=re(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function l(a,b,c,d,f){if(null===b||7!==b.tag)return b=Ha(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function ba(a,b,c){if("string"===typeof b||"number"===typeof b)return b=qe(""+b,a.mode,c),b.return=a,b;if("object"===
typeof b&&null!==b){switch(b.$$typeof){case Pc:return c=Oc(b.type,b.key,b.props,null,a.mode,c),c.ref=Rb(a,null,b),c.return=a,c;case gb:return b=re(b,a.mode,c),b.return=a,b}if(Qc(b)||zb(b))return b=Ha(b,a.mode,c,null),b.return=a,b;Nc(a,b)}return null}function p(a,b,c,d){var e=null!==b?b.key:null;if("string"===typeof c||"number"===typeof c)return null!==e?null:h(a,b,""+c,d);if("object"===typeof c&&null!==c){switch(c.$$typeof){case Pc:return c.key===e?c.type===Ma?l(a,b,c.props.children,d,e):m(a,b,c,
d):null;case gb:return c.key===e?n(a,b,c,d):null}if(Qc(c)||zb(c))return null!==e?null:l(a,b,c,d,null);Nc(a,c)}return null}function t(a,b,c,d,e){if("string"===typeof d||"number"===typeof d)return a=a.get(c)||null,h(b,a,""+d,e);if("object"===typeof d&&null!==d){switch(d.$$typeof){case Pc:return a=a.get(null===d.key?c:d.key)||null,d.type===Ma?l(b,a,d.props.children,e,d.key):m(b,a,d,e);case gb:return a=a.get(null===d.key?c:d.key)||null,n(b,a,d,e)}if(Qc(d)||zb(d))return a=a.get(c)||null,l(b,a,d,e,null);
Nc(b,d)}return null}function q(e,g,h,m){for(var n=null,k=null,l=g,r=g=0,C=null;null!==l&&r<h.length;r++){l.index>r?(C=l,l=null):C=l.sibling;var O=p(e,l,h[r],m);if(null===O){null===l&&(l=C);break}a&&l&&null===O.alternate&&b(e,l);g=f(O,g,r);null===k?n=O:k.sibling=O;k=O;l=C}if(r===h.length)return c(e,l),n;if(null===l){for(;r<h.length;r++)l=ba(e,h[r],m),null!==l&&(g=f(l,g,r),null===k?n=l:k.sibling=l,k=l);return n}for(l=d(e,l);r<h.length;r++)C=t(l,e,r,h[r],m),null!==C&&(a&&null!==C.alternate&&l.delete(null===
C.key?r:C.key),g=f(C,g,r),null===k?n=C:k.sibling=C,k=C);a&&l.forEach(function(a){return b(e,a)});return n}function w(e,g,h,n){var m=zb(h);if("function"!==typeof m)throw Error(k(150));h=m.call(h);if(null==h)throw Error(k(151));for(var l=m=null,r=g,C=g=0,O=null,v=h.next();null!==r&&!v.done;C++,v=h.next()){r.index>C?(O=r,r=null):O=r.sibling;var q=p(e,r,v.value,n);if(null===q){null===r&&(r=O);break}a&&r&&null===q.alternate&&b(e,r);g=f(q,g,C);null===l?m=q:l.sibling=q;l=q;r=O}if(v.done)return c(e,r),m;
if(null===r){for(;!v.done;C++,v=h.next())v=ba(e,v.value,n),null!==v&&(g=f(v,g,C),null===l?m=v:l.sibling=v,l=v);return m}for(r=d(e,r);!v.done;C++,v=h.next())v=t(r,e,C,v.value,n),null!==v&&(a&&null!==v.alternate&&r.delete(null===v.key?C:v.key),g=f(v,g,C),null===l?m=v:l.sibling=v,l=v);a&&r.forEach(function(a){return b(e,a)});return m}return function(a,d,f,h){var m="object"===typeof f&&null!==f&&f.type===Ma&&null===f.key;m&&(f=f.props.children);var n="object"===typeof f&&null!==f;if(n)switch(f.$$typeof){case Pc:a:{n=
f.key;for(m=d;null!==m;){if(m.key===n){switch(m.tag){case 7:if(f.type===Ma){c(a,m.sibling);d=e(m,f.props.children);d.return=a;a=d;break a}break;default:if(m.elementType===f.type){c(a,m.sibling);d=e(m,f.props);d.ref=Rb(a,m,f);d.return=a;a=d;break a}}c(a,m);break}else b(a,m);m=m.sibling}f.type===Ma?(d=Ha(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Oc(f.type,f.key,f.props,null,a.mode,h),h.ref=Rb(a,d,f),h.return=a,a=h)}return g(a);case gb:a:{for(m=f.key;null!==d;){if(d.key===m)if(4===d.tag&&d.stateNode.containerInfo===
f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=re(f,a.mode,h);d.return=a;a=d}return g(a)}if("string"===typeof f||"number"===typeof f)return f=""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=qe(f,a.mode,h),d.return=a,a=d),g(a);if(Qc(f))return q(a,d,f,h);if(zb(f))return w(a,d,f,h);n&&Nc(a,f);if("undefined"===typeof f&&!m)switch(a.tag){case 1:case 0:throw a=
a.type,Error(k(152,a.displayName||a.name||"Component"));}return c(a,d)}}function Ta(a){if(a===Sb)throw Error(k(174));return a}function se(a,b){y(Tb,b);y(Ub,a);y(ja,Sb);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Hd(null,"");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=Hd(b,a)}q(ja);y(ja,b)}function tb(a){q(ja);q(Ub);q(Tb)}function bh(a){Ta(Tb.current);var b=Ta(ja.current);var c=Hd(b,a.type);b!==c&&(y(Ub,a),y(ja,c))}function te(a){Ub.current===
a&&(q(ja),q(Ub))}function Rc(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===$d||c.data===Zd))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function ue(a,b){return{responder:a,props:b}}
function S(){throw Error(k(321));}function ve(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!Qa(a[c],b[c]))return!1;return!0}function we(a,b,c,d,e,f){Ia=f;z=b;b.memoizedState=null;b.updateQueue=null;b.expirationTime=0;Sc.current=null===a||null===a.memoizedState?dj:ej;a=c(d,e);if(b.expirationTime===Ia){f=0;do{b.expirationTime=0;if(!(25>f))throw Error(k(301));f+=1;J=K=null;b.updateQueue=null;Sc.current=fj;a=c(d,e)}while(b.expirationTime===Ia)}Sc.current=Tc;b=null!==K&&null!==K.next;
Ia=0;J=K=z=null;Uc=!1;if(b)throw Error(k(300));return a}function ub(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===J?z.memoizedState=J=a:J=J.next=a;return J}function vb(){if(null===K){var a=z.alternate;a=null!==a?a.memoizedState:null}else a=K.next;var b=null===J?z.memoizedState:J.next;if(null!==b)J=b,K=a;else{if(null===a)throw Error(k(310));K=a;a={memoizedState:K.memoizedState,baseState:K.baseState,baseQueue:K.baseQueue,queue:K.queue,next:null};null===J?z.memoizedState=
J=a:J=J.next=a}return J}function Ua(a,b){return"function"===typeof b?b(a):b}function Vc(a,b,c){b=vb();c=b.queue;if(null===c)throw Error(k(311));c.lastRenderedReducer=a;var d=K,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,m=e;do{var n=m.expirationTime;if(n<Ia){var l={expirationTime:m.expirationTime,suspenseConfig:m.suspenseConfig,action:m.action,eagerReducer:m.eagerReducer,eagerState:m.eagerState,
next:null};null===h?(g=h=l,f=d):h=h.next=l;n>z.expirationTime&&(z.expirationTime=n,Kc(n))}else null!==h&&(h=h.next={expirationTime:1073741823,suspenseConfig:m.suspenseConfig,action:m.action,eagerReducer:m.eagerReducer,eagerState:m.eagerState,next:null}),Vg(n,m.suspenseConfig),d=m.eagerReducer===a?m.eagerState:a(d,m.action);m=m.next}while(null!==m&&m!==e);null===h?f=d:h.next=g;Qa(d,b.memoizedState)||(ia=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState,
c.dispatch]}function Wc(a,b,c){b=vb();c=b.queue;if(null===c)throw Error(k(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);Qa(f,b.memoizedState)||(ia=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}function xe(a){var b=ub();"function"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={pending:null,dispatch:null,lastRenderedReducer:Ua,
lastRenderedState:a};a=a.dispatch=ch.bind(null,z,a);return[b.memoizedState,a]}function ye(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=z.updateQueue;null===b?(b={lastEffect:null},z.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function dh(a){return vb().memoizedState}function ze(a,b,c,d){var e=ub();z.effectTag|=a;e.memoizedState=ye(1|b,c,void 0,void 0===d?null:d)}function Ae(a,b,c,d){var e=vb();
d=void 0===d?null:d;var f=void 0;if(null!==K){var g=K.memoizedState;f=g.destroy;if(null!==d&&ve(d,g.deps)){ye(b,c,f,d);return}}z.effectTag|=a;e.memoizedState=ye(1|b,c,f,d)}function eh(a,b){return ze(516,4,a,b)}function Xc(a,b){return Ae(516,4,a,b)}function fh(a,b){return Ae(4,2,a,b)}function gh(a,b){if("function"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function hh(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;
return Ae(4,2,gh.bind(null,b,a),c)}function Be(a,b){}function ih(a,b){ub().memoizedState=[a,void 0===b?null:b];return a}function Yc(a,b){var c=vb();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&ve(b,d[1]))return d[0];c.memoizedState=[a,b];return a}function jh(a,b){var c=vb();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&ve(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function Ce(a,b,c){var d=Cc();Da(98>d?98:d,function(){a(!0)});Da(97<d?97:d,function(){var d=
X.suspense;X.suspense=void 0===b?null:b;try{a(!1),c()}finally{X.suspense=d}})}function ch(a,b,c){var d=ka(),e=Vb.suspense;d=Va(d,a,e);e={expirationTime:d,suspenseConfig:e,action:c,eagerReducer:null,eagerState:null,next:null};var f=b.pending;null===f?e.next=e:(e.next=f.next,f.next=e);b.pending=e;f=a.alternate;if(a===z||null!==f&&f===z)Uc=!0,e.expirationTime=Ia,z.expirationTime=Ia;else{if(0===a.expirationTime&&(null===f||0===f.expirationTime)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,
h=f(g,c);e.eagerReducer=f;e.eagerState=h;if(Qa(h,g))return}catch(m){}finally{}Ja(a,d)}}function kh(a,b){var c=la(5,null,null,0);c.elementType="DELETED";c.type="DELETED";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function lh(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType?
null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}function De(a){if(Wa){var b=Ka;if(b){var c=b;if(!lh(a,b)){b=kb(c.nextSibling);if(!b||!lh(a,b)){a.effectTag=a.effectTag&-1025|2;Wa=!1;ra=a;return}kh(ra,c)}ra=a;Ka=kb(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,Wa=!1,ra=a}}function mh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;ra=a}function Zc(a){if(a!==ra)return!1;if(!Wa)return mh(a),Wa=!0,!1;var b=a.type;if(5!==a.tag||"head"!==b&&"body"!==
b&&!Yd(b,a.memoizedProps))for(b=Ka;b;)kh(a,b),b=kb(b.nextSibling);mh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(k(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===og){if(0===b){Ka=kb(a.nextSibling);break a}b--}else c!==ng&&c!==Zd&&c!==$d||b++}a=a.nextSibling}Ka=null}}else Ka=ra?kb(a.stateNode.nextSibling):null;return!0}function Ee(){Ka=ra=null;Wa=!1}function T(a,b,c,d){b.child=null===a?Fe(b,null,c,d):wb(b,a.child,c,d)}function nh(a,
b,c,d,e){c=c.render;var f=b.ref;rb(b,e);d=we(a,b,c,d,f,e);if(null!==a&&!ia)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),sa(a,b,e);b.effectTag|=1;T(a,b,d,e);return b.child}function oh(a,b,c,d,e,f){if(null===a){var g=c.type;if("function"===typeof g&&!Ge(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ph(a,b,g,d,e,f);a=Oc(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<
f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:Ob,c(e,d)&&a.ref===b.ref))return sa(a,b,f);b.effectTag|=1;a=Sa(g,d);a.ref=b.ref;a.return=b;return b.child=a}function ph(a,b,c,d,e,f){return null!==a&&Ob(a.memoizedProps,d)&&a.ref===b.ref&&(ia=!1,e<f)?(b.expirationTime=a.expirationTime,sa(a,b,f)):He(a,b,c,d,f)}function qh(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function He(a,b,c,d,e){var f=N(c)?Ra:B.current;f=pb(b,f);rb(b,e);c=we(a,b,c,d,f,e);if(null!==a&&!ia)return b.updateQueue=
a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),sa(a,b,e);b.effectTag|=1;T(a,b,c,e);return b.child}function rh(a,b,c,d,e){if(N(c)){var f=!0;Bc(b)}else f=!1;rb(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),Yg(b,c,d),pe(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var m=g.context,n=c.contextType;"object"===typeof n&&null!==n?n=W(n):(n=N(c)?Ra:B.current,n=pb(b,n));var l=c.getDerivedStateFromProps,k="function"===
typeof l||"function"===typeof g.getSnapshotBeforeUpdate;k||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||m!==n)&&Zg(b,g,d,n);Ga=!1;var p=b.memoizedState;g.state=p;Qb(b,d,g,e);m=b.memoizedState;h!==d||p!==m||G.current||Ga?("function"===typeof l&&(Lc(b,c,l,d),m=b.memoizedState),(h=Ga||Xg(b,c,h,d,p,m,n))?(k||"function"!==typeof g.UNSAFE_componentWillMount&&"function"!==typeof g.componentWillMount||("function"===typeof g.componentWillMount&&
g.componentWillMount(),"function"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),"function"===typeof g.componentDidMount&&(b.effectTag|=4)):("function"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=m),g.props=d,g.state=m,g.context=n,d=h):("function"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,oe(a,b),h=b.memoizedProps,g.props=b.type===b.elementType?h:aa(b.type,h),m=g.context,n=c.contextType,"object"===typeof n&&null!==
n?n=W(n):(n=N(c)?Ra:B.current,n=pb(b,n)),l=c.getDerivedStateFromProps,(k="function"===typeof l||"function"===typeof g.getSnapshotBeforeUpdate)||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||m!==n)&&Zg(b,g,d,n),Ga=!1,m=b.memoizedState,g.state=m,Qb(b,d,g,e),p=b.memoizedState,h!==d||m!==p||G.current||Ga?("function"===typeof l&&(Lc(b,c,l,d),p=b.memoizedState),(l=Ga||Xg(b,c,h,d,m,p,n))?(k||"function"!==typeof g.UNSAFE_componentWillUpdate&&
"function"!==typeof g.componentWillUpdate||("function"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,p,n),"function"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,p,n)),"function"===typeof g.componentDidUpdate&&(b.effectTag|=4),"function"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m===
a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=p),g.props=d,g.state=p,g.context=n,d=l):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=256),d=!1);return Ie(a,b,c,d,f,e)}function Ie(a,b,c,d,e,f){qh(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Hg(b,c,!1),sa(a,b,f);d=b.stateNode;gj.current=b;var h=g&&"function"!==typeof c.getDerivedStateFromError?
null:d.render();b.effectTag|=1;null!==a&&g?(b.child=wb(b,a.child,null,f),b.child=wb(b,null,h,f)):T(a,b,h,f);b.memoizedState=d.state;e&&Hg(b,c,!0);return b.child}function sh(a){var b=a.stateNode;b.pendingContext?Fg(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Fg(a,b.context,!1);se(a,b.containerInfo)}function th(a,b,c){var d=b.mode,e=b.pendingProps,f=D.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===
a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);y(D,f&1);if(null===a){void 0!==e.fallback&&De(b);if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling=c;b.memoizedState=Je;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Fe(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;
c=Sa(a,a.pendingProps);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Sa(d,e);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=Je;b.child=c;return d}c=wb(b,a.child,e.children,c);b.memoizedState=null;return b.child=c}a=a.child;if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==
a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=Je;b.child=e;return c}b.memoizedState=null;return b.child=wb(b,a,e.children,c)}function uh(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);Sg(a.return,b)}function Ke(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailExpiration:0,tailMode:e,
lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.renderingStartTime=0,g.last=d,g.tail=c,g.tailExpiration=0,g.tailMode=e,g.lastEffect=f)}function vh(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;T(a,b,d.children,c);d=D.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&uh(a,c);else if(19===a.tag)uh(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===
a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}y(D,d);if(0===(b.mode&2))b.memoizedState=null;else switch(e){case "forwards":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===Rc(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);Ke(b,!1,e,c,f,b.lastEffect);break;case "backwards":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===Rc(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}Ke(b,
!0,c,null,f,b.lastEffect);break;case "together":Ke(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}function sa(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Kc(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(k(153));if(null!==b.child){a=b.child;c=Sa(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Sa(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}
function $c(a,b){switch(a.tailMode){case "hidden":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case "collapsed":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}function hj(a,b,c){var d=b.pendingProps;switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return N(b.type)&&(q(G),q(B)),
null;case 3:return tb(),q(G),q(B),c=b.stateNode,c.pendingContext&&(c.context=c.pendingContext,c.pendingContext=null),null!==a&&null!==a.child||!Zc(b)||(b.effectTag|=4),wh(b),null;case 5:te(b);c=Ta(Tb.current);var e=b.type;if(null!==a&&null!=b.stateNode)ij(a,b,e,d,c),a.ref!==b.ref&&(b.effectTag|=128);else{if(!d){if(null===b.stateNode)throw Error(k(166));return null}a=Ta(ja.current);if(Zc(b)){d=b.stateNode;e=b.type;var f=b.memoizedProps;d[Aa]=b;d[vc]=f;switch(e){case "iframe":case "object":case "embed":w("load",
d);break;case "video":case "audio":for(a=0;a<Db.length;a++)w(Db[a],d);break;case "source":w("error",d);break;case "img":case "image":case "link":w("error",d);w("load",d);break;case "form":w("reset",d);w("submit",d);break;case "details":w("toggle",d);break;case "input":Hf(d,f);w("invalid",d);oa(c,"onChange");break;case "select":d._wrapperState={wasMultiple:!!f.multiple};w("invalid",d);oa(c,"onChange");break;case "textarea":Kf(d,f),w("invalid",d),oa(c,"onChange")}Ud(e,f);a=null;for(var g in f)if(f.hasOwnProperty(g)){var h=
f[g];"children"===g?"string"===typeof h?d.textContent!==h&&(a=["children",h]):"number"===typeof h&&d.textContent!==""+h&&(a=["children",""+h]):db.hasOwnProperty(g)&&null!=h&&oa(c,g)}switch(e){case "input":mc(d);Jf(d,f,!0);break;case "textarea":mc(d);Mf(d);break;case "select":case "option":break;default:"function"===typeof f.onClick&&(d.onclick=uc)}c=a;b.updateQueue=c;null!==c&&(b.effectTag|=4)}else{g=9===c.nodeType?c:c.ownerDocument;"http://www.w3.org/1999/xhtml"===a&&(a=Nf(e));"http://www.w3.org/1999/xhtml"===
a?"script"===e?(a=g.createElement("div"),a.innerHTML="<script>\x3c/script>",a=a.removeChild(a.firstChild)):"string"===typeof d.is?a=g.createElement(e,{is:d.is}):(a=g.createElement(e),"select"===e&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,e);a[Aa]=b;a[vc]=d;jj(a,b,!1,!1);b.stateNode=a;g=Vd(e,d);switch(e){case "iframe":case "object":case "embed":w("load",a);h=d;break;case "video":case "audio":for(h=0;h<Db.length;h++)w(Db[h],a);h=d;break;case "source":w("error",a);
h=d;break;case "img":case "image":case "link":w("error",a);w("load",a);h=d;break;case "form":w("reset",a);w("submit",a);h=d;break;case "details":w("toggle",a);h=d;break;case "input":Hf(a,d);h=Cd(a,d);w("invalid",a);oa(c,"onChange");break;case "option":h=Fd(a,d);break;case "select":a._wrapperState={wasMultiple:!!d.multiple};h=M({},d,{value:void 0});w("invalid",a);oa(c,"onChange");break;case "textarea":Kf(a,d);h=Gd(a,d);w("invalid",a);oa(c,"onChange");break;default:h=d}Ud(e,h);var m=h;for(f in m)if(m.hasOwnProperty(f)){var n=
m[f];"style"===f?gg(a,n):"dangerouslySetInnerHTML"===f?(n=n?n.__html:void 0,null!=n&&xh(a,n)):"children"===f?"string"===typeof n?("textarea"!==e||""!==n)&&Wb(a,n):"number"===typeof n&&Wb(a,""+n):"suppressContentEditableWarning"!==f&&"suppressHydrationWarning"!==f&&"autoFocus"!==f&&(db.hasOwnProperty(f)?null!=n&&oa(c,f):null!=n&&xd(a,f,n,g))}switch(e){case "input":mc(a);Jf(a,d,!1);break;case "textarea":mc(a);Mf(a);break;case "option":null!=d.value&&a.setAttribute("value",""+va(d.value));break;case "select":a.multiple=
!!d.multiple;c=d.value;null!=c?hb(a,!!d.multiple,c,!1):null!=d.defaultValue&&hb(a,!!d.multiple,d.defaultValue,!0);break;default:"function"===typeof h.onClick&&(a.onclick=uc)}lg(e,d)&&(b.effectTag|=4)}null!==b.ref&&(b.effectTag|=128)}return null;case 6:if(a&&null!=b.stateNode)kj(a,b,a.memoizedProps,d);else{if("string"!==typeof d&&null===b.stateNode)throw Error(k(166));c=Ta(Tb.current);Ta(ja.current);Zc(b)?(c=b.stateNode,d=b.memoizedProps,c[Aa]=b,c.nodeValue!==d&&(b.effectTag|=4)):(c=(9===c.nodeType?
c:c.ownerDocument).createTextNode(d),c[Aa]=b,b.stateNode=c)}return null;case 13:q(D);d=b.memoizedState;if(0!==(b.effectTag&64))return b.expirationTime=c,b;c=null!==d;d=!1;null===a?void 0!==b.memoizedProps.fallback&&Zc(b):(e=a.memoizedState,d=null!==e,c||null===e||(e=a.child.sibling,null!==e&&(f=b.firstEffect,null!==f?(b.firstEffect=e,e.nextEffect=f):(b.firstEffect=b.lastEffect=e,e.nextEffect=null),e.effectTag=8)));if(c&&!d&&0!==(b.mode&2))if(null===a&&!0!==b.memoizedProps.unstable_avoidThisFallback||
0!==(D.current&1))F===Xa&&(F=ad);else{if(F===Xa||F===ad)F=bd;0!==Xb&&null!==U&&(Ya(U,P),yh(U,Xb))}if(c||d)b.effectTag|=4;return null;case 4:return tb(),wh(b),null;case 10:return me(b),null;case 17:return N(b.type)&&(q(G),q(B)),null;case 19:q(D);d=b.memoizedState;if(null===d)return null;e=0!==(b.effectTag&64);f=d.rendering;if(null===f)if(e)$c(d,!1);else{if(F!==Xa||null!==a&&0!==(a.effectTag&64))for(f=b.child;null!==f;){a=Rc(f);if(null!==a){b.effectTag|=64;$c(d,!1);e=a.updateQueue;null!==e&&(b.updateQueue=
e,b.effectTag|=4);null===d.lastEffect&&(b.firstEffect=null);b.lastEffect=d.lastEffect;for(d=b.child;null!==d;)e=d,f=c,e.effectTag&=2,e.nextEffect=null,e.firstEffect=null,e.lastEffect=null,a=e.alternate,null===a?(e.childExpirationTime=0,e.expirationTime=f,e.child=null,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null):(e.childExpirationTime=a.childExpirationTime,e.expirationTime=a.expirationTime,e.child=a.child,e.memoizedProps=a.memoizedProps,e.memoizedState=a.memoizedState,
e.updateQueue=a.updateQueue,f=a.dependencies,e.dependencies=null===f?null:{expirationTime:f.expirationTime,firstContext:f.firstContext,responders:f.responders}),d=d.sibling;y(D,D.current&1|2);return b.child}f=f.sibling}}else{if(!e)if(a=Rc(f),null!==a){if(b.effectTag|=64,e=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.effectTag|=4),$c(d,!0),null===d.tail&&"hidden"===d.tailMode&&!f.alternate)return b=b.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*Y()-d.renderingStartTime>d.tailExpiration&&
1<c&&(b.effectTag|=64,e=!0,$c(d,!1),b.expirationTime=b.childExpirationTime=c-1);d.isBackwards?(f.sibling=b.child,b.child=f):(c=d.last,null!==c?c.sibling=f:b.child=f,d.last=f)}return null!==d.tail?(0===d.tailExpiration&&(d.tailExpiration=Y()+500),c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=Y(),c.sibling=null,b=D.current,y(D,e?b&1|2:b&1),c):null}throw Error(k(156,b.tag));}function lj(a,b){switch(a.tag){case 1:return N(a.type)&&(q(G),q(B)),b=a.effectTag,b&4096?
(a.effectTag=b&-4097|64,a):null;case 3:tb();q(G);q(B);b=a.effectTag;if(0!==(b&64))throw Error(k(285));a.effectTag=b&-4097|64;return a;case 5:return te(a),null;case 13:return q(D),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return q(D),null;case 4:return tb(),null;case 10:return me(a),null;default:return null}}function Le(a,b){return{value:a,source:b,stack:Bd(b)}}function Me(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=Bd(c));null!==c&&na(c.type);b=b.value;null!==a&&1===a.tag&&
na(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function mj(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){Za(a,c)}}function zh(a){var b=a.ref;if(null!==b)if("function"===typeof b)try{b(null)}catch(c){Za(a,c)}else b.current=null}function nj(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===
b.type?c:aa(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:case 5:case 6:case 4:case 17:return}throw Error(k(163));}function Ah(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.destroy;c.destroy=void 0;void 0!==d&&d()}c=c.next}while(c!==b)}}function Bh(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function oj(a,b,c,d){switch(c.tag){case 0:case 11:case 15:case 22:Bh(3,
c);return;case 1:a=c.stateNode;c.effectTag&4&&(null===b?a.componentDidMount():(d=c.elementType===c.type?b.memoizedProps:aa(c.type,b.memoizedProps),a.componentDidUpdate(d,b.memoizedState,a.__reactInternalSnapshotBeforeUpdate)));b=c.updateQueue;null!==b&&Wg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Wg(c,b,a)}return;case 5:a=c.stateNode;null===b&&c.effectTag&4&&lg(c.type,c.memoizedProps)&&
a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&bg(c))));return;case 19:case 17:case 20:case 21:return}throw Error(k(163));}function Ch(a,b,c){"function"===typeof Ne&&Ne(b);switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;Da(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Za(g,
h)}}a=a.next}while(a!==d)})}break;case 1:zh(b);c=b.stateNode;"function"===typeof c.componentWillUnmount&&mj(b,c);break;case 5:zh(b);break;case 4:Dh(a,b,c)}}function Eh(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;a.stateNode=null;null!==b&&Eh(b)}function Fh(a){return 5===a.tag||3===a.tag||4===a.tag}function Gh(a){a:{for(var b=a.return;null!==
b;){if(Fh(b)){var c=b;break a}b=b.return}throw Error(k(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(k(161));}c.effectTag&16&&(Wb(b,""),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Fh(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;if(null===c.child||4===c.tag)continue b;
else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}d?Oe(a,c,b):Pe(a,c,b)}function Oe(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=uc));else if(4!==d&&(a=a.child,null!==a))for(Oe(a,b,c),a=a.sibling;null!==a;)Oe(a,b,c),a=a.sibling}
function Pe(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Pe(a,b,c),a=a.sibling;null!==a;)Pe(a,b,c),a=a.sibling}function Dh(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(k(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=
a,m=d,n=c,l=m;;)if(Ch(h,l,n),null!==l.child&&4!==l.tag)l.child.return=l,l=l.child;else{if(l===m)break a;for(;null===l.sibling;){if(null===l.return||l.return===m)break a;l=l.return}l.sibling.return=l.return;l=l.sibling}g?(h=f,m=d.stateNode,8===h.nodeType?h.parentNode.removeChild(m):h.removeChild(m)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Ch(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===
b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}function Qe(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:Ah(3,b);return;case 1:return;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[vc]=d;"input"===a&&"radio"===d.type&&null!=d.name&&If(c,d);Vd(a,e);b=Vd(a,d);for(e=0;e<f.length;e+=2){var g=f[e],
h=f[e+1];"style"===g?gg(c,h):"dangerouslySetInnerHTML"===g?xh(c,h):"children"===g?Wb(c,h):xd(c,g,h,b)}switch(a){case "input":Dd(c,d);break;case "textarea":Lf(c,d);break;case "select":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?hb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?hb(c,!!d.multiple,d.defaultValue,!0):hb(c,!!d.multiple,d.multiple?[]:"",!1))}}}return;case 6:if(null===b.stateNode)throw Error(k(162));b.stateNode.nodeValue=b.memoizedProps;
return;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,bg(b.containerInfo));return;case 12:return;case 13:c=b;null===b.memoizedState?d=!1:(d=!0,c=b.child,Re=Y());if(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,"function"===typeof f.setProperty?f.setProperty("display","none","important"):f.display="none"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty("display")?e.display:null,f.style.display=fg("display",e));else if(6===a.tag)a.stateNode.nodeValue=d?
"":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=f;continue}else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===c)break;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Hh(b);return;case 19:Hh(b);return;case 17:return}throw Error(k(163));}function Hh(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=
new pj);b.forEach(function(b){var d=qj.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}function Ih(a,b,c){c=Ea(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){cd||(cd=!0,Se=d);Me(a,b)};return c}function Jh(a,b,c){c=Ea(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if("function"===typeof d){var e=b.value;c.payload=function(){Me(a,b);return d(e)}}var f=a.stateNode;null!==f&&"function"===typeof f.componentDidCatch&&(c.callback=function(){"function"!==typeof d&&
(null===La?La=new Set([this]):La.add(this),Me(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:""})});return c}function ka(){return(p&(ca|ma))!==H?1073741821-(Y()/10|0):0!==dd?dd:dd=1073741821-(Y()/10|0)}function Va(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=Cc();if(0===(b&4))return 99===d?1073741823:1073741822;if((p&ca)!==H)return P;if(null!==c)a=Fc(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=Fc(a,150,100);break;case 97:case 96:a=
Fc(a,5E3,250);break;case 95:a=2;break;default:throw Error(k(326));}null!==U&&a===P&&--a;return a}function ed(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&
(U===e&&(Kc(b),F===bd&&Ya(e,P)),yh(e,b));return e}function fd(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Kh(a,b))return b;var c=a.lastPingedTime;a=a.nextKnownPendingLevel;a=c>a?c:a;return 2>=a&&b!==a?0:a}function V(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=Og(Te.bind(null,a));else{var b=fd(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=ka();
1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Qg&&Rg(c)}a.callbackExpirationTime=b;a.callbackPriority=d;b=1073741823===b?Og(Te.bind(null,a)):Ng(d,Lh.bind(null,a),{timeout:10*(1073741821-b)-Y()});a.callbackNode=b}}}function Lh(a,b){dd=0;if(b)return b=ka(),Ue(a,b),V(a),null;var c=fd(a);if(0!==c){b=a.callbackNode;if((p&(ca|ma))!==H)throw Error(k(327));
xb();a===U&&c===P||$a(a,c);if(null!==t){var d=p;p|=ca;var e=Mh();do try{rj();break}catch(h){Nh(a,h)}while(1);le();p=d;gd.current=e;if(F===hd)throw b=id,$a(a,c),Ya(a,c),V(a),b;if(null===t)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=F,U=null,d){case Xa:case hd:throw Error(k(345));case Oh:Ue(a,2<c?2:c);break;case ad:Ya(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ve(e));if(1073741823===ta&&(e=Re+Ph-Y(),10<e)){if(jd){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=
c;$a(a,c);break}}f=fd(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=We(ab.bind(null,a),e);break}ab(a);break;case bd:Ya(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ve(e));if(jd&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;$a(a,c);break}e=fd(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}1073741823!==Yb?d=10*(1073741821-Yb)-Y():1073741823===ta?d=0:(d=10*(1073741821-ta)-5E3,e=Y(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=
(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*sj(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=We(ab.bind(null,a),d);break}ab(a);break;case Xe:if(1073741823!==ta&&null!==kd){f=ta;var g=kd;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=Y()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){Ya(a,c);a.timeoutHandle=We(ab.bind(null,a),d);break}}ab(a);break;default:throw Error(k(329));}V(a);if(a.callbackNode===b)return Lh.bind(null,a)}}return null}function Te(a){var b=
a.lastExpiredTime;b=0!==b?b:1073741823;if((p&(ca|ma))!==H)throw Error(k(327));xb();a===U&&b===P||$a(a,b);if(null!==t){var c=p;p|=ca;var d=Mh();do try{tj();break}catch(e){Nh(a,e)}while(1);le();p=c;gd.current=d;if(F===hd)throw c=id,$a(a,b),Ya(a,b),V(a),c;if(null!==t)throw Error(k(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;U=null;ab(a);V(a)}return null}function uj(){if(null!==bb){var a=bb;bb=null;a.forEach(function(a,c){Ue(c,a);V(c)});ha()}}function Qh(a,b){var c=p;p|=1;try{return a(b)}finally{p=
c,p===H&&ha()}}function Rh(a,b){var c=p;p&=-2;p|=Ye;try{return a(b)}finally{p=c,p===H&&ha()}}function $a(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,vj(c));if(null!==t)for(c=t.return;null!==c;){var d=c;switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&(q(G),q(B));break;case 3:tb();q(G);q(B);break;case 5:te(d);break;case 4:tb();break;case 13:q(D);break;case 19:q(D);break;case 10:me(d)}c=c.return}U=a;t=Sa(a.current,null);
P=b;F=Xa;id=null;Yb=ta=1073741823;kd=null;Xb=0;jd=!1}function Nh(a,b){do{try{le();Sc.current=Tc;if(Uc)for(var c=z.memoizedState;null!==c;){var d=c.queue;null!==d&&(d.pending=null);c=c.next}Ia=0;J=K=z=null;Uc=!1;if(null===t||null===t.return)return F=hd,id=b,t=null;a:{var e=a,f=t.return,g=t,h=b;b=P;g.effectTag|=2048;g.firstEffect=g.lastEffect=null;if(null!==h&&"object"===typeof h&&"function"===typeof h.then){var m=h;if(0===(g.mode&2)){var n=g.alternate;n?(g.updateQueue=n.updateQueue,g.memoizedState=
n.memoizedState,g.expirationTime=n.expirationTime):(g.updateQueue=null,g.memoizedState=null)}var l=0!==(D.current&1),k=f;do{var p;if(p=13===k.tag){var q=k.memoizedState;if(null!==q)p=null!==q.dehydrated?!0:!1;else{var w=k.memoizedProps;p=void 0===w.fallback?!1:!0!==w.unstable_avoidThisFallback?!0:l?!1:!0}}if(p){var y=k.updateQueue;if(null===y){var r=new Set;r.add(m);k.updateQueue=r}else y.add(m);if(0===(k.mode&2)){k.effectTag|=64;g.effectTag&=-2981;if(1===g.tag)if(null===g.alternate)g.tag=17;else{var O=
Ea(1073741823,null);O.tag=Jc;Fa(g,O)}g.expirationTime=1073741823;break a}h=void 0;g=b;var v=e.pingCache;null===v?(v=e.pingCache=new wj,h=new Set,v.set(m,h)):(h=v.get(m),void 0===h&&(h=new Set,v.set(m,h)));if(!h.has(g)){h.add(g);var x=xj.bind(null,e,m,g);m.then(x,x)}k.effectTag|=4096;k.expirationTime=b;break a}k=k.return}while(null!==k);h=Error((na(g.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display."+
Bd(g))}F!==Xe&&(F=Oh);h=Le(h,g);k=f;do{switch(k.tag){case 3:m=h;k.effectTag|=4096;k.expirationTime=b;var A=Ih(k,m,b);Ug(k,A);break a;case 1:m=h;var u=k.type,B=k.stateNode;if(0===(k.effectTag&64)&&("function"===typeof u.getDerivedStateFromError||null!==B&&"function"===typeof B.componentDidCatch&&(null===La||!La.has(B)))){k.effectTag|=4096;k.expirationTime=b;var H=Jh(k,m,b);Ug(k,H);break a}}k=k.return}while(null!==k)}t=Sh(t)}catch(cj){b=cj;continue}break}while(1)}function Mh(a){a=gd.current;gd.current=
Tc;return null===a?Tc:a}function Vg(a,b){a<ta&&2<a&&(ta=a);null!==b&&a<Yb&&2<a&&(Yb=a,kd=b)}function Kc(a){a>Xb&&(Xb=a)}function tj(){for(;null!==t;)t=Th(t)}function rj(){for(;null!==t&&!yj();)t=Th(t)}function Th(a){var b=zj(a.alternate,a,P);a.memoizedProps=a.pendingProps;null===b&&(b=Sh(a));Uh.current=null;return b}function Sh(a){t=a;do{var b=t.alternate;a=t.return;if(0===(t.effectTag&2048)){b=hj(b,t,P);if(1===P||1!==t.childExpirationTime){for(var c=0,d=t.child;null!==d;){var e=d.expirationTime,
f=d.childExpirationTime;e>c&&(c=e);f>c&&(c=f);d=d.sibling}t.childExpirationTime=c}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=t.firstEffect),a.lastEffect=t.lastEffect),1<t.effectTag&&(null!==a.lastEffect?a.lastEffect.nextEffect=t:a.firstEffect=t,a.lastEffect=t))}else{b=lj(t);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=
2048)}b=t.sibling;if(null!==b)return b;t=a}while(null!==t);F===Xa&&(F=Xe);return null}function Ve(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function ab(a){var b=Cc();Da(99,Aj.bind(null,a,b));return null}function Aj(a,b){do xb();while(null!==Zb);if((p&(ca|ma))!==H)throw Error(k(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(k(177));a.callbackNode=null;a.callbackExpirationTime=
0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Ve(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=d-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===U&&(t=U=null,P=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=p;p|=ma;Uh.current=null;Ze=tc;var g=kg();if(Xd(g)){if("selectionStart"in
g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var m=h.getSelection&&h.getSelection();if(m&&0!==m.rangeCount){h=m.anchorNode;var n=m.anchorOffset,q=m.focusNode;m=m.focusOffset;try{h.nodeType,q.nodeType}catch(sb){h=null;break a}var ba=0,w=-1,y=-1,B=0,D=0,r=g,z=null;b:for(;;){for(var v;;){r!==h||0!==n&&3!==r.nodeType||(w=ba+n);r!==q||0!==m&&3!==r.nodeType||(y=ba+m);3===r.nodeType&&(ba+=r.nodeValue.length);if(null===(v=r.firstChild))break;z=r;
r=v}for(;;){if(r===g)break b;z===h&&++B===n&&(w=ba);z===q&&++D===m&&(y=ba);if(null!==(v=r.nextSibling))break;r=z;z=r.parentNode}r=v}h=-1===w||-1===y?null:{start:w,end:y}}else h=null}h=h||{start:0,end:0}}else h=null;$e={activeElementDetached:null,focusedElem:g,selectionRange:h};tc=!1;l=e;do try{Bj()}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);l=e;do try{for(g=a,h=b;null!==l;){var x=l.effectTag;x&16&&Wb(l.stateNode,"");if(x&128){var A=l.alternate;if(null!==A){var u=
A.ref;null!==u&&("function"===typeof u?u(null):u.current=null)}}switch(x&1038){case 2:Gh(l);l.effectTag&=-3;break;case 6:Gh(l);l.effectTag&=-3;Qe(l.alternate,l);break;case 1024:l.effectTag&=-1025;break;case 1028:l.effectTag&=-1025;Qe(l.alternate,l);break;case 4:Qe(l.alternate,l);break;case 8:n=l,Dh(g,n,h),Eh(n)}l=l.nextEffect}}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);u=$e;A=kg();x=u.focusedElem;h=u.selectionRange;if(A!==x&&x&&x.ownerDocument&&jg(x.ownerDocument.documentElement,
x)){null!==h&&Xd(x)&&(A=h.start,u=h.end,void 0===u&&(u=A),"selectionStart"in x?(x.selectionStart=A,x.selectionEnd=Math.min(u,x.value.length)):(u=(A=x.ownerDocument||document)&&A.defaultView||window,u.getSelection&&(u=u.getSelection(),n=x.textContent.length,g=Math.min(h.start,n),h=void 0===h.end?g:Math.min(h.end,n),!u.extend&&g>h&&(n=h,h=g,g=n),n=ig(x,g),q=ig(x,h),n&&q&&(1!==u.rangeCount||u.anchorNode!==n.node||u.anchorOffset!==n.offset||u.focusNode!==q.node||u.focusOffset!==q.offset)&&(A=A.createRange(),
A.setStart(n.node,n.offset),u.removeAllRanges(),g>h?(u.addRange(A),u.extend(q.node,q.offset)):(A.setEnd(q.node,q.offset),u.addRange(A))))));A=[];for(u=x;u=u.parentNode;)1===u.nodeType&&A.push({element:u,left:u.scrollLeft,top:u.scrollTop});"function"===typeof x.focus&&x.focus();for(x=0;x<A.length;x++)u=A[x],u.element.scrollLeft=u.left,u.element.scrollTop=u.top}tc=!!Ze;$e=Ze=null;a.current=c;l=e;do try{for(x=a;null!==l;){var F=l.effectTag;F&36&&oj(x,l.alternate,l);if(F&128){A=void 0;var E=l.ref;if(null!==
E){var G=l.stateNode;switch(l.tag){case 5:A=G;break;default:A=G}"function"===typeof E?E(A):E.current=A}}l=l.nextEffect}}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);l=null;Cj();p=f}else a.current=c;if(ld)ld=!1,Zb=a,$b=b;else for(l=e;null!==l;)b=l.nextEffect,l.nextEffect=null,l=b;b=a.firstPendingTime;0===b&&(La=null);1073741823===b?a===af?ac++:(ac=0,af=a):ac=0;"function"===typeof bf&&bf(c.stateNode,d);V(a);if(cd)throw cd=!1,a=Se,Se=null,a;if((p&Ye)!==H)return null;
ha();return null}function Bj(){for(;null!==l;){var a=l.effectTag;0!==(a&256)&&nj(l.alternate,l);0===(a&512)||ld||(ld=!0,Ng(97,function(){xb();return null}));l=l.nextEffect}}function xb(){if(90!==$b){var a=97<$b?97:$b;$b=90;return Da(a,Dj)}}function Dj(){if(null===Zb)return!1;var a=Zb;Zb=null;if((p&(ca|ma))!==H)throw Error(k(331));var b=p;p|=ma;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:case 22:Ah(5,c),Bh(5,c)}}catch(d){if(null===
a)throw Error(k(330));Za(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}p=b;ha();return!0}function Vh(a,b,c){b=Le(c,b);b=Ih(a,b,1073741823);Fa(a,b);a=ed(a,1073741823);null!==a&&V(a)}function Za(a,b){if(3===a.tag)Vh(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){Vh(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if("function"===typeof c.type.getDerivedStateFromError||"function"===typeof d.componentDidCatch&&(null===La||!La.has(d))){a=Le(b,a);a=Jh(c,a,1073741823);Fa(c,a);c=ed(c,1073741823);null!==
c&&V(c);break}}c=c.return}}function xj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);U===a&&P===c?F===bd||F===ad&&1073741823===ta&&Y()-Re<Ph?$a(a,P):jd=!0:Kh(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,V(a)))}function qj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=ka(),b=Va(b,a,null));a=ed(a,b);null!==a&&V(a)}function Ej(a){if("undefined"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=
b.inject(a);bf=function(a,e){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(f){}};Ne=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}function Fj(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=
null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Ge(a){a=a.prototype;return!(!a||!a.isReactComponent)}function Gj(a){if("function"===typeof a)return Ge(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===zd)return 11;if(a===Ad)return 14}return 2}function Sa(a,b){var c=a.alternate;null===c?(c=la(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=
null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,firstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}function Oc(a,b,c,d,e,f){var g=2;d=a;if("function"===typeof a)Ge(a)&&(g=1);else if("string"===typeof a)g=
5;else a:switch(a){case Ma:return Ha(c.children,e,f,b);case Hj:g=8;e|=7;break;case Af:g=8;e|=1;break;case kc:return a=la(12,c,b,e|8),a.elementType=kc,a.type=kc,a.expirationTime=f,a;case lc:return a=la(13,c,b,e),a.type=lc,a.elementType=lc,a.expirationTime=f,a;case yd:return a=la(19,c,b,e),a.elementType=yd,a.expirationTime=f,a;default:if("object"===typeof a&&null!==a)switch(a.$$typeof){case Cf:g=10;break a;case Bf:g=9;break a;case zd:g=11;break a;case Ad:g=14;break a;case Ef:g=16;d=null;break a;case Df:g=
22;break a}throw Error(k(130,null==a?a:typeof a,""));}b=la(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Ha(a,b,c,d){a=la(7,a,d,b);a.expirationTime=c;return a}function qe(a,b,c){a=la(6,a,null,b);a.expirationTime=c;return a}function re(a,b,c){b=la(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}function Ij(a,b,c){this.tag=b;this.current=null;this.containerInfo=
a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function Kh(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function Ya(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;
c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}function yh(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Ue(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}
function md(a,b,c,d){var e=b.current,f=ka(),g=Vb.suspense;f=Va(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(Na(c)!==c||1!==c.tag)throw Error(k(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(N(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(k(171));}if(1===c.tag){var m=c.type;if(N(m)){c=Gg(c,m,h);break a}}c=h}else c=Ca;null===b.context?b.context=c:b.pendingContext=c;b=Ea(f,g);b.payload={element:a};d=void 0===
d?null:d;null!==d&&(b.callback=d);Fa(e,b);Ja(e,f);return f}function cf(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function Wh(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function df(a,b){Wh(a,b);(a=a.alternate)&&Wh(a,b)}function ef(a,b,c){c=null!=c&&!0===c.hydrate;var d=new Ij(a,b,c),e=la(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;ne(e);a[Lb]=d.current;c&&0!==b&&
xi(a,9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}function bc(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||" react-mount-point-unstable "!==a.nodeValue))}function Jj(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute("data-reactroot")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new ef(a,0,b?{hydrate:!0}:void 0)}function nd(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;
if("function"===typeof e){var h=e;e=function(){var a=cf(g);h.call(a)}}md(b,g,a,e)}else{f=c._reactRootContainer=Jj(c,d);g=f._internalRoot;if("function"===typeof e){var m=e;e=function(){var a=cf(g);m.call(a)}}Rh(function(){md(b,g,a,e)})}return cf(g)}function Kj(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:gb,key:null==d?null:""+d,children:a,containerInfo:b,implementation:c}}function Xh(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;
if(!bc(b))throw Error(k(200));return Kj(a,b,null,c)}if(!ea)throw Error(k(227));var ki=function(a,b,c,d,e,f,g,h,m){var n=Array.prototype.slice.call(arguments,3);try{b.apply(c,n)}catch(C){this.onError(C)}},yb=!1,gc=null,hc=!1,pd=null,li={onError:function(a){yb=!0;gc=a}},td=null,rf=null,mf=null,ic=null,cb={},jc=[],qd={},db={},rd={},wa=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement),M=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.assign,
sd=null,eb=null,fb=null,ee=function(a,b){return a(b)},eg=function(a,b,c,d,e){return a(b,c,d,e)},vd=function(){},vf=ee,Oa=!1,wd=!1,Z=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Scheduler,Lj=Z.unstable_cancelCallback,ff=Z.unstable_now,$f=Z.unstable_scheduleCallback,Mj=Z.unstable_shouldYield,Yh=Z.unstable_requestPaint,Pd=Z.unstable_runWithPriority,Nj=Z.unstable_getCurrentPriorityLevel,Oj=Z.unstable_ImmediatePriority,Zh=Z.unstable_UserBlockingPriority,ag=Z.unstable_NormalPriority,Pj=Z.unstable_LowPriority,
Qj=Z.unstable_IdlePriority,oi=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,wf=Object.prototype.hasOwnProperty,yf={},xf={},E={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){E[a]=
new L(a,0,!1,a,null,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];E[b]=new L(b,1,!1,a[1],null,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){E[a]=new L(a,2,!1,a.toLowerCase(),null,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){E[a]=new L(a,2,!1,a,null,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){E[a]=
new L(a,3,!1,a.toLowerCase(),null,!1)});["checked","multiple","muted","selected"].forEach(function(a){E[a]=new L(a,3,!0,a,null,!1)});["capture","download"].forEach(function(a){E[a]=new L(a,4,!1,a,null,!1)});["cols","rows","size","span"].forEach(function(a){E[a]=new L(a,6,!1,a,null,!1)});["rowSpan","start"].forEach(function(a){E[a]=new L(a,5,!1,a.toLowerCase(),null,!1)});var gf=/[\-:]([a-z])/g,hf=function(a){return a[1].toUpperCase()};"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=
a.replace(gf,hf);E[b]=new L(b,1,!1,a,null,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(gf,hf);E[b]=new L(b,1,!1,a,"http://www.w3.org/1999/xlink",!1)});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(gf,hf);E[b]=new L(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1)});["tabIndex","crossOrigin"].forEach(function(a){E[a]=new L(a,1,!1,a.toLowerCase(),null,!1)});E.xlinkHref=new L("xlinkHref",1,
!1,"xlink:href","http://www.w3.org/1999/xlink",!0);["src","href","action","formAction"].forEach(function(a){E[a]=new L(a,1,!1,a.toLowerCase(),null,!0)});var da=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;da.hasOwnProperty("ReactCurrentDispatcher")||(da.ReactCurrentDispatcher={current:null});da.hasOwnProperty("ReactCurrentBatchConfig")||(da.ReactCurrentBatchConfig={suspense:null});var si=/^(.*)[\\\/]/,Q="function"===typeof Symbol&&Symbol.for,Pc=Q?Symbol.for("react.element"):60103,gb=Q?Symbol.for("react.portal"):
60106,Ma=Q?Symbol.for("react.fragment"):60107,Af=Q?Symbol.for("react.strict_mode"):60108,kc=Q?Symbol.for("react.profiler"):60114,Cf=Q?Symbol.for("react.provider"):60109,Bf=Q?Symbol.for("react.context"):60110,Hj=Q?Symbol.for("react.concurrent_mode"):60111,zd=Q?Symbol.for("react.forward_ref"):60112,lc=Q?Symbol.for("react.suspense"):60113,yd=Q?Symbol.for("react.suspense_list"):60120,Ad=Q?Symbol.for("react.memo"):60115,Ef=Q?Symbol.for("react.lazy"):60116,Df=Q?Symbol.for("react.block"):60121,zf="function"===
typeof Symbol&&Symbol.iterator,od,xh=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if("http://www.w3.org/2000/svg"!==a.namespaceURI||"innerHTML"in a)a.innerHTML=b;else{od=od||document.createElement("div");od.innerHTML="<svg>"+b.valueOf().toString()+"</svg>";for(b=od.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}}),Wb=function(a,
b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b},ib={animationend:nc("Animation","AnimationEnd"),animationiteration:nc("Animation","AnimationIteration"),animationstart:nc("Animation","AnimationStart"),transitionend:nc("Transition","TransitionEnd")},Id={},Of={};wa&&(Of=document.createElement("div").style,"AnimationEvent"in window||(delete ib.animationend.animation,delete ib.animationiteration.animation,delete ib.animationstart.animation),"TransitionEvent"in
window||delete ib.transitionend.transition);var $h=oc("animationend"),ai=oc("animationiteration"),bi=oc("animationstart"),ci=oc("transitionend"),Db="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Pf=new ("function"===typeof WeakMap?WeakMap:Map),Ab=null,wi=function(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;
if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)lf(a,b[d],c[d]);else b&&lf(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}},qc=[],Rd=!1,fa=[],xa=null,ya=null,za=null,Eb=new Map,Fb=new Map,Jb=[],Nd="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit".split(" "),
yi="focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture".split(" "),dg={},cg=new Map,Td=new Map,Rj=["abort","abort",$h,"animationEnd",ai,"animationIteration",bi,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata",
"loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",ci,"transitionEnd","waiting","waiting"];Sd("blur blur cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focus focus input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),
0);Sd("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1);Sd(Rj,2);(function(a,b){for(var c=0;c<a.length;c++)Td.set(a[c],b)})("change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),0);var Hi=Zh,Gi=Pd,tc=!0,Kb={animationIterationCount:!0,
borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,
strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Sj=["Webkit","ms","Moz","O"];Object.keys(Kb).forEach(function(a){Sj.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Kb[b]=Kb[a]})});var Ii=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}),ng="$",og="/$",$d="$?",Zd="$!",Ze=null,$e=null,We="function"===typeof setTimeout?setTimeout:void 0,vj="function"===
typeof clearTimeout?clearTimeout:void 0,jf=Math.random().toString(36).slice(2),Aa="__reactInternalInstance$"+jf,vc="__reactEventHandlers$"+jf,Lb="__reactContainere$"+jf,Ba=null,ce=null,wc=null;M(R.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():"unknown"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=xc)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():"unknown"!==
typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=xc)},persist:function(){this.isPersistent=xc},isPersistent:yc,destructor:function(){var a=this.constructor.Interface,b;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=yc;this._dispatchInstances=this._dispatchListeners=null}});R.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||
Date.now()},defaultPrevented:null,isTrusted:null};R.extend=function(a){function b(){return c.apply(this,arguments)}var c=this,d=function(){};d.prototype=c.prototype;d=new d;M(d,b.prototype);b.prototype=d;b.prototype.constructor=b;b.Interface=M({},c.Interface,a);b.extend=c.extend;sg(b);return b};sg(R);var Tj=R.extend({data:null}),Uj=R.extend({data:null}),Ni=[9,13,27,32],de=wa&&"CompositionEvent"in window,cc=null;wa&&"documentMode"in document&&(cc=document.documentMode);var Vj=wa&&"TextEvent"in window&&
!cc,xg=wa&&(!de||cc&&8<cc&&11>=cc),wg=String.fromCharCode(32),ua={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},
dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},vg=!1,mb=!1,Wj={eventTypes:ua,extractEvents:function(a,b,c,d,e){var f;if(de)b:{switch(a){case "compositionstart":var g=ua.compositionStart;break b;case "compositionend":g=ua.compositionEnd;break b;case "compositionupdate":g=
ua.compositionUpdate;break b}g=void 0}else mb?tg(a,c)&&(g=ua.compositionEnd):"keydown"===a&&229===c.keyCode&&(g=ua.compositionStart);g?(xg&&"ko"!==c.locale&&(mb||g!==ua.compositionStart?g===ua.compositionEnd&&mb&&(f=rg()):(Ba=d,ce="value"in Ba?Ba.value:Ba.textContent,mb=!0)),e=Tj.getPooled(g,b,c,d),f?e.data=f:(f=ug(c),null!==f&&(e.data=f)),lb(e),f=e):f=null;(a=Vj?Oi(a,c):Pi(a,c))?(b=Uj.getPooled(ua.beforeInput,b,c,d),b.data=a,lb(b)):b=null;return null===f?b:null===b?f:[f,b]}},Qi={color:!0,date:!0,
datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0},Ag={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}},Mb=null,Nb=null,kf=!1;wa&&(kf=Tf("input")&&(!document.documentMode||9<document.documentMode));var Xj={eventTypes:Ag,_isInputEventSupported:kf,extractEvents:function(a,b,c,d,e){e=b?Pa(b):window;var f=
e.nodeName&&e.nodeName.toLowerCase();if("select"===f||"input"===f&&"file"===e.type)var g=Si;else if(yg(e))if(kf)g=Wi;else{g=Ui;var h=Ti}else(f=e.nodeName)&&"input"===f.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)&&(g=Vi);if(g&&(g=g(a,b)))return zg(g,c,d);h&&h(a,e,b);"blur"===a&&(a=e._wrapperState)&&a.controlled&&"number"===e.type&&Ed(e,"number",e.value)}},dc=R.extend({view:null,detail:null}),Yi={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"},di=0,ei=0,fi=!1,gi=!1,ec=dc.extend({screenX:null,
screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:fe,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if("movementX"in a)return a.movementX;var b=di;di=a.screenX;return fi?"mousemove"===a.type?a.screenX-b:0:(fi=!0,0)},movementY:function(a){if("movementY"in a)return a.movementY;var b=ei;ei=a.screenY;return gi?"mousemove"===
a.type?a.screenY-b:0:(gi=!0,0)}}),hi=ec.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),fc={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout","pointerover"]},pointerLeave:{registrationName:"onPointerLeave",dependencies:["pointerout",
"pointerover"]}},Yj={eventTypes:fc,extractEvents:function(a,b,c,d,e){var f="mouseover"===a||"pointerover"===a,g="mouseout"===a||"pointerout"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;f=d.window===d?d:(f=d.ownerDocument)?f.defaultView||f.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?Bb(b):null,null!==b){var h=Na(b);if(b!==h||5!==b.tag&&6!==b.tag)b=null}}else g=null;if(g===b)return null;if("mouseout"===a||"mouseover"===a){var m=ec;var n=fc.mouseLeave;
var l=fc.mouseEnter;var k="mouse"}else if("pointerout"===a||"pointerover"===a)m=hi,n=fc.pointerLeave,l=fc.pointerEnter,k="pointer";a=null==g?f:Pa(g);f=null==b?f:Pa(b);n=m.getPooled(n,g,c,d);n.type=k+"leave";n.target=a;n.relatedTarget=f;c=m.getPooled(l,b,c,d);c.type=k+"enter";c.target=f;c.relatedTarget=a;d=g;k=b;if(d&&k)a:{m=d;l=k;g=0;for(a=m;a;a=pa(a))g++;a=0;for(b=l;b;b=pa(b))a++;for(;0<g-a;)m=pa(m),g--;for(;0<a-g;)l=pa(l),a--;for(;g--;){if(m===l||m===l.alternate)break a;m=pa(m);l=pa(l)}m=null}else m=
null;l=m;for(m=[];d&&d!==l;){g=d.alternate;if(null!==g&&g===l)break;m.push(d);d=pa(d)}for(d=[];k&&k!==l;){g=k.alternate;if(null!==g&&g===l)break;d.push(k);k=pa(k)}for(k=0;k<m.length;k++)be(m[k],"bubbled",n);for(k=d.length;0<k--;)be(d[k],"captured",c);return 0===(e&64)?[n]:[n,c]}},Qa="function"===typeof Object.is?Object.is:Zi,$i=Object.prototype.hasOwnProperty,Zj=wa&&"documentMode"in document&&11>=document.documentMode,Eg={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},
dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},nb=null,he=null,Pb=null,ge=!1,ak={eventTypes:Eg,extractEvents:function(a,b,c,d,e,f){e=f||(d.window===d?d.document:9===d.nodeType?d:d.ownerDocument);if(!(f=!e)){a:{e=Jd(e);f=rd.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?Pa(b):window;switch(a){case "focus":if(yg(e)||"true"===e.contentEditable)nb=e,he=b,Pb=null;break;case "blur":Pb=he=nb=null;
break;case "mousedown":ge=!0;break;case "contextmenu":case "mouseup":case "dragend":return ge=!1,Dg(c,d);case "selectionchange":if(Zj)break;case "keydown":case "keyup":return Dg(c,d)}return null}},bk=R.extend({animationName:null,elapsedTime:null,pseudoElement:null}),ck=R.extend({clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}}),dk=dc.extend({relatedTarget:null}),ek={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",
Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},fk={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",
224:"Meta"},gk=dc.extend({key:function(a){if(a.key){var b=ek[a.key]||a.key;if("Unidentified"!==b)return b}return"keypress"===a.type?(a=Ac(a),13===a?"Enter":String.fromCharCode(a)):"keydown"===a.type||"keyup"===a.type?fk[a.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:fe,charCode:function(a){return"keypress"===a.type?Ac(a):0},keyCode:function(a){return"keydown"===a.type||"keyup"===a.type?a.keyCode:0},which:function(a){return"keypress"===
a.type?Ac(a):"keydown"===a.type||"keyup"===a.type?a.keyCode:0}}),hk=ec.extend({dataTransfer:null}),ik=dc.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:fe}),jk=R.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),kk=ec.extend({deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in a?-a.wheelDeltaX:0},deltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a?
-a.wheelDelta:0},deltaZ:null,deltaMode:null}),lk={eventTypes:dg,extractEvents:function(a,b,c,d,e){e=cg.get(a);if(!e)return null;switch(a){case "keypress":if(0===Ac(c))return null;case "keydown":case "keyup":a=gk;break;case "blur":case "focus":a=dk;break;case "click":if(2===c.button)return null;case "auxclick":case "dblclick":case "mousedown":case "mousemove":case "mouseup":case "mouseout":case "mouseover":case "contextmenu":a=ec;break;case "drag":case "dragend":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "dragstart":case "drop":a=
hk;break;case "touchcancel":case "touchend":case "touchmove":case "touchstart":a=ik;break;case $h:case ai:case bi:a=bk;break;case ci:a=jk;break;case "scroll":a=dc;break;case "wheel":a=kk;break;case "copy":case "cut":case "paste":a=ck;break;case "gotpointercapture":case "lostpointercapture":case "pointercancel":case "pointerdown":case "pointermove":case "pointerout":case "pointerover":case "pointerup":a=hi;break;default:a=R}b=a.getPooled(e,b,c,d);lb(b);return b}};(function(a){if(ic)throw Error(k(101));
ic=Array.prototype.slice.call(a);nf()})("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" "));(function(a,b,c){td=a;rf=b;mf=c})(ae,Hb,Pa);pf({SimpleEventPlugin:lk,EnterLeaveEventPlugin:Yj,ChangeEventPlugin:Xj,SelectEventPlugin:ak,BeforeInputEventPlugin:Wj});var ie=[],ob=-1,Ca={},B={current:Ca},G={current:!1},Ra=Ca,bj=Pd,je=$f,Rg=Lj,aj=Nj,Dc=Oj,Ig=Zh,Jg=ag,Kg=Pj,Lg=Qj,Qg={},yj=Mj,Cj=void 0!==Yh?Yh:function(){},qa=null,
Ec=null,ke=!1,ii=ff(),Y=1E4>ii?ff:function(){return ff()-ii},Ic={current:null},Hc=null,qb=null,Gc=null,Tg=0,Jc=2,Ga=!1,Vb=da.ReactCurrentBatchConfig,$g=(new ea.Component).refs,Mc={isMounted:function(a){return(a=a._reactInternalFiber)?Na(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=ka(),e=Vb.suspense;d=Va(d,a,e);e=Ea(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=ka(),e=Vb.suspense;
d=Va(d,a,e);e=Ea(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=ka(),d=Vb.suspense;c=Va(c,a,d);d=Ea(c,d);d.tag=Jc;void 0!==b&&null!==b&&(d.callback=b);Fa(a,d);Ja(a,c)}},Qc=Array.isArray,wb=ah(!0),Fe=ah(!1),Sb={},ja={current:Sb},Ub={current:Sb},Tb={current:Sb},D={current:0},Sc=da.ReactCurrentDispatcher,X=da.ReactCurrentBatchConfig,Ia=0,z=null,K=null,J=null,Uc=!1,Tc={readContext:W,useCallback:S,useContext:S,
useEffect:S,useImperativeHandle:S,useLayoutEffect:S,useMemo:S,useReducer:S,useRef:S,useState:S,useDebugValue:S,useResponder:S,useDeferredValue:S,useTransition:S},dj={readContext:W,useCallback:ih,useContext:W,useEffect:eh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ze(4,2,gh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ze(4,2,a,b)},useMemo:function(a,b){var c=ub();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=
ub();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={pending:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=ch.bind(null,z,a);return[d.memoizedState,a]},useRef:function(a){var b=ub();a={current:a};return b.memoizedState=a},useState:xe,useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=xe(a),d=c[0],e=c[1];eh(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b=
xe(!1),c=b[0];b=b[1];return[ih(Ce.bind(null,b,a),[b,a]),c]}},ej={readContext:W,useCallback:Yc,useContext:W,useEffect:Xc,useImperativeHandle:hh,useLayoutEffect:fh,useMemo:jh,useReducer:Vc,useRef:dh,useState:function(a){return Vc(Ua)},useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=Vc(Ua),d=c[0],e=c[1];Xc(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b=Vc(Ua),c=b[0];b=b[1];return[Yc(Ce.bind(null,
b,a),[b,a]),c]}},fj={readContext:W,useCallback:Yc,useContext:W,useEffect:Xc,useImperativeHandle:hh,useLayoutEffect:fh,useMemo:jh,useReducer:Wc,useRef:dh,useState:function(a){return Wc(Ua)},useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=Wc(Ua),d=c[0],e=c[1];Xc(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b=Wc(Ua),c=b[0];b=b[1];return[Yc(Ce.bind(null,b,a),[b,a]),c]}},ra=null,Ka=null,Wa=
!1,gj=da.ReactCurrentOwner,ia=!1,Je={dehydrated:null,retryTime:0};var jj=function(a,b,c,d){for(c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};var wh=function(a){};var ij=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;Ta(ja.current);a=null;switch(c){case "input":f=
Cd(g,f);d=Cd(g,d);a=[];break;case "option":f=Fd(g,f);d=Fd(g,d);a=[];break;case "select":f=M({},f,{value:void 0});d=M({},d,{value:void 0});a=[];break;case "textarea":f=Gd(g,f);d=Gd(g,d);a=[];break;default:"function"!==typeof f.onClick&&"function"===typeof d.onClick&&(g.onclick=uc)}Ud(c,d);var h,m;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if("style"===h)for(m in g=f[h],g)g.hasOwnProperty(m)&&(c||(c={}),c[m]="");else"dangerouslySetInnerHTML"!==h&&"children"!==h&&"suppressContentEditableWarning"!==
h&&"suppressHydrationWarning"!==h&&"autoFocus"!==h&&(db.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var k=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&k!==g&&(null!=k||null!=g))if("style"===h)if(g){for(m in g)!g.hasOwnProperty(m)||k&&k.hasOwnProperty(m)||(c||(c={}),c[m]="");for(m in k)k.hasOwnProperty(m)&&g[m]!==k[m]&&(c||(c={}),c[m]=k[m])}else c||(a||(a=[]),a.push(h,c)),c=k;else"dangerouslySetInnerHTML"===h?(k=k?k.__html:void 0,g=g?g.__html:void 0,null!=k&&g!==k&&(a=a||
[]).push(h,k)):"children"===h?g===k||"string"!==typeof k&&"number"!==typeof k||(a=a||[]).push(h,""+k):"suppressContentEditableWarning"!==h&&"suppressHydrationWarning"!==h&&(db.hasOwnProperty(h)?(null!=k&&oa(e,h),a||g===k||(a=[])):(a=a||[]).push(h,k))}c&&(a=a||[]).push("style",c);e=a;if(b.updateQueue=e)b.effectTag|=4}};var kj=function(a,b,c,d){c!==d&&(b.effectTag|=4)};var pj="function"===typeof WeakSet?WeakSet:Set,wj="function"===typeof WeakMap?WeakMap:Map,sj=Math.ceil,gd=da.ReactCurrentDispatcher,
Uh=da.ReactCurrentOwner,H=0,Ye=8,ca=16,ma=32,Xa=0,hd=1,Oh=2,ad=3,bd=4,Xe=5,p=H,U=null,t=null,P=0,F=Xa,id=null,ta=1073741823,Yb=1073741823,kd=null,Xb=0,jd=!1,Re=0,Ph=500,l=null,cd=!1,Se=null,La=null,ld=!1,Zb=null,$b=90,bb=null,ac=0,af=null,dd=0,Ja=function(a,b){if(50<ac)throw ac=0,af=null,Error(k(185));a=ed(a,b);if(null!==a){var c=Cc();1073741823===b?(p&Ye)!==H&&(p&(ca|ma))===H?Te(a):(V(a),p===H&&ha()):V(a);(p&4)===H||98!==c&&99!==c||(null===bb?bb=new Map([[a,b]]):(c=bb.get(a),(void 0===c||c>b)&&bb.set(a,
b)))}};var zj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||G.current)ia=!0;else{if(d<c){ia=!1;switch(b.tag){case 3:sh(b);Ee();break;case 5:bh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:N(b.type)&&Bc(b);break;case 4:se(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;e=b.type._context;y(Ic,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;
if(0!==d&&d>=c)return th(a,b,c);y(D,D.current&1);b=sa(a,b,c);return null!==b?b.sibling:null}y(D,D.current&1);break;case 19:d=b.childExpirationTime>=c;if(0!==(a.effectTag&64)){if(d)return vh(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);y(D,D.current);if(!d)return null}return sa(a,b,c)}ia=!1}}else ia=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=pb(b,B.current);rb(b,c);e=we(null,
b,d,a,e,c);b.effectTag|=1;if("object"===typeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(N(d)){var f=!0;Bc(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;ne(b);var g=d.getDerivedStateFromProps;"function"===typeof g&&Lc(b,d,g,a);e.updater=Mc;b.stateNode=e;e._reactInternalFiber=b;pe(b,d,a,c);b=Ie(null,b,d,!0,f,c)}else b.tag=0,T(null,b,e,c),b=b.child;return b;case 16:a:{e=b.elementType;null!==a&&(a.alternate=
null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;ri(e);if(1!==e._status)throw e._result;e=e._result;b.type=e;f=b.tag=Gj(e);a=aa(e,a);switch(f){case 0:b=He(null,b,e,a,c);break a;case 1:b=rh(null,b,e,a,c);break a;case 11:b=nh(null,b,e,a,c);break a;case 14:b=oh(null,b,e,aa(e.type,a),d,c);break a}throw Error(k(306,e,""));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),He(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),rh(a,b,d,e,c);
case 3:sh(b);d=b.updateQueue;if(null===a||null===d)throw Error(k(282));d=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;oe(a,b);Qb(b,d,null,c);d=b.memoizedState.element;if(d===e)Ee(),b=sa(a,b,c);else{if(e=b.stateNode.hydrate)Ka=kb(b.stateNode.containerInfo.firstChild),ra=b,e=Wa=!0;if(e)for(c=Fe(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else T(a,b,d,c),Ee();b=b.child}return b;case 5:return bh(b),null===a&&De(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:
null,g=e.children,Yd(d,e)?g=null:null!==f&&Yd(d,f)&&(b.effectTag|=16),qh(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(T(a,b,g,c),b=b.child),b;case 6:return null===a&&De(b),null;case 13:return th(a,b,c);case 4:return se(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=wb(b,null,d,c):T(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),nh(a,b,d,e,c);case 7:return T(a,b,b.pendingProps,c),b.child;case 8:return T(a,
b,b.pendingProps.children,c),b.child;case 12:return T(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;var h=b.type._context;y(Ic,h._currentValue);h._currentValue=f;if(null!==g)if(h=g.value,f=Qa(h,f)?0:("function"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0,0===f){if(g.children===e.children&&!G.current){b=sa(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var m=h.dependencies;if(null!==
m){g=h.child;for(var l=m.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=Ea(c,null),l.tag=Jc,Fa(h,l));h.expirationTime<c&&(h.expirationTime=c);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);Sg(h.return,c);m.expirationTime<c&&(m.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=
g}T(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,rb(b,c),e=W(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,T(a,b,d,c),b.child;case 14:return e=b.type,f=aa(e,b.pendingProps),f=aa(e.type,f),oh(a,b,e,f,d,c);case 15:return ph(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,N(d)?(a=!0,Bc(b)):a=!1,rb(b,c),Yg(b,d,e),pe(b,d,e,c),Ie(null,
b,d,!0,a,c);case 19:return vh(a,b,c)}throw Error(k(156,b.tag));};var bf=null,Ne=null,la=function(a,b,c,d){return new Fj(a,b,c,d)};ef.prototype.render=function(a){md(a,this._internalRoot,null,null)};ef.prototype.unmount=function(){var a=this._internalRoot,b=a.containerInfo;md(null,a,null,function(){b[Lb]=null})};var Di=function(a){if(13===a.tag){var b=Fc(ka(),150,100);Ja(a,b);df(a,b)}};var Yf=function(a){13===a.tag&&(Ja(a,3),df(a,3))};var Bi=function(a){if(13===a.tag){var b=ka();b=Va(b,a,null);Ja(a,
b);df(a,b)}};sd=function(a,b,c){switch(b){case "input":Dd(a,c);b=c.name;if("radio"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll("input[name="+JSON.stringify(""+b)+'][type="radio"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=ae(d);if(!e)throw Error(k(90));Gf(d);Dd(d,e)}}}break;case "textarea":Lf(a,c);break;case "select":b=c.value,null!=b&&hb(a,!!c.multiple,b,!1)}};(function(a,b,c,d){ee=a;eg=b;vd=c;vf=d})(Qh,function(a,b,c,d,e){var f=p;p|=4;
try{return Da(98,a.bind(null,b,c,d,e))}finally{p=f,p===H&&ha()}},function(){(p&(1|ca|ma))===H&&(uj(),xb())},function(a,b){var c=p;p|=2;try{return a(b)}finally{p=c,p===H&&ha()}});var mk={Events:[Hb,Pa,ae,pf,qd,lb,function(a){Kd(a,Ki)},sf,tf,sc,pc,xb,{current:!1}]};(function(a){var b=a.findFiberByHostInstance;return Ej(M({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:da.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Sf(a);
return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:Bb,bundleType:0,version:"16.13.1",rendererPackageName:"react-dom"});I.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=mk;I.createPortal=Xh;I.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;if(void 0===
b){if("function"===typeof a.render)throw Error(k(188));throw Error(k(268,Object.keys(a)));}a=Sf(b);a=null===a?null:a.stateNode;return a};I.flushSync=function(a,b){if((p&(ca|ma))!==H)throw Error(k(187));var c=p;p|=1;try{return Da(99,a.bind(null,b))}finally{p=c,ha()}};I.hydrate=function(a,b,c){if(!bc(b))throw Error(k(200));return nd(null,a,b,!0,c)};I.render=function(a,b,c){if(!bc(b))throw Error(k(200));return nd(null,a,b,!1,c)};I.unmountComponentAtNode=function(a){if(!bc(a))throw Error(k(40));return a._reactRootContainer?
(Rh(function(){nd(null,null,a,!1,function(){a._reactRootContainer=null;a[Lb]=null})}),!0):!1};I.unstable_batchedUpdates=Qh;I.unstable_createPortal=function(a,b){return Xh(a,b,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)};I.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!bc(c))throw Error(k(200));if(null==a||void 0===a._reactInternalFiber)throw Error(k(38));return nd(a,b,c,!1,d)};I.version="16.13.1"});
</script>
<script>const e = React.createElement;
function pathToString(path) {
if (path[0] === '/') {
return '/' + path.slice(1).join('/');
} else {
return path.join('/');
}
}
function findCommonPath(files) {
if (!files || !files.length) {
return [];
}
function isPrefix(arr, prefix) {
if (arr.length < prefix.length) {
return false;
}
for (let i = prefix.length - 1; i >= 0; --i) {
if (arr[i] !== prefix[i]) {
return false;
}
}
return true;
}
let commonPath = files[0].path.slice(0, -1);
while (commonPath.length) {
if (files.every(file => isPrefix(file.path, commonPath))) {
break;
}
commonPath.pop();
}
return commonPath;
}
function findFolders(files) {
if (!files || !files.length) {
return [];
}
let folders = files.filter(file => file.path.length > 1).map(file => file.path[0]);
folders = [...new Set(folders)]; // unique
folders.sort();
folders = folders.map(folder => {
let filesInFolder = files
.filter(file => file.path[0] === folder)
.map(file => ({
...file,
path: file.path.slice(1),
parent: [...file.parent, file.path[0]],
}));
const children = findFolders(filesInFolder); // recursion
return {
is_folder: true,
path: [folder],
parent: files[0].parent,
children,
covered: children.reduce((sum, file) => sum + file.covered, 0),
coverable: children.reduce((sum, file) => sum + file.coverable, 0),
prevRun: {
covered: children.reduce((sum, file) => sum + file.prevRun.covered, 0),
coverable: children.reduce((sum, file) => sum + file.prevRun.coverable, 0),
}
};
});
return [
...folders,
...files.filter(file => file.path.length === 1),
];
}
class App extends React.Component {
constructor(...args) {
super(...args);
this.state = {
current: [],
};
}
componentDidMount() {
this.updateStateFromLocation();
window.addEventListener("hashchange", () => this.updateStateFromLocation(), false);
}
updateStateFromLocation() {
if (window.location.hash.length > 1) {
const current = window.location.hash.substr(1).split('/');
this.setState({current});
} else {
this.setState({current: []});
}
}
getCurrentPath() {
let file = this.props.root;
let path = [file];
for (let p of this.state.current) {
file = file.children.find(file => file.path[0] === p);
if (!file) {
return path;
}
path.push(file);
}
return path;
}
render() {
const path = this.getCurrentPath();
const file = path[path.length - 1];
let w = null;
if (file.is_folder) {
w = e(FilesList, {
folder: file,
onSelectFile: this.selectFile.bind(this),
onBack: path.length > 1 ? this.back.bind(this) : null,
});
} else {
w = e(DisplayFile, {
file,
onBack: this.back.bind(this),
});
}
return e('div', {className: 'app'}, w);
}
selectFile(file) {
this.setState(({current}) => {
return {current: [...current, file.path[0]]};
}, () => this.updateHash());
}
back(file) {
this.setState(({current}) => {
return {current: current.slice(0, current.length - 1)};
}, () => this.updateHash());
}
updateHash() {
if (!this.state.current || !this.state.current.length) {
window.location = '#';
} else {
window.location = '#' + this.state.current.join('/');
}
}
}
function FilesList({folder, onSelectFile, onBack}) {
let files = folder.children;
return e('div', {className: 'display-folder'},
e(FileHeader, {file: folder, onBack}),
e('table', {className: 'files-list'},
e('thead', {className: 'files-list__head'},
e('tr', null,
e('th', null, "Path"),
e('th', null, "Coverage")
)
),
e('tbody', {className: 'files-list__body'},
files.map(file => e(File, {file, onClick: onSelectFile}))
)
)
);
}
function File({file, onClick}) {
const coverage = file.coverable ? file.covered / file.coverable * 100 : -1;
const coverageDelta = file.prevRun &&
(file.covered / file.coverable * 100 - file.prevRun.covered / file.prevRun.coverable * 100);
return e('tr', {
className: 'files-list__file'
+ (coverage >= 0 && coverage < 50 ? ' files-list__file_low': '')
+ (coverage >= 50 && coverage < 80 ? ' files-list__file_medium': '')
+ (coverage >= 80 ? ' files-list__file_high': '')
+ (file.is_folder ? ' files-list__file_folder': ''),
onClick: () => onClick(file),
},
e('td', null, pathToString(file.path)),
e('td', null,
file.covered + ' / ' + file.coverable +
(coverage >= 0 ? ' (' + coverage.toFixed(2) + '%)' : ''),
e('span', {title: 'Change from the previous run'},
(coverageDelta ? ` (${coverageDelta > 0 ? '+' : ''}${coverageDelta.toFixed(2)}%)` : ''))
)
);
}
function DisplayFile({file, onBack}) {
return e('div', {className: 'display-file'},
e(FileHeader, {file, onBack}),
e(FileContent, {file})
);
}
function FileHeader({file, onBack}) {
const coverage = file.covered / file.coverable * 100;
const coverageDelta = file.prevRun && (coverage - file.prevRun.covered / file.prevRun.coverable * 100);
return e('div', {className: 'file-header'},
onBack ? e('a', {className: 'file-header__back', onClick: onBack}, 'Back') : null,
e('div', {className: 'file-header__name'}, pathToString([...file.parent, ...file.path])),
e('div', {className: 'file-header__stat'},
'Covered: ' + file.covered + ' of ' + file.coverable +
(file.coverable ? ' (' + coverage.toFixed(2) + '%)' : ''),
e('span', {title: 'Change from the previous run'},
(coverageDelta ? ` (${coverageDelta > 0 ? '+' : ''}${coverageDelta.toFixed(2)}%)` : ''))
)
);
}
function FileContent({file}) {
return e('div', {className: 'file-content'},
file.content.split(/\r?\n/).map((line, index) => {
const trace = file.traces.find(trace => trace.line === index + 1);
const covered = trace && trace.stats.Line;
const uncovered = trace && !trace.stats.Line;
return e('pre', {
className: 'code-line'
+ (covered ? ' code-line_covered' : '')
+ (uncovered ? ' code-line_uncovered' : ''),
title: trace ? JSON.stringify(trace.stats, null, 2) : null,
}, line);
})
);
}
(function(){
const commonPath = findCommonPath(data.files);
const prevFilesMap = new Map();
previousData && previousData.files.forEach((file) => {
const path = file.path.slice(commonPath.length).join('/');
prevFilesMap.set(path, file);
});
const files = data.files.map((file) => {
const path = file.path.slice(commonPath.length);
const { covered = 0, coverable = 0 } = prevFilesMap.get(path.join('/')) || {};
return {
...file,
path,
parent: commonPath,
prevRun: { covered, coverable },
};
});
const children = findFolders(files);
const root = {
is_folder: true,
children,
path: commonPath,
parent: [],
covered: children.reduce((sum, file) => sum + file.covered, 0),
coverable: children.reduce((sum, file) => sum + file.coverable, 0),
prevRun: {
covered: children.reduce((sum, file) => sum + file.prevRun.covered, 0),
coverable: children.reduce((sum, file) => sum + file.prevRun.coverable, 0),
}
};
ReactDOM.render(e(App, {root, prevFilesMap}), document.getElementById('root'));
}());
</script>
</body>
</html>