Fraser commited on
Commit
5435413
·
1 Parent(s): b29f3f6
public/trainer_image_paths.txt ADDED
@@ -0,0 +1,1579 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ trainer_images/001_Willow_Snap/image_001.jpg
2
+ trainer_images/001_Willow_Snap/image_002.jpg
3
+ trainer_images/001_Willow_Snap/image_003.jpg
4
+ trainer_images/002_Dex_Blaze/image_001.jpg
5
+ trainer_images/002_Dex_Blaze/image_002.jpg
6
+ trainer_images/002_Dex_Blaze/image_003.jpg
7
+ trainer_images/003_Nina_Nimbus/image_001.jpg
8
+ trainer_images/003_Nina_Nimbus/image_002.jpg
9
+ trainer_images/003_Nina_Nimbus/image_003.jpg
10
+ trainer_images/004_Kai_Breaker/image_001.jpg
11
+ trainer_images/004_Kai_Breaker/image_002.jpg
12
+ trainer_images/004_Kai_Breaker/image_003.jpg
13
+ trainer_images/005_Agatha_Trinket/image_001.jpg
14
+ trainer_images/005_Agatha_Trinket/image_002.jpg
15
+ trainer_images/005_Agatha_Trinket/image_003.jpg
16
+ trainer_images/006_Zippy_Zoom/image_001.jpg
17
+ trainer_images/006_Zippy_Zoom/image_002.jpg
18
+ trainer_images/006_Zippy_Zoom/image_003.jpg
19
+ trainer_images/007_Crow_Vane/image_001.jpg
20
+ trainer_images/007_Crow_Vane/image_002.jpg
21
+ trainer_images/007_Crow_Vane/image_003.jpg
22
+ trainer_images/008_Gizmo_Flux/image_001.jpg
23
+ trainer_images/008_Gizmo_Flux/image_002.jpg
24
+ trainer_images/008_Gizmo_Flux/image_003.jpg
25
+ trainer_images/009_Serena_Calm/image_001.jpg
26
+ trainer_images/009_Serena_Calm/image_002.jpg
27
+ trainer_images/009_Serena_Calm/image_003.jpg
28
+ trainer_images/010_Rex_Spray/image_001.jpg
29
+ trainer_images/010_Rex_Spray/image_002.jpg
30
+ trainer_images/010_Rex_Spray/image_003.jpg
31
+ trainer_images/011_Scout_Ridge/image_001.jpg
32
+ trainer_images/011_Scout_Ridge/image_002.jpg
33
+ trainer_images/011_Scout_Ridge/image_003.jpg
34
+ trainer_images/012_Lola_Chic/image_001.jpg
35
+ trainer_images/012_Lola_Chic/image_003.jpg
36
+ trainer_images/013_Byte_Phantom/image_001.jpg
37
+ trainer_images/013_Byte_Phantom/image_002.jpg
38
+ trainer_images/013_Byte_Phantom/image_003.jpg
39
+ trainer_images/014_Milo_Paws/image_001.jpg
40
+ trainer_images/014_Milo_Paws/image_002.jpg
41
+ trainer_images/014_Milo_Paws/image_003.jpg
42
+ trainer_images/015_Aric_Steel/image_001.jpg
43
+ trainer_images/015_Aric_Steel/image_002.jpg
44
+ trainer_images/015_Aric_Steel/image_003.jpg
45
+ trainer_images/016_Nova_Skye/image_001.jpg
46
+ trainer_images/016_Nova_Skye/image_002.jpg
47
+ trainer_images/016_Nova_Skye/image_003.jpg
48
+ trainer_images/017_Daisy_Bloom/image_001.jpg
49
+ trainer_images/017_Daisy_Bloom/image_002.jpg
50
+ trainer_images/017_Daisy_Bloom/image_003.jpg
51
+ trainer_images/018_Flint_Blaze/image_001.jpg
52
+ trainer_images/018_Flint_Blaze/image_002.jpg
53
+ trainer_images/018_Flint_Blaze/image_003.jpg
54
+ trainer_images/019_Mystra_Veil/image_001.jpg
55
+ trainer_images/019_Mystra_Veil/image_002.jpg
56
+ trainer_images/019_Mystra_Veil/image_003.jpg
57
+ trainer_images/020_Chef_Basil/image_001.jpg
58
+ trainer_images/020_Chef_Basil/image_002.jpg
59
+ trainer_images/020_Chef_Basil/image_003.jpg
60
+ trainer_images/021_Lyra_Tune/image_001.jpg
61
+ trainer_images/021_Lyra_Tune/image_002.jpg
62
+ trainer_images/021_Lyra_Tune/image_003.jpg
63
+ trainer_images/022_Terra_Green/image_001.jpg
64
+ trainer_images/022_Terra_Green/image_002.jpg
65
+ trainer_images/022_Terra_Green/image_003.jpg
66
+ trainer_images/023_Ryder_Steel/image_001.jpg
67
+ trainer_images/023_Ryder_Steel/image_002.jpg
68
+ trainer_images/023_Ryder_Steel/image_003.jpg
69
+ trainer_images/024_Sable_Pirouette/image_001.jpg
70
+ trainer_images/024_Sable_Pirouette/image_002.jpg
71
+ trainer_images/024_Sable_Pirouette/image_003.jpg
72
+ trainer_images/025_Detective_Knox/image_001.jpg
73
+ trainer_images/025_Detective_Knox/image_002.jpg
74
+ trainer_images/025_Detective_Knox/image_003.jpg
75
+ trainer_images/026_Fauna_Wilder/image_001.jpg
76
+ trainer_images/026_Fauna_Wilder/image_002.jpg
77
+ trainer_images/026_Fauna_Wilder/image_003.jpg
78
+ trainer_images/027_Vince_Torque/image_001.jpg
79
+ trainer_images/027_Vince_Torque/image_002.jpg
80
+ trainer_images/027_Vince_Torque/image_003.jpg
81
+ trainer_images/028_Jinx_Trick/image_001.jpg
82
+ trainer_images/028_Jinx_Trick/image_002.jpg
83
+ trainer_images/028_Jinx_Trick/image_003.jpg
84
+ trainer_images/029_Celeste_Halo/image_001.jpg
85
+ trainer_images/029_Celeste_Halo/image_002.jpg
86
+ trainer_images/029_Celeste_Halo/image_003.jpg
87
+ trainer_images/030_Evan_Byte/image_001.jpg
88
+ trainer_images/030_Evan_Byte/image_002.jpg
89
+ trainer_images/030_Evan_Byte/image_003.jpg
90
+ trainer_images/031_Maya_Pawson/image_001.jpg
91
+ trainer_images/031_Maya_Pawson/image_002.jpg
92
+ trainer_images/031_Maya_Pawson/image_003.jpg
93
+ trainer_images/032_Echo_Shade/image_001.jpg
94
+ trainer_images/032_Echo_Shade/image_002.jpg
95
+ trainer_images/032_Echo_Shade/image_003.jpg
96
+ trainer_images/033_Jasper_Jolt/image_001.jpg
97
+ trainer_images/033_Jasper_Jolt/image_002.jpg
98
+ trainer_images/033_Jasper_Jolt/image_003.jpg
99
+ trainer_images/034_Dr_Terra_Bones/image_001.jpg
100
+ trainer_images/034_Dr_Terra_Bones/image_002.jpg
101
+ trainer_images/034_Dr_Terra_Bones/image_003.jpg
102
+ trainer_images/035_Cipher_Ghost/image_001.jpg
103
+ trainer_images/035_Cipher_Ghost/image_002.jpg
104
+ trainer_images/035_Cipher_Ghost/image_003.jpg
105
+ trainer_images/036_Max_Panel/image_001.jpg
106
+ trainer_images/036_Max_Panel/image_002.jpg
107
+ trainer_images/036_Max_Panel/image_003.jpg
108
+ trainer_images/037_Lila_Verse/image_001.jpg
109
+ trainer_images/037_Lila_Verse/image_002.jpg
110
+ trainer_images/037_Lila_Verse/image_003.jpg
111
+ trainer_images/038_Cave_Scout/image_001.jpg
112
+ trainer_images/038_Cave_Scout/image_002.jpg
113
+ trainer_images/038_Cave_Scout/image_003.jpg
114
+ trainer_images/039_Roxy_Spin/image_001.jpg
115
+ trainer_images/039_Roxy_Spin/image_002.jpg
116
+ trainer_images/039_Roxy_Spin/image_003.jpg
117
+ trainer_images/040_Celina_Star/image_001.jpg
118
+ trainer_images/040_Celina_Star/image_002.jpg
119
+ trainer_images/040_Celina_Star/image_003.jpg
120
+ trainer_images/041_Finn_River/image_001.jpg
121
+ trainer_images/041_Finn_River/image_002.jpg
122
+ trainer_images/041_Finn_River/image_003.jpg
123
+ trainer_images/042_Penny_Spin/image_001.jpg
124
+ trainer_images/042_Penny_Spin/image_002.jpg
125
+ trainer_images/042_Penny_Spin/image_003.jpg
126
+ trainer_images/043_Raven_Shade/image_001.jpg
127
+ trainer_images/043_Raven_Shade/image_002.jpg
128
+ trainer_images/043_Raven_Shade/image_003.jpg
129
+ trainer_images/044_Sugar_Whisk/image_001.jpg
130
+ trainer_images/044_Sugar_Whisk/image_002.jpg
131
+ trainer_images/044_Sugar_Whisk/image_003.jpg
132
+ trainer_images/045_Horace_Tick/image_001.jpg
133
+ trainer_images/045_Horace_Tick/image_002.jpg
134
+ trainer_images/045_Horace_Tick/image_003.jpg
135
+ trainer_images/046_Alpine_Frost/image_001.jpg
136
+ trainer_images/046_Alpine_Frost/image_002.jpg
137
+ trainer_images/046_Alpine_Frost/image_003.jpg
138
+ trainer_images/047_Mysto_Shade/image_001.jpg
139
+ trainer_images/047_Mysto_Shade/image_002.jpg
140
+ trainer_images/047_Mysto_Shade/image_003.jpg
141
+ trainer_images/048_Fia_Glow/image_001.jpg
142
+ trainer_images/048_Fia_Glow/image_002.jpg
143
+ trainer_images/048_Fia_Glow/image_003.jpg
144
+ trainer_images/049_Zen_Lotus/image_001.jpg
145
+ trainer_images/049_Zen_Lotus/image_002.jpg
146
+ trainer_images/049_Zen_Lotus/image_003.jpg
147
+ trainer_images/050_Pixel_Ace/image_001.jpg
148
+ trainer_images/050_Pixel_Ace/image_002.jpg
149
+ trainer_images/050_Pixel_Ace/image_003.jpg
150
+ trainer_images/051_Robin_Swift/image_001.jpg
151
+ trainer_images/051_Robin_Swift/image_002.jpg
152
+ trainer_images/051_Robin_Swift/image_003.jpg
153
+ trainer_images/052_Drake_Fossil/image_001.jpg
154
+ trainer_images/052_Drake_Fossil/image_002.jpg
155
+ trainer_images/052_Drake_Fossil/image_003.jpg
156
+ trainer_images/053_Marina_Tide/image_001.jpg
157
+ trainer_images/053_Marina_Tide/image_002.jpg
158
+ trainer_images/053_Marina_Tide/image_003.jpg
159
+ trainer_images/054_Maris_Deep/image_001.jpg
160
+ trainer_images/054_Maris_Deep/image_002.jpg
161
+ trainer_images/054_Maris_Deep/image_003.jpg
162
+ trainer_images/055_Forge_Flint/image_001.jpg
163
+ trainer_images/055_Forge_Flint/image_003.jpg
164
+ trainer_images/056_Saffron_Dash/image_001.jpg
165
+ trainer_images/056_Saffron_Dash/image_002.jpg
166
+ trainer_images/056_Saffron_Dash/image_003.jpg
167
+ trainer_images/057_Rogue_Drift/image_001.jpg
168
+ trainer_images/057_Rogue_Drift/image_002.jpg
169
+ trainer_images/057_Rogue_Drift/image_003.jpg
170
+ trainer_images/058_Sylva_Moon/image_001.jpg
171
+ trainer_images/058_Sylva_Moon/image_002.jpg
172
+ trainer_images/058_Sylva_Moon/image_003.jpg
173
+ trainer_images/059_Jazzy_Beat/image_001.jpg
174
+ trainer_images/059_Jazzy_Beat/image_002.jpg
175
+ trainer_images/059_Jazzy_Beat/image_003.jpg
176
+ trainer_images/060_Honey_Buzz/image_001.jpg
177
+ trainer_images/060_Honey_Buzz/image_002.jpg
178
+ trainer_images/060_Honey_Buzz/image_003.jpg
179
+ trainer_images/061_Blaze_Ember/image_001.jpg
180
+ trainer_images/061_Blaze_Ember/image_002.jpg
181
+ trainer_images/061_Blaze_Ember/image_003.jpg
182
+ trainer_images/062_Flash_Reel/image_001.jpg
183
+ trainer_images/062_Flash_Reel/image_002.jpg
184
+ trainer_images/063_Bobo_Bop/image_001.jpg
185
+ trainer_images/063_Bobo_Bop/image_002.jpg
186
+ trainer_images/063_Bobo_Bop/image_003.jpg
187
+ trainer_images/064_Flora_Green/image_001.jpg
188
+ trainer_images/064_Flora_Green/image_002.jpg
189
+ trainer_images/064_Flora_Green/image_003.jpg
190
+ trainer_images/065_Ace_Raider/image_001.jpg
191
+ trainer_images/065_Ace_Raider/image_002.jpg
192
+ trainer_images/065_Ace_Raider/image_003.jpg
193
+ trainer_images/066_Trixie_Tots/image_001.jpg
194
+ trainer_images/066_Trixie_Tots/image_002.jpg
195
+ trainer_images/066_Trixie_Tots/image_003.jpg
196
+ trainer_images/067_Shadow_Fang/image_001.jpg
197
+ trainer_images/067_Shadow_Fang/image_002.jpg
198
+ trainer_images/067_Shadow_Fang/image_003.jpg
199
+ trainer_images/068_Ella_Blue/image_001.jpg
200
+ trainer_images/068_Ella_Blue/image_002.jpg
201
+ trainer_images/068_Ella_Blue/image_003.jpg
202
+ trainer_images/069_Rocky_Summit/image_001.jpg
203
+ trainer_images/069_Rocky_Summit/image_002.jpg
204
+ trainer_images/069_Rocky_Summit/image_003.jpg
205
+ trainer_images/070_Ivy_Labs/image_001.jpg
206
+ trainer_images/070_Ivy_Labs/image_002.jpg
207
+ trainer_images/070_Ivy_Labs/image_003.jpg
208
+ trainer_images/071_Vlad_Hunt/image_001.jpg
209
+ trainer_images/071_Vlad_Hunt/image_002.jpg
210
+ trainer_images/071_Vlad_Hunt/image_003.jpg
211
+ trainer_images/072_Flare_Twist/image_001.jpg
212
+ trainer_images/072_Flare_Twist/image_002.jpg
213
+ trainer_images/072_Flare_Twist/image_003.jpg
214
+ trainer_images/073_Booker_Reed/image_001.jpg
215
+ trainer_images/073_Booker_Reed/image_002.jpg
216
+ trainer_images/073_Booker_Reed/image_003.jpg
217
+ trainer_images/074_Dr_Aria_Stone/image_001.jpg
218
+ trainer_images/074_Dr_Aria_Stone/image_002.jpg
219
+ trainer_images/074_Dr_Aria_Stone/image_003.jpg
220
+ trainer_images/075_Dash_Vroom/image_001.jpg
221
+ trainer_images/075_Dash_Vroom/image_002.jpg
222
+ trainer_images/075_Dash_Vroom/image_003.jpg
223
+ trainer_images/076_Luna_Care/image_001.jpg
224
+ trainer_images/076_Luna_Care/image_002.jpg
225
+ trainer_images/076_Luna_Care/image_003.jpg
226
+ trainer_images/077_Captain_Coral/image_001.jpg
227
+ trainer_images/077_Captain_Coral/image_002.jpg
228
+ trainer_images/077_Captain_Coral/image_003.jpg
229
+ trainer_images/078_Crystal_Glide/image_001.jpg
230
+ trainer_images/078_Crystal_Glide/image_002.jpg
231
+ trainer_images/078_Crystal_Glide/image_003.jpg
232
+ trainer_images/079_Gideon_Torch/image_001.jpg
233
+ trainer_images/079_Gideon_Torch/image_002.jpg
234
+ trainer_images/079_Gideon_Torch/image_003.jpg
235
+ trainer_images/080_Tocka_Bell/image_001.jpg
236
+ trainer_images/080_Tocka_Bell/image_002.jpg
237
+ trainer_images/080_Tocka_Bell/image_003.jpg
238
+ trainer_images/081_Skyler_Drift/image_001.jpg
239
+ trainer_images/081_Skyler_Drift/image_002.jpg
240
+ trainer_images/081_Skyler_Drift/image_003.jpg
241
+ trainer_images/082_Stormy_Gale/image_001.jpg
242
+ trainer_images/082_Stormy_Gale/image_002.jpg
243
+ trainer_images/082_Stormy_Gale/image_003.jpg
244
+ trainer_images/083_Alina_Flask/image_001.jpg
245
+ trainer_images/083_Alina_Flask/image_002.jpg
246
+ trainer_images/083_Alina_Flask/image_003.jpg
247
+ trainer_images/084_Marcel_String/image_001.jpg
248
+ trainer_images/084_Marcel_String/image_002.jpg
249
+ trainer_images/084_Marcel_String/image_003.jpg
250
+ trainer_images/085_Coral_Vein/image_001.jpg
251
+ trainer_images/085_Coral_Vein/image_002.jpg
252
+ trainer_images/085_Coral_Vein/image_003.jpg
253
+ trainer_images/086_Mimi_Sugarplum/image_001.jpg
254
+ trainer_images/086_Mimi_Sugarplum/image_002.jpg
255
+ trainer_images/086_Mimi_Sugarplum/image_003.jpg
256
+ trainer_images/087_Theo_Bloom/image_001.jpg
257
+ trainer_images/087_Theo_Bloom/image_002.jpg
258
+ trainer_images/087_Theo_Bloom/image_003.jpg
259
+ trainer_images/088_Rune_Aria/image_001.jpg
260
+ trainer_images/088_Rune_Aria/image_002.jpg
261
+ trainer_images/088_Rune_Aria/image_003.jpg
262
+ trainer_images/089_Fizz_Jolly/image_001.jpg
263
+ trainer_images/089_Fizz_Jolly/image_002.jpg
264
+ trainer_images/089_Fizz_Jolly/image_003.jpg
265
+ trainer_images/090_Shadow_Lynx/image_001.jpg
266
+ trainer_images/090_Shadow_Lynx/image_002.jpg
267
+ trainer_images/090_Shadow_Lynx/image_003.jpg
268
+ trainer_images/091_Ash_Pyre/image_001.jpg
269
+ trainer_images/091_Ash_Pyre/image_002.jpg
270
+ trainer_images/091_Ash_Pyre/image_003.jpg
271
+ trainer_images/092_Aeris_Float/image_001.jpg
272
+ trainer_images/092_Aeris_Float/image_002.jpg
273
+ trainer_images/092_Aeris_Float/image_003.jpg
274
+ trainer_images/093_Dex_Wilder/image_001.jpg
275
+ trainer_images/093_Dex_Wilder/image_002.jpg
276
+ trainer_images/093_Dex_Wilder/image_003.jpg
277
+ trainer_images/094_Luna_Shade/image_001.jpg
278
+ trainer_images/094_Luna_Shade/image_002.jpg
279
+ trainer_images/094_Luna_Shade/image_003.jpg
280
+ trainer_images/095_Buck_Timber/image_001.jpg
281
+ trainer_images/095_Buck_Timber/image_002.jpg
282
+ trainer_images/095_Buck_Timber/image_003.jpg
283
+ trainer_images/096_Crystal_Frost/image_001.jpg
284
+ trainer_images/096_Crystal_Frost/image_002.jpg
285
+ trainer_images/096_Crystal_Frost/image_003.jpg
286
+ trainer_images/097_Sonia_Blue/image_001.jpg
287
+ trainer_images/097_Sonia_Blue/image_002.jpg
288
+ trainer_images/098_Grease_Torque/image_001.jpg
289
+ trainer_images/098_Grease_Torque/image_002.jpg
290
+ trainer_images/098_Grease_Torque/image_003.jpg
291
+ trainer_images/099_Zephyra_Mist/image_001.jpg
292
+ trainer_images/099_Zephyra_Mist/image_002.jpg
293
+ trainer_images/099_Zephyra_Mist/image_003.jpg
294
+ trainer_images/100_Kaito_Shiro/image_001.jpg
295
+ trainer_images/100_Kaito_Shiro/image_002.jpg
296
+ trainer_images/100_Kaito_Shiro/image_003.jpg
297
+ trainer_images/101_Beezy_Honey/image_001.jpg
298
+ trainer_images/101_Beezy_Honey/image_002.jpg
299
+ trainer_images/101_Beezy_Honey/image_003.jpg
300
+ trainer_images/102_Falcon_Gray/image_001.jpg
301
+ trainer_images/102_Falcon_Gray/image_002.jpg
302
+ trainer_images/102_Falcon_Gray/image_003.jpg
303
+ trainer_images/103_Rainn_Drizzle/image_001.jpg
304
+ trainer_images/103_Rainn_Drizzle/image_002.jpg
305
+ trainer_images/103_Rainn_Drizzle/image_003.jpg
306
+ trainer_images/104_Gemma_Spark/image_001.jpg
307
+ trainer_images/104_Gemma_Spark/image_002.jpg
308
+ trainer_images/104_Gemma_Spark/image_003.jpg
309
+ trainer_images/105_Knox_Hammer/image_001.jpg
310
+ trainer_images/105_Knox_Hammer/image_002.jpg
311
+ trainer_images/105_Knox_Hammer/image_003.jpg
312
+ trainer_images/106_Aya_Ink/image_001.jpg
313
+ trainer_images/106_Aya_Ink/image_002.jpg
314
+ trainer_images/106_Aya_Ink/image_003.jpg
315
+ trainer_images/107_Blaze_Boom/image_001.jpg
316
+ trainer_images/107_Blaze_Boom/image_002.jpg
317
+ trainer_images/107_Blaze_Boom/image_003.jpg
318
+ trainer_images/108_Nova_Lune/image_001.jpg
319
+ trainer_images/108_Nova_Lune/image_002.jpg
320
+ trainer_images/108_Nova_Lune/image_003.jpg
321
+ trainer_images/109_Frost_Pike/image_001.jpg
322
+ trainer_images/109_Frost_Pike/image_002.jpg
323
+ trainer_images/109_Frost_Pike/image_003.jpg
324
+ trainer_images/110_Vivi_Vox/image_001.jpg
325
+ trainer_images/110_Vivi_Vox/image_002.jpg
326
+ trainer_images/110_Vivi_Vox/image_003.jpg
327
+ trainer_images/111_Sahara_Dust/image_001.jpg
328
+ trainer_images/111_Sahara_Dust/image_002.jpg
329
+ trainer_images/111_Sahara_Dust/image_003.jpg
330
+ trainer_images/112_Piper_Fold/image_001.jpg
331
+ trainer_images/112_Piper_Fold/image_002.jpg
332
+ trainer_images/112_Piper_Fold/image_003.jpg
333
+ trainer_images/113_Shade_Flicker/image_001.jpg
334
+ trainer_images/113_Shade_Flicker/image_002.jpg
335
+ trainer_images/113_Shade_Flicker/image_003.jpg
336
+ trainer_images/114_Sizzle_Ember/image_001.jpg
337
+ trainer_images/114_Sizzle_Ember/image_002.jpg
338
+ trainer_images/114_Sizzle_Ember/image_003.jpg
339
+ trainer_images/115_Haven_Moss/image_001.jpg
340
+ trainer_images/115_Haven_Moss/image_002.jpg
341
+ trainer_images/115_Haven_Moss/image_003.jpg
342
+ trainer_images/116_Melody_Spin/image_001.jpg
343
+ trainer_images/116_Melody_Spin/image_002.jpg
344
+ trainer_images/116_Melody_Spin/image_003.jpg
345
+ trainer_images/117_Dive_Marlin/image_001.jpg
346
+ trainer_images/117_Dive_Marlin/image_002.jpg
347
+ trainer_images/117_Dive_Marlin/image_003.jpg
348
+ trainer_images/118_Flame_Glint/image_001.jpg
349
+ trainer_images/118_Flame_Glint/image_002.jpg
350
+ trainer_images/118_Flame_Glint/image_003.jpg
351
+ trainer_images/119_Jasper_Jinx/image_001.jpg
352
+ trainer_images/119_Jasper_Jinx/image_002.jpg
353
+ trainer_images/119_Jasper_Jinx/image_003.jpg
354
+ trainer_images/120_Pace_Swift/image_001.jpg
355
+ trainer_images/120_Pace_Swift/image_002.jpg
356
+ trainer_images/120_Pace_Swift/image_003.jpg
357
+ trainer_images/121_Faye_Whimsy/image_001.jpg
358
+ trainer_images/121_Faye_Whimsy/image_003.jpg
359
+ trainer_images/122_Captain_Tide/image_001.jpg
360
+ trainer_images/122_Captain_Tide/image_002.jpg
361
+ trainer_images/122_Captain_Tide/image_003.jpg
362
+ trainer_images/123_Petal_Grace/image_001.jpg
363
+ trainer_images/123_Petal_Grace/image_002.jpg
364
+ trainer_images/123_Petal_Grace/image_003.jpg
365
+ trainer_images/124_Echo_Hollow/image_001.jpg
366
+ trainer_images/124_Echo_Hollow/image_002.jpg
367
+ trainer_images/124_Echo_Hollow/image_003.jpg
368
+ trainer_images/125_Blaze_Frost/image_001.jpg
369
+ trainer_images/125_Blaze_Frost/image_002.jpg
370
+ trainer_images/125_Blaze_Frost/image_003.jpg
371
+ trainer_images/126_Carto_Knox/image_001.jpg
372
+ trainer_images/126_Carto_Knox/image_002.jpg
373
+ trainer_images/126_Carto_Knox/image_003.jpg
374
+ trainer_images/127_Samba_Rio/image_001.jpg
375
+ trainer_images/127_Samba_Rio/image_002.jpg
376
+ trainer_images/127_Samba_Rio/image_003.jpg
377
+ trainer_images/128_Bishop_Knight/image_001.jpg
378
+ trainer_images/128_Bishop_Knight/image_002.jpg
379
+ trainer_images/128_Bishop_Knight/image_003.jpg
380
+ trainer_images/129_Kai_Storm/image_001.jpg
381
+ trainer_images/129_Kai_Storm/image_002.jpg
382
+ trainer_images/129_Kai_Storm/image_003.jpg
383
+ trainer_images/130_Sunny_Cove/image_001.jpg
384
+ trainer_images/130_Sunny_Cove/image_002.jpg
385
+ trainer_images/130_Sunny_Cove/image_003.jpg
386
+ trainer_images/131_Kai_Bonsai/image_001.jpg
387
+ trainer_images/131_Kai_Bonsai/image_002.jpg
388
+ trainer_images/131_Kai_Bonsai/image_003.jpg
389
+ trainer_images/132_Tagger_Flux/image_001.jpg
390
+ trainer_images/132_Tagger_Flux/image_002.jpg
391
+ trainer_images/132_Tagger_Flux/image_003.jpg
392
+ trainer_images/133_Skye_Rider/image_001.jpg
393
+ trainer_images/133_Skye_Rider/image_002.jpg
394
+ trainer_images/133_Skye_Rider/image_003.jpg
395
+ trainer_images/134_Emory_Quill/image_001.jpg
396
+ trainer_images/134_Emory_Quill/image_002.jpg
397
+ trainer_images/134_Emory_Quill/image_003.jpg
398
+ trainer_images/135_Stormhook/image_001.jpg
399
+ trainer_images/135_Stormhook/image_002.jpg
400
+ trainer_images/135_Stormhook/image_003.jpg
401
+ trainer_images/136_Dolly_Cut/image_001.jpg
402
+ trainer_images/136_Dolly_Cut/image_002.jpg
403
+ trainer_images/136_Dolly_Cut/image_003.jpg
404
+ trainer_images/137_Fog_Walker/image_001.jpg
405
+ trainer_images/137_Fog_Walker/image_002.jpg
406
+ trainer_images/137_Fog_Walker/image_003.jpg
407
+ trainer_images/138_Lola_Salsa/image_001.jpg
408
+ trainer_images/138_Lola_Salsa/image_002.jpg
409
+ trainer_images/138_Lola_Salsa/image_003.jpg
410
+ trainer_images/139_Eldon_Page/image_001.jpg
411
+ trainer_images/139_Eldon_Page/image_002.jpg
412
+ trainer_images/140_Skate_Vex/image_001.jpg
413
+ trainer_images/140_Skate_Vex/image_002.jpg
414
+ trainer_images/140_Skate_Vex/image_003.jpg
415
+ trainer_images/141_Aria_Chord/image_001.jpg
416
+ trainer_images/141_Aria_Chord/image_002.jpg
417
+ trainer_images/142_Lava_Flint/image_001.jpg
418
+ trainer_images/142_Lava_Flint/image_002.jpg
419
+ trainer_images/142_Lava_Flint/image_003.jpg
420
+ trainer_images/143_Trixie_Flip/image_001.jpg
421
+ trainer_images/143_Trixie_Flip/image_002.jpg
422
+ trainer_images/143_Trixie_Flip/image_003.jpg
423
+ trainer_images/144_Quinn_Relic/image_001.jpg
424
+ trainer_images/144_Quinn_Relic/image_002.jpg
425
+ trainer_images/144_Quinn_Relic/image_003.jpg
426
+ trainer_images/145_Scoop_Sunny/image_001.jpg
427
+ trainer_images/145_Scoop_Sunny/image_002.jpg
428
+ trainer_images/145_Scoop_Sunny/image_003.jpg
429
+ trainer_images/146_Harlan_Forge/image_001.jpg
430
+ trainer_images/146_Harlan_Forge/image_003.jpg
431
+ trainer_images/147_Sandy_Drift/image_001.jpg
432
+ trainer_images/147_Sandy_Drift/image_002.jpg
433
+ trainer_images/147_Sandy_Drift/image_003.jpg
434
+ trainer_images/148_Rex_Trail/image_001.jpg
435
+ trainer_images/148_Rex_Trail/image_002.jpg
436
+ trainer_images/148_Rex_Trail/image_003.jpg
437
+ trainer_images/149_Carmen_Fuego/image_001.jpg
438
+ trainer_images/149_Carmen_Fuego/image_002.jpg
439
+ trainer_images/149_Carmen_Fuego/image_003.jpg
440
+ trainer_images/150_Hawk_Eye/image_001.jpg
441
+ trainer_images/150_Hawk_Eye/image_002.jpg
442
+ trainer_images/150_Hawk_Eye/image_003.jpg
443
+ trainer_images/151_Nina_Care/image_001.jpg
444
+ trainer_images/151_Nina_Care/image_002.jpg
445
+ trainer_images/151_Nina_Care/image_003.jpg
446
+ trainer_images/152_Ranger_Oak/image_001.jpg
447
+ trainer_images/152_Ranger_Oak/image_002.jpg
448
+ trainer_images/152_Ranger_Oak/image_003.jpg
449
+ trainer_images/153_Lola_Maria/image_001.jpg
450
+ trainer_images/153_Lola_Maria/image_002.jpg
451
+ trainer_images/153_Lola_Maria/image_003.jpg
452
+ trainer_images/154_Puzzle_Finn/image_001.jpg
453
+ trainer_images/154_Puzzle_Finn/image_002.jpg
454
+ trainer_images/154_Puzzle_Finn/image_003.jpg
455
+ trainer_images/155_Mei_Cha/image_001.jpg
456
+ trainer_images/155_Mei_Cha/image_002.jpg
457
+ trainer_images/155_Mei_Cha/image_003.jpg
458
+ trainer_images/156_Buck_Wilder/image_001.jpg
459
+ trainer_images/156_Buck_Wilder/image_002.jpg
460
+ trainer_images/156_Buck_Wilder/image_003.jpg
461
+ trainer_images/157_Clara_Prism/image_001.jpg
462
+ trainer_images/157_Clara_Prism/image_002.jpg
463
+ trainer_images/157_Clara_Prism/image_003.jpg
464
+ trainer_images/158_Dash_Rally/image_001.jpg
465
+ trainer_images/158_Dash_Rally/image_002.jpg
466
+ trainer_images/158_Dash_Rally/image_003.jpg
467
+ trainer_images/159_Nova_Maris/image_001.jpg
468
+ trainer_images/159_Nova_Maris/image_002.jpg
469
+ trainer_images/159_Nova_Maris/image_003.jpg
470
+ trainer_images/160_Poppy_Spark/image_001.jpg
471
+ trainer_images/160_Poppy_Spark/image_002.jpg
472
+ trainer_images/160_Poppy_Spark/image_003.jpg
473
+ trainer_images/161_Tic_Tock/image_001.jpg
474
+ trainer_images/161_Tic_Tock/image_002.jpg
475
+ trainer_images/161_Tic_Tock/image_003.jpg
476
+ trainer_images/162_Mira_Strings/image_001.jpg
477
+ trainer_images/162_Mira_Strings/image_002.jpg
478
+ trainer_images/162_Mira_Strings/image_003.jpg
479
+ trainer_images/163_Jax_Color/image_001.jpg
480
+ trainer_images/163_Jax_Color/image_002.jpg
481
+ trainer_images/163_Jax_Color/image_003.jpg
482
+ trainer_images/164_Sylvia_Pine/image_001.jpg
483
+ trainer_images/164_Sylvia_Pine/image_002.jpg
484
+ trainer_images/164_Sylvia_Pine/image_003.jpg
485
+ trainer_images/165_Shade_Lyric/image_001.jpg
486
+ trainer_images/165_Shade_Lyric/image_002.jpg
487
+ trainer_images/165_Shade_Lyric/image_003.jpg
488
+ trainer_images/166_Coco_Sweet/image_001.jpg
489
+ trainer_images/166_Coco_Sweet/image_002.jpg
490
+ trainer_images/166_Coco_Sweet/image_003.jpg
491
+ trainer_images/167_Glacier_Edge/image_001.jpg
492
+ trainer_images/167_Glacier_Edge/image_002.jpg
493
+ trainer_images/167_Glacier_Edge/image_003.jpg
494
+ trainer_images/168_Mira_Wall/image_001.jpg
495
+ trainer_images/168_Mira_Wall/image_002.jpg
496
+ trainer_images/168_Mira_Wall/image_003.jpg
497
+ trainer_images/169_Buck_Trigger/image_001.jpg
498
+ trainer_images/169_Buck_Trigger/image_002.jpg
499
+ trainer_images/169_Buck_Trigger/image_003.jpg
500
+ trainer_images/170_Lila_Porcelaine/image_001.jpg
501
+ trainer_images/170_Lila_Porcelaine/image_002.jpg
502
+ trainer_images/170_Lila_Porcelaine/image_003.jpg
503
+ trainer_images/171_Rex_Scrum/image_001.jpg
504
+ trainer_images/171_Rex_Scrum/image_002.jpg
505
+ trainer_images/171_Rex_Scrum/image_003.jpg
506
+ trainer_images/172_Nimbus_Gale/image_001.jpg
507
+ trainer_images/172_Nimbus_Gale/image_002.jpg
508
+ trainer_images/172_Nimbus_Gale/image_003.jpg
509
+ trainer_images/173_Tag_Ink/image_001.jpg
510
+ trainer_images/173_Tag_Ink/image_002.jpg
511
+ trainer_images/173_Tag_Ink/image_003.jpg
512
+ trainer_images/174_Sunny_Ray/image_001.jpg
513
+ trainer_images/174_Sunny_Ray/image_002.jpg
514
+ trainer_images/174_Sunny_Ray/image_003.jpg
515
+ trainer_images/175_Luna_Glide/image_001.jpg
516
+ trainer_images/175_Luna_Glide/image_002.jpg
517
+ trainer_images/175_Luna_Glide/image_003.jpg
518
+ trainer_images/176_Dash_Flip/image_001.jpg
519
+ trainer_images/176_Dash_Flip/image_002.jpg
520
+ trainer_images/176_Dash_Flip/image_003.jpg
521
+ trainer_images/177_Coinessa_Mint/image_001.jpg
522
+ trainer_images/177_Coinessa_Mint/image_002.jpg
523
+ trainer_images/177_Coinessa_Mint/image_003.jpg
524
+ trainer_images/178_Felix_Stitch/image_001.jpg
525
+ trainer_images/178_Felix_Stitch/image_002.jpg
526
+ trainer_images/178_Felix_Stitch/image_003.jpg
527
+ trainer_images/179_Misty_Specter/image_001.jpg
528
+ trainer_images/179_Misty_Specter/image_002.jpg
529
+ trainer_images/179_Misty_Specter/image_003.jpg
530
+ trainer_images/180_Beat_Smash/image_001.jpg
531
+ trainer_images/180_Beat_Smash/image_002.jpg
532
+ trainer_images/180_Beat_Smash/image_003.jpg
533
+ trainer_images/181_Tess_Cogburn/image_001.jpg
534
+ trainer_images/181_Tess_Cogburn/image_002.jpg
535
+ trainer_images/181_Tess_Cogburn/image_003.jpg
536
+ trainer_images/182_Dusty_Hue/image_001.jpg
537
+ trainer_images/182_Dusty_Hue/image_002.jpg
538
+ trainer_images/182_Dusty_Hue/image_003.jpg
539
+ trainer_images/183_Gore_Reel/image_001.jpg
540
+ trainer_images/183_Gore_Reel/image_002.jpg
541
+ trainer_images/184_Mina_Match/image_001.jpg
542
+ trainer_images/184_Mina_Match/image_002.jpg
543
+ trainer_images/184_Mina_Match/image_003.jpg
544
+ trainer_images/185_Jet_Vektor/image_001.jpg
545
+ trainer_images/185_Jet_Vektor/image_002.jpg
546
+ trainer_images/185_Jet_Vektor/image_003.jpg
547
+ trainer_images/186_Sir_Regald/image_001.jpg
548
+ trainer_images/186_Sir_Regald/image_002.jpg
549
+ trainer_images/186_Sir_Regald/image_003.jpg
550
+ trainer_images/187_Agent_VV/image_001.jpg
551
+ trainer_images/187_Agent_VV/image_002.jpg
552
+ trainer_images/187_Agent_VV/image_003.jpg
553
+ trainer_images/188_Cirra_Loft/image_001.jpg
554
+ trainer_images/188_Cirra_Loft/image_002.jpg
555
+ trainer_images/188_Cirra_Loft/image_003.jpg
556
+ trainer_images/189_Captain_Mire/image_001.jpg
557
+ trainer_images/189_Captain_Mire/image_002.jpg
558
+ trainer_images/189_Captain_Mire/image_003.jpg
559
+ trainer_images/190_Inky_Frame/image_001.jpg
560
+ trainer_images/190_Inky_Frame/image_002.jpg
561
+ trainer_images/190_Inky_Frame/image_003.jpg
562
+ trainer_images/191_Nocturne_Bell/image_001.jpg
563
+ trainer_images/191_Nocturne_Bell/image_002.jpg
564
+ trainer_images/191_Nocturne_Bell/image_003.jpg
565
+ trainer_images/192_Elden_Mark/image_001.jpg
566
+ trainer_images/192_Elden_Mark/image_002.jpg
567
+ trainer_images/192_Elden_Mark/image_003.jpg
568
+ trainer_images/193_Grizz_Slam/image_001.jpg
569
+ trainer_images/193_Grizz_Slam/image_002.jpg
570
+ trainer_images/193_Grizz_Slam/image_003.jpg
571
+ trainer_images/194_Luna_Drift/image_001.jpg
572
+ trainer_images/194_Luna_Drift/image_002.jpg
573
+ trainer_images/194_Luna_Drift/image_003.jpg
574
+ trainer_images/195_Hattie_Crown/image_001.jpg
575
+ trainer_images/195_Hattie_Crown/image_002.jpg
576
+ trainer_images/195_Hattie_Crown/image_003.jpg
577
+ trainer_images/196_Oak_Wrench/image_001.jpg
578
+ trainer_images/196_Oak_Wrench/image_002.jpg
579
+ trainer_images/196_Oak_Wrench/image_003.jpg
580
+ trainer_images/197_Rosa_Shear/image_001.jpg
581
+ trainer_images/197_Rosa_Shear/image_002.jpg
582
+ trainer_images/197_Rosa_Shear/image_003.jpg
583
+ trainer_images/198_Gnorman_Twig/image_001.jpg
584
+ trainer_images/198_Gnorman_Twig/image_002.jpg
585
+ trainer_images/198_Gnorman_Twig/image_003.jpg
586
+ trainer_images/199_Prof_Volt/image_001.jpg
587
+ trainer_images/199_Prof_Volt/image_002.jpg
588
+ trainer_images/199_Prof_Volt/image_003.jpg
589
+ trainer_images/200_Mocha_Chill/image_001.jpg
590
+ trainer_images/200_Mocha_Chill/image_002.jpg
591
+ trainer_images/200_Mocha_Chill/image_003.jpg
592
+ trainer_images/201_Buzz_Nett/image_001.jpg
593
+ trainer_images/201_Buzz_Nett/image_002.jpg
594
+ trainer_images/202_Glitz_Nova/image_001.jpg
595
+ trainer_images/202_Glitz_Nova/image_002.jpg
596
+ trainer_images/202_Glitz_Nova/image_003.jpg
597
+ trainer_images/203_Owla_Frost/image_001.jpg
598
+ trainer_images/203_Owla_Frost/image_002.jpg
599
+ trainer_images/203_Owla_Frost/image_003.jpg
600
+ trainer_images/204_Theo_Blink/image_001.jpg
601
+ trainer_images/204_Theo_Blink/image_002.jpg
602
+ trainer_images/204_Theo_Blink/image_003.jpg
603
+ trainer_images/205_Sora_Maki/image_001.jpg
604
+ trainer_images/205_Sora_Maki/image_002.jpg
605
+ trainer_images/205_Sora_Maki/image_003.jpg
606
+ trainer_images/206_Pixel_Rush/image_001.jpg
607
+ trainer_images/206_Pixel_Rush/image_002.jpg
608
+ trainer_images/206_Pixel_Rush/image_003.jpg
609
+ trainer_images/207_Ardan_Claw/image_001.jpg
610
+ trainer_images/207_Ardan_Claw/image_002.jpg
611
+ trainer_images/207_Ardan_Claw/image_003.jpg
612
+ trainer_images/208_Poppy_Pop/image_001.jpg
613
+ trainer_images/208_Poppy_Pop/image_002.jpg
614
+ trainer_images/208_Poppy_Pop/image_003.jpg
615
+ trainer_images/209_Orin_Void/image_001.jpg
616
+ trainer_images/209_Orin_Void/image_002.jpg
617
+ trainer_images/209_Orin_Void/image_003.jpg
618
+ trainer_images/210_Divina_Aria/image_001.jpg
619
+ trainer_images/210_Divina_Aria/image_002.jpg
620
+ trainer_images/210_Divina_Aria/image_003.jpg
621
+ trainer_images/211_Scrap_Jack/image_001.jpg
622
+ trainer_images/211_Scrap_Jack/image_002.jpg
623
+ trainer_images/211_Scrap_Jack/image_003.jpg
624
+ trainer_images/212_Ember_Twirl/image_001.jpg
625
+ trainer_images/212_Ember_Twirl/image_002.jpg
626
+ trainer_images/212_Ember_Twirl/image_003.jpg
627
+ trainer_images/213_Arlo_Form/image_001.jpg
628
+ trainer_images/213_Arlo_Form/image_002.jpg
629
+ trainer_images/213_Arlo_Form/image_003.jpg
630
+ trainer_images/214_Marceau_Blank/image_001.jpg
631
+ trainer_images/214_Marceau_Blank/image_002.jpg
632
+ trainer_images/214_Marceau_Blank/image_003.jpg
633
+ trainer_images/215_Briney_Tune/image_001.jpg
634
+ trainer_images/215_Briney_Tune/image_002.jpg
635
+ trainer_images/215_Briney_Tune/image_003.jpg
636
+ trainer_images/216_Cyra_Key/image_001.jpg
637
+ trainer_images/216_Cyra_Key/image_002.jpg
638
+ trainer_images/216_Cyra_Key/image_003.jpg
639
+ trainer_images/217_Lucien_Veil/image_001.jpg
640
+ trainer_images/217_Lucien_Veil/image_002.jpg
641
+ trainer_images/217_Lucien_Veil/image_003.jpg
642
+ trainer_images/218_Vika_Frostline/image_001.jpg
643
+ trainer_images/218_Vika_Frostline/image_002.jpg
644
+ trainer_images/218_Vika_Frostline/image_003.jpg
645
+ trainer_images/219_Mauve_Hex/image_001.jpg
646
+ trainer_images/219_Mauve_Hex/image_002.jpg
647
+ trainer_images/219_Mauve_Hex/image_003.jpg
648
+ trainer_images/220_Nina_Meow/image_001.jpg
649
+ trainer_images/220_Nina_Meow/image_002.jpg
650
+ trainer_images/220_Nina_Meow/image_003.jpg
651
+ trainer_images/221_Chuck_Shout/image_001.jpg
652
+ trainer_images/221_Chuck_Shout/image_002.jpg
653
+ trainer_images/221_Chuck_Shout/image_003.jpg
654
+ trainer_images/222_Fern_Bay/image_001.jpg
655
+ trainer_images/222_Fern_Bay/image_002.jpg
656
+ trainer_images/222_Fern_Bay/image_003.jpg
657
+ trainer_images/223_Claude_Snip/image_001.jpg
658
+ trainer_images/223_Claude_Snip/image_002.jpg
659
+ trainer_images/223_Claude_Snip/image_003.jpg
660
+ trainer_images/224_Garrick_Croft/image_001.jpg
661
+ trainer_images/224_Garrick_Croft/image_002.jpg
662
+ trainer_images/224_Garrick_Croft/image_003.jpg
663
+ trainer_images/225_Rosa_Ring/image_001.jpg
664
+ trainer_images/225_Rosa_Ring/image_002.jpg
665
+ trainer_images/225_Rosa_Ring/image_003.jpg
666
+ trainer_images/226_Drew_Gloom/image_001.jpg
667
+ trainer_images/226_Drew_Gloom/image_002.jpg
668
+ trainer_images/226_Drew_Gloom/image_003.jpg
669
+ trainer_images/227_Ivy_Clash/image_001.jpg
670
+ trainer_images/227_Ivy_Clash/image_002.jpg
671
+ trainer_images/227_Ivy_Clash/image_003.jpg
672
+ trainer_images/228_Commander_Sky/image_001.jpg
673
+ trainer_images/228_Commander_Sky/image_002.jpg
674
+ trainer_images/228_Commander_Sky/image_003.jpg
675
+ trainer_images/229_Glyph_Spray/image_001.jpg
676
+ trainer_images/229_Glyph_Spray/image_002.jpg
677
+ trainer_images/229_Glyph_Spray/image_003.jpg
678
+ trainer_images/230_Ashen_Path/image_001.jpg
679
+ trainer_images/230_Ashen_Path/image_002.jpg
680
+ trainer_images/230_Ashen_Path/image_003.jpg
681
+ trainer_images/231_Lenny_Bid/image_001.jpg
682
+ trainer_images/231_Lenny_Bid/image_002.jpg
683
+ trainer_images/231_Lenny_Bid/image_003.jpg
684
+ trainer_images/232_Bea_Nector/image_001.jpg
685
+ trainer_images/232_Bea_Nector/image_002.jpg
686
+ trainer_images/232_Bea_Nector/image_003.jpg
687
+ trainer_images/233_Theo_Hollow/image_001.jpg
688
+ trainer_images/233_Theo_Hollow/image_002.jpg
689
+ trainer_images/233_Theo_Hollow/image_003.jpg
690
+ trainer_images/234_Velvet_Seam/image_001.jpg
691
+ trainer_images/234_Velvet_Seam/image_002.jpg
692
+ trainer_images/234_Velvet_Seam/image_003.jpg
693
+ trainer_images/235_Orin_Pivot/image_001.jpg
694
+ trainer_images/235_Orin_Pivot/image_002.jpg
695
+ trainer_images/235_Orin_Pivot/image_003.jpg
696
+ trainer_images/236_Freeze_Buoy/image_001.jpg
697
+ trainer_images/236_Freeze_Buoy/image_002.jpg
698
+ trainer_images/236_Freeze_Buoy/image_003.jpg
699
+ trainer_images/237_Ada_Splice/image_001.jpg
700
+ trainer_images/237_Ada_Splice/image_002.jpg
701
+ trainer_images/237_Ada_Splice/image_003.jpg
702
+ trainer_images/238_Sawyer_Grind/image_001.jpg
703
+ trainer_images/238_Sawyer_Grind/image_002.jpg
704
+ trainer_images/239_Vira_Nocturne/image_001.jpg
705
+ trainer_images/239_Vira_Nocturne/image_002.jpg
706
+ trainer_images/239_Vira_Nocturne/image_003.jpg
707
+ trainer_images/240_Rush_Hue/image_001.jpg
708
+ trainer_images/240_Rush_Hue/image_002.jpg
709
+ trainer_images/240_Rush_Hue/image_003.jpg
710
+ trainer_images/241_Echo_Prism/image_001.jpg
711
+ trainer_images/241_Echo_Prism/image_002.jpg
712
+ trainer_images/241_Echo_Prism/image_003.jpg
713
+ trainer_images/242_Remi_Rummage/image_001.jpg
714
+ trainer_images/242_Remi_Rummage/image_002.jpg
715
+ trainer_images/242_Remi_Rummage/image_003.jpg
716
+ trainer_images/243_Galen_Dawn/image_001.jpg
717
+ trainer_images/243_Galen_Dawn/image_002.jpg
718
+ trainer_images/243_Galen_Dawn/image_003.jpg
719
+ trainer_images/244_Clara_Clip/image_001.jpg
720
+ trainer_images/244_Clara_Clip/image_002.jpg
721
+ trainer_images/244_Clara_Clip/image_003.jpg
722
+ trainer_images/245_Reef_Leap/image_001.jpg
723
+ trainer_images/245_Reef_Leap/image_002.jpg
724
+ trainer_images/245_Reef_Leap/image_003.jpg
725
+ trainer_images/246_Dr_Venn/image_001.jpg
726
+ trainer_images/246_Dr_Venn/image_002.jpg
727
+ trainer_images/246_Dr_Venn/image_003.jpg
728
+ trainer_images/247_Cecil_Drape/image_001.jpg
729
+ trainer_images/247_Cecil_Drape/image_002.jpg
730
+ trainer_images/247_Cecil_Drape/image_003.jpg
731
+ trainer_images/248_Nami_Hush/image_001.jpg
732
+ trainer_images/248_Nami_Hush/image_002.jpg
733
+ trainer_images/248_Nami_Hush/image_003.jpg
734
+ trainer_images/249_Dr_Cone/image_001.jpg
735
+ trainer_images/249_Dr_Cone/image_002.jpg
736
+ trainer_images/249_Dr_Cone/image_003.jpg
737
+ trainer_images/250_Cass_Byte/image_001.jpg
738
+ trainer_images/250_Cass_Byte/image_002.jpg
739
+ trainer_images/250_Cass_Byte/image_003.jpg
740
+ trainer_images/251_Rune_Ochre/image_001.jpg
741
+ trainer_images/251_Rune_Ochre/image_002.jpg
742
+ trainer_images/251_Rune_Ochre/image_003.jpg
743
+ trainer_images/252_Echo_Beak/image_001.jpg
744
+ trainer_images/252_Echo_Beak/image_002.jpg
745
+ trainer_images/252_Echo_Beak/image_003.jpg
746
+ trainer_images/253_Dozer_Rail/image_001.jpg
747
+ trainer_images/253_Dozer_Rail/image_002.jpg
748
+ trainer_images/253_Dozer_Rail/image_003.jpg
749
+ trainer_images/254_Memezy_Flux/image_001.jpg
750
+ trainer_images/254_Memezy_Flux/image_002.jpg
751
+ trainer_images/254_Memezy_Flux/image_003.jpg
752
+ trainer_images/255_Essie_Fleur/image_001.jpg
753
+ trainer_images/255_Essie_Fleur/image_002.jpg
754
+ trainer_images/255_Essie_Fleur/image_003.jpg
755
+ trainer_images/256_Torch_Iron/image_001.jpg
756
+ trainer_images/256_Torch_Iron/image_002.jpg
757
+ trainer_images/256_Torch_Iron/image_003.jpg
758
+ trainer_images/257_Lyra_Dawn/image_001.jpg
759
+ trainer_images/257_Lyra_Dawn/image_002.jpg
760
+ trainer_images/257_Lyra_Dawn/image_003.jpg
761
+ trainer_images/258_Link_Shift/image_001.jpg
762
+ trainer_images/258_Link_Shift/image_002.jpg
763
+ trainer_images/258_Link_Shift/image_003.jpg
764
+ trainer_images/259_Glint_Mora/image_001.jpg
765
+ trainer_images/259_Glint_Mora/image_002.jpg
766
+ trainer_images/259_Glint_Mora/image_003.jpg
767
+ trainer_images/260_Shoe_Gruff/image_001.jpg
768
+ trainer_images/260_Shoe_Gruff/image_002.jpg
769
+ trainer_images/260_Shoe_Gruff/image_003.jpg
770
+ trainer_images/261_Vera_Gale/image_001.jpg
771
+ trainer_images/261_Vera_Gale/image_002.jpg
772
+ trainer_images/261_Vera_Gale/image_003.jpg
773
+ trainer_images/262_Flippy_Jane/image_001.jpg
774
+ trainer_images/262_Flippy_Jane/image_002.jpg
775
+ trainer_images/262_Flippy_Jane/image_003.jpg
776
+ trainer_images/263_Riggs_Alpine/image_001.jpg
777
+ trainer_images/263_Riggs_Alpine/image_002.jpg
778
+ trainer_images/263_Riggs_Alpine/image_003.jpg
779
+ trainer_images/264_Abbess_Ink/image_001.jpg
780
+ trainer_images/264_Abbess_Ink/image_002.jpg
781
+ trainer_images/264_Abbess_Ink/image_003.jpg
782
+ trainer_images/265_Zip_Crag/image_001.jpg
783
+ trainer_images/265_Zip_Crag/image_002.jpg
784
+ trainer_images/265_Zip_Crag/image_003.jpg
785
+ trainer_images/266_Luna_Drift/image_001.jpg
786
+ trainer_images/266_Luna_Drift/image_002.jpg
787
+ trainer_images/266_Luna_Drift/image_003.jpg
788
+ trainer_images/267_Skip_Vandal/image_001.jpg
789
+ trainer_images/267_Skip_Vandal/image_002.jpg
790
+ trainer_images/267_Skip_Vandal/image_003.jpg
791
+ trainer_images/268_Koji_Root/image_001.jpg
792
+ trainer_images/268_Koji_Root/image_002.jpg
793
+ trainer_images/268_Koji_Root/image_003.jpg
794
+ trainer_images/269_Diva_Echo/image_001.jpg
795
+ trainer_images/269_Diva_Echo/image_002.jpg
796
+ trainer_images/269_Diva_Echo/image_003.jpg
797
+ trainer_images/270_Grant_Norm/image_001.jpg
798
+ trainer_images/270_Grant_Norm/image_002.jpg
799
+ trainer_images/270_Grant_Norm/image_003.jpg
800
+ trainer_images/271_Orbit_Ray/image_001.jpg
801
+ trainer_images/271_Orbit_Ray/image_002.jpg
802
+ trainer_images/271_Orbit_Ray/image_003.jpg
803
+ trainer_images/272_Clipper_Buzz/image_001.jpg
804
+ trainer_images/272_Clipper_Buzz/image_002.jpg
805
+ trainer_images/272_Clipper_Buzz/image_003.jpg
806
+ trainer_images/273_Mara_Sludge/image_001.jpg
807
+ trainer_images/273_Mara_Sludge/image_002.jpg
808
+ trainer_images/273_Mara_Sludge/image_003.jpg
809
+ trainer_images/274_Juno_Keeper/image_001.jpg
810
+ trainer_images/274_Juno_Keeper/image_003.jpg
811
+ trainer_images/275_Glace_Carve/image_001.jpg
812
+ trainer_images/275_Glace_Carve/image_002.jpg
813
+ trainer_images/275_Glace_Carve/image_003.jpg
814
+ trainer_images/276_Paige_Roast/image_001.jpg
815
+ trainer_images/276_Paige_Roast/image_002.jpg
816
+ trainer_images/276_Paige_Roast/image_003.jpg
817
+ trainer_images/277_Hitch_Straw/image_001.jpg
818
+ trainer_images/277_Hitch_Straw/image_002.jpg
819
+ trainer_images/277_Hitch_Straw/image_003.jpg
820
+ trainer_images/278_Shyla_Reflekt/image_001.jpg
821
+ trainer_images/278_Shyla_Reflekt/image_003.jpg
822
+ trainer_images/279_Dolly_Varn/image_001.jpg
823
+ trainer_images/279_Dolly_Varn/image_002.jpg
824
+ trainer_images/279_Dolly_Varn/image_003.jpg
825
+ trainer_images/280_Gareth_Plume/image_001.jpg
826
+ trainer_images/280_Gareth_Plume/image_002.jpg
827
+ trainer_images/280_Gareth_Plume/image_003.jpg
828
+ trainer_images/281_Pixi_Bot/image_001.jpg
829
+ trainer_images/281_Pixi_Bot/image_002.jpg
830
+ trainer_images/281_Pixi_Bot/image_003.jpg
831
+ trainer_images/282_Zan_Dye/image_001.jpg
832
+ trainer_images/282_Zan_Dye/image_002.jpg
833
+ trainer_images/282_Zan_Dye/image_003.jpg
834
+ trainer_images/283_Prof_Why/image_001.jpg
835
+ trainer_images/283_Prof_Why/image_002.jpg
836
+ trainer_images/283_Prof_Why/image_003.jpg
837
+ trainer_images/284_Roxy_Trash/image_001.jpg
838
+ trainer_images/284_Roxy_Trash/image_002.jpg
839
+ trainer_images/284_Roxy_Trash/image_003.jpg
840
+ trainer_images/285_Nerra_Tide/image_001.jpg
841
+ trainer_images/285_Nerra_Tide/image_002.jpg
842
+ trainer_images/285_Nerra_Tide/image_003.jpg
843
+ trainer_images/286_Toll_Quiet/image_001.jpg
844
+ trainer_images/286_Toll_Quiet/image_002.jpg
845
+ trainer_images/286_Toll_Quiet/image_003.jpg
846
+ trainer_images/287_Skylar_Reach/image_001.jpg
847
+ trainer_images/287_Skylar_Reach/image_002.jpg
848
+ trainer_images/287_Skylar_Reach/image_003.jpg
849
+ trainer_images/288_Lag_Byte/image_001.jpg
850
+ trainer_images/288_Lag_Byte/image_002.jpg
851
+ trainer_images/288_Lag_Byte/image_003.jpg
852
+ trainer_images/289_Mira_Vein/image_001.jpg
853
+ trainer_images/289_Mira_Vein/image_002.jpg
854
+ trainer_images/289_Mira_Vein/image_003.jpg
855
+ trainer_images/290_Ciri_Drift/image_001.jpg
856
+ trainer_images/290_Ciri_Drift/image_002.jpg
857
+ trainer_images/290_Ciri_Drift/image_003.jpg
858
+ trainer_images/291_Glen_Sprig/image_001.jpg
859
+ trainer_images/291_Glen_Sprig/image_002.jpg
860
+ trainer_images/291_Glen_Sprig/image_003.jpg
861
+ trainer_images/292_Grim_Hollow/image_001.jpg
862
+ trainer_images/292_Grim_Hollow/image_002.jpg
863
+ trainer_images/292_Grim_Hollow/image_003.jpg
864
+ trainer_images/293_Bree_Sway/image_001.jpg
865
+ trainer_images/293_Bree_Sway/image_002.jpg
866
+ trainer_images/293_Bree_Sway/image_003.jpg
867
+ trainer_images/294_Ash_Ridge/image_001.jpg
868
+ trainer_images/294_Ash_Ridge/image_002.jpg
869
+ trainer_images/294_Ash_Ridge/image_003.jpg
870
+ trainer_images/295_Tilda_Sprock/image_001.jpg
871
+ trainer_images/295_Tilda_Sprock/image_002.jpg
872
+ trainer_images/295_Tilda_Sprock/image_003.jpg
873
+ trainer_images/296_Velo_Swift/image_001.jpg
874
+ trainer_images/296_Velo_Swift/image_002.jpg
875
+ trainer_images/296_Velo_Swift/image_003.jpg
876
+ trainer_images/297_Burt_Morn/image_001.jpg
877
+ trainer_images/297_Burt_Morn/image_002.jpg
878
+ trainer_images/297_Burt_Morn/image_003.jpg
879
+ trainer_images/298_Dottie_Spin/image_001.jpg
880
+ trainer_images/298_Dottie_Spin/image_002.jpg
881
+ trainer_images/299_Manny_Play/image_001.jpg
882
+ trainer_images/299_Manny_Play/image_002.jpg
883
+ trainer_images/299_Manny_Play/image_003.jpg
884
+ trainer_images/300_Mira_Hull/image_001.jpg
885
+ trainer_images/300_Mira_Hull/image_002.jpg
886
+ trainer_images/300_Mira_Hull/image_003.jpg
887
+ trainer_images/301_Echo_Tram/image_001.jpg
888
+ trainer_images/301_Echo_Tram/image_002.jpg
889
+ trainer_images/301_Echo_Tram/image_003.jpg
890
+ trainer_images/302_Nora_Haze/image_001.jpg
891
+ trainer_images/302_Nora_Haze/image_002.jpg
892
+ trainer_images/302_Nora_Haze/image_003.jpg
893
+ trainer_images/303_Loop_Upcycle/image_001.jpg
894
+ trainer_images/303_Loop_Upcycle/image_002.jpg
895
+ trainer_images/303_Loop_Upcycle/image_003.jpg
896
+ trainer_images/304_Marin_Feather/image_001.jpg
897
+ trainer_images/304_Marin_Feather/image_002.jpg
898
+ trainer_images/304_Marin_Feather/image_003.jpg
899
+ trainer_images/305_Chord_Stalac/image_001.jpg
900
+ trainer_images/305_Chord_Stalac/image_002.jpg
901
+ trainer_images/305_Chord_Stalac/image_003.jpg
902
+ trainer_images/306_Tessa_Gale/image_001.jpg
903
+ trainer_images/306_Tessa_Gale/image_002.jpg
904
+ trainer_images/307_Dustin_Layer/image_001.jpg
905
+ trainer_images/307_Dustin_Layer/image_002.jpg
906
+ trainer_images/307_Dustin_Layer/image_003.jpg
907
+ trainer_images/308_Beat_Jax/image_001.jpg
908
+ trainer_images/308_Beat_Jax/image_002.jpg
909
+ trainer_images/308_Beat_Jax/image_003.jpg
910
+ trainer_images/309_Clara_Field/image_001.jpg
911
+ trainer_images/309_Clara_Field/image_002.jpg
912
+ trainer_images/309_Clara_Field/image_003.jpg
913
+ trainer_images/310_Vinny_Glass/image_001.jpg
914
+ trainer_images/310_Vinny_Glass/image_002.jpg
915
+ trainer_images/310_Vinny_Glass/image_003.jpg
916
+ trainer_images/311_Chad_Chill/image_001.jpg
917
+ trainer_images/311_Chad_Chill/image_002.jpg
918
+ trainer_images/311_Chad_Chill/image_003.jpg
919
+ trainer_images/312_Pip_Tilt/image_001.jpg
920
+ trainer_images/312_Pip_Tilt/image_002.jpg
921
+ trainer_images/312_Pip_Tilt/image_003.jpg
922
+ trainer_images/313_Shelley_Surf/image_001.jpg
923
+ trainer_images/313_Shelley_Surf/image_002.jpg
924
+ trainer_images/313_Shelley_Surf/image_003.jpg
925
+ trainer_images/314_Ash_Tarp/image_001.jpg
926
+ trainer_images/314_Ash_Tarp/image_002.jpg
927
+ trainer_images/314_Ash_Tarp/image_003.jpg
928
+ trainer_images/315_Silva_Abra/image_001.jpg
929
+ trainer_images/315_Silva_Abra/image_002.jpg
930
+ trainer_images/315_Silva_Abra/image_003.jpg
931
+ trainer_images/316_Mabel_Crumb/image_001.jpg
932
+ trainer_images/316_Mabel_Crumb/image_002.jpg
933
+ trainer_images/316_Mabel_Crumb/image_003.jpg
934
+ trainer_images/317_Apollo_Crank/image_001.jpg
935
+ trainer_images/317_Apollo_Crank/image_002.jpg
936
+ trainer_images/317_Apollo_Crank/image_003.jpg
937
+ trainer_images/318_Buzz_Fuse/image_001.jpg
938
+ trainer_images/318_Buzz_Fuse/image_002.jpg
939
+ trainer_images/318_Buzz_Fuse/image_003.jpg
940
+ trainer_images/319_Kendra_Clue/image_001.jpg
941
+ trainer_images/319_Kendra_Clue/image_002.jpg
942
+ trainer_images/319_Kendra_Clue/image_003.jpg
943
+ trainer_images/320_Bram_Fleece/image_001.jpg
944
+ trainer_images/320_Bram_Fleece/image_002.jpg
945
+ trainer_images/320_Bram_Fleece/image_003.jpg
946
+ trainer_images/321_Raya_Pace/image_001.jpg
947
+ trainer_images/321_Raya_Pace/image_002.jpg
948
+ trainer_images/321_Raya_Pace/image_003.jpg
949
+ trainer_images/322_Todd_Pawsley/image_001.jpg
950
+ trainer_images/322_Todd_Pawsley/image_002.jpg
951
+ trainer_images/322_Todd_Pawsley/image_003.jpg
952
+ trainer_images/323_Nina_Paste/image_001.jpg
953
+ trainer_images/323_Nina_Paste/image_002.jpg
954
+ trainer_images/323_Nina_Paste/image_003.jpg
955
+ trainer_images/324_Vin_Vox/image_001.jpg
956
+ trainer_images/324_Vin_Vox/image_002.jpg
957
+ trainer_images/324_Vin_Vox/image_003.jpg
958
+ trainer_images/325_Roxy_Brick/image_001.jpg
959
+ trainer_images/325_Roxy_Brick/image_002.jpg
960
+ trainer_images/325_Roxy_Brick/image_003.jpg
961
+ trainer_images/326_Tarn_Scale/image_001.jpg
962
+ trainer_images/326_Tarn_Scale/image_002.jpg
963
+ trainer_images/326_Tarn_Scale/image_003.jpg
964
+ trainer_images/327_Franco_Flare/image_001.jpg
965
+ trainer_images/327_Franco_Flare/image_002.jpg
966
+ trainer_images/327_Franco_Flare/image_003.jpg
967
+ trainer_images/328_Jun_Silence/image_001.jpg
968
+ trainer_images/328_Jun_Silence/image_002.jpg
969
+ trainer_images/328_Jun_Silence/image_003.jpg
970
+ trainer_images/329_Dusty_Mop/image_001.jpg
971
+ trainer_images/329_Dusty_Mop/image_002.jpg
972
+ trainer_images/329_Dusty_Mop/image_003.jpg
973
+ trainer_images/330_Tess_Lens/image_001.jpg
974
+ trainer_images/330_Tess_Lens/image_002.jpg
975
+ trainer_images/330_Tess_Lens/image_003.jpg
976
+ trainer_images/331_Miss_Sugarroll/image_001.jpg
977
+ trainer_images/331_Miss_Sugarroll/image_002.jpg
978
+ trainer_images/331_Miss_Sugarroll/image_003.jpg
979
+ trainer_images/332_Zip_Rotor/image_001.jpg
980
+ trainer_images/332_Zip_Rotor/image_002.jpg
981
+ trainer_images/332_Zip_Rotor/image_003.jpg
982
+ trainer_images/333_Clara_Dome/image_001.jpg
983
+ trainer_images/333_Clara_Dome/image_002.jpg
984
+ trainer_images/333_Clara_Dome/image_003.jpg
985
+ trainer_images/334_Reef_Soak/image_001.jpg
986
+ trainer_images/334_Reef_Soak/image_002.jpg
987
+ trainer_images/334_Reef_Soak/image_003.jpg
988
+ trainer_images/335_Leona_Stride/image_001.jpg
989
+ trainer_images/335_Leona_Stride/image_002.jpg
990
+ trainer_images/335_Leona_Stride/image_003.jpg
991
+ trainer_images/336_Rusty_Span/image_001.jpg
992
+ trainer_images/336_Rusty_Span/image_002.jpg
993
+ trainer_images/336_Rusty_Span/image_003.jpg
994
+ trainer_images/337_Lux_Bright/image_001.jpg
995
+ trainer_images/337_Lux_Bright/image_002.jpg
996
+ trainer_images/337_Lux_Bright/image_003.jpg
997
+ trainer_images/338_Dr_Hallow/image_001.jpg
998
+ trainer_images/338_Dr_Hallow/image_002.jpg
999
+ trainer_images/338_Dr_Hallow/image_003.jpg
1000
+ trainer_images/339_Rocky_Updraft/image_001.jpg
1001
+ trainer_images/339_Rocky_Updraft/image_002.jpg
1002
+ trainer_images/339_Rocky_Updraft/image_003.jpg
1003
+ trainer_images/340_Petra_Bloom/image_001.jpg
1004
+ trainer_images/340_Petra_Bloom/image_002.jpg
1005
+ trainer_images/340_Petra_Bloom/image_003.jpg
1006
+ trainer_images/341_Kip_Starwatch/image_001.jpg
1007
+ trainer_images/341_Kip_Starwatch/image_002.jpg
1008
+ trainer_images/341_Kip_Starwatch/image_003.jpg
1009
+ trainer_images/342_Bennett_Decimal/image_001.jpg
1010
+ trainer_images/342_Bennett_Decimal/image_002.jpg
1011
+ trainer_images/342_Bennett_Decimal/image_003.jpg
1012
+ trainer_images/343_Trix_Quest/image_001.jpg
1013
+ trainer_images/343_Trix_Quest/image_002.jpg
1014
+ trainer_images/343_Trix_Quest/image_003.jpg
1015
+ trainer_images/344_Lilith_Bog/image_001.jpg
1016
+ trainer_images/344_Lilith_Bog/image_002.jpg
1017
+ trainer_images/344_Lilith_Bog/image_003.jpg
1018
+ trainer_images/345_Ink_Razor/image_001.jpg
1019
+ trainer_images/345_Ink_Razor/image_002.jpg
1020
+ trainer_images/345_Ink_Razor/image_003.jpg
1021
+ trainer_images/346_Char_Ash/image_001.jpg
1022
+ trainer_images/346_Char_Ash/image_002.jpg
1023
+ trainer_images/346_Char_Ash/image_003.jpg
1024
+ trainer_images/347_Oren_Echo/image_001.jpg
1025
+ trainer_images/347_Oren_Echo/image_002.jpg
1026
+ trainer_images/347_Oren_Echo/image_003.jpg
1027
+ trainer_images/348_Jax_Stage/image_001.jpg
1028
+ trainer_images/348_Jax_Stage/image_002.jpg
1029
+ trainer_images/348_Jax_Stage/image_003.jpg
1030
+ trainer_images/349_Glen_Drift/image_001.jpg
1031
+ trainer_images/349_Glen_Drift/image_002.jpg
1032
+ trainer_images/349_Glen_Drift/image_003.jpg
1033
+ trainer_images/350_Bram_Tock/image_001.jpg
1034
+ trainer_images/350_Bram_Tock/image_002.jpg
1035
+ trainer_images/350_Bram_Tock/image_003.jpg
1036
+ trainer_images/351_Coach_Beck/image_001.jpg
1037
+ trainer_images/351_Coach_Beck/image_002.jpg
1038
+ trainer_images/351_Coach_Beck/image_003.jpg
1039
+ trainer_images/352_Reed_Loop/image_001.jpg
1040
+ trainer_images/352_Reed_Loop/image_002.jpg
1041
+ trainer_images/352_Reed_Loop/image_003.jpg
1042
+ trainer_images/353_Nolan_Crick/image_001.jpg
1043
+ trainer_images/353_Nolan_Crick/image_002.jpg
1044
+ trainer_images/353_Nolan_Crick/image_003.jpg
1045
+ trainer_images/354_Lana_Break/image_001.jpg
1046
+ trainer_images/354_Lana_Break/image_003.jpg
1047
+ trainer_images/355_Chef_Yama/image_001.jpg
1048
+ trainer_images/355_Chef_Yama/image_002.jpg
1049
+ trainer_images/355_Chef_Yama/image_003.jpg
1050
+ trainer_images/356_Loopie_Lane/image_001.jpg
1051
+ trainer_images/356_Loopie_Lane/image_002.jpg
1052
+ trainer_images/356_Loopie_Lane/image_003.jpg
1053
+ trainer_images/357_Cloudy_Penn/image_001.jpg
1054
+ trainer_images/357_Cloudy_Penn/image_002.jpg
1055
+ trainer_images/357_Cloudy_Penn/image_003.jpg
1056
+ trainer_images/358_Grant_Lock/image_001.jpg
1057
+ trainer_images/358_Grant_Lock/image_002.jpg
1058
+ trainer_images/358_Grant_Lock/image_003.jpg
1059
+ trainer_images/359_Cedar_Vane/image_001.jpg
1060
+ trainer_images/359_Cedar_Vane/image_002.jpg
1061
+ trainer_images/359_Cedar_Vane/image_003.jpg
1062
+ trainer_images/360_Penny_Finch/image_001.jpg
1063
+ trainer_images/360_Penny_Finch/image_002.jpg
1064
+ trainer_images/360_Penny_Finch/image_003.jpg
1065
+ trainer_images/361_Dr_Mira_Field/image_001.jpg
1066
+ trainer_images/361_Dr_Mira_Field/image_002.jpg
1067
+ trainer_images/361_Dr_Mira_Field/image_003.jpg
1068
+ trainer_images/362_Nina_Whisk/image_001.jpg
1069
+ trainer_images/362_Nina_Whisk/image_002.jpg
1070
+ trainer_images/362_Nina_Whisk/image_003.jpg
1071
+ trainer_images/363_Hugh_Herd/image_001.jpg
1072
+ trainer_images/363_Hugh_Herd/image_002.jpg
1073
+ trainer_images/363_Hugh_Herd/image_003.jpg
1074
+ trainer_images/364_Tess_Dune/image_001.jpg
1075
+ trainer_images/364_Tess_Dune/image_002.jpg
1076
+ trainer_images/364_Tess_Dune/image_003.jpg
1077
+ trainer_images/365_Farmer_Cluck/image_001.jpg
1078
+ trainer_images/365_Farmer_Cluck/image_002.jpg
1079
+ trainer_images/365_Farmer_Cluck/image_003.jpg
1080
+ trainer_images/366_Maris_Shell/image_001.jpg
1081
+ trainer_images/366_Maris_Shell/image_002.jpg
1082
+ trainer_images/366_Maris_Shell/image_003.jpg
1083
+ trainer_images/367_Shade_Owls/image_001.jpg
1084
+ trainer_images/367_Shade_Owls/image_002.jpg
1085
+ trainer_images/367_Shade_Owls/image_003.jpg
1086
+ trainer_images/368_Jasper_Mite/image_001.jpg
1087
+ trainer_images/368_Jasper_Mite/image_002.jpg
1088
+ trainer_images/368_Jasper_Mite/image_003.jpg
1089
+ trainer_images/369_Lilly_Ribbit/image_001.jpg
1090
+ trainer_images/369_Lilly_Ribbit/image_002.jpg
1091
+ trainer_images/369_Lilly_Ribbit/image_003.jpg
1092
+ trainer_images/370_Clara_Reign/image_001.jpg
1093
+ trainer_images/370_Clara_Reign/image_002.jpg
1094
+ trainer_images/370_Clara_Reign/image_003.jpg
1095
+ trainer_images/371_Dr_Frost/image_001.jpg
1096
+ trainer_images/371_Dr_Frost/image_002.jpg
1097
+ trainer_images/371_Dr_Frost/image_003.jpg
1098
+ trainer_images/372_Kael_Talon/image_001.jpg
1099
+ trainer_images/372_Kael_Talon/image_002.jpg
1100
+ trainer_images/372_Kael_Talon/image_003.jpg
1101
+ trainer_images/373_Bun_Cass/image_001.jpg
1102
+ trainer_images/373_Bun_Cass/image_002.jpg
1103
+ trainer_images/373_Bun_Cass/image_003.jpg
1104
+ trainer_images/374_Mord_Crowe/image_001.jpg
1105
+ trainer_images/374_Mord_Crowe/image_002.jpg
1106
+ trainer_images/374_Mord_Crowe/image_003.jpg
1107
+ trainer_images/375_Vera_Coil/image_001.jpg
1108
+ trainer_images/375_Vera_Coil/image_002.jpg
1109
+ trainer_images/375_Vera_Coil/image_003.jpg
1110
+ trainer_images/376_Cavern_Wing/image_001.jpg
1111
+ trainer_images/376_Cavern_Wing/image_002.jpg
1112
+ trainer_images/376_Cavern_Wing/image_003.jpg
1113
+ trainer_images/377_Lola_Bark/image_001.jpg
1114
+ trainer_images/377_Lola_Bark/image_002.jpg
1115
+ trainer_images/377_Lola_Bark/image_003.jpg
1116
+ trainer_images/378_Logan_Chew/image_001.jpg
1117
+ trainer_images/378_Logan_Chew/image_002.jpg
1118
+ trainer_images/378_Logan_Chew/image_003.jpg
1119
+ trainer_images/379_Mira_Flutter/image_001.jpg
1120
+ trainer_images/379_Mira_Flutter/image_002.jpg
1121
+ trainer_images/379_Mira_Flutter/image_003.jpg
1122
+ trainer_images/380_Everett_Sky/image_001.jpg
1123
+ trainer_images/380_Everett_Sky/image_002.jpg
1124
+ trainer_images/380_Everett_Sky/image_003.jpg
1125
+ trainer_images/381_Suri_Bamboo/image_001.jpg
1126
+ trainer_images/381_Suri_Bamboo/image_002.jpg
1127
+ trainer_images/381_Suri_Bamboo/image_003.jpg
1128
+ trainer_images/382_Jax_Safari/image_001.jpg
1129
+ trainer_images/382_Jax_Safari/image_002.jpg
1130
+ trainer_images/382_Jax_Safari/image_003.jpg
1131
+ trainer_images/383_Faye_Drift/image_001.jpg
1132
+ trainer_images/383_Faye_Drift/image_002.jpg
1133
+ trainer_images/383_Faye_Drift/image_003.jpg
1134
+ trainer_images/384_Ralph_Crag/image_001.jpg
1135
+ trainer_images/384_Ralph_Crag/image_002.jpg
1136
+ trainer_images/384_Ralph_Crag/image_003.jpg
1137
+ trainer_images/385_Lina_Prowl/image_001.jpg
1138
+ trainer_images/385_Lina_Prowl/image_002.jpg
1139
+ trainer_images/385_Lina_Prowl/image_003.jpg
1140
+ trainer_images/386_Gill_Moss/image_001.jpg
1141
+ trainer_images/386_Gill_Moss/image_003.jpg
1142
+ trainer_images/387_Ayla_Bounce/image_001.jpg
1143
+ trainer_images/387_Ayla_Bounce/image_002.jpg
1144
+ trainer_images/387_Ayla_Bounce/image_003.jpg
1145
+ trainer_images/388_Doug_Antler/image_001.jpg
1146
+ trainer_images/388_Doug_Antler/image_002.jpg
1147
+ trainer_images/388_Doug_Antler/image_003.jpg
1148
+ trainer_images/389_Pippa_Prickle/image_001.jpg
1149
+ trainer_images/389_Pippa_Prickle/image_002.jpg
1150
+ trainer_images/389_Pippa_Prickle/image_003.jpg
1151
+ trainer_images/390_Rico_Chime/image_001.jpg
1152
+ trainer_images/390_Rico_Chime/image_002.jpg
1153
+ trainer_images/390_Rico_Chime/image_003.jpg
1154
+ trainer_images/391_Aria_Howl/image_001.jpg
1155
+ trainer_images/391_Aria_Howl/image_002.jpg
1156
+ trainer_images/391_Aria_Howl/image_003.jpg
1157
+ trainer_images/392_Remy_Swipe/image_001.jpg
1158
+ trainer_images/392_Remy_Swipe/image_002.jpg
1159
+ trainer_images/392_Remy_Swipe/image_003.jpg
1160
+ trainer_images/393_Florina_Pink/image_001.jpg
1161
+ trainer_images/393_Florina_Pink/image_002.jpg
1162
+ trainer_images/393_Florina_Pink/image_003.jpg
1163
+ trainer_images/394_Renn_Snow/image_001.jpg
1164
+ trainer_images/394_Renn_Snow/image_002.jpg
1165
+ trainer_images/394_Renn_Snow/image_003.jpg
1166
+ trainer_images/395_Hazel_Skip/image_001.jpg
1167
+ trainer_images/395_Hazel_Skip/image_002.jpg
1168
+ trainer_images/395_Hazel_Skip/image_003.jpg
1169
+ trainer_images/396_Jet_Squeegee/image_001.jpg
1170
+ trainer_images/396_Jet_Squeegee/image_002.jpg
1171
+ trainer_images/396_Jet_Squeegee/image_003.jpg
1172
+ trainer_images/397_Vi_Vow/image_001.jpg
1173
+ trainer_images/397_Vi_Vow/image_002.jpg
1174
+ trainer_images/397_Vi_Vow/image_003.jpg
1175
+ trainer_images/398_Dex_Ghoul/image_001.jpg
1176
+ trainer_images/398_Dex_Ghoul/image_003.jpg
1177
+ trainer_images/399_Marla_Throw/image_001.jpg
1178
+ trainer_images/399_Marla_Throw/image_002.jpg
1179
+ trainer_images/399_Marla_Throw/image_003.jpg
1180
+ trainer_images/400_Skip_Panel/image_001.jpg
1181
+ trainer_images/400_Skip_Panel/image_002.jpg
1182
+ trainer_images/400_Skip_Panel/image_003.jpg
1183
+ trainer_images/401_Rosa_Wake/image_001.jpg
1184
+ trainer_images/401_Rosa_Wake/image_002.jpg
1185
+ trainer_images/401_Rosa_Wake/image_003.jpg
1186
+ trainer_images/402_Lenny_Pop/image_001.jpg
1187
+ trainer_images/402_Lenny_Pop/image_002.jpg
1188
+ trainer_images/403_Tess_Spine/image_001.jpg
1189
+ trainer_images/403_Tess_Spine/image_002.jpg
1190
+ trainer_images/403_Tess_Spine/image_003.jpg
1191
+ trainer_images/404_Jan_Chip/image_001.jpg
1192
+ trainer_images/404_Jan_Chip/image_002.jpg
1193
+ trainer_images/404_Jan_Chip/image_003.jpg
1194
+ trainer_images/405_Bree_Nectar/image_001.jpg
1195
+ trainer_images/405_Bree_Nectar/image_002.jpg
1196
+ trainer_images/405_Bree_Nectar/image_003.jpg
1197
+ trainer_images/406_Quinn_Click/image_001.jpg
1198
+ trainer_images/406_Quinn_Click/image_002.jpg
1199
+ trainer_images/406_Quinn_Click/image_003.jpg
1200
+ trainer_images/407_Sunny_Toast/image_001.jpg
1201
+ trainer_images/407_Sunny_Toast/image_002.jpg
1202
+ trainer_images/407_Sunny_Toast/image_003.jpg
1203
+ trainer_images/408_RJ_Bass/image_001.jpg
1204
+ trainer_images/408_RJ_Bass/image_002.jpg
1205
+ trainer_images/408_RJ_Bass/image_003.jpg
1206
+ trainer_images/409_Clay_Switch/image_001.jpg
1207
+ trainer_images/409_Clay_Switch/image_002.jpg
1208
+ trainer_images/409_Clay_Switch/image_003.jpg
1209
+ trainer_images/410_Zoe_Whirl/image_001.jpg
1210
+ trainer_images/410_Zoe_Whirl/image_002.jpg
1211
+ trainer_images/410_Zoe_Whirl/image_003.jpg
1212
+ trainer_images/411_Dale_Signal/image_001.jpg
1213
+ trainer_images/411_Dale_Signal/image_002.jpg
1214
+ trainer_images/411_Dale_Signal/image_003.jpg
1215
+ trainer_images/412_Thespi_Wynn/image_001.jpg
1216
+ trainer_images/412_Thespi_Wynn/image_002.jpg
1217
+ trainer_images/412_Thespi_Wynn/image_003.jpg
1218
+ trainer_images/413_Faye_Pastel/image_001.jpg
1219
+ trainer_images/413_Faye_Pastel/image_002.jpg
1220
+ trainer_images/413_Faye_Pastel/image_003.jpg
1221
+ trainer_images/414_Jo_Bean/image_001.jpg
1222
+ trainer_images/414_Jo_Bean/image_002.jpg
1223
+ trainer_images/414_Jo_Bean/image_003.jpg
1224
+ trainer_images/415_Max_Lift/image_001.jpg
1225
+ trainer_images/415_Max_Lift/image_002.jpg
1226
+ trainer_images/415_Max_Lift/image_003.jpg
1227
+ trainer_images/416_Vic_Pawn/image_001.jpg
1228
+ trainer_images/416_Vic_Pawn/image_002.jpg
1229
+ trainer_images/416_Vic_Pawn/image_003.jpg
1230
+ trainer_images/417_Gloria_Peck/image_001.jpg
1231
+ trainer_images/417_Gloria_Peck/image_002.jpg
1232
+ trainer_images/417_Gloria_Peck/image_003.jpg
1233
+ trainer_images/418_Cy_Trick/image_001.jpg
1234
+ trainer_images/418_Cy_Trick/image_002.jpg
1235
+ trainer_images/418_Cy_Trick/image_003.jpg
1236
+ trainer_images/419_Nol_Kubo/image_001.jpg
1237
+ trainer_images/419_Nol_Kubo/image_002.jpg
1238
+ trainer_images/419_Nol_Kubo/image_003.jpg
1239
+ trainer_images/420_Del_Echo/image_001.jpg
1240
+ trainer_images/420_Del_Echo/image_002.jpg
1241
+ trainer_images/420_Del_Echo/image_003.jpg
1242
+ trainer_images/421_Rock_Boone/image_001.jpg
1243
+ trainer_images/421_Rock_Boone/image_002.jpg
1244
+ trainer_images/421_Rock_Boone/image_003.jpg
1245
+ trainer_images/422_Ivy_Watt/image_001.jpg
1246
+ trainer_images/422_Ivy_Watt/image_002.jpg
1247
+ trainer_images/422_Ivy_Watt/image_003.jpg
1248
+ trainer_images/423_Mr_Maybe/image_001.jpg
1249
+ trainer_images/423_Mr_Maybe/image_002.jpg
1250
+ trainer_images/423_Mr_Maybe/image_003.jpg
1251
+ trainer_images/424_Spence_Sill/image_001.jpg
1252
+ trainer_images/424_Spence_Sill/image_002.jpg
1253
+ trainer_images/424_Spence_Sill/image_003.jpg
1254
+ trainer_images/425_Tali_Blaze/image_001.jpg
1255
+ trainer_images/425_Tali_Blaze/image_002.jpg
1256
+ trainer_images/425_Tali_Blaze/image_003.jpg
1257
+ trainer_images/426_Marnie_Pull/image_001.jpg
1258
+ trainer_images/426_Marnie_Pull/image_002.jpg
1259
+ trainer_images/426_Marnie_Pull/image_003.jpg
1260
+ trainer_images/427_Bo_Guide/image_001.jpg
1261
+ trainer_images/427_Bo_Guide/image_002.jpg
1262
+ trainer_images/427_Bo_Guide/image_003.jpg
1263
+ trainer_images/428_Jenna_Nozzle/image_001.jpg
1264
+ trainer_images/428_Jenna_Nozzle/image_002.jpg
1265
+ trainer_images/428_Jenna_Nozzle/image_003.jpg
1266
+ trainer_images/429_Raye_Hue/image_001.jpg
1267
+ trainer_images/429_Raye_Hue/image_002.jpg
1268
+ trainer_images/429_Raye_Hue/image_003.jpg
1269
+ trainer_images/430_Lan_Plug/image_001.jpg
1270
+ trainer_images/430_Lan_Plug/image_002.jpg
1271
+ trainer_images/430_Lan_Plug/image_003.jpg
1272
+ trainer_images/431_Dot_Rally/image_001.jpg
1273
+ trainer_images/431_Dot_Rally/image_002.jpg
1274
+ trainer_images/431_Dot_Rally/image_003.jpg
1275
+ trainer_images/432_Old_Marius/image_001.jpg
1276
+ trainer_images/432_Old_Marius/image_002.jpg
1277
+ trainer_images/432_Old_Marius/image_003.jpg
1278
+ trainer_images/433_Starla_Step/image_001.jpg
1279
+ trainer_images/433_Starla_Step/image_002.jpg
1280
+ trainer_images/433_Starla_Step/image_003.jpg
1281
+ trainer_images/434_Toby_Scribble/image_001.jpg
1282
+ trainer_images/434_Toby_Scribble/image_002.jpg
1283
+ trainer_images/434_Toby_Scribble/image_003.jpg
1284
+ trainer_images/435_Mira_Yawn/image_001.jpg
1285
+ trainer_images/435_Mira_Yawn/image_002.jpg
1286
+ trainer_images/435_Mira_Yawn/image_003.jpg
1287
+ trainer_images/436_Jenks_Curb/image_001.jpg
1288
+ trainer_images/436_Jenks_Curb/image_002.jpg
1289
+ trainer_images/436_Jenks_Curb/image_003.jpg
1290
+ trainer_images/437_Lulu_Splash/image_001.jpg
1291
+ trainer_images/437_Lulu_Splash/image_002.jpg
1292
+ trainer_images/437_Lulu_Splash/image_003.jpg
1293
+ trainer_images/438_Ben_Heel/image_001.jpg
1294
+ trainer_images/438_Ben_Heel/image_002.jpg
1295
+ trainer_images/438_Ben_Heel/image_003.jpg
1296
+ trainer_images/439_Ashly_Draft/image_001.jpg
1297
+ trainer_images/439_Ashly_Draft/image_002.jpg
1298
+ trainer_images/439_Ashly_Draft/image_003.jpg
1299
+ trainer_images/440_Kip_Queue/image_001.jpg
1300
+ trainer_images/440_Kip_Queue/image_002.jpg
1301
+ trainer_images/440_Kip_Queue/image_003.jpg
1302
+ trainer_images/441_Bree_Glint/image_001.jpg
1303
+ trainer_images/441_Bree_Glint/image_002.jpg
1304
+ trainer_images/441_Bree_Glint/image_003.jpg
1305
+ trainer_images/442_Ollie_Lantern/image_001.jpg
1306
+ trainer_images/442_Ollie_Lantern/image_002.jpg
1307
+ trainer_images/442_Ollie_Lantern/image_003.jpg
1308
+ trainer_images/443_Maya_Peel/image_001.jpg
1309
+ trainer_images/443_Maya_Peel/image_002.jpg
1310
+ trainer_images/443_Maya_Peel/image_003.jpg
1311
+ trainer_images/444_Nate_Snore/image_001.jpg
1312
+ trainer_images/444_Nate_Snore/image_002.jpg
1313
+ trainer_images/444_Nate_Snore/image_003.jpg
1314
+ trainer_images/445_Tina_Grease/image_001.jpg
1315
+ trainer_images/445_Tina_Grease/image_002.jpg
1316
+ trainer_images/445_Tina_Grease/image_003.jpg
1317
+ trainer_images/446_Sox_Rumble/image_001.jpg
1318
+ trainer_images/446_Sox_Rumble/image_002.jpg
1319
+ trainer_images/446_Sox_Rumble/image_003.jpg
1320
+ trainer_images/447_Nell_Bargain/image_001.jpg
1321
+ trainer_images/447_Nell_Bargain/image_002.jpg
1322
+ trainer_images/447_Nell_Bargain/image_003.jpg
1323
+ trainer_images/448_Denny_Mark/image_001.jpg
1324
+ trainer_images/448_Denny_Mark/image_002.jpg
1325
+ trainer_images/448_Denny_Mark/image_003.jpg
1326
+ trainer_images/449_Tasha_Sigh/image_001.jpg
1327
+ trainer_images/449_Tasha_Sigh/image_002.jpg
1328
+ trainer_images/449_Tasha_Sigh/image_003.jpg
1329
+ trainer_images/450_Callie_Fold/image_001.jpg
1330
+ trainer_images/450_Callie_Fold/image_002.jpg
1331
+ trainer_images/450_Callie_Fold/image_003.jpg
1332
+ trainer_images/451_Jay_Quiet/image_001.jpg
1333
+ trainer_images/451_Jay_Quiet/image_002.jpg
1334
+ trainer_images/451_Jay_Quiet/image_003.jpg
1335
+ trainer_images/452_Mimi_Click/image_001.jpg
1336
+ trainer_images/452_Mimi_Click/image_002.jpg
1337
+ trainer_images/452_Mimi_Click/image_003.jpg
1338
+ trainer_images/453_Chet_Toss/image_001.jpg
1339
+ trainer_images/453_Chet_Toss/image_002.jpg
1340
+ trainer_images/453_Chet_Toss/image_003.jpg
1341
+ trainer_images/454_Derek_Couch/image_001.jpg
1342
+ trainer_images/454_Derek_Couch/image_002.jpg
1343
+ trainer_images/454_Derek_Couch/image_003.jpg
1344
+ trainer_images/455_Tilly_Drip/image_001.jpg
1345
+ trainer_images/455_Tilly_Drip/image_002.jpg
1346
+ trainer_images/455_Tilly_Drip/image_003.jpg
1347
+ trainer_images/456_Rory_Pin/image_001.jpg
1348
+ trainer_images/456_Rory_Pin/image_002.jpg
1349
+ trainer_images/456_Rory_Pin/image_003.jpg
1350
+ trainer_images/457_Jess_Zoom/image_001.jpg
1351
+ trainer_images/457_Jess_Zoom/image_002.jpg
1352
+ trainer_images/457_Jess_Zoom/image_003.jpg
1353
+ trainer_images/458_Walt_Dash/image_001.jpg
1354
+ trainer_images/458_Walt_Dash/image_002.jpg
1355
+ trainer_images/458_Walt_Dash/image_003.jpg
1356
+ trainer_images/459_Old_Marv/image_001.jpg
1357
+ trainer_images/459_Old_Marv/image_002.jpg
1358
+ trainer_images/459_Old_Marv/image_003.jpg
1359
+ trainer_images/460_Mr_Woof/image_001.jpg
1360
+ trainer_images/460_Mr_Woof/image_002.jpg
1361
+ trainer_images/460_Mr_Woof/image_003.jpg
1362
+ trainer_images/461_Rae_Drip/image_001.jpg
1363
+ trainer_images/461_Rae_Drip/image_002.jpg
1364
+ trainer_images/461_Rae_Drip/image_003.jpg
1365
+ trainer_images/462_Liam_Sort/image_001.jpg
1366
+ trainer_images/462_Liam_Sort/image_002.jpg
1367
+ trainer_images/462_Liam_Sort/image_003.jpg
1368
+ trainer_images/463_Monica_Lane/image_001.jpg
1369
+ trainer_images/463_Monica_Lane/image_002.jpg
1370
+ trainer_images/463_Monica_Lane/image_003.jpg
1371
+ trainer_images/464_Cass_Tempest/image_001.jpg
1372
+ trainer_images/464_Cass_Tempest/image_002.jpg
1373
+ trainer_images/464_Cass_Tempest/image_003.jpg
1374
+ trainer_images/465_Rafe_Deep/image_001.jpg
1375
+ trainer_images/465_Rafe_Deep/image_002.jpg
1376
+ trainer_images/465_Rafe_Deep/image_003.jpg
1377
+ trainer_images/466_Sol_Umbra/image_001.jpg
1378
+ trainer_images/466_Sol_Umbra/image_003.jpg
1379
+ trainer_images/467_Orin_Scope/image_001.jpg
1380
+ trainer_images/467_Orin_Scope/image_002.jpg
1381
+ trainer_images/467_Orin_Scope/image_003.jpg
1382
+ trainer_images/468_Vash_Ember/image_001.jpg
1383
+ trainer_images/468_Vash_Ember/image_002.jpg
1384
+ trainer_images/468_Vash_Ember/image_003.jpg
1385
+ trainer_images/469_Dr_Faye_Prime/image_001.jpg
1386
+ trainer_images/469_Dr_Faye_Prime/image_002.jpg
1387
+ trainer_images/469_Dr_Faye_Prime/image_003.jpg
1388
+ trainer_images/470_Thorn_Chill/image_001.jpg
1389
+ trainer_images/470_Thorn_Chill/image_002.jpg
1390
+ trainer_images/470_Thorn_Chill/image_003.jpg
1391
+ trainer_images/471_Juno_Arc/image_001.jpg
1392
+ trainer_images/471_Juno_Arc/image_002.jpg
1393
+ trainer_images/472_Echo_Flick/image_001.jpg
1394
+ trainer_images/472_Echo_Flick/image_002.jpg
1395
+ trainer_images/472_Echo_Flick/image_003.jpg
1396
+ trainer_images/473_Monk_Vale/image_001.jpg
1397
+ trainer_images/473_Monk_Vale/image_002.jpg
1398
+ trainer_images/473_Monk_Vale/image_003.jpg
1399
+ trainer_images/474_Sera_Magma/image_001.jpg
1400
+ trainer_images/474_Sera_Magma/image_002.jpg
1401
+ trainer_images/474_Sera_Magma/image_003.jpg
1402
+ trainer_images/475_Silas_Fade/image_001.jpg
1403
+ trainer_images/475_Silas_Fade/image_002.jpg
1404
+ trainer_images/475_Silas_Fade/image_003.jpg
1405
+ trainer_images/476_Nyx_Whisper/image_001.jpg
1406
+ trainer_images/476_Nyx_Whisper/image_002.jpg
1407
+ trainer_images/476_Nyx_Whisper/image_003.jpg
1408
+ trainer_images/477_Dr_Kline_Brine/image_001.jpg
1409
+ trainer_images/477_Dr_Kline_Brine/image_002.jpg
1410
+ trainer_images/477_Dr_Kline_Brine/image_003.jpg
1411
+ trainer_images/478_Pax_Prism/image_001.jpg
1412
+ trainer_images/478_Pax_Prism/image_002.jpg
1413
+ trainer_images/478_Pax_Prism/image_003.jpg
1414
+ trainer_images/479_Amon_Dust/image_001.jpg
1415
+ trainer_images/479_Amon_Dust/image_002.jpg
1416
+ trainer_images/479_Amon_Dust/image_003.jpg
1417
+ trainer_images/480_Lira_Veil/image_001.jpg
1418
+ trainer_images/480_Lira_Veil/image_002.jpg
1419
+ trainer_images/480_Lira_Veil/image_003.jpg
1420
+ trainer_images/481_Axel_Singularity/image_001.jpg
1421
+ trainer_images/481_Axel_Singularity/image_002.jpg
1422
+ trainer_images/481_Axel_Singularity/image_003.jpg
1423
+ trainer_images/482_Chi_Cascade/image_001.jpg
1424
+ trainer_images/482_Chi_Cascade/image_002.jpg
1425
+ trainer_images/482_Chi_Cascade/image_003.jpg
1426
+ trainer_images/483_Fen_Zuri/image_001.jpg
1427
+ trainer_images/483_Fen_Zuri/image_002.jpg
1428
+ trainer_images/483_Fen_Zuri/image_003.jpg
1429
+ trainer_images/484_Dr_Rayburst/image_001.jpg
1430
+ trainer_images/484_Dr_Rayburst/image_002.jpg
1431
+ trainer_images/484_Dr_Rayburst/image_003.jpg
1432
+ trainer_images/485_Rowan_Vale/image_001.jpg
1433
+ trainer_images/485_Rowan_Vale/image_002.jpg
1434
+ trainer_images/485_Rowan_Vale/image_003.jpg
1435
+ trainer_images/486_Leah_Glyph/image_001.jpg
1436
+ trainer_images/486_Leah_Glyph/image_002.jpg
1437
+ trainer_images/486_Leah_Glyph/image_003.jpg
1438
+ trainer_images/487_Glitcha_Frame/image_001.jpg
1439
+ trainer_images/487_Glitcha_Frame/image_002.jpg
1440
+ trainer_images/487_Glitcha_Frame/image_003.jpg
1441
+ trainer_images/488_Dr_Ellan_Track/image_001.jpg
1442
+ trainer_images/488_Dr_Ellan_Track/image_002.jpg
1443
+ trainer_images/488_Dr_Ellan_Track/image_003.jpg
1444
+ trainer_images/489_Nova_Cipher/image_001.jpg
1445
+ trainer_images/489_Nova_Cipher/image_002.jpg
1446
+ trainer_images/489_Nova_Cipher/image_003.jpg
1447
+ trainer_images/490_Koa_Freeze/image_001.jpg
1448
+ trainer_images/490_Koa_Freeze/image_002.jpg
1449
+ trainer_images/490_Koa_Freeze/image_003.jpg
1450
+ trainer_images/491_Mute_Wells/image_001.jpg
1451
+ trainer_images/491_Mute_Wells/image_002.jpg
1452
+ trainer_images/491_Mute_Wells/image_003.jpg
1453
+ trainer_images/492_Reel_Annum/image_001.jpg
1454
+ trainer_images/492_Reel_Annum/image_002.jpg
1455
+ trainer_images/492_Reel_Annum/image_003.jpg
1456
+ trainer_images/493_Orren_Codex/image_001.jpg
1457
+ trainer_images/493_Orren_Codex/image_002.jpg
1458
+ trainer_images/493_Orren_Codex/image_003.jpg
1459
+ trainer_images/494_Clint_Crinkle/image_001.jpg
1460
+ trainer_images/494_Clint_Crinkle/image_002.jpg
1461
+ trainer_images/494_Clint_Crinkle/image_003.jpg
1462
+ trainer_images/495_Nana_Fizz/image_001.jpg
1463
+ trainer_images/495_Nana_Fizz/image_002.jpg
1464
+ trainer_images/495_Nana_Fizz/image_003.jpg
1465
+ trainer_images/496_Mister_Vanish/image_001.jpg
1466
+ trainer_images/496_Mister_Vanish/image_002.jpg
1467
+ trainer_images/497_Rudy_Clause/image_001.jpg
1468
+ trainer_images/497_Rudy_Clause/image_002.jpg
1469
+ trainer_images/497_Rudy_Clause/image_003.jpg
1470
+ trainer_images/498_Trina_Soar/image_001.jpg
1471
+ trainer_images/498_Trina_Soar/image_002.jpg
1472
+ trainer_images/498_Trina_Soar/image_003.jpg
1473
+ trainer_images/499_Broc_Flex/image_001.jpg
1474
+ trainer_images/499_Broc_Flex/image_002.jpg
1475
+ trainer_images/499_Broc_Flex/image_003.jpg
1476
+ trainer_images/500_Kiki_Ketchup/image_001.jpg
1477
+ trainer_images/500_Kiki_Ketchup/image_002.jpg
1478
+ trainer_images/501_Jean_Shhh/image_001.jpg
1479
+ trainer_images/501_Jean_Shhh/image_002.jpg
1480
+ trainer_images/501_Jean_Shhh/image_003.jpg
1481
+ trainer_images/502_Axel_Woke/image_001.jpg
1482
+ trainer_images/502_Axel_Woke/image_002.jpg
1483
+ trainer_images/502_Axel_Woke/image_003.jpg
1484
+ trainer_images/503_Miss_Greeble/image_001.jpg
1485
+ trainer_images/503_Miss_Greeble/image_002.jpg
1486
+ trainer_images/503_Miss_Greeble/image_003.jpg
1487
+ trainer_images/504_Mini_Mimi/image_001.jpg
1488
+ trainer_images/504_Mini_Mimi/image_002.jpg
1489
+ trainer_images/504_Mini_Mimi/image_003.jpg
1490
+ trainer_images/505_Lonnie_Twist/image_001.jpg
1491
+ trainer_images/505_Lonnie_Twist/image_002.jpg
1492
+ trainer_images/505_Lonnie_Twist/image_003.jpg
1493
+ trainer_images/506_Dozer_Drool/image_001.jpg
1494
+ trainer_images/506_Dozer_Drool/image_002.jpg
1495
+ trainer_images/506_Dozer_Drool/image_003.jpg
1496
+ trainer_images/507_Sandra_Splash/image_001.jpg
1497
+ trainer_images/507_Sandra_Splash/image_002.jpg
1498
+ trainer_images/507_Sandra_Splash/image_003.jpg
1499
+ trainer_images/508_Sir_Gregor/image_001.jpg
1500
+ trainer_images/508_Sir_Gregor/image_002.jpg
1501
+ trainer_images/508_Sir_Gregor/image_003.jpg
1502
+ trainer_images/509_Carl_Chuckle/image_001.jpg
1503
+ trainer_images/509_Carl_Chuckle/image_002.jpg
1504
+ trainer_images/509_Carl_Chuckle/image_003.jpg
1505
+ trainer_images/510_Jazz_Fingers/image_001.jpg
1506
+ trainer_images/510_Jazz_Fingers/image_002.jpg
1507
+ trainer_images/510_Jazz_Fingers/image_003.jpg
1508
+ trainer_images/511_Vinyl_Vince/image_001.jpg
1509
+ trainer_images/511_Vinyl_Vince/image_002.jpg
1510
+ trainer_images/511_Vinyl_Vince/image_003.jpg
1511
+ trainer_images/512_Mr_Whiskerz/image_001.jpg
1512
+ trainer_images/512_Mr_Whiskerz/image_002.jpg
1513
+ trainer_images/512_Mr_Whiskerz/image_003.jpg
1514
+ trainer_images/513_Arrow_Arlo/image_001.jpg
1515
+ trainer_images/513_Arrow_Arlo/image_002.jpg
1516
+ trainer_images/513_Arrow_Arlo/image_003.jpg
1517
+ trainer_images/514_Petra_Stack/image_001.jpg
1518
+ trainer_images/514_Petra_Stack/image_002.jpg
1519
+ trainer_images/514_Petra_Stack/image_003.jpg
1520
+ trainer_images/515_Chompy_Chuck/image_001.jpg
1521
+ trainer_images/515_Chompy_Chuck/image_002.jpg
1522
+ trainer_images/515_Chompy_Chuck/image_003.jpg
1523
+ trainer_images/516_Chairman_Meow/image_001.jpg
1524
+ trainer_images/516_Chairman_Meow/image_002.jpg
1525
+ trainer_images/516_Chairman_Meow/image_003.jpg
1526
+ trainer_images/517_Loopy_Liz/image_001.jpg
1527
+ trainer_images/517_Loopy_Liz/image_002.jpg
1528
+ trainer_images/517_Loopy_Liz/image_003.jpg
1529
+ trainer_images/518_Stanky_Pete/image_001.jpg
1530
+ trainer_images/518_Stanky_Pete/image_002.jpg
1531
+ trainer_images/518_Stanky_Pete/image_003.jpg
1532
+ trainer_images/519_Rusty_Tune/image_001.jpg
1533
+ trainer_images/519_Rusty_Tune/image_002.jpg
1534
+ trainer_images/519_Rusty_Tune/image_003.jpg
1535
+ trainer_images/520_Kim_Tastic/image_001.jpg
1536
+ trainer_images/520_Kim_Tastic/image_002.jpg
1537
+ trainer_images/520_Kim_Tastic/image_003.jpg
1538
+ trainer_images/521_Lil_Bop/image_001.jpg
1539
+ trainer_images/521_Lil_Bop/image_002.jpg
1540
+ trainer_images/521_Lil_Bop/image_003.jpg
1541
+ trainer_images/522_Ducky_Dan/image_001.jpg
1542
+ trainer_images/522_Ducky_Dan/image_002.jpg
1543
+ trainer_images/522_Ducky_Dan/image_003.jpg
1544
+ trainer_images/523_Fae_Splash/image_001.jpg
1545
+ trainer_images/523_Fae_Splash/image_002.jpg
1546
+ trainer_images/523_Fae_Splash/image_003.jpg
1547
+ trainer_images/524_Clutter_Carla/image_001.jpg
1548
+ trainer_images/524_Clutter_Carla/image_002.jpg
1549
+ trainer_images/524_Clutter_Carla/image_003.jpg
1550
+ trainer_images/525_Otto_Stahl/image_001.jpg
1551
+ trainer_images/525_Otto_Stahl/image_002.jpg
1552
+ trainer_images/525_Otto_Stahl/image_003.jpg
1553
+ trainer_images/526_Nigel_RAF/image_001.jpg
1554
+ trainer_images/526_Nigel_RAF/image_002.jpg
1555
+ trainer_images/526_Nigel_RAF/image_003.jpg
1556
+ trainer_images/527_Comrade_Toma/image_001.jpg
1557
+ trainer_images/527_Comrade_Toma/image_002.jpg
1558
+ trainer_images/527_Comrade_Toma/image_003.jpg
1559
+ trainer_images/528_Sabine_Covert/image_001.jpg
1560
+ trainer_images/528_Sabine_Covert/image_002.jpg
1561
+ trainer_images/528_Sabine_Covert/image_003.jpg
1562
+ trainer_images/529_Grugg_Smudge/image_001.jpg
1563
+ trainer_images/529_Grugg_Smudge/image_002.jpg
1564
+ trainer_images/529_Grugg_Smudge/image_003.jpg
1565
+ trainer_images/530_Maximus_Forum/image_001.jpg
1566
+ trainer_images/530_Maximus_Forum/image_002.jpg
1567
+ trainer_images/530_Maximus_Forum/image_003.jpg
1568
+ trainer_images/531_Marin_Vale/image_001.jpg
1569
+ trainer_images/531_Marin_Vale/image_002.jpg
1570
+ trainer_images/531_Marin_Vale/image_003.jpg
1571
+ trainer_images/532_Lt_Skyler/image_001.jpg
1572
+ trainer_images/532_Lt_Skyler/image_002.jpg
1573
+ trainer_images/532_Lt_Skyler/image_003.jpg
1574
+ trainer_images/533_Kenzo_Pulse/image_001.jpg
1575
+ trainer_images/533_Kenzo_Pulse/image_002.jpg
1576
+ trainer_images/533_Kenzo_Pulse/image_003.jpg
1577
+ trainer_images/534_Deckhand_Rizzo/image_001.jpg
1578
+ trainer_images/534_Deckhand_Rizzo/image_002.jpg
1579
+ trainer_images/534_Deckhand_Rizzo/image_003.jpg
src/lib/components/AutoTrainerScanner.svelte ADDED
@@ -0,0 +1,537 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script lang="ts">
2
+ import type { GradioClient } from '$lib/types';
3
+ import { TrainerScanService, type TrainerScanState } from '$lib/services/trainerScanService';
4
+ import { getScanningStats, resetFailedScans } from '$lib/db/trainerScanning';
5
+
6
+ interface Props {
7
+ joyCaptionClient: GradioClient;
8
+ zephyrClient: GradioClient;
9
+ fluxClient: GradioClient;
10
+ }
11
+
12
+ let { joyCaptionClient, zephyrClient, fluxClient }: Props = $props();
13
+
14
+ // Service instance
15
+ let scanService: TrainerScanService;
16
+
17
+ // Component state
18
+ let scanState: TrainerScanState = $state({
19
+ isScanning: false,
20
+ currentImage: null,
21
+ currentTrainer: null,
22
+ progress: {
23
+ total: 0,
24
+ completed: 0,
25
+ failed: 0,
26
+ pending: 0
27
+ },
28
+ error: null
29
+ });
30
+
31
+ let showAdvanced = $state(false);
32
+ let isInitializing = $state(false);
33
+
34
+ // Initialize service when clients are available
35
+ $effect(() => {
36
+ if (joyCaptionClient && zephyrClient && fluxClient) {
37
+ scanService = new TrainerScanService(joyCaptionClient, zephyrClient, fluxClient);
38
+
39
+ // Subscribe to state changes
40
+ scanService.onStateChange((newState) => {
41
+ scanState = newState;
42
+ });
43
+
44
+ // Load initial stats
45
+ loadStats();
46
+ }
47
+ });
48
+
49
+ async function loadStats() {
50
+ try {
51
+ const stats = await getScanningStats();
52
+ scanState.progress = {
53
+ total: stats.total,
54
+ completed: stats.completed,
55
+ failed: stats.failed,
56
+ pending: stats.pending
57
+ };
58
+ } catch (error) {
59
+ console.error('Failed to load scanning stats:', error);
60
+ }
61
+ }
62
+
63
+ async function handleStartScanning() {
64
+ if (!scanService) return;
65
+
66
+ try {
67
+ isInitializing = true;
68
+ await scanService.startScanning();
69
+ } catch (error) {
70
+ scanState.error = error instanceof Error ? error.message : 'Failed to start scanning';
71
+ } finally {
72
+ isInitializing = false;
73
+ }
74
+ }
75
+
76
+ function handleStopScanning() {
77
+ if (scanService) {
78
+ scanService.stopScanning();
79
+ }
80
+ }
81
+
82
+ async function handleResetFailed() {
83
+ try {
84
+ const resetCount = await resetFailedScans();
85
+ await loadStats();
86
+ scanState.error = null;
87
+ alert(`Reset ${resetCount} failed scans back to pending`);
88
+ } catch (error) {
89
+ scanState.error = error instanceof Error ? error.message : 'Failed to reset failed scans';
90
+ }
91
+ }
92
+
93
+ async function handleInitializeDatabase() {
94
+ if (!scanService) return;
95
+
96
+ try {
97
+ isInitializing = true;
98
+ await scanService.initializeFromFile();
99
+ await loadStats();
100
+ scanState.error = null;
101
+ } catch (error) {
102
+ scanState.error = error instanceof Error ? error.message : 'Failed to initialize database';
103
+ } finally {
104
+ isInitializing = false;
105
+ }
106
+ }
107
+
108
+ function getProgressPercentage(): number {
109
+ if (scanState.progress.total === 0) return 0;
110
+ return Math.round((scanState.progress.completed / scanState.progress.total) * 100);
111
+ }
112
+
113
+ function formatTrainerName(name: string | null): string {
114
+ if (!name) return '';
115
+ return name.replace(/^\d+_/, '').replace(/_/g, ' ');
116
+ }
117
+ </script>
118
+
119
+ <div class="auto-trainer-scanner">
120
+ <div class="scanner-header">
121
+ <h3>🤖 Auto Trainer Scanner</h3>
122
+ <button
123
+ class="toggle-advanced"
124
+ onclick={() => showAdvanced = !showAdvanced}
125
+ >
126
+ {showAdvanced ? '▼' : '▶'} Advanced
127
+ </button>
128
+ </div>
129
+
130
+ <!-- Main Controls -->
131
+ <div class="main-controls">
132
+ {#if scanState.progress.total === 0}
133
+ <div class="setup-section">
134
+ <p>Initialize the trainer scanning database to get started.</p>
135
+ <button
136
+ class="init-button"
137
+ onclick={handleInitializeDatabase}
138
+ disabled={isInitializing}
139
+ >
140
+ {isInitializing ? 'Initializing...' : 'Initialize Scanner'}
141
+ </button>
142
+ </div>
143
+ {:else}
144
+ <div class="scan-controls">
145
+ {#if !scanState.isScanning}
146
+ <button
147
+ class="start-button"
148
+ onclick={handleStartScanning}
149
+ disabled={scanState.progress.pending === 0 || isInitializing}
150
+ >
151
+ {isInitializing ? 'Starting...' : 'Start Auto Scan'}
152
+ </button>
153
+ {:else}
154
+ <button
155
+ class="stop-button"
156
+ onclick={handleStopScanning}
157
+ >
158
+ Stop Scanning
159
+ </button>
160
+ {/if}
161
+ </div>
162
+ {/if}
163
+ </div>
164
+
165
+ <!-- Progress Display -->
166
+ {#if scanState.progress.total > 0}
167
+ <div class="progress-section">
168
+ <div class="progress-stats">
169
+ <div class="stat">
170
+ <span class="stat-value">{scanState.progress.completed}</span>
171
+ <span class="stat-label">Completed</span>
172
+ </div>
173
+ <div class="stat">
174
+ <span class="stat-value">{scanState.progress.pending}</span>
175
+ <span class="stat-label">Pending</span>
176
+ </div>
177
+ <div class="stat">
178
+ <span class="stat-value">{scanState.progress.failed}</span>
179
+ <span class="stat-label">Failed</span>
180
+ </div>
181
+ <div class="stat">
182
+ <span class="stat-value">{scanState.progress.total}</span>
183
+ <span class="stat-label">Total</span>
184
+ </div>
185
+ </div>
186
+
187
+ <div class="progress-bar">
188
+ <div class="progress-fill" style="width: {getProgressPercentage()}%"></div>
189
+ <span class="progress-text">{getProgressPercentage()}%</span>
190
+ </div>
191
+
192
+ {#if scanState.isScanning && scanState.currentTrainer}
193
+ <div class="current-processing">
194
+ <div class="processing-spinner"></div>
195
+ <span>Processing: {formatTrainerName(scanState.currentTrainer)}</span>
196
+ </div>
197
+ {/if}
198
+ </div>
199
+ {/if}
200
+
201
+ <!-- Error Display -->
202
+ {#if scanState.error}
203
+ <div class="error-section">
204
+ <div class="error-message">
205
+ ⚠️ {scanState.error}
206
+ </div>
207
+ <button
208
+ class="error-dismiss"
209
+ onclick={() => scanState.error = null}
210
+ >
211
+ Dismiss
212
+ </button>
213
+ </div>
214
+ {/if}
215
+
216
+ <!-- Advanced Controls -->
217
+ {#if showAdvanced}
218
+ <div class="advanced-section">
219
+ <h4>Advanced Options</h4>
220
+ <div class="advanced-controls">
221
+ <button
222
+ class="reset-button"
223
+ onclick={handleResetFailed}
224
+ disabled={scanState.progress.failed === 0}
225
+ >
226
+ Reset Failed ({scanState.progress.failed})
227
+ </button>
228
+
229
+ <button
230
+ class="reinit-button"
231
+ onclick={handleInitializeDatabase}
232
+ disabled={isInitializing}
233
+ >
234
+ Re-initialize Database
235
+ </button>
236
+ </div>
237
+
238
+ <div class="info-section">
239
+ <p><strong>How it works:</strong></p>
240
+ <ul>
241
+ <li>Loads trainer images from HuggingFace dataset</li>
242
+ <li>Generates unique piclets using Joy Caption + Zephyr-7B</li>
243
+ <li>Tracks progress in IndexedDB to prevent duplicates</li>
244
+ <li>Can be stopped and resumed at any time</li>
245
+ </ul>
246
+ </div>
247
+ </div>
248
+ {/if}
249
+ </div>
250
+
251
+ <style>
252
+ .auto-trainer-scanner {
253
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
254
+ border-radius: 12px;
255
+ padding: 20px;
256
+ margin: 16px 0;
257
+ color: white;
258
+ box-shadow: 0 4px 15px rgba(0,0,0,0.2);
259
+ }
260
+
261
+ .scanner-header {
262
+ display: flex;
263
+ justify-content: space-between;
264
+ align-items: center;
265
+ margin-bottom: 16px;
266
+ }
267
+
268
+ .scanner-header h3 {
269
+ margin: 0;
270
+ font-size: 1.2rem;
271
+ font-weight: 600;
272
+ }
273
+
274
+ .toggle-advanced {
275
+ background: rgba(255, 255, 255, 0.2);
276
+ border: none;
277
+ color: white;
278
+ padding: 4px 8px;
279
+ border-radius: 4px;
280
+ cursor: pointer;
281
+ font-size: 0.9rem;
282
+ transition: background-color 0.2s;
283
+ }
284
+
285
+ .toggle-advanced:hover {
286
+ background: rgba(255, 255, 255, 0.3);
287
+ }
288
+
289
+ .main-controls {
290
+ margin-bottom: 16px;
291
+ }
292
+
293
+ .setup-section {
294
+ text-align: center;
295
+ padding: 20px;
296
+ }
297
+
298
+ .setup-section p {
299
+ margin-bottom: 16px;
300
+ opacity: 0.9;
301
+ }
302
+
303
+ .init-button {
304
+ background: #4CAF50;
305
+ color: white;
306
+ border: none;
307
+ padding: 12px 24px;
308
+ border-radius: 8px;
309
+ font-size: 1rem;
310
+ cursor: pointer;
311
+ transition: background-color 0.2s;
312
+ }
313
+
314
+ .init-button:hover:not(:disabled) {
315
+ background: #45a049;
316
+ }
317
+
318
+ .init-button:disabled {
319
+ background: #666;
320
+ cursor: not-allowed;
321
+ }
322
+
323
+ .scan-controls {
324
+ display: flex;
325
+ justify-content: center;
326
+ }
327
+
328
+ .start-button {
329
+ background: #4CAF50;
330
+ color: white;
331
+ border: none;
332
+ padding: 12px 24px;
333
+ border-radius: 8px;
334
+ font-size: 1rem;
335
+ cursor: pointer;
336
+ transition: background-color 0.2s;
337
+ }
338
+
339
+ .start-button:hover:not(:disabled) {
340
+ background: #45a049;
341
+ }
342
+
343
+ .start-button:disabled {
344
+ background: #666;
345
+ cursor: not-allowed;
346
+ }
347
+
348
+ .stop-button {
349
+ background: #f44336;
350
+ color: white;
351
+ border: none;
352
+ padding: 12px 24px;
353
+ border-radius: 8px;
354
+ font-size: 1rem;
355
+ cursor: pointer;
356
+ transition: background-color 0.2s;
357
+ }
358
+
359
+ .stop-button:hover {
360
+ background: #da190b;
361
+ }
362
+
363
+ .progress-section {
364
+ background: rgba(255, 255, 255, 0.1);
365
+ border-radius: 8px;
366
+ padding: 16px;
367
+ margin-bottom: 16px;
368
+ }
369
+
370
+ .progress-stats {
371
+ display: grid;
372
+ grid-template-columns: repeat(4, 1fr);
373
+ gap: 16px;
374
+ margin-bottom: 16px;
375
+ }
376
+
377
+ .stat {
378
+ text-align: center;
379
+ }
380
+
381
+ .stat-value {
382
+ display: block;
383
+ font-size: 1.5rem;
384
+ font-weight: bold;
385
+ color: #FFD700;
386
+ }
387
+
388
+ .stat-label {
389
+ display: block;
390
+ font-size: 0.8rem;
391
+ opacity: 0.8;
392
+ margin-top: 4px;
393
+ }
394
+
395
+ .progress-bar {
396
+ position: relative;
397
+ background: rgba(255, 255, 255, 0.2);
398
+ border-radius: 10px;
399
+ height: 20px;
400
+ overflow: hidden;
401
+ margin-bottom: 12px;
402
+ }
403
+
404
+ .progress-fill {
405
+ background: linear-gradient(90deg, #FFD700, #FFA500);
406
+ height: 100%;
407
+ transition: width 0.3s ease;
408
+ border-radius: 10px;
409
+ }
410
+
411
+ .progress-text {
412
+ position: absolute;
413
+ top: 50%;
414
+ left: 50%;
415
+ transform: translate(-50%, -50%);
416
+ font-size: 0.8rem;
417
+ font-weight: bold;
418
+ color: #333;
419
+ }
420
+
421
+ .current-processing {
422
+ display: flex;
423
+ align-items: center;
424
+ gap: 8px;
425
+ font-size: 0.9rem;
426
+ opacity: 0.9;
427
+ }
428
+
429
+ .processing-spinner {
430
+ width: 16px;
431
+ height: 16px;
432
+ border: 2px solid rgba(255, 255, 255, 0.3);
433
+ border-top: 2px solid white;
434
+ border-radius: 50%;
435
+ animation: spin 1s linear infinite;
436
+ }
437
+
438
+ @keyframes spin {
439
+ to { transform: rotate(360deg); }
440
+ }
441
+
442
+ .error-section {
443
+ background: rgba(244, 67, 54, 0.2);
444
+ border: 1px solid rgba(244, 67, 54, 0.5);
445
+ border-radius: 8px;
446
+ padding: 12px;
447
+ margin-bottom: 16px;
448
+ display: flex;
449
+ justify-content: space-between;
450
+ align-items: center;
451
+ }
452
+
453
+ .error-message {
454
+ font-size: 0.9rem;
455
+ }
456
+
457
+ .error-dismiss {
458
+ background: none;
459
+ border: 1px solid rgba(255, 255, 255, 0.5);
460
+ color: white;
461
+ padding: 4px 8px;
462
+ border-radius: 4px;
463
+ cursor: pointer;
464
+ font-size: 0.8rem;
465
+ }
466
+
467
+ .error-dismiss:hover {
468
+ background: rgba(255, 255, 255, 0.1);
469
+ }
470
+
471
+ .advanced-section {
472
+ background: rgba(255, 255, 255, 0.1);
473
+ border-radius: 8px;
474
+ padding: 16px;
475
+ margin-top: 16px;
476
+ }
477
+
478
+ .advanced-section h4 {
479
+ margin: 0 0 12px 0;
480
+ font-size: 1rem;
481
+ }
482
+
483
+ .advanced-controls {
484
+ display: flex;
485
+ gap: 12px;
486
+ margin-bottom: 16px;
487
+ flex-wrap: wrap;
488
+ }
489
+
490
+ .reset-button, .reinit-button {
491
+ background: rgba(255, 255, 255, 0.2);
492
+ color: white;
493
+ border: 1px solid rgba(255, 255, 255, 0.3);
494
+ padding: 8px 16px;
495
+ border-radius: 6px;
496
+ cursor: pointer;
497
+ font-size: 0.9rem;
498
+ transition: background-color 0.2s;
499
+ }
500
+
501
+ .reset-button:hover:not(:disabled), .reinit-button:hover:not(:disabled) {
502
+ background: rgba(255, 255, 255, 0.3);
503
+ }
504
+
505
+ .reset-button:disabled, .reinit-button:disabled {
506
+ opacity: 0.5;
507
+ cursor: not-allowed;
508
+ }
509
+
510
+ .info-section {
511
+ font-size: 0.85rem;
512
+ opacity: 0.9;
513
+ }
514
+
515
+ .info-section ul {
516
+ margin: 8px 0 0 0;
517
+ padding-left: 20px;
518
+ }
519
+
520
+ .info-section li {
521
+ margin-bottom: 4px;
522
+ }
523
+
524
+ @media (max-width: 600px) {
525
+ .progress-stats {
526
+ grid-template-columns: repeat(2, 1fr);
527
+ }
528
+
529
+ .advanced-controls {
530
+ flex-direction: column;
531
+ }
532
+
533
+ .reset-button, .reinit-button {
534
+ width: 100%;
535
+ }
536
+ }
537
+ </style>
src/lib/components/AutoTrainerScanner/AutoTrainerScanner.svelte ADDED
@@ -0,0 +1,484 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script lang="ts">
2
+ import type { GradioClient } from '$lib/types';
3
+ import { TrainerScanService, type TrainerScanState } from '$lib/services/trainerScanService';
4
+ import { resetFailedScans } from '$lib/db/trainerScanning';
5
+
6
+ interface Props {
7
+ joyCaptionClient: GradioClient;
8
+ zephyrClient: GradioClient;
9
+ fluxClient: GradioClient;
10
+ }
11
+
12
+ let { joyCaptionClient, zephyrClient, fluxClient }: Props = $props();
13
+
14
+ // Scanner service and state
15
+ let scanService: TrainerScanService | null = null;
16
+ let scanState: TrainerScanState = $state({
17
+ isScanning: false,
18
+ currentImage: null,
19
+ currentTrainer: null,
20
+ progress: {
21
+ total: 0,
22
+ completed: 0,
23
+ failed: 0,
24
+ pending: 0
25
+ },
26
+ error: null
27
+ });
28
+
29
+ let showDetails = $state(false);
30
+ let isInitializing = $state(false);
31
+
32
+ // Initialize scan service when clients are available
33
+ $effect(() => {
34
+ if (joyCaptionClient && zephyrClient && fluxClient && !scanService) {
35
+ scanService = new TrainerScanService(joyCaptionClient, zephyrClient, fluxClient);
36
+
37
+ // Subscribe to state changes
38
+ scanService.onStateChange((newState) => {
39
+ scanState = newState;
40
+ });
41
+
42
+ // Load initial state
43
+ loadInitialState();
44
+ }
45
+ });
46
+
47
+ async function loadInitialState() {
48
+ if (!scanService) return;
49
+
50
+ try {
51
+ isInitializing = true;
52
+ await scanService.initializeFromFile();
53
+ } catch (error) {
54
+ console.error('Failed to initialize scanner:', error);
55
+ scanState.error = error instanceof Error ? error.message : 'Failed to initialize';
56
+ } finally {
57
+ isInitializing = false;
58
+ }
59
+ }
60
+
61
+ async function startScanning() {
62
+ if (!scanService) return;
63
+
64
+ try {
65
+ await scanService.startScanning();
66
+ } catch (error) {
67
+ console.error('Failed to start scanning:', error);
68
+ scanState.error = error instanceof Error ? error.message : 'Failed to start scanning';
69
+ }
70
+ }
71
+
72
+ function stopScanning() {
73
+ if (!scanService) return;
74
+ scanService.stopScanning();
75
+ }
76
+
77
+ async function retryFailedScans() {
78
+ try {
79
+ const resetCount = await resetFailedScans();
80
+ console.log(`Reset ${resetCount} failed scans to pending`);
81
+
82
+ // Refresh state
83
+ if (scanService) {
84
+ await scanService.initializeFromFile();
85
+ }
86
+ } catch (error) {
87
+ console.error('Failed to retry failed scans:', error);
88
+ scanState.error = error instanceof Error ? error.message : 'Failed to retry failed scans';
89
+ }
90
+ }
91
+
92
+ function formatImageName(imagePath: string | null): string {
93
+ if (!imagePath) return '';
94
+ const parts = imagePath.split('/');
95
+ return parts[parts.length - 1] || '';
96
+ }
97
+
98
+ function formatTrainerName(trainerName: string | null): string {
99
+ if (!trainerName) return '';
100
+ // Convert "001_Willow_Snap" to "Willow Snap"
101
+ return trainerName.split('_').slice(1).join(' ');
102
+ }
103
+
104
+ function getProgressPercent(): number {
105
+ const { total, completed } = scanState.progress;
106
+ return total > 0 ? Math.round((completed / total) * 100) : 0;
107
+ }
108
+ </script>
109
+
110
+ <div class="auto-trainer-scanner">
111
+ <div class="scanner-header">
112
+ <div class="title-section">
113
+ <h3>🤖 Auto Trainer Scanner</h3>
114
+ <button
115
+ class="details-toggle"
116
+ onclick={() => showDetails = !showDetails}
117
+ >
118
+ {showDetails ? '▼' : '▶'} Details
119
+ </button>
120
+ </div>
121
+
122
+ {#if scanState.progress.total > 0}
123
+ <div class="progress-summary">
124
+ <div class="progress-bar">
125
+ <div
126
+ class="progress-fill"
127
+ style="width: {getProgressPercent()}%"
128
+ ></div>
129
+ </div>
130
+ <span class="progress-text">
131
+ {scanState.progress.completed} / {scanState.progress.total} ({getProgressPercent()}%)
132
+ </span>
133
+ </div>
134
+ {/if}
135
+ </div>
136
+
137
+ {#if showDetails}
138
+ <div class="scanner-details">
139
+ {#if isInitializing}
140
+ <div class="status-message">
141
+ <div class="spinner"></div>
142
+ <span>Initializing scanner...</span>
143
+ </div>
144
+ {:else if scanState.isScanning}
145
+ <div class="scanning-status">
146
+ <div class="current-processing">
147
+ <div class="spinner"></div>
148
+ <div class="processing-info">
149
+ <div class="current-trainer">
150
+ Processing: <strong>{formatTrainerName(scanState.currentTrainer)}</strong>
151
+ </div>
152
+ <div class="current-image">
153
+ {formatImageName(scanState.currentImage)}
154
+ </div>
155
+ </div>
156
+ </div>
157
+
158
+ <button class="stop-button" onclick={stopScanning}>
159
+ ⏹️ Stop Scanning
160
+ </button>
161
+ </div>
162
+ {:else}
163
+ <div class="scanner-controls">
164
+ <button
165
+ class="start-button"
166
+ onclick={startScanning}
167
+ disabled={scanState.progress.pending === 0}
168
+ >
169
+ ▶️ Start Auto Scan
170
+ </button>
171
+
172
+ {#if scanState.progress.failed > 0}
173
+ <button class="retry-button" onclick={retryFailedScans}>
174
+ 🔄 Retry Failed ({scanState.progress.failed})
175
+ </button>
176
+ {/if}
177
+ </div>
178
+ {/if}
179
+
180
+ {#if scanState.progress.total > 0}
181
+ <div class="progress-details">
182
+ <div class="progress-stats">
183
+ <div class="stat">
184
+ <span class="stat-label">Total:</span>
185
+ <span class="stat-value">{scanState.progress.total}</span>
186
+ </div>
187
+ <div class="stat completed">
188
+ <span class="stat-label">Completed:</span>
189
+ <span class="stat-value">{scanState.progress.completed}</span>
190
+ </div>
191
+ <div class="stat pending">
192
+ <span class="stat-label">Pending:</span>
193
+ <span class="stat-value">{scanState.progress.pending}</span>
194
+ </div>
195
+ {#if scanState.progress.failed > 0}
196
+ <div class="stat failed">
197
+ <span class="stat-label">Failed:</span>
198
+ <span class="stat-value">{scanState.progress.failed}</span>
199
+ </div>
200
+ {/if}
201
+ </div>
202
+ </div>
203
+ {/if}
204
+
205
+ {#if scanState.error}
206
+ <div class="error-message">
207
+ <strong>Error:</strong> {scanState.error}
208
+ </div>
209
+ {/if}
210
+
211
+ <div class="scanner-info">
212
+ <p>
213
+ This will automatically process trainer images from the HuggingFace dataset,
214
+ converting them into unique Piclets. The scanner will resume from where it left off
215
+ if interrupted.
216
+ </p>
217
+ </div>
218
+ </div>
219
+ {/if}
220
+ </div>
221
+
222
+ <style>
223
+ .auto-trainer-scanner {
224
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
225
+ border-radius: 12px;
226
+ padding: 1rem;
227
+ margin-bottom: 1rem;
228
+ color: white;
229
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
230
+ }
231
+
232
+ .scanner-header {
233
+ display: flex;
234
+ flex-direction: column;
235
+ gap: 0.5rem;
236
+ }
237
+
238
+ .title-section {
239
+ display: flex;
240
+ align-items: center;
241
+ justify-content: space-between;
242
+ }
243
+
244
+ .title-section h3 {
245
+ margin: 0;
246
+ font-size: 1.1rem;
247
+ }
248
+
249
+ .details-toggle {
250
+ background: rgba(255, 255, 255, 0.2);
251
+ border: none;
252
+ color: white;
253
+ padding: 0.3rem 0.6rem;
254
+ border-radius: 6px;
255
+ cursor: pointer;
256
+ font-size: 0.9rem;
257
+ transition: background-color 0.2s;
258
+ }
259
+
260
+ .details-toggle:hover {
261
+ background: rgba(255, 255, 255, 0.3);
262
+ }
263
+
264
+ .progress-summary {
265
+ display: flex;
266
+ align-items: center;
267
+ gap: 1rem;
268
+ }
269
+
270
+ .progress-bar {
271
+ flex: 1;
272
+ height: 8px;
273
+ background: rgba(255, 255, 255, 0.2);
274
+ border-radius: 4px;
275
+ overflow: hidden;
276
+ }
277
+
278
+ .progress-fill {
279
+ height: 100%;
280
+ background: linear-gradient(90deg, #4facfe 0%, #00f2fe 100%);
281
+ transition: width 0.3s ease;
282
+ }
283
+
284
+ .progress-text {
285
+ font-size: 0.9rem;
286
+ font-weight: 500;
287
+ white-space: nowrap;
288
+ }
289
+
290
+ .scanner-details {
291
+ margin-top: 1rem;
292
+ padding-top: 1rem;
293
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
294
+ }
295
+
296
+ .status-message {
297
+ display: flex;
298
+ align-items: center;
299
+ gap: 0.5rem;
300
+ padding: 0.8rem;
301
+ background: rgba(255, 255, 255, 0.1);
302
+ border-radius: 8px;
303
+ margin-bottom: 1rem;
304
+ }
305
+
306
+ .scanning-status {
307
+ display: flex;
308
+ flex-direction: column;
309
+ gap: 1rem;
310
+ }
311
+
312
+ .current-processing {
313
+ display: flex;
314
+ align-items: center;
315
+ gap: 1rem;
316
+ padding: 1rem;
317
+ background: rgba(255, 255, 255, 0.1);
318
+ border-radius: 8px;
319
+ }
320
+
321
+ .processing-info {
322
+ flex: 1;
323
+ }
324
+
325
+ .current-trainer {
326
+ font-size: 1rem;
327
+ margin-bottom: 0.3rem;
328
+ }
329
+
330
+ .current-image {
331
+ font-size: 0.9rem;
332
+ opacity: 0.8;
333
+ }
334
+
335
+ .scanner-controls {
336
+ display: flex;
337
+ gap: 0.8rem;
338
+ margin-bottom: 1rem;
339
+ }
340
+
341
+ .start-button, .stop-button, .retry-button {
342
+ padding: 0.8rem 1.2rem;
343
+ border: none;
344
+ border-radius: 8px;
345
+ font-weight: 500;
346
+ cursor: pointer;
347
+ transition: all 0.2s;
348
+ }
349
+
350
+ .start-button {
351
+ background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
352
+ color: white;
353
+ }
354
+
355
+ .start-button:hover:not(:disabled) {
356
+ transform: translateY(-1px);
357
+ box-shadow: 0 4px 8px rgba(79, 172, 254, 0.3);
358
+ }
359
+
360
+ .start-button:disabled {
361
+ background: rgba(255, 255, 255, 0.3);
362
+ cursor: not-allowed;
363
+ opacity: 0.6;
364
+ }
365
+
366
+ .stop-button {
367
+ background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 100%);
368
+ color: white;
369
+ }
370
+
371
+ .stop-button:hover {
372
+ transform: translateY(-1px);
373
+ box-shadow: 0 4px 8px rgba(255, 107, 107, 0.3);
374
+ }
375
+
376
+ .retry-button {
377
+ background: linear-gradient(135deg, #ffa726 0%, #ff7043 100%);
378
+ color: white;
379
+ }
380
+
381
+ .retry-button:hover {
382
+ transform: translateY(-1px);
383
+ box-shadow: 0 4px 8px rgba(255, 167, 38, 0.3);
384
+ }
385
+
386
+ .progress-details {
387
+ margin-bottom: 1rem;
388
+ }
389
+
390
+ .progress-stats {
391
+ display: grid;
392
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
393
+ gap: 0.8rem;
394
+ }
395
+
396
+ .stat {
397
+ display: flex;
398
+ justify-content: space-between;
399
+ align-items: center;
400
+ padding: 0.6rem;
401
+ background: rgba(255, 255, 255, 0.1);
402
+ border-radius: 6px;
403
+ border-left: 3px solid rgba(255, 255, 255, 0.5);
404
+ }
405
+
406
+ .stat.completed {
407
+ border-left-color: #4caf50;
408
+ }
409
+
410
+ .stat.pending {
411
+ border-left-color: #ff9800;
412
+ }
413
+
414
+ .stat.failed {
415
+ border-left-color: #f44336;
416
+ }
417
+
418
+ .stat-label {
419
+ font-size: 0.9rem;
420
+ opacity: 0.9;
421
+ }
422
+
423
+ .stat-value {
424
+ font-weight: 600;
425
+ font-size: 1rem;
426
+ }
427
+
428
+ .error-message {
429
+ background: rgba(244, 67, 54, 0.2);
430
+ border: 1px solid rgba(244, 67, 54, 0.4);
431
+ border-radius: 8px;
432
+ padding: 0.8rem;
433
+ margin-bottom: 1rem;
434
+ font-size: 0.9rem;
435
+ }
436
+
437
+ .scanner-info {
438
+ background: rgba(255, 255, 255, 0.1);
439
+ border-radius: 8px;
440
+ padding: 0.8rem;
441
+ font-size: 0.9rem;
442
+ line-height: 1.4;
443
+ }
444
+
445
+ .scanner-info p {
446
+ margin: 0;
447
+ opacity: 0.9;
448
+ }
449
+
450
+ .spinner {
451
+ width: 20px;
452
+ height: 20px;
453
+ border: 2px solid rgba(255, 255, 255, 0.3);
454
+ border-top: 2px solid white;
455
+ border-radius: 50%;
456
+ animation: spin 1s linear infinite;
457
+ }
458
+
459
+ @keyframes spin {
460
+ to { transform: rotate(360deg); }
461
+ }
462
+
463
+ @media (max-width: 768px) {
464
+ .progress-summary {
465
+ flex-direction: column;
466
+ align-items: stretch;
467
+ gap: 0.5rem;
468
+ }
469
+
470
+ .current-processing {
471
+ flex-direction: column;
472
+ align-items: flex-start;
473
+ text-align: left;
474
+ }
475
+
476
+ .scanner-controls {
477
+ flex-direction: column;
478
+ }
479
+
480
+ .progress-stats {
481
+ grid-template-columns: 1fr;
482
+ }
483
+ }
484
+ </style>
src/lib/components/Pages/Scanner.svelte CHANGED
@@ -1,5 +1,6 @@
1
  <script lang="ts">
2
  import PicletGenerator from '../PicletGenerator/PicletGenerator.svelte';
 
3
  import type { GradioClient } from '$lib/types';
4
 
5
  interface Props {
@@ -14,6 +15,14 @@
14
 
15
  <div class="scanner-page">
16
  {#if fluxClient && joyCaptionClient && zephyrClient && qwenClient}
 
 
 
 
 
 
 
 
17
  <PicletGenerator
18
  {fluxClient}
19
  {joyCaptionClient}
 
1
  <script lang="ts">
2
  import PicletGenerator from '../PicletGenerator/PicletGenerator.svelte';
3
+ import AutoTrainerScanner from '../AutoTrainerScanner/AutoTrainerScanner.svelte';
4
  import type { GradioClient } from '$lib/types';
5
 
6
  interface Props {
 
15
 
16
  <div class="scanner-page">
17
  {#if fluxClient && joyCaptionClient && zephyrClient && qwenClient}
18
+ <!-- Auto Trainer Scanner -->
19
+ <AutoTrainerScanner
20
+ {joyCaptionClient}
21
+ {zephyrClient}
22
+ {fluxClient}
23
+ />
24
+
25
+ <!-- Manual Piclet Generator -->
26
  <PicletGenerator
27
  {fluxClient}
28
  {joyCaptionClient}
src/lib/db/index.ts CHANGED
@@ -1,11 +1,12 @@
1
  import Dexie, { type Table } from 'dexie';
2
- import type { PicletInstance, Encounter, GameState } from './schema';
3
 
4
  export class PicletDatabase extends Dexie {
5
  // Game tables
6
  picletInstances!: Table<PicletInstance>;
7
  encounters!: Table<Encounter>;
8
  gameState!: Table<GameState>;
 
9
 
10
  constructor() {
11
  super('PicletGameDB');
@@ -30,6 +31,14 @@ export class PicletDatabase extends Dexie {
30
  encounters: '++id, type, createdAt',
31
  gameState: '++id, lastPlayed'
32
  });
 
 
 
 
 
 
 
 
33
  }
34
  }
35
 
 
1
  import Dexie, { type Table } from 'dexie';
2
+ import type { PicletInstance, Encounter, GameState, TrainerScanProgress } from './schema';
3
 
4
  export class PicletDatabase extends Dexie {
5
  // Game tables
6
  picletInstances!: Table<PicletInstance>;
7
  encounters!: Table<Encounter>;
8
  gameState!: Table<GameState>;
9
+ trainerScanProgress!: Table<TrainerScanProgress>;
10
 
11
  constructor() {
12
  super('PicletGameDB');
 
31
  encounters: '++id, type, createdAt',
32
  gameState: '++id, lastPlayed'
33
  });
34
+
35
+ // Version 6: Add trainer scanning progress table
36
+ this.version(6).stores({
37
+ picletInstances: '++id, typeId, nickname, isInRoster, rosterPosition, caughtAt',
38
+ encounters: '++id, type, createdAt',
39
+ gameState: '++id, lastPlayed',
40
+ trainerScanProgress: 'imagePath, trainerName, status, completedAt'
41
+ });
42
  }
43
  }
44
 
src/lib/db/schema.ts CHANGED
@@ -141,3 +141,27 @@ export interface BattleState {
141
  capturedPiclet?: PicletInstance;
142
  }
143
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  capturedPiclet?: PicletInstance;
142
  }
143
 
144
+ // Trainer Scanning Progress - Track automated trainer piclet generation
145
+ export interface TrainerScanProgress {
146
+ id?: number;
147
+
148
+ // Image Info
149
+ imagePath: string; // e.g., "trainer_images/001_Willow_Snap/image_001.jpg"
150
+ trainerName: string; // e.g., "001_Willow_Snap"
151
+ imageIndex: number; // e.g., 1, 2, 3 for multiple images per trainer
152
+
153
+ // Processing Status
154
+ status: 'pending' | 'processing' | 'completed' | 'failed';
155
+
156
+ // Results
157
+ picletInstanceId?: number; // ID of generated piclet if successful
158
+ errorMessage?: string; // Error details if failed
159
+
160
+ // Timing
161
+ startedAt?: Date;
162
+ completedAt?: Date;
163
+
164
+ // Remote URL for reference
165
+ remoteUrl: string; // Full HuggingFace URL
166
+ }
167
+
src/lib/db/trainerScanning.ts ADDED
@@ -0,0 +1,198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { db } from './index';
2
+ import type { TrainerScanProgress } from './schema';
3
+
4
+ const TRAINER_SCAN_STORE = 'trainerScanProgress';
5
+
6
+ // Initialize trainer scan progress records from paths
7
+ export async function initializeTrainerScanProgress(imagePaths: string[]): Promise<void> {
8
+ const tx = db.transaction([TRAINER_SCAN_STORE], 'readwrite');
9
+ const store = tx.objectStore(TRAINER_SCAN_STORE);
10
+
11
+ for (const imagePath of imagePaths) {
12
+ // Extract trainer name and image index from path
13
+ // Format: "trainer_images/001_Willow_Snap/image_001.jpg"
14
+ const pathParts = imagePath.split('/');
15
+ const trainerName = pathParts[1]; // "001_Willow_Snap"
16
+ const imageFile = pathParts[2]; // "image_001.jpg"
17
+ const imageIndex = parseInt(imageFile.match(/image_(\d+)\.jpg/)?.[1] || '1');
18
+
19
+ const remoteUrl = `https://huggingface.co/datasets/Fraser/piclets/resolve/main/${imagePath}`;
20
+
21
+ // Check if this path already exists
22
+ const existing = await store.get(imagePath);
23
+ if (!existing) {
24
+ const progressRecord: Omit<TrainerScanProgress, 'id'> = {
25
+ imagePath,
26
+ trainerName,
27
+ imageIndex,
28
+ status: 'pending',
29
+ remoteUrl
30
+ };
31
+
32
+ await store.add(progressRecord);
33
+ }
34
+ }
35
+
36
+ await tx.complete;
37
+ }
38
+
39
+ // Get next pending image to process
40
+ export async function getNextPendingImage(): Promise<TrainerScanProgress | null> {
41
+ const tx = db.transaction([TRAINER_SCAN_STORE], 'readonly');
42
+ const store = tx.objectStore(TRAINER_SCAN_STORE);
43
+
44
+ // Get all pending records
45
+ const pendingRecords: TrainerScanProgress[] = [];
46
+ let cursor = await store.openCursor();
47
+
48
+ while (cursor) {
49
+ if (cursor.value.status === 'pending') {
50
+ pendingRecords.push(cursor.value);
51
+ }
52
+ cursor = await cursor.continue();
53
+ }
54
+
55
+ // Return the first pending record (if any)
56
+ return pendingRecords.length > 0 ? pendingRecords[0] : null;
57
+ }
58
+
59
+ // Update scan progress status
60
+ export async function updateScanProgress(
61
+ imagePath: string,
62
+ updates: Partial<Omit<TrainerScanProgress, 'id' | 'imagePath'>>
63
+ ): Promise<void> {
64
+ const tx = db.transaction([TRAINER_SCAN_STORE], 'readwrite');
65
+ const store = tx.objectStore(TRAINER_SCAN_STORE);
66
+
67
+ const existing = await store.get(imagePath);
68
+ if (existing) {
69
+ const updated = { ...existing, ...updates };
70
+ await store.put(updated);
71
+ }
72
+
73
+ await tx.complete;
74
+ }
75
+
76
+ // Mark image processing as started
77
+ export async function markImageProcessingStarted(imagePath: string): Promise<void> {
78
+ await updateScanProgress(imagePath, {
79
+ status: 'processing',
80
+ startedAt: new Date()
81
+ });
82
+ }
83
+
84
+ // Mark image processing as completed successfully
85
+ export async function markImageProcessingCompleted(
86
+ imagePath: string,
87
+ picletInstanceId: number
88
+ ): Promise<void> {
89
+ await updateScanProgress(imagePath, {
90
+ status: 'completed',
91
+ picletInstanceId,
92
+ completedAt: new Date()
93
+ });
94
+ }
95
+
96
+ // Mark image processing as failed
97
+ export async function markImageProcessingFailed(
98
+ imagePath: string,
99
+ errorMessage: string
100
+ ): Promise<void> {
101
+ await updateScanProgress(imagePath, {
102
+ status: 'failed',
103
+ errorMessage,
104
+ completedAt: new Date()
105
+ });
106
+ }
107
+
108
+ // Get scanning statistics
109
+ export async function getScanningStats(): Promise<{
110
+ total: number;
111
+ pending: number;
112
+ processing: number;
113
+ completed: number;
114
+ failed: number;
115
+ }> {
116
+ const tx = db.transaction([TRAINER_SCAN_STORE], 'readonly');
117
+ const store = tx.objectStore(TRAINER_SCAN_STORE);
118
+
119
+ const stats = {
120
+ total: 0,
121
+ pending: 0,
122
+ processing: 0,
123
+ completed: 0,
124
+ failed: 0
125
+ };
126
+
127
+ let cursor = await store.openCursor();
128
+ while (cursor) {
129
+ stats.total++;
130
+ const status = cursor.value.status;
131
+ stats[status]++;
132
+ cursor = await cursor.continue();
133
+ }
134
+
135
+ return stats;
136
+ }
137
+
138
+ // Get all completed scans for a specific trainer
139
+ export async function getCompletedScansForTrainer(trainerName: string): Promise<TrainerScanProgress[]> {
140
+ const tx = db.transaction([TRAINER_SCAN_STORE], 'readonly');
141
+ const store = tx.objectStore(TRAINER_SCAN_STORE);
142
+
143
+ const results: TrainerScanProgress[] = [];
144
+ let cursor = await store.openCursor();
145
+
146
+ while (cursor) {
147
+ const record = cursor.value;
148
+ if (record.trainerName === trainerName && record.status === 'completed') {
149
+ results.push(record);
150
+ }
151
+ cursor = await cursor.continue();
152
+ }
153
+
154
+ return results;
155
+ }
156
+
157
+ // Reset all failed scans back to pending (for retry)
158
+ export async function resetFailedScans(): Promise<number> {
159
+ const tx = db.transaction([TRAINER_SCAN_STORE], 'readwrite');
160
+ const store = tx.objectStore(TRAINER_SCAN_STORE);
161
+
162
+ let resetCount = 0;
163
+ let cursor = await store.openCursor();
164
+
165
+ while (cursor) {
166
+ if (cursor.value.status === 'failed') {
167
+ const updated = {
168
+ ...cursor.value,
169
+ status: 'pending' as const,
170
+ errorMessage: undefined,
171
+ startedAt: undefined,
172
+ completedAt: undefined
173
+ };
174
+ await cursor.update(updated);
175
+ resetCount++;
176
+ }
177
+ cursor = await cursor.continue();
178
+ }
179
+
180
+ await tx.complete;
181
+ return resetCount;
182
+ }
183
+
184
+ // Get current processing status (for resuming interrupted sessions)
185
+ export async function getCurrentProcessingImage(): Promise<TrainerScanProgress | null> {
186
+ const tx = db.transaction([TRAINER_SCAN_STORE], 'readonly');
187
+ const store = tx.objectStore(TRAINER_SCAN_STORE);
188
+
189
+ let cursor = await store.openCursor();
190
+ while (cursor) {
191
+ if (cursor.value.status === 'processing') {
192
+ return cursor.value;
193
+ }
194
+ cursor = await cursor.continue();
195
+ }
196
+
197
+ return null;
198
+ }
src/lib/services/trainerScanService.ts ADDED
@@ -0,0 +1,347 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import type { GradioClient } from '$lib/types';
2
+ import {
3
+ initializeTrainerScanProgress,
4
+ getNextPendingImage,
5
+ markImageProcessingStarted,
6
+ markImageProcessingCompleted,
7
+ markImageProcessingFailed,
8
+ getScanningStats,
9
+ getCurrentProcessingImage
10
+ } from '$lib/db/trainerScanning';
11
+ import { savePicletInstance, generatedDataToPicletInstance } from '$lib/db/piclets';
12
+ import { extractPicletMetadata } from './picletMetadata';
13
+ import { removeBackground } from '$lib/utils/professionalImageProcessing';
14
+ import type { PicletStats } from '$lib/types';
15
+
16
+ export interface TrainerScanState {
17
+ isScanning: boolean;
18
+ currentImage: string | null;
19
+ currentTrainer: string | null;
20
+ progress: {
21
+ total: number;
22
+ completed: number;
23
+ failed: number;
24
+ pending: number;
25
+ };
26
+ error: string | null;
27
+ }
28
+
29
+ export class TrainerScanService {
30
+ private joyCaptionClient: GradioClient;
31
+ private zephyrClient: GradioClient;
32
+ private fluxClient: GradioClient;
33
+
34
+ private isScanning = false;
35
+ private shouldStop = false;
36
+ private stateCallbacks: ((state: TrainerScanState) => void)[] = [];
37
+
38
+ constructor(
39
+ joyCaptionClient: GradioClient,
40
+ zephyrClient: GradioClient,
41
+ fluxClient: GradioClient
42
+ ) {
43
+ this.joyCaptionClient = joyCaptionClient;
44
+ this.zephyrClient = zephyrClient;
45
+ this.fluxClient = fluxClient;
46
+ }
47
+
48
+ // Subscribe to state changes
49
+ onStateChange(callback: (state: TrainerScanState) => void) {
50
+ this.stateCallbacks.push(callback);
51
+ }
52
+
53
+ // Notify all subscribers of state changes
54
+ private notifyStateChange(state: Partial<TrainerScanState>) {
55
+ const fullState = { ...this.getCurrentState(), ...state };
56
+ this.stateCallbacks.forEach(callback => callback(fullState));
57
+ }
58
+
59
+ // Get current scanning state
60
+ private async getCurrentState(): Promise<TrainerScanState> {
61
+ const stats = await getScanningStats();
62
+ return {
63
+ isScanning: this.isScanning,
64
+ currentImage: null,
65
+ currentTrainer: null,
66
+ progress: {
67
+ total: stats.total,
68
+ completed: stats.completed,
69
+ failed: stats.failed,
70
+ pending: stats.pending
71
+ },
72
+ error: null
73
+ };
74
+ }
75
+
76
+ // Initialize scanning database with image paths from file
77
+ async initializeFromFile(): Promise<void> {
78
+ try {
79
+ const response = await fetch('/trainer_image_paths.txt');
80
+ const content = await response.text();
81
+ const imagePaths = content.trim().split('\n').filter(path => path.trim());
82
+
83
+ await initializeTrainerScanProgress(imagePaths);
84
+ this.notifyStateChange(await this.getCurrentState());
85
+ } catch (error) {
86
+ console.error('Failed to initialize trainer scan progress:', error);
87
+ throw new Error('Failed to load trainer image paths');
88
+ }
89
+ }
90
+
91
+ // Start automated scanning
92
+ async startScanning(): Promise<void> {
93
+ if (this.isScanning) {
94
+ throw new Error('Scanning is already in progress');
95
+ }
96
+
97
+ // Initialize database if needed
98
+ const stats = await getScanningStats();
99
+ if (stats.total === 0) {
100
+ await this.initializeFromFile();
101
+ }
102
+
103
+ // Check for interrupted processing
104
+ const currentProcessing = await getCurrentProcessingImage();
105
+ if (currentProcessing) {
106
+ // Reset interrupted processing back to pending
107
+ await markImageProcessingFailed(currentProcessing.imagePath, 'Process interrupted');
108
+ }
109
+
110
+ this.isScanning = true;
111
+ this.shouldStop = false;
112
+ this.notifyStateChange({ isScanning: true, error: null });
113
+
114
+ try {
115
+ await this.processingLoop();
116
+ } catch (error) {
117
+ console.error('Scanning error:', error);
118
+ this.notifyStateChange({ error: error instanceof Error ? error.message : 'Unknown error' });
119
+ } finally {
120
+ this.isScanning = false;
121
+ this.notifyStateChange({ isScanning: false, currentImage: null, currentTrainer: null });
122
+ }
123
+ }
124
+
125
+ // Stop scanning
126
+ stopScanning(): void {
127
+ this.shouldStop = true;
128
+ }
129
+
130
+ // Main processing loop
131
+ private async processingLoop(): Promise<void> {
132
+ while (!this.shouldStop) {
133
+ const nextImage = await getNextPendingImage();
134
+
135
+ if (!nextImage) {
136
+ // No more pending images
137
+ break;
138
+ }
139
+
140
+ this.notifyStateChange({
141
+ currentImage: nextImage.imagePath,
142
+ currentTrainer: nextImage.trainerName
143
+ });
144
+
145
+ try {
146
+ await this.processImage(nextImage.imagePath, nextImage.remoteUrl);
147
+ // Add small delay between images to prevent overwhelming the system
148
+ await new Promise(resolve => setTimeout(resolve, 1000));
149
+ } catch (error) {
150
+ console.error(`Failed to process ${nextImage.imagePath}:`, error);
151
+ await markImageProcessingFailed(
152
+ nextImage.imagePath,
153
+ error instanceof Error ? error.message : 'Unknown error'
154
+ );
155
+ }
156
+
157
+ // Update progress
158
+ this.notifyStateChange(await this.getCurrentState());
159
+ }
160
+ }
161
+
162
+ // Process a single remote image
163
+ private async processImage(imagePath: string, remoteUrl: string): Promise<void> {
164
+ await markImageProcessingStarted(imagePath);
165
+
166
+ try {
167
+ // Fetch remote image
168
+ const imageFile = await this.fetchRemoteImage(remoteUrl, imagePath);
169
+
170
+ // Caption the image
171
+ const imageCaption = await this.captionImage(imageFile);
172
+
173
+ // Generate monster concept
174
+ const picletConcept = await this.generatePicletConcept(imageCaption);
175
+
176
+ // Generate stats
177
+ const picletStats = await this.generatePicletStats(picletConcept);
178
+
179
+ // Generate image prompt
180
+ const imagePrompt = await this.generateImagePrompt(picletConcept);
181
+
182
+ // Generate monster image
183
+ const picletImageUrl = await this.generateMonsterImage(imagePrompt);
184
+
185
+ // Process generated image (remove background)
186
+ const imageData = await this.processGeneratedImage(picletImageUrl);
187
+
188
+ // Create piclet instance
189
+ const generatedData = {
190
+ name: this.extractNameFromConcept(picletConcept),
191
+ imageUrl: picletImageUrl,
192
+ imageData,
193
+ imageCaption,
194
+ concept: picletConcept,
195
+ imagePrompt,
196
+ stats: picletStats,
197
+ createdAt: new Date()
198
+ };
199
+
200
+ const picletInstance = await generatedDataToPicletInstance(generatedData, 5);
201
+ const savedId = await savePicletInstance(picletInstance);
202
+
203
+ await markImageProcessingCompleted(imagePath, savedId);
204
+
205
+ } catch (error) {
206
+ throw error; // Re-throw to be caught by processingLoop
207
+ }
208
+ }
209
+
210
+ // Fetch remote image and convert to File
211
+ private async fetchRemoteImage(remoteUrl: string, originalPath: string): Promise<File> {
212
+ const response = await fetch(remoteUrl);
213
+ if (!response.ok) {
214
+ throw new Error(`Failed to fetch ${remoteUrl}: ${response.statusText}`);
215
+ }
216
+
217
+ const blob = await response.blob();
218
+ const fileName = originalPath.split('/').pop() || 'trainer_image.jpg';
219
+
220
+ return new File([blob], fileName, { type: blob.type });
221
+ }
222
+
223
+ // Caption image using Joy Caption
224
+ private async captionImage(imageFile: File): Promise<string> {
225
+ const result = await this.joyCaptionClient.predict("/caption", [imageFile, "descriptive", "any", false]);
226
+ const captionResult = result.data[0] as string;
227
+
228
+ if (!captionResult || captionResult.trim() === '') {
229
+ throw new Error('Failed to generate image caption');
230
+ }
231
+
232
+ return captionResult.trim();
233
+ }
234
+
235
+ // Generate piclet concept using Zephyr
236
+ private async generatePicletConcept(imageCaption: string): Promise<string> {
237
+ const prompt = `Based on this image description, create a unique creature concept for a Pokemon-style monster collection game called "Pictuary":
238
+
239
+ "${imageCaption}"
240
+
241
+ Create a creative, original monster concept that:
242
+ 1. Is inspired by elements from the image but is clearly a fantastical creature
243
+ 2. Has a unique name and personality
244
+ 3. Includes special abilities related to its appearance
245
+ 4. Is suitable for a family-friendly game
246
+
247
+ Write a detailed monster concept (2-3 paragraphs).`;
248
+
249
+ const result = await this.zephyrClient.predict("/chat", [
250
+ [["user", prompt]],
251
+ 512, // max tokens
252
+ 0.7, // temperature
253
+ 0.9, // top_p
254
+ ]);
255
+
256
+ const conceptResult = result.data[0][1][1] as string;
257
+
258
+ if (!conceptResult || conceptResult.trim() === '') {
259
+ throw new Error('Failed to generate piclet concept');
260
+ }
261
+
262
+ return conceptResult.trim();
263
+ }
264
+
265
+ // Generate piclet stats
266
+ private async generatePicletStats(concept: string): Promise<PicletStats> {
267
+ return await extractPicletMetadata(concept, this.zephyrClient);
268
+ }
269
+
270
+ // Generate image prompt for monster creation
271
+ private async generateImagePrompt(concept: string): Promise<string> {
272
+ const prompt = `Extract ONLY the visual appearance from this monster concept and describe it in one concise sentence:
273
+ "${concept}"
274
+
275
+ Focus on: colors, body shape, eyes, limbs, mouth, and key visual features. Omit backstory, abilities, and non-visual details.`;
276
+
277
+ const result = await this.zephyrClient.predict("/chat", [
278
+ [["user", prompt]],
279
+ 256, // max tokens
280
+ 0.5, // temperature
281
+ 0.9, // top_p
282
+ ]);
283
+
284
+ const promptResult = result.data[0][1][1] as string;
285
+
286
+ if (!promptResult || promptResult.trim() === '') {
287
+ throw new Error('Failed to generate image prompt');
288
+ }
289
+
290
+ return promptResult.trim();
291
+ }
292
+
293
+ // Generate monster image using Flux
294
+ private async generateMonsterImage(imagePrompt: string): Promise<string> {
295
+ const fullPrompt = `${imagePrompt}, digital art, creature design, fantasy monster, clean background, professional illustration`;
296
+
297
+ const result = await this.fluxClient.predict("/infer", [
298
+ fullPrompt,
299
+ "", // negative prompt
300
+ 832, // width
301
+ 1216, // height
302
+ 1, // num inference steps
303
+ 3.0, // guidance scale
304
+ 0, // seed
305
+ ]);
306
+
307
+ const imageUrl = result.data[0] as string;
308
+
309
+ if (!imageUrl) {
310
+ throw new Error('Failed to generate monster image');
311
+ }
312
+
313
+ return imageUrl;
314
+ }
315
+
316
+ // Process generated image (remove background)
317
+ private async processGeneratedImage(imageUrl: string): Promise<string> {
318
+ try {
319
+ return await removeBackground(imageUrl);
320
+ } catch (error) {
321
+ console.warn('Background removal failed, using original image:', error);
322
+ return imageUrl;
323
+ }
324
+ }
325
+
326
+ // Extract name from concept text
327
+ private extractNameFromConcept(concept: string): string {
328
+ // Try to find a name in common patterns
329
+ const patterns = [
330
+ /(?:called|named)\s+([A-Z][a-z]+(?:\s+[A-Z][a-z]+)?)/,
331
+ /^([A-Z][a-z]+(?:\s+[A-Z][a-z]+)?)/,
332
+ /this\s+([A-Z][a-z]+(?:\s+[A-Z][a-z]+)?)/,
333
+ ];
334
+
335
+ for (const pattern of patterns) {
336
+ const match = concept.match(pattern);
337
+ if (match && match[1]) {
338
+ return match[1].trim();
339
+ }
340
+ }
341
+
342
+ // Fallback to generating a random trainer-inspired name
343
+ const trainerNames = ['Snap', 'Blaze', 'Nimbus', 'Breaker', 'Trinket'];
344
+ const randomName = trainerNames[Math.floor(Math.random() * trainerNames.length)];
345
+ return `Trainer${randomName}`;
346
+ }
347
+ }