├── .gitignore
├── CodemastersBinImage.sln
├── CodemastersBinImage
├── App.config
├── BinImage.cs
├── CodemastersBinImage.csproj
├── Helpers.cs
├── PluginVideoSega.cs
├── Program.cs
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── Settings.Designer.cs
│ └── Settings.settings
├── WinImploder.cs
├── frmMain.Designer.cs
├── frmMain.cs
├── frmMain.resx
├── icon100x100.ico
└── win_imploder.dll
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | CodemastersBinImage/obj/
2 | CodemastersBinImage/bin/
3 | *.suo
4 |
--------------------------------------------------------------------------------
/CodemastersBinImage.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Express 2013 for Windows Desktop
4 | VisualStudioVersion = 12.0.21005.1
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodemastersBinImage", "CodemastersBinImage\CodemastersBinImage.csproj", "{5B8EF666-264B-4302-9F42-7FCC9A3F3D9F}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {5B8EF666-264B-4302-9F42-7FCC9A3F3D9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {5B8EF666-264B-4302-9F42-7FCC9A3F3D9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {5B8EF666-264B-4302-9F42-7FCC9A3F3D9F}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {5B8EF666-264B-4302-9F42-7FCC9A3F3D9F}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | EndGlobal
23 |
--------------------------------------------------------------------------------
/CodemastersBinImage/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/CodemastersBinImage/BinImage.cs:
--------------------------------------------------------------------------------
1 | using Helper;
2 | using PluginVideoSega;
3 | using System;
4 | using System.Drawing;
5 | using System.IO;
6 | using WinImploder;
7 |
8 | namespace CodemastersBinImage
9 | {
10 | public class BinImageData
11 | {
12 | byte[] data = null;
13 |
14 | public BinImageData(byte[] data)
15 | {
16 | if (ImploderWork.CheckImp(data))
17 | {
18 | this.data = ImploderWork.Explode(data);
19 | }
20 | else
21 | {
22 | this.data = data;
23 | }
24 | }
25 |
26 | public BinImageData(Bitmap image)
27 | {
28 | byte[] tiles;
29 | ushort[] mapping;
30 | Color[] palette;
31 | ushort width;
32 | ushort height;
33 |
34 | VideoSega.ImageToData(image, null, out tiles, out mapping, out palette, out width, out height);
35 | image.Dispose();
36 |
37 | MemoryStream dataStream = new MemoryStream();
38 | dataStream.WriteWordInc(0, (ushort)(tiles.Length / TileSize));
39 | dataStream.WriteWordInc(0, width);
40 | dataStream.WriteWordInc(0, height);
41 |
42 | byte[] palBytes = VideoSega.PaletteToByteArray(palette);
43 | dataStream.Write(palBytes, 0, palBytes.Length);
44 |
45 | byte[] mapBytes = Mapper.WordMapToByteMap(mapping);
46 | dataStream.Write(mapBytes, 0, mapBytes.Length);
47 |
48 | dataStream.Write(tiles, 0, tiles.Length);
49 |
50 | data = dataStream.ToArray();
51 | }
52 |
53 | public byte[] Data
54 | {
55 | get
56 | {
57 | if (data != null)
58 | {
59 | return ImploderWork.ImplodeBest(data, (uint)data.Length);
60 | }
61 | return data;
62 | }
63 | }
64 |
65 | public int TilesCountOffset
66 | {
67 | get { return 0; }
68 | }
69 |
70 | public ushort TilesCount
71 | {
72 | get
73 | {
74 | if (data == null) return 0;
75 | return data.ReadWord(TilesCountOffset);
76 | }
77 | set
78 | {
79 | if (data == null) return;
80 | data.WriteWord(TilesCountOffset, value);
81 | }
82 | }
83 |
84 | public int WidthOffset
85 | {
86 | get { return TilesCountOffset + 2; }
87 | }
88 |
89 | public ushort Width
90 | {
91 | get
92 | {
93 | if (data == null) return 0;
94 | ushort width = data.ReadWord(WidthOffset);
95 | return (ushort)((width > 0xFF) ? 0 : width);
96 | }
97 | set
98 | {
99 | if (data == null) return;
100 | data.WriteWord(WidthOffset, (ushort)((value > 0xFF) ? 0 : value));
101 | }
102 | }
103 |
104 | public int HeightOffset
105 | {
106 | get { return WidthOffset + 2; }
107 | }
108 |
109 | public ushort Height
110 | {
111 | get
112 | {
113 | if (data == null) return 0;
114 | ushort height = data.ReadWord(HeightOffset);
115 | return (ushort)((height > 0xFF) ? 0 : height);
116 | }
117 | set
118 | {
119 | if (data == null) return;
120 | data.WriteWord(HeightOffset, (ushort)((value > 0xFF) ? 0 : value));
121 | }
122 | }
123 |
124 | public int PaletteOffset
125 | {
126 | get { return HeightOffset + 2; }
127 | }
128 |
129 | public int PaletteSize
130 | {
131 | get { return 0x20; }
132 | }
133 |
134 | public Color[] Palette
135 | {
136 | get
137 | {
138 | if (data == null) return null;
139 | if (PaletteOffset + PaletteSize > data.Length) return null;
140 |
141 | byte[] pal = new byte[PaletteSize];
142 | Array.Copy(data, PaletteOffset, pal, 0, pal.Length);
143 |
144 | return VideoSega.PaletteFromByteArray(pal);
145 | }
146 |
147 | set
148 | {
149 | if (data == null) return;
150 | byte[] pal = VideoSega.PaletteToByteArray(value);
151 | Array.Copy(pal, 0, data, PaletteOffset, PaletteSize);
152 | }
153 | }
154 |
155 | public int MappingOffset
156 | {
157 | get { return PaletteOffset + PaletteSize; }
158 | }
159 |
160 | public int MappingSize
161 | {
162 | get
163 | {
164 | ushort width = Width;
165 | ushort height = Height;
166 |
167 | if (width * height == 0) return 0;
168 |
169 | return width * height * 2;
170 | }
171 | }
172 |
173 | public ushort[] Mapping
174 | {
175 | get
176 | {
177 | if (data == null) return null;
178 | if (MappingOffset + MappingSize > data.Length) return null;
179 |
180 | ushort[] mapping = new ushort[MappingSize / 2];
181 |
182 | for (int i = 0; i < mapping.Length; ++i)
183 | {
184 | mapping[i] = data.ReadWord(MappingOffset + i * 2);
185 | }
186 |
187 | return mapping;
188 | }
189 |
190 | set
191 | {
192 | if (data == null) return;
193 |
194 | for (int i = 0; i < value.Length; ++i)
195 | {
196 | data.WriteWord(MappingOffset + i * 2, value[i]);
197 | }
198 | }
199 | }
200 |
201 | public int TilesOffset
202 | {
203 | get { return MappingOffset + MappingSize; }
204 | }
205 |
206 | public int TileSize
207 | {
208 | get { return 0x20; }
209 | }
210 |
211 | public int TilesSize
212 | {
213 | get { return TilesCount * TileSize; }
214 | }
215 |
216 | public byte[] Tiles
217 | {
218 | get
219 | {
220 | if (data == null) return null;
221 | if (TilesOffset + TilesSize > data.Length) return null;
222 |
223 | byte[] tiles = new byte[TilesSize];
224 |
225 | Array.Copy(data, TilesOffset, tiles, 0, TilesSize);
226 |
227 | return tiles;
228 | }
229 |
230 | set
231 | {
232 | ushort width = Width;
233 | ushort height = Height;
234 |
235 | if (width * height == 0) return;
236 |
237 | TilesCount = (ushort)(value.Length / TileSize);
238 | Array.Copy(value, 0, data, TilesOffset, TilesSize);
239 | }
240 | }
241 |
242 | public void ImageAndMask(out Bitmap image)
243 | {
244 | image = VideoSega.ImageFromData(Tiles, Mapping, Palette, Width, Height);
245 | }
246 | }
247 | }
248 |
--------------------------------------------------------------------------------
/CodemastersBinImage/CodemastersBinImage.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {5B8EF666-264B-4302-9F42-7FCC9A3F3D9F}
8 | WinExe
9 | Properties
10 | CodemastersBinImage
11 | CodemastersBinImage
12 | v4.0
13 | 512
14 | Client
15 |
16 |
17 | x86
18 | true
19 | full
20 | false
21 | bin\Debug\
22 | DEBUG;TRACE
23 | prompt
24 | 4
25 | true
26 |
27 |
28 | x86
29 | pdbonly
30 | true
31 | bin\Release\
32 | TRACE
33 | prompt
34 | 4
35 | true
36 |
37 |
38 |
39 |
40 |
41 | icon100x100.ico
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | Form
54 |
55 |
56 | frmMain.cs
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | frmMain.cs
65 |
66 |
67 | ResXFileCodeGenerator
68 | Resources.Designer.cs
69 | Designer
70 |
71 |
72 | True
73 | Resources.resx
74 | True
75 |
76 |
77 | SettingsSingleFileGenerator
78 | Settings.Designer.cs
79 |
80 |
81 | True
82 | Settings.settings
83 | True
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 | PreserveNewest
93 |
94 |
95 |
96 |
103 |
--------------------------------------------------------------------------------
/CodemastersBinImage/Helpers.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Drawing;
4 | using System.Drawing.Imaging;
5 | using System.IO;
6 | using System.Runtime.InteropServices;
7 |
8 | namespace Helper
9 | {
10 | public static class Helpers
11 | {
12 | public static UInt16 ReadWord(this byte[] array, int index)
13 | {
14 | return (ushort)((array[index] << 8) | array[index + 1]);
15 | }
16 |
17 | public static byte ReadByteInc(this MemoryStream stream, int index = 0)
18 | {
19 | stream.Seek(index, SeekOrigin.Current);
20 |
21 | byte[] array = new byte[1];
22 | stream.Read(array, 0, array.Length);
23 | return array[0];
24 | }
25 |
26 | public static UInt16 ReadWord(this MemoryStream stream, int index = 0)
27 | {
28 | long pos = stream.Position;
29 | stream.Seek(index, SeekOrigin.Current);
30 |
31 | byte[] array = new byte[2];
32 | stream.Read(array, 0, array.Length);
33 |
34 | stream.Position = pos;
35 | return (ushort)((array[0] << 8) | array[1]);
36 | }
37 |
38 | public static UInt16 ReadWordInc(this MemoryStream stream, int index = 0)
39 | {
40 | stream.Seek(index, SeekOrigin.Current);
41 |
42 | byte[] array = new byte[2];
43 | stream.Read(array, 0, array.Length);
44 | return (ushort)((array[0] << 8) | array[1]);
45 | }
46 |
47 | public static UInt32 ReadLong(this byte[] array, int index)
48 | {
49 | return (uint)((array[index] << 24) | (array[index + 1] << 16) | (array[index + 2] << 8) | array[index + 3]);
50 | }
51 |
52 | public static UInt32 ReadLong(this MemoryStream stream, int index = 0)
53 | {
54 | long pos = stream.Position;
55 | stream.Seek(index, SeekOrigin.Current);
56 |
57 | byte[] array = new byte[4];
58 | stream.Read(array, 0, array.Length);
59 |
60 | stream.Position = pos;
61 | return (uint)((array[0] << 24) | (array[1] << 16) | (array[2] << 8) | array[3]);
62 | }
63 |
64 | public static UInt32 ReadLongInc(this MemoryStream stream, int index = 0)
65 | {
66 | stream.Seek(index, SeekOrigin.Current);
67 |
68 | byte[] array = new byte[4];
69 | stream.Read(array, 0, array.Length);
70 | return (uint)((array[0] << 24) | (array[1] << 16) | (array[2] << 8) | array[3]);
71 | }
72 |
73 | public static void WriteWord(this byte[] array, int index, ushort value)
74 | {
75 | array[index++] = (byte)((value >> 8) & 0xFF);
76 | array[index] = (byte)(value & 0xFF);
77 | }
78 |
79 | public static void WriteWordInc(this MemoryStream stream, int index, ushort value)
80 | {
81 | stream.Seek(index, SeekOrigin.Current);
82 |
83 | byte[] array = new byte[2];
84 | array[0] = (byte)((value >> 8) & 0xFF);
85 | array[1] = (byte)(value & 0xFF);
86 | stream.Write(array, 0, array.Length);
87 | }
88 |
89 | public static void WriteLong(this byte[] array, int index, uint value)
90 | {
91 | array[index++] = (byte)((value >> 24) & 0xFF);
92 | array[index++] = (byte)((value >> 16) & 0xFF);
93 | array[index++] = (byte)((value >> 8) & 0xFF);
94 | array[index] = (byte)(value & 0xFF);
95 | }
96 |
97 | public static void WriteLongInc(this MemoryStream stream, int index, uint value)
98 | {
99 | stream.Seek(index, SeekOrigin.Current);
100 |
101 | byte[] array = new byte[4];
102 | array[0] = (byte)((value >> 24) & 0xFF);
103 | array[1] = (byte)((value >> 16) & 0xFF);
104 | array[2] = (byte)((value >> 8) & 0xFF);
105 | array[3] = (byte)(value & 0xFF);
106 | stream.Write(array, 0, array.Length);
107 | }
108 |
109 | public static void IncPos(this MemoryStream stream, int value)
110 | {
111 | stream.Seek(value, SeekOrigin.Current);
112 | }
113 |
114 | public static void SubPos(this MemoryStream stream, int value)
115 | {
116 | stream.Seek(-value, SeekOrigin.Current);
117 | }
118 |
119 | public static Bitmap CropImage(Bitmap source, Rectangle cropArea)
120 | {
121 | return source.Clone(cropArea, source.PixelFormat);
122 | }
123 |
124 | public static byte[] BitmapToArray(Bitmap image)
125 | {
126 | using (MemoryStream ms = new MemoryStream())
127 | {
128 | image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
129 | return ms.ToArray();
130 | }
131 | }
132 |
133 | public static Bitmap BitmapFromArray(byte[] array)
134 | {
135 | using (var ms = new MemoryStream(array))
136 | {
137 | return new Bitmap(ms);
138 | }
139 | }
140 |
141 | public static uint mask(byte bit_idx, byte bits_cnt = 1)
142 | {
143 | return (uint)(((1 << bits_cnt) - 1) << bit_idx);
144 | }
145 |
146 | public static class CompareByteArray
147 | {
148 | [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
149 | static extern int memcmp(byte[] b1, byte[] b2, long count);
150 |
151 | static public bool Compare(byte[] b1, byte[] b2)
152 | {
153 | return b1.Length == b2.Length && memcmp(b1, b2, b1.Length) == 0;
154 | }
155 | }
156 |
157 | public class CompareByteArrays : IEqualityComparer
158 | {
159 | public bool Equals(byte[] x, byte[] y)
160 | {
161 | return Helpers.CompareByteArray.Compare(x, y);
162 | }
163 | public int GetHashCode(byte[] obj)
164 | {
165 | var str = Convert.ToBase64String(obj);
166 | return str.GetHashCode();
167 | }
168 | }
169 |
170 | public class CompareKey : IEqualityComparer>
171 | {
172 | public bool Equals(Tuple x, Tuple y)
173 | {
174 | return Helpers.CompareByteArray.Compare(x.Item1, y.Item1);
175 | }
176 | public int GetHashCode(Tuple obj)
177 | {
178 | var str = Convert.ToBase64String(obj.Item1);
179 | return str.GetHashCode();
180 | }
181 | }
182 |
183 | public class CompareValue : IEqualityComparer>
184 | {
185 | public bool Equals(Tuple x, Tuple y)
186 | {
187 | return (x.Item2 == y.Item2);
188 | }
189 | public int GetHashCode(Tuple obj)
190 | {
191 | return obj.Item2.GetHashCode();
192 | }
193 | }
194 |
195 | public static int SearchBytes(byte[] array, byte[] value, int from)
196 | {
197 | int found = 0;
198 | for (int i = from; i < array.Length; i++)
199 | {
200 | if (array[i] == value[found])
201 | {
202 | if (++found == value.Length)
203 | {
204 | return i - found + 1;
205 | }
206 | }
207 | else
208 | {
209 | found = 0;
210 | }
211 | }
212 | return -1;
213 | }
214 | }
215 | }
216 |
--------------------------------------------------------------------------------
/CodemastersBinImage/PluginVideoSega.cs:
--------------------------------------------------------------------------------
1 | using Helper;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Drawing;
5 | using System.Drawing.Imaging;
6 | using System.IO;
7 | using System.Linq;
8 | using System.Runtime.InteropServices;
9 |
10 | namespace PluginVideoSega
11 | {
12 | public class ScreenPoint
13 | {
14 | byte _X = 0;
15 | byte _Y = 0;
16 | ushort _PlaneAddr = 0x0000;
17 |
18 | public ScreenPoint() { }
19 |
20 | public ScreenPoint(byte x, byte y, ushort planeAddr)
21 | {
22 | _X = x;
23 | _Y = y;
24 | _PlaneAddr = planeAddr;
25 | }
26 |
27 | public byte X
28 | {
29 | get { return _X; }
30 | set { _X = value; }
31 | }
32 |
33 | public byte Y
34 | {
35 | get { return _Y; }
36 | set { _Y = value; }
37 | }
38 |
39 | public ushort PlaneAddr
40 | {
41 | get { return _PlaneAddr; }
42 | set { _PlaneAddr = value; }
43 | }
44 | }
45 |
46 | public static class VideoSega
47 | {
48 | public static Color[] PaletteFromByteArray(byte[] pal)
49 | {
50 | Color[] retn = new Color[16];
51 |
52 | for (int x = 0, offset = 0; x < 16; x++, offset += 2)
53 | retn[x] = ColorFromWord(pal.ReadWord(offset));
54 |
55 | return retn;
56 | }
57 |
58 | public static byte[] PaletteToByteArray(Color[] pal)
59 | {
60 | byte[] retn = new byte[32];
61 |
62 | int offset = 0;
63 | for (int x = 0; x < 16; x++, offset += 2)
64 | {
65 | ushort W = ColorToWord(pal[x]);
66 |
67 | retn[offset + 0] = (byte)((W >> 8) & 0xFF);
68 | retn[offset + 1] = (byte)((W >> 0) & 0xFF);
69 | }
70 |
71 | return retn;
72 | }
73 |
74 | public static ushort ColorToWord(Color color)
75 | {
76 | ushort W = 0;
77 |
78 | W |= (ushort)(((color.R >> 4) & 0xE) << 0);
79 | W |= (ushort)(((color.G >> 4) & 0xE) << 4);
80 | W |= (ushort)(((color.B >> 4) & 0xE) << 8);
81 |
82 | return W;
83 | }
84 |
85 | public static Color ColorFromWord(ushort Word)
86 | {
87 | byte r = (byte)(((Word >> 0) & 0xE) << 4);
88 | byte g = (byte)(((Word >> 4) & 0xE) << 4);
89 | byte b = (byte)(((Word >> 8) & 0xE) << 4);
90 | return Color.FromArgb(r, g, b);
91 | }
92 |
93 | public static Color[] PaletteApplySega(Color[] pal)
94 | {
95 | byte[] tmp = PaletteToByteArray(pal);
96 | return PaletteFromByteArray(tmp);
97 | }
98 |
99 | public static Color ColorApplySega(Color color)
100 | {
101 | ushort tmp = ColorToWord(color);
102 | return ColorFromWord(tmp);
103 | }
104 |
105 | public static void TileToData(Bitmap tile, byte[] tiles, int tilePos)
106 | {
107 | BitmapData tileData = tile.LockBits(new Rectangle(0, 0, tile.Width, tile.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
108 | byte[] tileBytes = new byte[tileData.Height * tileData.Stride];
109 | Marshal.Copy(tileData.Scan0, tileBytes, 0, tileBytes.Length);
110 |
111 | for (int h = 0; h < 8; ++h)
112 | for (int w = 0; w < 4; ++w)
113 | {
114 | tiles[tilePos] = (byte)((tileBytes[h * tileData.Stride + w * 2 + 0] << 4) & 0xF0);
115 | tiles[tilePos] |= (byte)((tileBytes[h * tileData.Stride + w * 2 + 1] << 0) & 0x0F);
116 | tilePos++;
117 | }
118 |
119 | tile.UnlockBits(tileData);
120 | }
121 |
122 | public static bool TileFromData(byte[] bytes, BitmapData data, int x, int y, byte[] tiles, ushort word)
123 | {
124 | ushort tilePos = Mapper.TilePos(word);
125 | for (int h = 0; h < 8; h++)
126 | for (int w = 0; w < 4; w++)
127 | {
128 | if (tilePos >= tiles.Length) return false;
129 |
130 | int newW1 = x + (Mapper.HF(word) ? (7 - (w * 2 + 0)) : (w * 2 + 0));
131 | int newW2 = x + (Mapper.HF(word) ? (7 - (w * 2 + 1)) : (w * 2 + 1));
132 | int newH = y + (Mapper.VF(word) ? (7 - h) : h);
133 |
134 | byte B = tiles[tilePos++];
135 | bytes[newH * data.Stride + newW1] = (byte)((B & 0xF0) >> 4);
136 | bytes[newH * data.Stride + newW2] = (byte)((B & 0x0F) >> 0);
137 | }
138 |
139 | return true;
140 | }
141 |
142 | public static Bitmap ImageMaskFromData(ushort[] mapping, ushort width, ushort height)
143 | {
144 | if (mapping == null) return null;
145 | if (width == 0) return null;
146 | if (height == 0) return null;
147 |
148 | Bitmap mask = new Bitmap(width * 8, height * 8, PixelFormat.Format8bppIndexed);
149 | ColorPalette maskPal = mask.Palette;
150 |
151 | for (int i = 0; i < maskPal.Entries.Length; ++i)
152 | {
153 | maskPal.Entries[i] = ColorApplySega(Color.White); // Clear palette
154 | }
155 |
156 | BitmapData data = mask.LockBits(new Rectangle(0, 0, mask.Width, mask.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
157 | byte[] bytes = new byte[data.Height * data.Stride];
158 | Marshal.Copy(data.Scan0, bytes, 0, bytes.Length);
159 |
160 | byte pal = 0;
161 | for (ushort y = 0; y < height; ++y)
162 | for (ushort x = 0; x < width; ++x)
163 | {
164 | ushort word = mapping[y * width + x];
165 | bool prior = Mapper.P(word);
166 | pal = Mapper.PalIdx(word);
167 |
168 | for (int h = 0; h < 8; h++)
169 | for (int w = 0; w < 8; w++)
170 | {
171 | bytes[(y * 8 + h) * data.Stride + (x * 8 + w)] = (byte)(prior ? 1 : 0);
172 | }
173 | }
174 |
175 | maskPal.Entries[1] = Color.FromArgb((pal << 4), 0, 0); // First color for non prior
176 | mask.Palette = maskPal;
177 |
178 | Marshal.Copy(bytes, 0, data.Scan0, bytes.Length);
179 | mask.UnlockBits(data);
180 |
181 | return mask;
182 | }
183 |
184 | public static Bitmap ImageFromData(byte[] tiles, ushort[] mapping, Color[] palette, ushort widthInTiles, ushort heightInTiles)
185 | {
186 | if (tiles == null) return null;
187 | if (mapping == null) return null;
188 | if (palette == null) return null;
189 | if (widthInTiles == 0) return null;
190 | if (heightInTiles == 0) return null;
191 |
192 | Bitmap image = new Bitmap(widthInTiles * 8, heightInTiles * 8, PixelFormat.Format8bppIndexed);
193 |
194 | BitmapData imageData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
195 | byte[] imageBytes = new byte[imageData.Height * imageData.Stride];
196 | Marshal.Copy(imageData.Scan0, imageBytes, 0, imageBytes.Length);
197 |
198 | for (ushort y = 0; y < heightInTiles; ++y)
199 | for (ushort x = 0; x < widthInTiles; ++x)
200 | if (!TileFromData(imageBytes, imageData, x * 8, y * 8, tiles, mapping[y * widthInTiles + x]))
201 | {
202 | image.UnlockBits(imageData);
203 | return null;
204 | }
205 |
206 | Marshal.Copy(imageBytes, 0, imageData.Scan0, imageBytes.Length);
207 | image.UnlockBits(imageData);
208 |
209 | PaletteToImage(image, palette);
210 |
211 | return image;
212 | }
213 |
214 | public static void ImageToData(Bitmap image, Bitmap mask, out byte[] tiles, out ushort[] mapping, out Color[] palette, out ushort width, out ushort height)
215 | {
216 | width = (ushort)image.Width;
217 | height = (ushort)image.Height;
218 |
219 | List> tilesAllHF = new List>();
220 | List tilesAll = new List();
221 |
222 | for (int y = 0; y < height; y += 8)
223 | for (int x = 0; x < width; x += 8)
224 | {
225 | int idx = (y / 8) * (width / 8) + (x / 8);
226 |
227 | Rectangle rect = new Rectangle(new Point(x, y), new Size(8, 8));
228 | Bitmap tile = Helpers.CropImage(image, rect);
229 |
230 | byte[] hash00 = Helpers.BitmapToArray(tile); // !HF, !VF
231 | tile.RotateFlip(RotateFlipType.RotateNoneFlipX);
232 | byte[] hash10 = Helpers.BitmapToArray(tile); // HF, !VF
233 | tile.RotateFlip(RotateFlipType.RotateNoneFlipY);
234 | byte[] hash11 = Helpers.BitmapToArray(tile); // HF, VF
235 | tile.RotateFlip(RotateFlipType.RotateNoneFlipX);
236 | byte[] hash01 = Helpers.BitmapToArray(tile); // !HF, VF
237 |
238 | tilesAll.Add(new byte[][] { hash00, hash10, hash11, hash01 });
239 |
240 | tilesAllHF.Add(new Tuple(hash00, idx));
241 | tilesAllHF.Add(new Tuple(hash10, idx));
242 | tilesAllHF.Add(new Tuple(hash11, idx));
243 | tilesAllHF.Add(new Tuple(hash01, idx));
244 | }
245 |
246 | tilesAllHF = tilesAllHF.Distinct(new Helpers.CompareKey()).ToList(); //remove tile duplicates
247 | tilesAllHF = tilesAllHF.Distinct(new Helpers.CompareValue()).ToList(); //remove tile duplicates
248 |
249 | BitmapData maskData = null;
250 | byte[] maskBytes = null;
251 |
252 | if (mask != null)
253 | {
254 | maskData = mask.LockBits(new Rectangle(0, 0, mask.Width, mask.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
255 | maskBytes = new byte[maskData.Height * maskData.Stride];
256 | Marshal.Copy(maskData.Scan0, maskBytes, 0, maskBytes.Length);
257 | }
258 |
259 | MemoryStream stream = new MemoryStream();
260 | for (int i = 0; i < tilesAll.Count; ++i)
261 | {
262 | int x = (i % (width / 8));
263 | int y = (i / (width / 8));
264 |
265 | int idx = 0;
266 | for (int l = 0; l < tilesAll[i].Length; ++l)
267 | if ((idx = tilesAllHF.FindIndex(a => Helpers.CompareByteArray.Compare(a.Item1, tilesAll[i][l]))) >= 0)
268 | {
269 | ushort word = 0;
270 | bool HF = false, VF = false; // !HF, !VF
271 | switch (l)
272 | {
273 | case 1: // HF, !VF
274 | HF = true; VF = false;
275 | break;
276 | case 2: // HF, VF
277 | HF = true; VF = true;
278 | break;
279 | case 3: // !HF, VF
280 | HF = false; VF = true;
281 | break;
282 | }
283 |
284 | bool prior = false;
285 |
286 | if (mask != null)
287 | {
288 | for (int h = 0; h < 8; h++)
289 | for (int w = 0; w < 8; w++)
290 | if (maskBytes[(y * 8 + h) * maskData.Stride + (x * 8 + w)] == 1)
291 | {
292 | prior = true;
293 | break;
294 | }
295 |
296 | word = Mapper.EncodeTileInfo((ushort)idx, HF, VF, (byte)(mask.Palette.Entries[1].R >> 4), prior);
297 | }
298 | else
299 | {
300 | word = Mapper.EncodeTileInfo((ushort)idx, HF, VF, 0, prior);
301 | }
302 |
303 | stream.WriteWordInc(0, word);
304 | break;
305 | }
306 | }
307 |
308 | if (mask != null)
309 | {
310 | mask.UnlockBits(maskData);
311 | }
312 |
313 | width /= 8;
314 | height /= 8;
315 |
316 | mapping = Mapper.ByteMapToWordMap(stream.ToArray());
317 | palette = PaletteFromImage(image);
318 |
319 | int tilesCount = tilesAllHF.Count;
320 | tiles = new byte[0x20 * tilesCount];
321 |
322 | for (int i = 0; i < tilesCount; ++i)
323 | {
324 | Bitmap tile = Helpers.BitmapFromArray(tilesAllHF[i].Item1);
325 | TileToData(tile, tiles, i * 0x20);
326 | tile.Dispose();
327 | }
328 | }
329 |
330 | public static Bitmap TilesetFromData(byte[] tiles, Color[] palette, out int tilesCount, ushort tilesInRow = 16)
331 | {
332 | tilesCount = (tiles != null ? (tiles.Length / 0x20) : 0);
333 | tilesInRow = (ushort)((tilesCount < tilesInRow) ? tilesCount : tilesInRow);
334 |
335 | if (tilesCount != 0)
336 | {
337 | ushort[] mapping = new ushort[tilesCount];
338 |
339 | for (int x = 0; x < tilesCount; x++)
340 | {
341 | mapping[x] = Mapper.EncodeTileInfo((ushort)x, false, false, 0, false);
342 | }
343 |
344 | return ImageFromData(tiles, mapping, palette, tilesInRow, (ushort)(tilesCount / tilesInRow));
345 | }
346 |
347 | return null;
348 | }
349 |
350 | public static Color[] PaletteFromImage(Bitmap image)
351 | {
352 | Color[] colors = new Color[16];
353 |
354 | for (int i = 0; i < colors.Length; ++i)
355 | {
356 | colors[i] = ColorApplySega(image.Palette.Entries[i]);
357 | }
358 |
359 | return colors;
360 | }
361 |
362 | public static void PaletteToImage(Bitmap image, Color[] palette)
363 | {
364 | ColorPalette imagePal = image.Palette;
365 |
366 | for (int i = 0; i < imagePal.Entries.Length; ++i)
367 | {
368 | imagePal.Entries[i] = ColorApplySega(Color.Black); // Clear palette
369 | }
370 | for (int i = 0; i < palette.Length; ++i)
371 | {
372 | imagePal.Entries[i] = Color.FromArgb(
373 | palette[i].R | ((i & 0x0C) >> 2),
374 | palette[i].G | ((i & 0x02) >> 1),
375 | palette[i].B | ((i & 0x01) >> 0)
376 | ); // Fill image palette
377 | }
378 | image.Palette = imagePal;
379 | }
380 |
381 | public static ushort GetVramWriteAddr(uint value)
382 | {
383 | return (ushort)(((value & Helpers.mask(0, 2)) << 14) | ((value & Helpers.mask(16, 14)) >> 16));
384 | }
385 |
386 | public static uint SetVramWriteAddr(ushort value)
387 | {
388 | return (uint)(((value >> 14) & Helpers.mask(0, 2)) | ((value << 16) & Helpers.mask(16, 14)) | (1 << 30));
389 | }
390 |
391 | public static ScreenPoint VramAddrToScreenPoint(ushort vramAddr, byte screenSize)
392 | {
393 | ushort planeAddr = (ushort)(vramAddr & 0xE000);
394 | vramAddr &= 0x1FFF;
395 | vramAddr >>= 1;
396 | byte x = (byte)(vramAddr % screenSize);
397 | byte y = (byte)(vramAddr / screenSize);
398 | return new ScreenPoint(x, y, planeAddr);
399 | }
400 |
401 | public static ushort VramAddrFromScreenPoint(ScreenPoint xy, byte screenSize)
402 | {
403 | ushort vramAddr = (ushort)(xy.Y * screenSize + xy.X);
404 | vramAddr <<= 1;
405 | vramAddr &= 0x1FFF;
406 | vramAddr |= (ushort)(xy.PlaneAddr & 0xE000);
407 | return vramAddr;
408 | }
409 | }
410 |
411 | public static class Mapper
412 | {
413 | public static ushort TileIdx(ushort Word)
414 | {
415 | return (ushort)(Word & 0x7FF);
416 | }
417 |
418 | public static byte PalIdx(ushort Word)
419 | {
420 | return (byte)((Word & 0x6000) >> 13);
421 | }
422 |
423 | public static bool HF(ushort Word)
424 | {
425 | return ((Word & 0x800) >> 11) == 1;
426 | }
427 |
428 | public static bool VF(ushort Word)
429 | {
430 | return ((Word & 0x1000) >> 12) == 1;
431 | }
432 |
433 | public static bool P(ushort Word)
434 | {
435 | return ((Word & 0x8000) >> 15) == 1;
436 | }
437 |
438 | public static ushort ApplyTileIdx(ushort Word, ushort tileIdx)
439 | {
440 | return (ushort)((Word & ~0x07FF) | tileIdx);
441 | }
442 |
443 | public static ushort ApplyPalIdx(ushort Word, byte palIdx)
444 | {
445 | return (ushort)((Word & ~0x6000) | (palIdx << 13));
446 | }
447 |
448 | public static ushort ApplyHF(ushort Word, int hf)
449 | {
450 | return (ushort)((Word & ~0x0800) | (hf << 11));
451 | }
452 |
453 | public static ushort ApplyVF(ushort Word, int vf)
454 | {
455 | return (ushort)((Word & ~0x1000) | (vf << 12));
456 | }
457 |
458 | public static ushort ApplyP(ushort Word, int p)
459 | {
460 | return (ushort)((Word & ~0x8000) | (p << 15));
461 | }
462 |
463 | public static ushort TilePos(ushort Word)
464 | {
465 | ushort idx = TileIdx(Word);
466 | ushort tilesPos = (ushort)(idx * 0x20);
467 | return tilesPos;
468 | }
469 |
470 | public static ushort EncodeTileInfo(ushort idx, bool hf, bool vf, byte palIndex, bool p)
471 | {
472 | int retn = ((p ? 1 : 0) << 15) | ((palIndex & 3) << 13) | ((vf ? 1 : 0) << 12) | ((hf ? 1 : 0) << 11) | (idx & 0x7FF);
473 | return (ushort)retn;
474 | }
475 |
476 | public static byte[] WordMapToByteMap(ushort[] wordMap, ushort StartMask = 0)
477 | {
478 | int len = wordMap.Length;
479 |
480 | byte[] retn = new byte[len * 2];
481 | for (int i = 0, j = 0; i < len; i++, j += 2)
482 | {
483 | retn[j] = (byte)(((wordMap[i] & 0xFF00) >> 8) - StartMask);
484 | retn[j + 1] = (byte)((wordMap[i] & 0xFF) - StartMask);
485 | }
486 |
487 | return retn;
488 | }
489 |
490 | public static ushort[] ByteMapToWordMap(byte[] byteMap, ushort StartMask = 0)
491 | {
492 | int len = byteMap.Length / 2;
493 | ushort[] retn = new ushort[len];
494 | for (int i = 0, j = 0; i < len; i++, j += 2)
495 | retn[i] = (ushort)((((byteMap[j] << 8) | byteMap[j + 1]) & 0xFFFF) + StartMask);
496 | return retn;
497 | }
498 | }
499 | }
--------------------------------------------------------------------------------
/CodemastersBinImage/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Forms;
3 |
4 | namespace CodemastersBinImage
5 | {
6 | static class Program
7 | {
8 | [STAThread]
9 | static void Main()
10 | {
11 | /*
12 | string[] args = Environment.GetCommandLineArgs();
13 |
14 | if (args.Length >= 2) // mode, files, {log, rom}
15 | {
16 | if (!File.Exists(args[2])) return; // files
17 |
18 | string[] files = File.ReadAllLines(args[2]);
19 |
20 | char mode = args[1].ToLower()[0]; // mode
21 |
22 | if (mode == 'e')
23 | {
24 | for (int i = 0; i < files.Length; i++)
25 | {
26 | bool isBitmap;
27 | try
28 | {
29 | isBitmap = (Bitmap.FromFile(files[i]) != null);
30 | }
31 | catch
32 | {
33 | isBitmap = false;
34 | }
35 |
36 | BinImageData bid = BinImageData.FromFile(files[i]);
37 |
38 | if (bid == null) continue;
39 |
40 | if (!isBitmap)
41 | {
42 | Bitmap bmp = bid.Image;
43 |
44 | if (bmp == null) continue;
45 |
46 | bmp.Save(Path.GetFileName(Path.ChangeExtension(files[i], ".bmp")), ImageFormat.Bmp);
47 | bmp.Dispose();
48 | }
49 | else
50 | {
51 | File.WriteAllBytes(Path.GetFileName(Path.ChangeExtension(files[i], ".imp.bin")), bid.Data);
52 | }
53 | }
54 | }
55 | else if (mode == 'i')
56 | {
57 | if (!File.Exists(args[4])) return; // rom
58 | if (!File.Exists(args[3])) return; // log
59 |
60 | byte[] rom = File.ReadAllBytes(args[4]);
61 | string[] log = File.ReadAllLines(args[3]);
62 |
63 | List diffs = new List(log.Length);
64 |
65 | Regex regex = new Regex(@"^([A-Fa-f0-9]{8}) \(([A-Fa-f0-9]{4})");
66 | for (int i = 0; i < log.Length; i++)
67 | {
68 | Match match = regex.Match(log[i]);
69 |
70 | if (match.Success)
71 | {
72 | int size = Convert.ToInt32(match.Groups[2].Value, 16);
73 |
74 | BinImageData bid = BinImageData.FromFile(files[i]);
75 |
76 | byte[] impData = bid.Data;
77 |
78 | int diff = (impData.Length - size) + ((i > 0) ? diffs[i - 1] : 0);
79 | Console.WriteLine("[{0:000}, {1}]: {2}", i, files[i], diff);
80 |
81 | diffs.Add(diff);
82 | }
83 | }
84 |
85 | int firstOffset = 0, newOffset = 0;
86 | for (int i = 0; i < log.Length; i++)
87 | {
88 | Match match = regex.Match(log[i]);
89 |
90 | if (match.Success)
91 | {
92 | int offset = Convert.ToInt32(match.Groups[1].Value, 16);
93 | int size = Convert.ToInt32(match.Groups[2].Value, 16);
94 |
95 | firstOffset = ((firstOffset == 0) ? offset : firstOffset);
96 |
97 | BinImageData bid = BinImageData.FromFile(files[i]);
98 |
99 | byte[] impData = bid.Data;
100 |
101 | newOffset = offset + ((i > 0) ? diffs[i - 1] : 0);
102 |
103 | for (int k = 0; k < (0xD089C - newOffset); ++k)
104 | {
105 | rom[newOffset + k] = 0x00; // clear old imps
106 | }
107 |
108 | Array.Copy(impData, 0, rom, newOffset, impData.Length);
109 |
110 | if (i > 0)
111 | {
112 | List refs = new List();
113 |
114 | int refFrom = -1;
115 | while ((refFrom = Helpers.SearchBytes(
116 | rom,
117 | new byte[] {
118 | (byte)((offset >> 24) & 0xFF),
119 | (byte)((offset >> 16) & 0xFF),
120 | (byte)((offset >> 8) & 0xFF),
121 | (byte)((offset >> 0) & 0xFF),
122 | }, refFrom + 1
123 | )) != -1)
124 | {
125 | if (refFrom >= firstOffset) continue;
126 | refs.Add(refFrom);
127 | }
128 |
129 | for (int j = 0; j < refs.Count; ++j)
130 | {
131 | Console.WriteLine(string.Format("Fixing ref {0:X6}: {1:X6} -> {2:X6}", refs[j], offset, newOffset));
132 | rom.WriteLong(refs[j], (uint)newOffset);
133 | }
134 | }
135 | }
136 | }
137 | File.WriteAllBytes(Path.ChangeExtension(args[4], ".new.bin"), rom);
138 | }
139 |
140 | return;
141 | }
142 | */
143 |
144 | Application.EnableVisualStyles();
145 | Application.SetCompatibleTextRenderingDefault(false);
146 | Application.Run(new frmMain());
147 | }
148 | }
149 | }
150 |
--------------------------------------------------------------------------------
/CodemastersBinImage/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // Управление общими сведениями о сборке осуществляется с помощью
6 | // набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,
7 | // связанные со сборкой.
8 | [assembly: AssemblyTitle("CodemastersBinImage")]
9 | [assembly: AssemblyDescription("Codemasters Imploded Images Tool")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("Lab 313")]
12 | [assembly: AssemblyProduct("CodemastersBinImage")]
13 | [assembly: AssemblyCopyright("Copyright © 2016")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Параметр ComVisible со значением FALSE делает типы в сборке невидимыми
18 | // для COM-компонентов. Если требуется обратиться к типу в этой сборке через
19 | // COM, задайте атрибуту ComVisible значение TRUE для этого типа.
20 | [assembly: ComVisible(false)]
21 |
22 | // Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
23 | [assembly: Guid("6af724ef-e090-4789-9b01-da71a156de9a")]
24 |
25 | // Сведения о версии сборки состоят из следующих четырех значений:
26 | //
27 | // Основной номер версии
28 | // Дополнительный номер версии
29 | // Номер сборки
30 | // Редакция
31 | //
32 | // Можно задать все значения или принять номера сборки и редакции по умолчанию
33 | // используя "*", как показано ниже:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.3.0.0")]
36 | [assembly: AssemblyFileVersion("1.3.0.0")]
37 |
--------------------------------------------------------------------------------
/CodemastersBinImage/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace CodemastersBinImage.Properties {
12 | using System;
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources() {
33 | }
34 |
35 | ///
36 | /// Returns the cached ResourceManager instance used by this class.
37 | ///
38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39 | internal static global::System.Resources.ResourceManager ResourceManager {
40 | get {
41 | if (object.ReferenceEquals(resourceMan, null)) {
42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CodemastersBinImage.Properties.Resources", typeof(Resources).Assembly);
43 | resourceMan = temp;
44 | }
45 | return resourceMan;
46 | }
47 | }
48 |
49 | ///
50 | /// Overrides the current thread's CurrentUICulture property for all
51 | /// resource lookups using this strongly typed resource class.
52 | ///
53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54 | internal static global::System.Globalization.CultureInfo Culture {
55 | get {
56 | return resourceCulture;
57 | }
58 | set {
59 | resourceCulture = value;
60 | }
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/CodemastersBinImage/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/CodemastersBinImage/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace CodemastersBinImage.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17 |
18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19 |
20 | public static Settings Default {
21 | get {
22 | return defaultInstance;
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/CodemastersBinImage/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/CodemastersBinImage/WinImploder.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Runtime.InteropServices;
4 |
5 | namespace WinImploder
6 | {
7 | public static class ImploderWork
8 | {
9 | [DllImport(@"win_imploder.dll", CallingConvention = CallingConvention.Cdecl)]
10 | static unsafe extern int implode(byte* input, uint size, byte mode);
11 | [DllImport(@"win_imploder.dll", CallingConvention = CallingConvention.Cdecl)]
12 | static unsafe extern int imploded_size(byte* input);
13 |
14 | [DllImport(@"win_imploder.dll", CallingConvention = CallingConvention.Cdecl)]
15 | static unsafe extern int check_imp(byte* input);
16 |
17 | [DllImport(@"win_imploder.dll", CallingConvention = CallingConvention.Cdecl)]
18 | static unsafe extern int explode(byte* input);
19 | [DllImport(@"win_imploder.dll", CallingConvention = CallingConvention.Cdecl)]
20 | static unsafe extern int exploded_size(byte* input);
21 |
22 | public unsafe static byte[] Implode(byte[] input, uint size, byte mode)
23 | {
24 | byte[] output = new byte[0x10000];
25 | Array.Copy(input, output, input.Length);
26 |
27 | fixed (byte* pOutput = output)
28 | {
29 | int out_size = implode(pOutput, size, mode);
30 | if (out_size != 0)
31 | {
32 | byte[] result = new byte[out_size];
33 | Array.Copy(output, result, out_size);
34 |
35 | return result;
36 | }
37 |
38 | return null;
39 | }
40 | }
41 |
42 | public static byte[] ImplodeBest(byte[] input, uint size)
43 | {
44 | byte bestMode = 0;
45 | int bestLen = Implode(input, size, 0).Length;
46 |
47 | if (bestLen == 0) return null;
48 |
49 | for (byte i = 1; i < 0x0C; ++i)
50 | {
51 | int len = Implode(input, size, i).Length;
52 |
53 | if (len == 0) continue;
54 |
55 | if (bestLen > len)
56 | {
57 | bestMode = i;
58 | bestLen = len;
59 | }
60 | }
61 |
62 | if (bestLen == 0) return null;
63 | return Implode(input, size, bestMode);
64 | }
65 |
66 | public unsafe static int ImplodedSize(byte[] input, int pos = 0)
67 | {
68 | fixed (byte* pInput = input)
69 | {
70 | return imploded_size(&pInput[pos]);
71 | }
72 | }
73 |
74 | public unsafe static bool CheckImp(byte[] input, int pos = 0)
75 | {
76 | fixed (byte* pInput = input)
77 | {
78 | return (check_imp(&pInput[pos]) != 0);
79 | }
80 | }
81 |
82 | public unsafe static byte[] Explode(byte[] input, int pos = 0)
83 | {
84 | byte[] output = new byte[ExplodedSize(input, pos)];
85 | Array.Copy(input, output, input.Length);
86 |
87 | fixed (byte* pOutput = output)
88 | {
89 | int out_size = explode(&pOutput[0]);
90 |
91 | if (out_size != 0)
92 | {
93 | byte[] result = new byte[out_size];
94 | Array.Copy(output, result, out_size);
95 |
96 | return result;
97 | }
98 |
99 | return null;
100 | }
101 | }
102 |
103 | public unsafe static int ExplodedSize(byte[] input, int pos)
104 | {
105 | fixed (byte* pInput = input)
106 | {
107 | return exploded_size(&pInput[pos]);
108 | }
109 | }
110 |
111 | public static List> FindImploded(byte[] input)
112 | {
113 | List> list = new List>();
114 |
115 | int i = 0;
116 | while (i < input.Length)
117 | {
118 | if (CheckImp(input, i))
119 | {
120 | int size = ImplodedSize(input, i);
121 |
122 | if (i + size > input.Length)
123 | {
124 | i++;
125 | continue;
126 | }
127 |
128 | list.Add(new Tuple(i, size));
129 |
130 | i += size;
131 | }
132 | else
133 | {
134 | i++;
135 | }
136 | }
137 |
138 | return ((list.Count > 0) ? list : null);
139 | }
140 | }
141 | }
142 |
--------------------------------------------------------------------------------
/CodemastersBinImage/frmMain.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace CodemastersBinImage
2 | {
3 | partial class frmMain
4 | {
5 | ///
6 | /// Требуется переменная конструктора.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Освободить все используемые ресурсы.
12 | ///
13 | /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
14 | protected override void Dispose(bool disposing)
15 | {
16 | if (disposing && (components != null))
17 | {
18 | components.Dispose();
19 | }
20 | base.Dispose(disposing);
21 | }
22 |
23 | #region Код, автоматически созданный конструктором форм Windows
24 |
25 | ///
26 | /// Обязательный метод для поддержки конструктора - не изменяйте
27 | /// содержимое данного метода при помощи редактора кода.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain));
32 | this.pbImage = new System.Windows.Forms.PictureBox();
33 | this.dlgOpen = new System.Windows.Forms.OpenFileDialog();
34 | this.dlgSave = new System.Windows.Forms.SaveFileDialog();
35 | this.dlgOpenBmp = new System.Windows.Forms.OpenFileDialog();
36 | this.pnlLeft = new System.Windows.Forms.Panel();
37 | this.lvItems = new System.Windows.Forms.ListView();
38 | this.chIndex = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
39 | this.chOffset = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
40 | this.chSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
41 | this.pnlButtons = new System.Windows.Forms.Panel();
42 | this.btnExportAll = new System.Windows.Forms.Button();
43 | this.btnImplode = new System.Windows.Forms.Button();
44 | this.btnExport = new System.Windows.Forms.Button();
45 | this.btnBrowse = new System.Windows.Forms.Button();
46 | this.tbPath = new System.Windows.Forms.TextBox();
47 | this.dlgSaveDir = new System.Windows.Forms.FolderBrowserDialog();
48 | ((System.ComponentModel.ISupportInitialize)(this.pbImage)).BeginInit();
49 | this.pnlLeft.SuspendLayout();
50 | this.pnlButtons.SuspendLayout();
51 | this.SuspendLayout();
52 | //
53 | // pbImage
54 | //
55 | this.pbImage.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
56 | this.pbImage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
57 | this.pbImage.Dock = System.Windows.Forms.DockStyle.Fill;
58 | this.pbImage.Location = new System.Drawing.Point(350, 0);
59 | this.pbImage.Name = "pbImage";
60 | this.pbImage.Size = new System.Drawing.Size(459, 387);
61 | this.pbImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
62 | this.pbImage.TabIndex = 2;
63 | this.pbImage.TabStop = false;
64 | //
65 | // dlgOpen
66 | //
67 | this.dlgOpen.Filter = "ROM Files (*.bin;*.gen)|*.bin;*.gen|All Files (*.*)|*.*";
68 | this.dlgOpen.RestoreDirectory = true;
69 | this.dlgOpen.Title = "Select the game ROM...";
70 | //
71 | // dlgSave
72 | //
73 | this.dlgSave.DefaultExt = "bmp";
74 | this.dlgSave.Filter = "BMP Files (*.bmp)|*.bmp";
75 | this.dlgSave.RestoreDirectory = true;
76 | this.dlgSave.Title = "Where to save bitmap...";
77 | //
78 | // dlgOpenBmp
79 | //
80 | this.dlgOpenBmp.Filter = "BMP Files (*.bmp)|*.bmp";
81 | this.dlgOpenBmp.RestoreDirectory = true;
82 | this.dlgOpenBmp.Title = "Select Bitmap file...";
83 | //
84 | // pnlLeft
85 | //
86 | this.pnlLeft.Controls.Add(this.lvItems);
87 | this.pnlLeft.Controls.Add(this.pnlButtons);
88 | this.pnlLeft.Dock = System.Windows.Forms.DockStyle.Left;
89 | this.pnlLeft.Location = new System.Drawing.Point(0, 0);
90 | this.pnlLeft.Name = "pnlLeft";
91 | this.pnlLeft.Size = new System.Drawing.Size(350, 387);
92 | this.pnlLeft.TabIndex = 7;
93 | //
94 | // lvItems
95 | //
96 | this.lvItems.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
97 | this.chIndex,
98 | this.chOffset,
99 | this.chSize});
100 | this.lvItems.Dock = System.Windows.Forms.DockStyle.Fill;
101 | this.lvItems.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
102 | this.lvItems.FullRowSelect = true;
103 | this.lvItems.GridLines = true;
104 | this.lvItems.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
105 | this.lvItems.HideSelection = false;
106 | this.lvItems.Location = new System.Drawing.Point(0, 70);
107 | this.lvItems.MultiSelect = false;
108 | this.lvItems.Name = "lvItems";
109 | this.lvItems.Size = new System.Drawing.Size(350, 317);
110 | this.lvItems.TabIndex = 6;
111 | this.lvItems.UseCompatibleStateImageBehavior = false;
112 | this.lvItems.View = System.Windows.Forms.View.Details;
113 | this.lvItems.SelectedIndexChanged += new System.EventHandler(this.lvItems_SelectedIndexChanged);
114 | this.lvItems.Resize += new System.EventHandler(this.lvItems_Resize);
115 | //
116 | // chIndex
117 | //
118 | this.chIndex.Text = "#";
119 | this.chIndex.Width = 50;
120 | //
121 | // chOffset
122 | //
123 | this.chOffset.Text = "Offset";
124 | this.chOffset.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
125 | this.chOffset.Width = 100;
126 | //
127 | // chSize
128 | //
129 | this.chSize.Text = "Size";
130 | this.chSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
131 | this.chSize.Width = 100;
132 | //
133 | // pnlButtons
134 | //
135 | this.pnlButtons.Controls.Add(this.btnExportAll);
136 | this.pnlButtons.Controls.Add(this.btnImplode);
137 | this.pnlButtons.Controls.Add(this.btnExport);
138 | this.pnlButtons.Controls.Add(this.btnBrowse);
139 | this.pnlButtons.Controls.Add(this.tbPath);
140 | this.pnlButtons.Dock = System.Windows.Forms.DockStyle.Top;
141 | this.pnlButtons.Location = new System.Drawing.Point(0, 0);
142 | this.pnlButtons.Name = "pnlButtons";
143 | this.pnlButtons.Size = new System.Drawing.Size(350, 70);
144 | this.pnlButtons.TabIndex = 7;
145 | //
146 | // btnExportAll
147 | //
148 | this.btnExportAll.AutoSize = true;
149 | this.btnExportAll.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
150 | this.btnExportAll.Enabled = false;
151 | this.btnExportAll.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
152 | this.btnExportAll.Location = new System.Drawing.Point(105, 38);
153 | this.btnExportAll.Name = "btnExportAll";
154 | this.btnExportAll.Size = new System.Drawing.Size(87, 25);
155 | this.btnExportAll.TabIndex = 7;
156 | this.btnExportAll.Text = "Export All";
157 | this.btnExportAll.UseVisualStyleBackColor = true;
158 | this.btnExportAll.Click += new System.EventHandler(this.btnExportAll_Click);
159 | //
160 | // btnImplode
161 | //
162 | this.btnImplode.AutoSize = true;
163 | this.btnImplode.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
164 | this.btnImplode.Enabled = false;
165 | this.btnImplode.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
166 | this.btnImplode.Location = new System.Drawing.Point(198, 38);
167 | this.btnImplode.Name = "btnImplode";
168 | this.btnImplode.Size = new System.Drawing.Size(94, 25);
169 | this.btnImplode.TabIndex = 6;
170 | this.btnImplode.Text = "Implode BMP";
171 | this.btnImplode.UseVisualStyleBackColor = true;
172 | this.btnImplode.Click += new System.EventHandler(this.btnImplode_Click);
173 | //
174 | // btnExport
175 | //
176 | this.btnExport.AutoSize = true;
177 | this.btnExport.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
178 | this.btnExport.Enabled = false;
179 | this.btnExport.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
180 | this.btnExport.Location = new System.Drawing.Point(12, 38);
181 | this.btnExport.Name = "btnExport";
182 | this.btnExport.Size = new System.Drawing.Size(87, 25);
183 | this.btnExport.TabIndex = 5;
184 | this.btnExport.Text = "Export BMP";
185 | this.btnExport.UseVisualStyleBackColor = true;
186 | this.btnExport.Click += new System.EventHandler(this.btnExport_Click);
187 | //
188 | // btnBrowse
189 | //
190 | this.btnBrowse.AutoSize = true;
191 | this.btnBrowse.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
192 | this.btnBrowse.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
193 | this.btnBrowse.Location = new System.Drawing.Point(298, 8);
194 | this.btnBrowse.Name = "btnBrowse";
195 | this.btnBrowse.Size = new System.Drawing.Size(38, 25);
196 | this.btnBrowse.TabIndex = 2;
197 | this.btnBrowse.Text = "...";
198 | this.btnBrowse.UseVisualStyleBackColor = true;
199 | this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
200 | //
201 | // tbPath
202 | //
203 | this.tbPath.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
204 | this.tbPath.Location = new System.Drawing.Point(12, 12);
205 | this.tbPath.Name = "tbPath";
206 | this.tbPath.ReadOnly = true;
207 | this.tbPath.Size = new System.Drawing.Size(280, 20);
208 | this.tbPath.TabIndex = 1;
209 | this.tbPath.WordWrap = false;
210 | //
211 | // frmMain
212 | //
213 | this.AllowDrop = true;
214 | this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
215 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
216 | this.ClientSize = new System.Drawing.Size(809, 387);
217 | this.Controls.Add(this.pbImage);
218 | this.Controls.Add(this.pnlLeft);
219 | this.DoubleBuffered = true;
220 | this.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
221 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
222 | this.Name = "frmMain";
223 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
224 | this.Text = "Codemasters BinImage";
225 | this.Load += new System.EventHandler(this.frmMain_Load);
226 | this.DragDrop += new System.Windows.Forms.DragEventHandler(this.frmMain_DragDrop);
227 | this.DragEnter += new System.Windows.Forms.DragEventHandler(this.frmMain_DragEnter);
228 | ((System.ComponentModel.ISupportInitialize)(this.pbImage)).EndInit();
229 | this.pnlLeft.ResumeLayout(false);
230 | this.pnlButtons.ResumeLayout(false);
231 | this.pnlButtons.PerformLayout();
232 | this.ResumeLayout(false);
233 |
234 | }
235 |
236 | #endregion
237 | private System.Windows.Forms.PictureBox pbImage;
238 | private System.Windows.Forms.OpenFileDialog dlgOpen;
239 | private System.Windows.Forms.SaveFileDialog dlgSave;
240 | private System.Windows.Forms.OpenFileDialog dlgOpenBmp;
241 | private System.Windows.Forms.Panel pnlLeft;
242 | private System.Windows.Forms.ListView lvItems;
243 | private System.Windows.Forms.ColumnHeader chIndex;
244 | private System.Windows.Forms.ColumnHeader chOffset;
245 | private System.Windows.Forms.ColumnHeader chSize;
246 | private System.Windows.Forms.Panel pnlButtons;
247 | private System.Windows.Forms.Button btnImplode;
248 | private System.Windows.Forms.Button btnExport;
249 | private System.Windows.Forms.Button btnBrowse;
250 | private System.Windows.Forms.TextBox tbPath;
251 | private System.Windows.Forms.Button btnExportAll;
252 | private System.Windows.Forms.FolderBrowserDialog dlgSaveDir;
253 | }
254 | }
255 |
256 |
--------------------------------------------------------------------------------
/CodemastersBinImage/frmMain.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Drawing;
4 | using System.Drawing.Imaging;
5 | using System.IO;
6 | using System.Windows.Forms;
7 | using WinImploder;
8 |
9 | namespace CodemastersBinImage
10 | {
11 | public partial class frmMain : Form
12 | {
13 | byte[] rom = null;
14 | string romPath = string.Empty;
15 | List> itemsList = null;
16 |
17 | public frmMain()
18 | {
19 | InitializeComponent();
20 | }
21 |
22 | private void LoadFile(string fileName)
23 | {
24 | btnExportAll.Enabled = false;
25 |
26 | romPath = fileName;
27 | tbPath.Text = Path.GetFileName(romPath);
28 |
29 | lvItems.Items.Clear();
30 | pbImage.Image = null;
31 |
32 | rom = File.ReadAllBytes(romPath);
33 | itemsList = ImploderWork.FindImploded(rom);
34 |
35 | if (itemsList == null) return;
36 |
37 | int i = 0;
38 | while (i < itemsList.Count)
39 | {
40 | Tuple pair = itemsList[i];
41 |
42 | int offset = pair.Item1;
43 | int size = pair.Item2;
44 |
45 | byte[] data = new byte[size];
46 | Array.Copy(rom, offset, data, 0, size);
47 |
48 | BinImageData bid = new BinImageData(data);
49 |
50 | Bitmap image;
51 | bid.ImageAndMask(out image);
52 |
53 | if (image == null)
54 | {
55 | itemsList.Remove(pair);
56 | continue;
57 | }
58 |
59 | image.Dispose();
60 |
61 | string[] row = { string.Format("{0:000}", i + 1), string.Format("0x{0:X6}", offset), string.Format("0x{0:X4} ({0:00000})", size) };
62 | var lvItem = new ListViewItem(row);
63 | lvItems.Items.Add(lvItem);
64 |
65 | i++;
66 | }
67 |
68 | if (lvItems.Items == null) return;
69 |
70 | btnExportAll.Enabled = true;
71 |
72 | lvItems.Items[0].Focused = true;
73 | lvItems.Items[0].Selected = true;
74 | lvItems.Select();
75 | }
76 |
77 | private void btnBrowse_Click(object sender, System.EventArgs e)
78 | {
79 | if (dlgOpen.ShowDialog() != DialogResult.OK) return;
80 | if (!File.Exists(dlgOpen.FileName)) return;
81 |
82 | LoadFile(dlgOpen.FileName);
83 | }
84 |
85 | private void btnExport_Click(object sender, System.EventArgs e)
86 | {
87 | if (lvItems.SelectedIndices.Count == 0) return;
88 | if (rom == null) return;
89 | if (itemsList == null) return;
90 |
91 | int index = lvItems.SelectedIndices[0];
92 | int offset = itemsList[index].Item1;
93 | int size = itemsList[index].Item2;
94 |
95 | dlgSave.FileName = Path.GetFileName(Path.ChangeExtension(romPath, string.Format(".{0:000}_{1:X6}.bmp", index + 1, offset)));
96 | if (dlgSave.ShowDialog() != DialogResult.OK) return;
97 | string imageName = dlgSave.FileName;
98 |
99 | byte[] data = new byte[size];
100 | Array.Copy(rom, offset, data, 0, size);
101 |
102 | BinImageData bid = new BinImageData(data);
103 |
104 | Bitmap image;
105 | bid.ImageAndMask(out image);
106 |
107 | if (image == null) return;
108 |
109 | image.Save(imageName, ImageFormat.Bmp);
110 | MessageBox.Show(string.Format("{0}{1}File: \"{2}\".",
111 | "File successfully converted to bitmap!",
112 | Environment.NewLine,
113 | Path.GetFileName(imageName)
114 | ), "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
115 |
116 | image.Dispose();
117 |
118 | lvItems.Select();
119 | }
120 |
121 | private void btnExportAll_Click(object sender, EventArgs e)
122 | {
123 | if (rom == null) return;
124 | if (itemsList == null) return;
125 |
126 | dlgSaveDir.SelectedPath = Path.GetDirectoryName(romPath);
127 | if (dlgSaveDir.ShowDialog() != DialogResult.OK) return;
128 | string saveDir = dlgSaveDir.SelectedPath;
129 |
130 | for (int i = 0; i < itemsList.Count; ++i)
131 | {
132 | int offset = itemsList[i].Item1;
133 | int size = itemsList[i].Item2;
134 |
135 | byte[] data = new byte[size];
136 | Array.Copy(rom, offset, data, 0, size);
137 |
138 | BinImageData bid = new BinImageData(data);
139 |
140 | Bitmap image;
141 | bid.ImageAndMask(out image);
142 |
143 | if (image == null) return;
144 |
145 | string imageName = Path.Combine(dlgSaveDir.SelectedPath,
146 | Path.GetFileName(Path.ChangeExtension(romPath, string.Format(".{0:000}_{1:X6}.bmp", i + 1, offset)))
147 | );
148 | image.Save(imageName, ImageFormat.Bmp);
149 |
150 | image.Dispose();
151 |
152 | Application.DoEvents();
153 | }
154 |
155 | MessageBox.Show(string.Format("{0}{1}Directory: \"{2}\".",
156 | "All files successfully exported to directory!",
157 | Environment.NewLine,
158 | dlgSaveDir.SelectedPath
159 | ), "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
160 |
161 | lvItems.Select();
162 | }
163 |
164 | private void btnImplode_Click(object sender, System.EventArgs e)
165 | {
166 | if (lvItems.SelectedIndices.Count == 0) return;
167 | if (rom == null) return;
168 | if (itemsList == null) return;
169 |
170 | int index = lvItems.SelectedIndices[0];
171 | int offset = itemsList[index].Item1;
172 | int size = itemsList[index].Item2;
173 |
174 | dlgOpenBmp.Title = "Select your image Bitmap...";
175 | dlgOpenBmp.FileName = Path.GetFileName(Path.ChangeExtension(romPath, string.Format(".{0:000}_{1:X6}.bmp", index + 1, offset)));
176 | if (dlgOpenBmp.ShowDialog() != DialogResult.OK) return;
177 | string imageFile = dlgOpenBmp.FileName;
178 |
179 | BinImageData bid = new BinImageData((Bitmap.FromFile(imageFile) as Bitmap));
180 |
181 | if (bid == null) return;
182 |
183 | Bitmap image;
184 | bid.ImageAndMask(out image);
185 |
186 | if (image == null) return;
187 | image.Dispose();
188 |
189 | byte[] data = bid.Data;
190 |
191 | if (data.Length <= size)
192 | {
193 | for (int i = 0; i < size; ++i)
194 | {
195 | rom[offset + i] = 0x00; // clearing space
196 | }
197 |
198 | Array.Copy(data, 0, rom, offset, data.Length);
199 | File.WriteAllBytes(romPath, rom);
200 |
201 | MessageBox.Show("File successfully imploded and inserted into ROM!",
202 | "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
203 | }
204 | else
205 | {
206 | string fileName = Path.ChangeExtension(imageFile, ".imp.bin");
207 | File.WriteAllBytes(fileName, bid.Data);
208 |
209 | MessageBox.Show(string.Format("{0}{4}{1}{4}{2}{4}File: \"{3}\".",
210 | string.Format("Size of imploded data exceeds original one by +{0} bytes!", data.Length - size),
211 | "Saving in external file...",
212 | "File successfully converted to binary data!",
213 | Path.GetFileName(fileName),
214 | Environment.NewLine
215 | ), "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
216 | }
217 |
218 | lvItems_SelectedIndexChanged(sender, e);
219 | lvItems.Select();
220 | }
221 |
222 | private void lvItems_SelectedIndexChanged(object sender, System.EventArgs e)
223 | {
224 | if (lvItems.SelectedIndices.Count == 0) return;
225 | if (rom == null) return;
226 | if (itemsList == null) return;
227 |
228 | btnImplode.Enabled = false;
229 | btnExport.Enabled = false;
230 |
231 | int index = lvItems.SelectedIndices[0];
232 | int offset = itemsList[index].Item1;
233 | int size = itemsList[index].Item2;
234 |
235 | byte[] data = new byte[size];
236 | Array.Copy(rom, offset, data, 0, size);
237 |
238 | BinImageData bid = new BinImageData(data);
239 |
240 | Bitmap image;
241 | bid.ImageAndMask(out image);
242 |
243 | if (image == null) return;
244 |
245 | pbImage.Image = image;
246 |
247 | btnImplode.Enabled = true;
248 | btnExport.Enabled = true;
249 | }
250 |
251 | private void SizeLastColumn(ListView lv)
252 | {
253 | lv.Columns[lv.Columns.Count - 1].Width = -2;
254 | }
255 |
256 | private void lvItems_Resize(object sender, EventArgs e)
257 | {
258 | SizeLastColumn((ListView)sender);
259 | }
260 |
261 | private void frmMain_Load(object sender, EventArgs e)
262 | {
263 | SizeLastColumn(lvItems);
264 | }
265 |
266 | private void frmMain_DragEnter(object sender, DragEventArgs e)
267 | {
268 | if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)
269 | {
270 | e.Effect = DragDropEffects.All;
271 | }
272 | }
273 |
274 | private void frmMain_DragDrop(object sender, DragEventArgs e)
275 | {
276 | string[] files = (string[])(e.Data.GetData(DataFormats.FileDrop));
277 |
278 | LoadFile(files[0]);
279 | }
280 | }
281 | }
282 |
--------------------------------------------------------------------------------
/CodemastersBinImage/frmMain.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 | 127, 17
122 |
123 |
124 | 226, 17
125 |
126 |
127 | 320, 17
128 |
129 |
130 | 17, 17
131 |
132 |
133 | 65
134 |
135 |
136 |
137 |
138 | AAABAAEAZGQAACAAIACoogAAFgAAACgAAABkAAAAyAAAAAEAIAAAAAAAgKIAAAAAAAAAAAAAAAAAAAAA
139 | AAAhIij/IiIo/yQjKf8jIyn/IyMp/yMjKf8jIyn/JCMp/yMhKP8hICb/Hx4k/xsbIf8YGB7/Fxgd/xcX
140 | Hf8WFhz/FhYc/xYWHP8WFhz/FhYc/xYWHP8WFhz/FhYc/xYWHP8WFhz/FhYc/xYWHP8WFhz/FhYc/xcX
141 | HP8ZGBv/GRcd/xkXHf8ZGBz/Fxcc/xYWHP8XFhz/Fhcc/xYXG/8WGBz/Fhcc/xYXHP8WFxz/FRcb/xUX
142 | G/8VFhr/FRUa/xQVGv8WFhz/FxYd/xYWHP8WFhz/Fxcd/xcYHv8XFx3/Fxgc/xkZHv8aGR//Ghog/xwc
143 | If8eHSL/Hh4i/x0eI/8eHiT/Hx8l/yAfJf8gICb/ISIn/yMkKf8kJSr/JiYr/ycnLP8nJi3/JiYs/yYm
144 | LP8mJyz/Jyct/yYmLP8mJiz/JiYs/yYlLP8lJSv/JSUr/yUlK/8lJSv/JCQq/yQkKv8kJCr/JCQq/yQk
145 | Kv8kJCr/JCQq/yQkKv8kJCr/JCQq/yQjKf8jIyn/IyMp/yMjKf8jIyn/Iygr/yMnKv8jJSr/JCYq/yQl
146 | K/8jKCv/JSkr/yQlK/8jJyv/IyYp/yEjKP8fICX/HB8i/xoeIf8aGh//GBke/xgZHv8YGB7/GBge/xgY
147 | Hv8YFx3/GBcd/xcXHf8XFx3/Fxcd/xcXHf8YFx3/GBcd/xcXHf8YFx3/GRgd/xkYHf8YGB3/GBkd/xcY
148 | HP8XGB3/Fhge/xYZHv8WGR7/Fhof/xYZH/8WGR//Fhgf/xYZH/8WGR//Fhog/xYaIP8WGR7/Fhod/xca
149 | Hf8YGR7/GRsf/xsdIP8bHyL/GyEi/xwhIv8dIyL/HyMk/yAiJv8hJCb/Iico/yQoKf8kKCr/JCkr/yUp
150 | LP8lKSz/Jisu/ycrLv8oLi7/KS4v/youL/8qLzH/Kiww/yorL/8qKi//Kikw/ykqL/8pKS7/KCku/ykp
151 | L/8oKS7/KCgu/ygnLf8nJy3/Jyct/yYmLP8mJiz/JiYs/yYmK/8lJSv/JSUr/yUlK/8lJSv/JSUr/yUl
152 | LP8kJSv/JCUq/yQkK/8kJSr/JCUq/yM3MP8kNS3/JC8q/yQ2K/8mMC3/Jz0u/yU3LP8mOS//JD4v/yQ1
153 | LP8kLyr/Iywp/yAxJ/8eLiX/Hici/x4mI/8dIiT/HR8k/x0fIv8cHiL/HB0i/x0cI/8dHSL/HB0i/xwe
154 | I/8cHCL/HBwi/xwcIv8bHCH/Ghwi/xkcIf8ZHCH/GBwh/xgbIP8YGyD/GBsg/xcbIP8YHCH/GB4j/xcf
155 | Jv8XHib/GCAk/xgiIv8XICb/Fx8o/xohJ/8YHyT/FyEk/xgjIv8ZKSH/HCkj/x4lJf8eLyX/Hzgo/x82
156 | J/8gNSj/ITsr/yM7Lf8lOC3/Jjku/yY+MP8nQjH/KEEx/ypDMv8qRjX/K0k1/ypINf8pSDX/K003/ytF
157 | Nf8rTTf/K0g3/yw8Nf8sOTX/LTo1/y02NP8tMTP/LDQ0/ysxMv8rLzL/Ky0z/ysvM/8rLTH/Kiov/ykr
158 | MP8pLDL/KCww/ygsMP8nKi//KCgv/ycqL/8nKi//Jikv/yYpLf8mKi3/Jiwt/yYsLP8lKSz/JSos/yUp
159 | LP8kQjL/JEMs/yZBLf8kSy7/J0Ev/ylOLv8nRi//KlU0/ydUMv8lRi7/Jzwu/yU9Lv8kQi3/JDwr/yM8
160 | Kv8jOyv/JCwr/yMuK/8kLSv/JCwq/yQqK/8kKyr/JCgp/yQqK/8kKSr/IyQp/yMkK/8iJSr/IiUp/yIl
161 | Kf8gJSn/HiEm/x0fJP8cHyT/GyAk/xkfJf8ZHif/GR8n/xkiJ/8YIyv/GSQu/xglLP8YKyT/GCwl/xgl
162 | Lv8ZJCf/GCUm/xgnKf8bLCn/HDQl/x5FKv8hQCv/Iz0p/yFTL/8jUy7/JEws/yRQM/8kUDT/JlE0/ypU
163 | Nf8qVTb/KVc3/ytaN/8rXzn/LGc//ytnPf8rZz7/Lm9C/y1sP/8ubkH/L3NA/y5fOv8vVzj/LVA5/y1R
164 | OP8wQDj/L0E4/y9IOP8vPjb/Lzg3/y81OP8uPDb/LjU1/y4yM/8tNDP/LDYz/yw1NP8sMTX/KzE0/ys0
165 | M/8qNDP/KjA1/yoyMv8pMS//KTIw/yg3L/8pNDD/KDQw/yg4L/8oMTD/JU4y/yZNL/8nVTH/J1Qx/ylW
166 | M/8nWTP/LF03/yxnOP8rYDX/KFYx/ylRMv8qVTP/KUwy/ylNMv8pWjX/KlE3/ys/Nv8qSzX/KkU2/yw8
167 | Nf8rQDT/Kz4x/yw+Mv8sPDH/LTAx/y0wMv8sOTP/KzU0/ywwM/8rLzL/KjAx/yksKv8nJir/IyUq/yIn
168 | Kv8fJiz/HiQt/xwjKv8bJCr/GyUs/xsmLv8aJTD/GSgt/xkyIv8ZLCr/GSgs/xouKP8dKin/HjYo/yE9
169 | Kf8kRSz/Ilox/yRUMP8mWDD/JmIz/yVZMP8mWTL/J103/ydgOP8oYjj/KWQ5/ythOv8sZjr/LGw7/y1u
170 | Pf8tbT//L3JB/y5zQ/8ueUX/MIVI/y+BSP8wbED/M3JC/zFlP/8xYkD/M08+/zJfQP8yXD//MU86/zNK
171 | PP8xTjr/MFI5/zFIPP8xSTn/MUM0/zA/N/8xOzr/MEM3/y5INv8uPjb/LzY3/y42Nv8sQjL/LD40/ys+
172 | Nf8qRDP/Kj8z/ypAMv8oSTH/KT0y/yhdN/8oWjX/KF83/ypYM/8tYTj/KmU5/y9nPv8uaz3/LWQ6/y1k
173 | Ov8uZTz/LWE7/y1cO/8uZz7/MG9B/zFgQf8vUz//MGJD/y5WPv8wTzr/MVs//zBQOf8wTTn/MkE2/zI6
174 | Nv8xSDf/L0s4/zE5Ov8xODb/Lzs0/y86Mv8tMy7/Li0w/yssMP8oLzD/JzEw/yMrLf8hKCv/Hykp/x0p
175 | K/8eJin/HSgr/xskL/8bMib/GzMk/x0rKv8dNCf/IDIr/yI4K/8iRCz/JEMr/yVLLv8kWDD/J1cu/yRZ
176 | Mv8mVi//JlYu/ydYM/8pWDT/KF03/yhgOP8tYjf/K2Y6/ylpO/8qbD7/Lm1B/y9uPv8tb0H/L3dG/zCB
177 | SP8uekf/M3lI/zOASf80bkP/M2pF/zNrQ/82c0j/NWBD/zVcPv82V0D/NGA+/zRYO/80WDz/NVA5/zVK
178 | Ov81SDv/NE07/zRUO/81RD3/NDo9/zM7Of8xSDX/L0w4/zBHPP8uSzj/LVA1/y1INv8sSDf/Klc2/ytN
179 | NP8rYzz/LmM6/y5iPP8uXzv/L2I8/y9lPP8waT//MG1A/y1sPv8xb0H/M3BD/zFrRf8wbUP/M3VF/zR8
180 | S/80cUf/Ml5B/zZwS/82a0j/NWhF/zRjQ/8xYUP/M1pA/zVIOv8zTTn/MFc6/zNEOP81NDj/Mj82/y9D
181 | Mf8vPTH/MDIx/y8uMf8sLzD/Kjcw/yk0Lv8nLi7/JCst/yEvKf8gLCr/ISkp/yArJ/8eKSn/HDIl/x41
182 | I/8fLCj/HzQm/yA0Kf8hNyr/IT0o/yFCKv8jQCr/I0Ip/yRIKv8iTCz/JEws/yRNLP8kTyz/J08u/yVS
183 | M/8mVDT/KFY0/ylXNf8oXDb/KWA5/yxgOv8sYzr/LmY9/y9sQf8wcEL/MW5C/zN8SP8xe0b/MnNH/zNs
184 | SP83dUr/OXtJ/zlkQ/85ZUP/O11C/zxgP/85Wz3/OVo9/zpSO/84Wjz/OVc6/zZdP/84UED/OUM//zZN
185 | P/82Uzz/NV85/zVRPP8zUzz/MVM4/zNcOv8xVTr/M1w8/zBiPv8wWjr/MGI9/zNlPv8zZz7/Mmk+/zBp
186 | QP8ybD//NG1A/zRxQv8xcED/M3JD/zZzRf83ckn/NXhL/zaATf80g03/NYFR/zhxSf86fE//OXRN/zVx
187 | S/83bkn/Nm5I/zZhQ/8zUT7/MVU7/zBPOf8zOTf/MTc0/y1DNf8rQjL/Kzgw/y0tLv8rKyz/KDMr/yg3
188 | LP8oLiv/Jy4s/yUrK/8hMSj/ISop/yEpKP8gLyb/Hyon/x0wI/8dMCP/HSol/x4zJP8eMCT/HzUl/x4y
189 | JP8dOiT/HTcl/x43JP8eOSP/Hzsk/yA+Jv8gQCX/IkEn/yFDKf8iRiv/I0gu/yRJL/8lSzD/Jk4x/ydR
190 | Mf8nUzH/J1Qz/yhWNP8rWTb/K104/y1jOv8saz3/LWg9/zFqRP8za0L/M3pD/zd3Q/85a0X/Om5F/zto
191 | Qf8+YEH/PGJD/z1dQf9AZT//P2g//z1kQP9AZz//PlY+/zpeP/86XUH/PGRA/zlnQP88WD7/OmE9/zdg
192 | Ov84Zz//NWJA/zZzRf80bkL/Nmk//zNoQv81akH/NW1B/zZyQf81dET/N3RF/zl2Rv84dkf/OnZD/zl4
193 | Sf87eUv/OntK/zl6S/86g0//OIpS/zmFUf85fVL/OYNV/zl2Tv82dk7/NHFK/zFuRv8vXD//LlM//y5N
194 | Of8tQTP/LTkw/ys8MP8rRjP/KT8w/yczLf8lKiv/Iigo/x4rJf8bJCP/HCEi/xoiIf8aHyD/GCMh/xgd
195 | If8YHyL/Gicj/xsoJf8bKiT/HCwk/xwtJP8eMyT/HTAi/xsxIv8aKyD/Gi0g/xoxIP8bMyH/HTQi/xw0
196 | I/8bNST/GzQk/xsyJv8ZMSX/GDEq/xgwJ/8YMCT/GDIj/xkzI/8bNCj/HDgt/x09Lf8iQy//JEcw/yZO
197 | Mf8pVDP/Klc1/ypYN/8tVzn/LWE6/y5rPP8xYj3/M2hD/zZtRP85YkP/PGdJ/z9xSv8/aUP/QHVE/0Js
198 | R/9Ac0j/Q21H/0VlRP9Ab0T/QGVH/0F1R/88a0b/QG5F/z11Rv89cEX/PHRJ/zt3Sf87hU7/OXlI/zd3
199 | SP84bUb/Om5G/zlxRf87cUf/OndJ/zt8Sv87fUr/PH5L/z2CS/88hk3/PIVP/zuGT/88gk3/PIVN/zyS
200 | VP87iFD/OoVS/zuEU/83eE3/MmxF/y9pQv8rYj//KFI6/yhGNP8mQS7/KEAs/yQ0Kv8dLSX/FyUe/w4W
201 | E/8JDAv/BgcE/wQEAP8BAgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wECAP8EBQD/BQcE/wYK
202 | CP8JDw3/DhgV/xMhHP8WKR//Giwh/xosIP8WJyD/EiAd/w8YF/8KEBD/BgwK/wUHBf8DBQL/AgIA/wEA
203 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAwD/BQcD/wYMCf8KExD/EB4a/xYuJv8dPC7/JUk0/yZQ
204 | NP8mUTT/KlA2/yxbOf8uXD3/M15A/zdySf8/b0z/QmxJ/0F+TP9EdEz/R35O/0V1Tf9Gdkv/RHhM/0R/
205 | T/9EfUz/QHhM/0GETP9Ah1D/QH9Q/0J8Tv8/iVL/PJNX/zyIT/8+gk3/OnVI/zlyRv9Ackj/PGpF/z56
206 | S/88hk3/PYVM/z6GS/88jVL/PY1R/zyRUP89j1H/PI5S/z+OUv8/lVj/Po5W/0CHUf86g0//NXBI/y5e
207 | Pv8pVzn/Jk4y/yVDL/8iOyn/IUAs/xMkHP8FBgb/AAAA/wAAAP8AAAD/AAAF/wIBFP8EAyD/BQQw/wYG
208 | OP8HB0D/CQhH/wkISP8IB0L/BgY6/wYGNf8FBC3/BAMe/wICFv8AAAn/AAAA/wAAAP8AAAD/AgMD/w0V
209 | E/8MExb/AgIE/wAAAP8AAAD/AAAB/wEADP8CARj/BAMi/wUFMP8GBjf/Bwc//wgJRf8JCUf/CQhH/wcI
210 | Qf8GBjj/BQUw/wQCIP8CABP/AAAE/wAAAP8AAAD/AAEA/wcNDv8YLSb/IkQv/yJBLv8lSTH/KEw0/y1U
211 | Of8yYED/OGNE/z9vS/9CgVP/R35Q/0mHVf9IgVb/R4FV/0iJV/9Hi1j/RoFQ/0SHVf9DjlX/RJNc/0OJ
212 | Vf9CiFT/QpBX/0CWWP9AjlL/Po1R/1SKWf97r4b/e7WS/26gbf89iE7/P49T/0CPUf9AkFH/P5FU/z+R
213 | U/8+lVT/P5VT/z+TVP9ClFf/QZhb/0KSWP9AhlL/OHxJ/zNoQP8rVTX/JUgu/yFBK/8eOyf/Hzgn/xMl
214 | G/8AAAD/AQEJ/wYFO/8JCmb/DA2H/w4Qn/8QEq//EhO6/xQVxf8WF8z/GBjR/xgY1f8ZGdb/FxjU/xYX
215 | 0P8VFsr/FBTE/xITu/8QErD/DxCj/w0Oj/8KC3P/BwdK/wEACP8AAAD/AAAA/wICD/8ICFX/Cgt3/wwO
216 | kv8QEKT/EBKx/xITvP8UFcX/FhfM/xgX0f8YGNX/GRnV/xgY1f8WF9H/FhfM/xUVxv8SFLv/EBKv/w8Q
217 | n/8NDob/Cgpj/wYFNf8AAAT/AgED/xgrJ/8gOyz/IDwr/yNALP8mSDD/LFE3/zNdP/88cEr/Q4JV/0iF
218 | V/9Jjl3/So1d/0uPYP9KkmH/SIpY/0iLWP9Ijlz/R5Jd/0abZf9Gllr/RZVX/0OWV/9Bmlv/QZpY/0GY
219 | V/93n2z/mcmh/4TLqv+AtX3/P45T/0GUVf9Cl1X/QJhV/0OUVf9BmFf/QZhW/0OZVv9DmFb/Q5lY/0SY
220 | WP9Fllf/QYxU/zp+S/8yaD7/KVUy/yRILP8gPyr/Hzwn/x05Jv8GCwj/AgAG/wsNhP8OELf/DxG3/xER
221 | uv8SErv/ExO+/xYVw/8XF8f/GBjM/xoZ0P8aGdP/GhrT/xoZ0/8ZGdH/GBjO/xcXyv8VFsf/FBTC/xMT
222 | vv8RErv/EBG4/w4Psv8DAx//AQEA/wAAAP8FBTT/EBG7/w8RtP8QEbf/ERK6/xMTvf8VFcL/FxfH/xgY
223 | zP8aGdD/GhnT/xoa0/8aGdP/GRnR/xgYzv8XF8r/FhbH/xQUw/8TE8D/ERK9/xARuP8PELX/Cwtz/wAA
224 | AP8LExX/ITst/yA6K/8iPiz/JUYv/ytPN/80XT//PHJL/0SFWP9Kil7/TJJl/02UZv9Nk2j/SpZn/0qS
225 | YP9LlF7/SJdf/0eZY/9HnWb/R5dh/0iZXP9EnVv/Q59d/0KeXf9DnF3/icmu/5rAkf9YklP/RI1V/0OX
226 | WP9ElFT/RJRV/0SWVP9HllT/RZlY/0SZWf9Fmln/RppT/0acVf9ImFj/R5ZY/0OSVf8+h0//NXRE/y9k
227 | O/8qVTL/JUsv/yVGLf8fPSn/AwYA/wQCIv8OD63/Dg+q/w8Qrf8REbT/FBO8/xYVw/8YF8r/GRnR/xoa
228 | 1/8cG9z/HBzf/x0c3/8cHN//HBze/xwb2/8aGtf/GBnS/xcXy/8UFcT/ExO7/xARsv8OD6j/AgIY/wMC
229 | Bv8CAgH/BAQs/w4Qr/8PEKz/EhG1/xMSvP8VFcL/FxfK/xkZ0f8aGtb/HBvb/xwc3/8dHN//HBzf/xwc
230 | 3v8bG9v/GhrX/xkZ0v8XF8z/FRXE/xMTu/8QEbH/DhCs/wwOpP8BABL/BwwL/yRCM/8mRTH/KEg0/ytS
231 | N/8xXT7/N21I/0B+Uf9Iilv/TJJg/06SY/9Pkmf/S5Rm/0yTZv9LmGb/Sppj/0mfYf9HnmP/R51k/0ma
232 | Zf9JmmP/RqJj/0WhXP9Fnlv/Rp1c/3u+iP9qrHL/To1T/0uUWf9Io2P/SZZc/0iSVP9JnFv/SZxd/0WZ
233 | Vv9EmFn/Rpla/0iZVf9Imlb/SZxX/0ibVv9JlFT/RY9Q/z6CSf85dUT/M2g9/zBeOf8tWDf/KE4z/wUJ
234 | Af8CARz/DQ+m/w8Qrf8QEbL/ERK5/xQUwf8XFsn/GhnS/xsa2f8cG97/Hhzi/x8e5f8gHeb/Hx3m/x8d
235 | 5P8eHeP/HRzf/xwb3P8ZGdX/FxjO/xUVxP8RErv/DxCp/wIBEv8FBwn/BAYE/wMCJP8OEK//EBCx/xIS
236 | uf8UFMD/FhfI/xkZ0f8bGtn/HBve/x4c4v8fHuX/IB3m/x8d5v8fHeT/Hh3j/x0c3/8bG9z/GRrW/xgY
237 | zv8VFcX/EhO5/w8Rs/8ND5z/AQAM/woSEP8tUj3/L1U7/y9eP/80ZEP/OW9K/z5+Uv9FhVf/So1c/0yW
238 | Yv9KnGf/Sqtq/0yhZf9JnmT/SaVp/0ydZv9Kn2X/S6Fl/0uhZP9Jn2b/SJ5o/0ejZv9HoV7/RZ9b/0Wk
239 | Xv9UoV7/Tqpj/1SUVv9Qn2H/Taxq/02WXv9LmV3/SaRi/0iWW/9ElVr/R5ld/0iZWv9KlFf/SpdX/0mZ
240 | V/9LmFT/TpVW/0ySVf9JjVH/Q4ZO/0B/TP89d0n/Om9A/zl5Sf8NHRH/AAAH/w0Omv8PELH/EBGz/xMT
241 | vP8VFcX/GBjO/xoa1/8cG97/Hx3k/yAd5/8gHuj/IB7p/yAd6f8gHuj/IB7o/x4d5v8dHOL/HBvd/xka
242 | 1v8WF8v/ExTC/xAQp/8BAAr/CA0N/wcKCf8CARr/DhCr/xARtf8TE7v/FhXE/xkYzf8bGdb/HBve/x4d
243 | 5P8fHuf/IB7o/yAe6f8gHen/IB7o/yAe6P8eHeb/Hh3i/xwc3v8ZGtb/FxfM/xQUv/8SErz/DQ6Q/wAA
244 | AP8TIx//OGpG/zloRf87c0r/Pn5S/0GGWf9EmWD/R6dn/0qWX/9OoWT/Satp/0m5bv9Jrmv/R7Jq/0m8
245 | b/9KuXL/SKRq/0qhaf9LoWb/S6Nk/0ikZv9MoWb/TJxg/0qfYP9IpGL/WqNh/1etaP9UqmT/T7dx/0+j
246 | Zf9OmV7/Saxn/0esZf9Hml3/RaVj/0inY/9Jm13/TY5Z/0yRV/9MkVj/TJhX/0uTWv9MhlX/SYZR/0mR
247 | Vf9ElFb/RJBV/0CYWv9Crmj/Hkku/wAAAP8MDXn/DxG4/xARtP8UFL//FxfJ/xkZ0/8bG9v/Hh3i/yAe
248 | 5/8hHun/Hx7r/x8f6/8gH+v/ICDq/yEf6v8hHur/IB7m/x0c4f8cG9z/GRjQ/xUWyf8PEaD/AAAB/w0Z
249 | Ff8KExH/AQAN/w4Ppf8QErf/FBO+/xcWyP8ZGdL/Gxvb/x0d4f8gHuf/IR7p/x8f6v8gH+v/IB/r/yAf
250 | 6/8hH+v/IR7q/yAe5v8eHeL/HBvc/xoZ0/8VFcP/ExTF/wsMav8AAAD/J0c3/0SBU/9EfFD/RohU/0iU
251 | Xf9Jp2f/SL5v/0fDcP9MuG//UaJk/1CZX/9NnmX/SrZt/0m9b/9LwHT/TLBx/0qrb/9Jomf/S6Nn/06h
252 | Z/9Pomf/TaJo/02fZv9KoGT/SKJj/12mZv9cnmD/V6Ni/1KpZ/9PrWv/TL9z/0q7bv9Irmb/R6pm/0eq
253 | Zv9MmGD/T45a/06RV/9OlVf/T5db/0ubXf9XpGf/bK53/2qkb/9Mml//RJ9c/0ihXP9Ds2z/RMBv/zKG
254 | Uf8AAAD/CAdD/xARuP8RErT/FRXB/xgXzP8aGtf/HBvf/x8d5f8gHun/IB7r/yAf6/8gIOv/IiHr/yUk
255 | 7P8oJuv/JiTr/yMh6P8fHuT/HRze/xkZ0/8XF9D/DxCQ/wAAAP8XMST/Eycf/wAAAP8OD5j/ERK7/xUU
256 | wP8YF8z/GhnW/xwc3v8eHeX/Hx/p/yAf6v8gH+v/ICDs/yIg7P8lI+3/Jybs/yYk6/8jIej/Hx7l/xwb
257 | 3/8ZGdb/FhbH/xMUwv8GBTL/AgIA/z52Vf9Lll3/SYxX/0qWWv9MnWH/S69p/0u/cP9MwnP/ULFt/0+b
258 | Xv9Ql17/Sq1s/0y1bf9PoGT/Tbxz/0+ra/9On2T/SaZn/0ynZv9Mpmb/TaNo/0una/9Mp2r/S6Vl/0qk
259 | Y/9eqGX/WqNk/1agZP9Sp2n/TbNw/0y3bv9NqGf/T5lh/02UXP9Nkln/UI1Z/1CQWP9Rjlr/UJZZ/06d
260 | Wv9QpF//otCY/4zlyv+o3LL/Zqtr/0KeW/9Io1//SaBi/0uoY/9Ho1//CxkM/wEAC/8OD6H/ERK5/xUV
261 | wf8ZGM3/GxrX/x0c4P8gHub/IB7p/yAf6/8gH+v/IiHr/yko6/85N+3/Q0Lu/z087P8sK+j/IiDk/x0c
262 | 3v8aGdL/FxfT/w4Oc/8AAAD/J1I5/yJDNv8AAAD/DA6B/xESv/8VFL//GBfM/xoa1v8dHN//Hx7l/x8f
263 | 6f8gH+r/IB/r/yIh7P8oJ+z/Nzbt/0NC7f8+Pez/LSzp/yIh5f8dHN7/GRnV/xcXzv8REqH/AAAA/xQo
264 | H/9PpGv/TaVl/0+fZ/9RmGL/UJdh/0+ZYf9PomP/UaNj/1GcXv9OmV7/T5xh/0uwa/9QnmL/UZhe/06h
265 | ZP9OsWz/S6pm/02nZP9OqWP/Tatk/0ypaP9NqWn/Tqpo/06pZ/9Mqmf/WrFp/1mkZ/9VrW//T7h0/1Cg
266 | Z/9PkVz/TZ9i/0+eYv9Rjlr/UI1Z/1GLW/9QjVv/UJBZ/1CQWf9Pl1v/TZ1d/3W3e/+Ix47/dLt5/06l
267 | YP9Kp2H/S6xk/06kZP9NnmL/Uqto/yZUN/8AAAD/Cwxj/xITwv8UFb7/FxjN/xoa1/8cHN//IB7l/yAf
268 | 6P8fH+r/IB/r/yQk7P84N+3/Xl7x/3h48/9paPH/QEDr/yUl5P8cHNz/GRjP/xcXz/8JCEb/AAAA/zt2
269 | VP8yY03/AAAA/woKWP8REsD/FRS+/xgXzP8aGtX/HBzf/x8e5f8gH+j/Hx/r/yAf6/8jI+z/NTTt/1pb
270 | 7/93d/P/a2vw/0ND6v8mJuT/HR3c/xgY0P8YF9L/CgtW/wAAAP85bFP/Xrt+/1Wtcv9Xq3X/Wahy/1qh
271 | bf9Ynmr/V55p/1edaP9XnGb/VKBm/1eeZv9Xnmb/VaJm/1KoZ/9SqGj/Uqhm/1GrZ/9Srmf/Ua5o/1Ct
272 | bP9Prmz/UK1s/0+vbv9PsWr/TrFp/1uSW/9ZjFn/VpZi/1SgZv9Rl2D/Uo1c/1WNW/9TjVv/Uo5d/1OS
273 | XP9VkV7/U5Rd/1OXXv9UmF7/VJlh/1OfYv9NoGD/T6Bc/0+jXv9Rqmf/U7Nw/1K2b/9Ut3H/VLJy/1a2
274 | df9MoGv/Bw4H/wIAE/8QEaj/FBXC/xcXyf8aGtT/HBvc/x4d4/8fHuf/IB7p/yAe6v8mJez/QkDt/3V0
275 | 8v+Xl/T/g4Py/05N6f8nJ+H/HBvX/xgY0f8UE7L/AAAM/wwaEP9JmGb/RYdi/wcMCP8DARz/EBKy/xQU
276 | v/8XF8n/GhnU/xsb3P8eHeL/Hx7m/yAe6f8gHur/JSPr/z497P9wcPL/l5b1/4aG8v9RUOr/KSrh/x0c
277 | 1/8YGdT/ExSo/wAABv8QGxb/Wqly/16xd/9brHj/Xat4/12od/9dpHH/XKZy/12pdv9bqHD/WaVy/1ik
278 | bf9Zp23/Wahv/1iubv9YsG3/VbBu/1axbf9Us2z/UL1w/1G8df9Us3L/ULt1/1C2c/9Rsm//UbNt/1C2
279 | bP9ZkVr/VpBb/1WMW/9VjVr/UpNa/1GTXP9SkFz/UpZf/1CjZf9SnGD/VZZh/1GlZv9RnmX/Upxk/1Kg
280 | Zf9Uo2b/VKdm/1SqaP9Uqmr/Valq/1aub/9TtXL/VbVx/1Wzc/9Us3L/X718/zVlSv8AAAD/CgpF/xQU
281 | xP8WFsT/GBnQ/xoa2P8cG9//Hh3j/yAd5v8gHuf/JCPp/zc26/9cXO//d3bx/2Zm7f8+PuT/IyLc/xka
282 | zv8WF9P/CwxW/wAAAP8sWD3/T6dp/1CjZ/8lRzT/AAAA/wwNaP8TFMb/FRbC/xgZz/8aGtf/HBze/x4d
283 | 4/8gHub/IR7n/yMj6P81NOr/WVnv/3Z28P9oae3/QEHm/yUk3f8aGtH/FhjL/wgJNP8AAAD/QoRi/2XB
284 | ff9grHT/Yat4/2Kpef9gqHf/X6t3/12ud/9csXb/XLB5/1utdv9brXD/W610/1utdP9ZsHL/WLFy/1W2
285 | cv9Su3L/Ub1y/1G+cP9PwXT/Ub51/1S9dv9Tu3P/Ur5z/1C/c/9Su2//VpJb/1aNXf9Xj13/U5Nd/1KU
286 | Xv9RlWH/Tplg/0+ZXv9RpGb/Ualp/1KgZf9Pq2v/UqJl/1GjZv9SpWj/Ualo/1KsZ/9VrGj/Vaxr/1at
287 | bP9WsXD/VbRz/1e1c/9YtnT/V7V2/1yxeP9er3j/FCUa/wAAAP8PEJD/FRbO/xcXx/8ZGtP/Gxva/xwb
288 | 3v8eHeL/Hh3j/yEf5f8nJuX/NjXo/0FA5/85OeT/KSje/x0c0f8XGdb/EROd/wAAAP8NFw//S5Na/0+X
289 | YP9QnWH/Rotd/wcMCv8BAAj/ERGk/xUWyP8YF8f/GRnT/xsb2f8cG97/Hhzh/x4d4/8gH+X/Jibm/zQ0
290 | 5/9BQOf/Ozvk/yop3v8dHdD/GRnZ/xASiP8AAAD/Hj8y/2HGhf9gt3f/YrZ7/2O0f/9itID/YrN8/2Cz
291 | e/9etXz/W7l7/1u3fP9cs3f/W7J4/1qzd/9YtHb/WbR1/1m0dP9VuXf/Ur51/1PDdf9SwnX/U7x1/1K9
292 | df9UvnX/VcB3/1TBc/9Rv3H/VLxv/1OSXf9SkV//UpNd/1KUXf9SlF//UZpj/0+nZ/9Tp2r/U6Rm/1Kq
293 | aP9Qqmr/U6pq/1Ovbf9StG//UbNs/1KwZ/9Ss2z/VrBs/1iyb/9WtG7/VbVy/1S1cf9St2//UbNu/1Cv
294 | bf9Op2v/Uq1q/0CIUv8DBQD/BQMb/xMTrv8XF8z/GBfJ/xka0/8aGtj/HBvc/xwc3v8dHN//Hx7g/yIh
295 | 4P8jI9//IiDa/x0b0f8ZGdj/ExSz/wQDHf8BAAD/O3FL/1GbYP9Oj17/TZBi/1Cfaf8yYEj/AAAA/wUF
296 | Lf8TFLn/FxfM/xgYyf8ZGdL/GhrY/xwb3P8cHN7/HRzg/x8d4f8hIeD/IiPf/yEh3P8dHNL/GRrY/xMU
297 | qf8CAA//CBIN/0aqaf9Pum7/UbBp/1izc/9YtHn/XLV6/2C5f/9huIL/YrqE/1+8gf9dvH//W7l//1u3
298 | f/9YuXr/Vrt5/1a7eP9UvHf/U7x6/1W9eP9TvHP/U752/1LBe/9Tv3r/Ur14/0/Ad/9RvXL/VLps/1K5
299 | bP9TlF7/VJRe/1KWXf9Sl17/UJtj/0+eZP9PpGT/Uatq/1Kva/9SrWj/U65q/1Sybf9UtW7/UrRs/1Ow
300 | a/9Vrmb/ULFr/06xaP9Ns2n/Ta5o/0ytav9Jrmj/SKxm/0mnZv9LpWf/S6Jl/0ydX/9RqWb/M2NC/wAA
301 | AP8GByH/FBSv/xcY0v8XGMr/GBjO/xoZ0/8bGtf/GxrY/xoa2P8bGtf/GxvU/xsa1/8ZGtv/ExOj/wME
302 | HP8CAgD/OGhJ/1enbv9RnGT/U5tl/1GdaP9RoWv/Wqxz/zJcRP8AAAD/BgUq/xQTrf8YGNP/FxjO/xcZ
303 | zv8aGdL/GxrW/xsa2P8aGtn/GxrY/xob1P8aGtL/GRnc/xUUp/8EBBb/AQIB/zuKW/9OwXH/SrVn/022
304 | aP9Os3D/TrNt/1Czbv9StHL/VLZ2/1a2d/9Tt3z/U7x+/1e6e/9YuXz/WL19/1i+ff9Yvnz/V797/1W9
305 | ef9Sv3n/Vbx2/1S6dP9Svnn/U714/1W3cv9UuXL/Urpy/1K2bf9Stmr/UpZg/1OWX/9TmGD/Uppi/0+f
306 | ZP9Qo2X/UaVk/1CmY/9RrGj/ULJt/1Cxbf9Qr2r/TbRo/0yxZv9Lq2L/Sqxi/0euZv9GsGX/SK9l/0iu
307 | Z/9Irmf/SbBq/0qpav9MpGb/TKFl/0yiYv9Lnl//TZpf/1qvcv8rTjj/AAAA/wUFF/8QEoz/FxfO/xgY
308 | 1f8YGNP/GBnU/xkZ1/8ZGdn/Ghrd/xkZ2v8WFbf/DAtf/wQDCP8AAAD/Eh0X/y1PNf8eNSP/GS8e/xgr
309 | G/8ZLB7/GjMi/yM+Kf8wVzn/EBoa/wAAAP8EBBD/DQ1q/xQUuP8YGNX/GRjX/xkZ1v8ZGdb/GRnX/xoZ
310 | 2f8ZGdz/GBjS/xAShf8DBA7/AAAA/y1sSP9OyHT/R7lv/0+5Zv9SuGr/VLZ0/1O4cv9Tt3L/VLZz/1G5
311 | cf9QuHH/Srt0/0bCdP9LtG3/TLRu/025dv9NvHj/Ubp3/1S7ef9SunX/Ur12/1W+eP9Xu3X/Vbd0/1W5
312 | cv9Vt3L/U65w/1aobf9Xpmv/Va1s/1SXX/9SmWD/Upth/1CaY/9NoWP/S6ho/0uoZP9NpWL/SaZj/0qq
313 | Yv9KqGL/SKtk/0itZP9Iq2T/SK5k/0eyZP9Hr2P/Sq9m/0qtaP9Iq2X/Sqpn/0mraP9JpmT/TKJh/02s
314 | af9Trm7/WK1x/2Gudv9osXv/a7N9/zlVQf8BAQP/AAAA/wcGNf8QEIH/FBSo/xQVsf8UFLL/ExOm/xAP
315 | hf8KCUj/BAMM/wAAAP8AAAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAAD/AQAA/wAAAP8AAAD/AAAA/wAA
316 | AP8AAAL/AAAB/wEBAP8FBBL/CgpQ/xAQi/8TE6j/FRS2/xUWtv8UFan/EBF+/wYGLf8AAAD/BAcK/0B9
317 | XP9o2I//XMN6/1PGdf9OwnD/Ublu/0+7b/9Qvm//Urtw/1G6cP9Qu3D/UL1y/1G7cP9KwXP/Sbpv/0a6
318 | bv9Gu3P/RLp0/0m2df9LtnP/SbZs/0y2bf9Os27/TrRx/066df9Qs3L/UrRz/1SudP9Um2r/WZ5p/1ug
319 | ZP9PmF3/T5ld/0yhYv9Js2v/SKtk/0e8av9GtGj/SKhm/0moZP9JqmP/Satm/0mtZf9JrGX/SK9o/0ey
320 | Z/9HtWj/R7Fo/0isZ/9Jqmb/SqVi/0yiYv9Mo2X/U6Nk/12pbv9jrnf/aLZ+/2m0fv9psXv/aaN0/2yc
321 | c/91rn//ToNe/xQnGv8BAQD/AAAA/wAAAP8BAQb/AwIJ/wMCAv8BAAD/AAAA/wAAAP8GBgj/HhoY/zYv
322 | Kf9LQzv/YFVL/2xfVf9yZlv/d2pg/3hrYv92amL/cGZe/2RcVP9NRkH/NS8s/xkWGf8CAgf/AAAA/wAA
323 | AP8CAQD/AwME/wICC/8AAAX/AAAA/wAAAP8DAwL/IT4x/1Opef9o1pH/Y9GM/2jPi/9qzIT/ZsmB/2DI
324 | gP9XxXf/TsJx/0m9cf9IvHL/Rr9w/0jCcv9IwHL/R8J0/0S+c/9ExHT/R8F3/0a9df9HtHP/R7Rv/0ey
325 | bv9JsG3/Ta5s/0ytbP9JvXP/S7lz/0uvbv9It3D/b7J3/4PKnf+CxZ7/Tppe/0ydYP9Kt2v/SMRw/0a+
326 | bP9Js2n/SK1n/0atZP9IrGb/SKtn/0isZv9IrGX/Satl/0uuaP9Ir2v/RrBp/0iuZ/9Jp2T/TKRg/1Ok
327 | Zv9apm7/Yaxz/2asd/9ppXP/aqh4/2mzf/9ponb/bat6/26re/9olm7/W4Zf/1qVY/9Rn2v/PW5W/zBJ
328 | Qf8vPDj/EBQS/wAAAP8AAAD/AgEE/x4ZGv9IPTj/altQ/35tYP+Hdmj/i3pt/45+cf+RgXP/lIN3/5aG
329 | ef+XiHz/mYt+/5uNgf+ej4P/n5CF/5yOhP+QhHr/dGpj/0ZAP/8TERn/AAAD/wAAAP8DAwb/FSse/x1N
330 | M/8nZET/P5pj/1zPhf9l0oz/Y8+L/2LViv9i0or/ZdCG/2rNiP9pz4z/Yc+M/13Lh/9UxoH/S8V5/0a+
331 | dP9DvnD/QsNz/0S/dP9GuHH/Rr90/0e2c/9ItnL/RrZw/0a3bf9Jsm7/SLNv/0u4cv9MtHL/SrJu/02y
332 | bf9NrG7/Ratp/4HDhf+d4Lv/l9u5/06cYP9NnV//TaZi/0q9cP9Hu23/SbVr/0ulZv9JqGX/Sqdi/0uo
333 | Zf9JqWT/Saxm/0iqZf9Iq2b/R7Jt/06ta/9Wq2j/WrNy/1+ydv9lr3X/Zq54/2atdv9npnX/aKR1/2ql
334 | d/9toHn/b5p1/2ePbv9bjGf/UX9c/1F4WP9UdV3/Un9o/2iWgP9um4f/NUQ//wUHB/8IBgb/OzMt/2JU
335 | SP98alz/h3Rm/4l3Z/+LeWr/kH1v/5WCdP+ah3n/nYx+/6CPgv+jkoX/ppWI/6iXiv+pmYz/qZqN/6mZ
336 | jf+omI3/p5mN/6iajv+mmo//kod9/3BoYf8wLSz/AAAA/wwdE/8zgE7/TdB5/0XCcv9DuWz/S79x/1XH
337 | e/9hzof/Z9CM/2XOjP9h0Y//Xs6N/1/Oiv9gy4r/YMuL/2DLif9cx4T/VMN+/1DBev9JuHX/RrVu/0a2
338 | cf9IsW7/Saxs/0mxbP9JsWr/SK5o/0ira/9IrGz/SrJw/0qxcv9MrGj/Talq/0mxbf9KsW3/Yaxq/5/F
339 | jv9NoGD/TZ5h/1Graf9Nq2f/S6Zj/0e5av9Lpmb/S6Np/0qkZf9KpmD/Sahd/0umYv9QpWb/V61w/1u9
340 | f/9gtnr/X7d4/1++f/9ks3z/aah3/2mpd/9opnT/a6Fz/22eeP9vmXj/Zo9u/1iDYf9Tdln/UHRY/1N0
341 | Xv9VcmP/WXFl/3GXhv9jgW//FBcU/wAAAP8aFRP/Y1RJ/4FuX/+FcWL/h3Rm/416a/+TgHH/mYZ2/52K
342 | e/+ij4D/p5SF/6uXiv+sm43/r56R/7KhlP+1pJf/uKaZ/7ionP+5qZ3/uamd/7eonP+zpZn/rqGW/6ue
343 | lP+rnpP/pZiO/2FZU/8HBgb/AAAA/x9MLf9Gvm7/R79w/0e7bv9Hu27/SMNy/1jKgf9gzoz/YdGQ/2DP
344 | jP9jy4r/YsiI/2HJif9gxoj/YcWI/2DEhv9gxIH/XcCA/1i9e/9TuHj/TbBx/0iuav9Iq2X/Sahm/0ql
345 | Z/9KpmP/SqNl/0udZv9Lp2r/Srdz/0y0cP9OsWv/T7Nu/0ypaP9qrW7/S59h/0yfZP9NoWT/S6Fi/0ql
346 | Zv9LpWT/S6Zm/0mkZv9KpWb/TaZn/1Ssav9ZtHb/XLV8/1+yff9hs37/YbN4/1+5ef9js3f/Zq12/2Wu
347 | ff9ms3v/a6h4/26dd/9okG3/W4Ji/1F2Wf9Sclj/VHRe/1VzXv9Wcl7/YX1w/3qShP9feWz/Cg4M/wAA
348 | AP83MCn/eGZX/4BtX/+EcWL/jnlq/5SAcf+ahXb/n4p7/6SPgP+olIX/rJeI/66djf+zoZL/t6WX/7mp
349 | m/+9rJ//v66i/8GxpP/Cs6f/w7Sp/8W1qf/Dtan/wbSo/7+xpf+6rKL/tKad/6yflv+sn5b/hn11/yEg
350 | HP8AAAD/Gzsl/0i4bv9JvW//Srht/0m7cP9Hv3D/S8N1/1fGf/9lyIb/asWL/2jBh/9lwYX/Y8CG/2O6
351 | hf9huX7/YLl7/2G3f/9is3z/YbJ6/16veP9arG//Vqhn/1CiYv9Ko2L/SaJe/0qhY/9On2X/TKNn/02o
352 | a/9QpWX/VZ9k/1mkaP9Zp2T/WqVg/1Gqav9PpWj/TKpn/0qjYf9HpWP/Sadn/0+paP9Uq2r/WK5w/1yv
353 | c/9esHX/XLF6/2G8f/9mx4f/ZsCG/2O2gP9ltHz/aLR9/2q+h/9sw4b/brJ8/2KWbv9XhmH/Unpd/1Ry
354 | Wv9UcVv/UIhn/0yIZf9QhWz/ZJF6/3yZjf9gd2v/CAkI/wAAAP9HPTT/f2xd/4FtXf+KdmX/k35u/5iD
355 | dP+eiXr/o41+/6eSg/+rlof/sJuM/7Sgkf+4ppb/u6qc/7+vov/Ftan/y72x/9DFuv/Wy8L/2dDH/9zT
356 | yv/d1Mz/3NPM/9rRyf/WzMX/0Ma9/8i+tf/Atav/sKad/6ygmP+ckYj/MC8q/wAAAP8dOSb/U7Jv/02v
357 | av9Osmz/UrJt/1C1bP9Nt2//VbZx/2K5ev9tvYT/bruE/227g/9xw4X/ccOH/228hP9qrn3/aKl9/2Wy
358 | gf9nu37/abd5/2Stc/9fqG7/Walt/1KnZ/9PpGT/TqBh/06fYv9PomP/VKVl/1mmZ/9fqGb/Za1j/2uv
359 | Y/9RuHL/TrZw/06vaP9NqGj/U6pr/1evbv9bsXH/XLJ0/1ywdP9csHL/XrJ0/2e9f/9aoXL/PGpS/yVA
360 | M/8ZKR//FSQW/xYnGv8hNyz/OFdF/0l3WP9ViWD/Vn5a/1R1Xf9UemP/U3hi/02DZf9WhGn/aJ6D/3eo
361 | kf9pi3z/DhIP/wAAAP9KQDf/gm9e/4JuX/+MeWf/lX9w/52Gd/+gi3z/pI+A/6mUhf+smYr/sp+Q/7al
362 | lv+7q53/xbaq/9DEuv/b08v/5eDa/+zo4//v7en/8u/s//Pw7P/z8e3/8/Ht//Lv7v/x7ez/7+zp/+vp
363 | 5f/n49//39vV/9LMxf+/t7D/sqig/6Wakf8yMC3/AAAA/y1ONf9ou3f/V6lk/1mtZ/9ermf/YK5q/1+r
364 | af9dpmb/Y6lo/3a7eP98uIL/V4hl/zNTQf8gMib/FyMX/xYiF/8bLCP/Kkk5/0RyVv9ipHP/ard5/2Ot
365 | cf9ir3H/YLFw/16tcP9ZqWr/WKhm/1unZP9jqWP/a6xh/3WvYv9+s2L/ULNs/1K8df9aunr/XLN2/1q0
366 | c/9btnT/W7By/1yzdv9dsnb/Y7l5/1ysdf8yWkX/CA0L/wAAAP8AAQD/AAAJ/wAAEv8AAA3/AAAB/wAA
367 | AP8BAgL/HSsm/0ZqVP9ViGv/ToRq/06AaP9flXz/cKKL/3Oei/9zppH/Hi0l/wAAAP9EOjL/hHBg/4Rw
368 | YP+QeWn/l4Fw/52Hd/+ijX3/pZCB/6mVhv+vnI3/taOV/7uqnf/FuKv/183F/+fj3v/v7Oj/8u/r//Hv
369 | 6//w7ur/8e7q//Du6v/x7ev/8e7r//Hu6v/x7er/8O3q/+/s6P/u6+f/7enm/+ro5P/m49//3drW/8/L
370 | xf/AubP/p6CX/yYlIv8AAAD/UnJQ/4HJgP9vsWT/bqhj/3KqYv94p1//caZi/4CwZv9dfEr/GSYf/wEA
371 | AP8AAAD/AAAD/wAAEP8AABH/AAAF/wABAP8AAAD/EBgT/0JuUf9qs3b/Z7Ny/2Swc/9ntnb/arJ1/26y
372 | cv9yr2z/eKxl/32uYf+Er13/j7Bb/1uzc/9euHn/X7J3/12sbv9etXT/Xrp5/120df9euHv/Z8GA/0+N
373 | Zv8PGhj/AAAA/wMDG/8JCmn/DQ2a/wwOr/8NDbb/Dg6y/wwNo/8LC33/BgUy/wAAAP8DBQf/L05F/1mL
374 | c/9lmH//cqOI/3CdhP95r5j/P1dN/wAAAP8vKSP/gm5f/4RwYf+Qemn/mIBx/56Hd/+hjHz/ppKB/6uX
375 | iP+xn5D/uKaY/8O0qP/WzsX/5+Te/+7s6f/u7Oj/7uvn/+7r5//v7Oj/8O3p//Hu6v/x7ur/8u7t//Lu
376 | 7P/y7+v/8e7q//Hu6v/w7en/7+zo/+3q5v/r6OT/6OTg/+Tf3P/e2tX/0s/K/8nGwP+hnZn/Dw4O/wMG
377 | A/+DrHH/ntB9/5a6ZP+RrFn/tLxe/6q3X/80RC3/AAAA/wAAAf8HBkT/DAyK/wwOqP8NDrP/DQ61/wwN
378 | rP8MDJH/CAhX/wIBDf8AAAD/HzEp/2amc/9vu3b/bLNw/3S1cf98tHD/hrVt/5O1av+it2b/sLpi/8C7
379 | XP9gp2//X6hu/2CzdP9gtnX/YLZ1/2C2eP9esXf/aMSB/0iFX/8EBgn/AAAA/woJU/8ODrb/Dg7N/w4O
380 | y/8PDsv/Dg7K/w4Oyv8NDsv/Dg7N/w4Nxf8KCnL/AwML/wAAAP81Tkz/e7Kb/3Khiv90pY//cKaQ/wsP
381 | Dv8OCgn/d2VY/4dyY/+Oemn/l4Fw/56Hd/+gi3z/ppGC/6yYiP+yn5H/u6qc/87CuP/k39n/7evm/+zp
382 | 5f/s6eT/7erm/+7r5//v7Oj/8O3p//Dt6f/x7ur/8u/r//Lv6//y7+v/8u/r//Hu6v/x7ur/8O3p/+/s
383 | 6P/u6+f/7Onl/+rn4//n5OD/5ODb/9zY0//OysX/zsnG/399ef8AAAD/P0Qp/9Dfh//IynX/0cll/9PE
384 | X/89NyL/AAAA/wUGG/8LDI3/DQ3K/w4OzP8NDsr/Dg7K/w4Oyv8ODsv/Dg7L/w4Ozf8NDaX/Bgc5/wAA
385 | AP8SGhj/bqFu/4W7ef+DsXD/jLRw/5i2av+vu2X/wr9k/83CY//RwGL/Y6Nv/2Olb/9hq3L/X7R2/2G4
386 | eP9hsnb/Zrt8/06MY/8FCQn/AgAM/wwLgv8NDsz/Dg7J/w4Oy/8ODtD/Dw7T/w8O0/8PDtP/Dw7R/w4O
387 | zf8ODcv/DQ3C/wcHWv8DBA//AAAA/ztRTP93tZ3/dbue/zRVSP8AAAD/W05D/4t2Zv+OeGn/l4Jx/5yH
388 | d/+hi3v/pZCB/6yYif+zoZL/wLGl/9nQyP/p5+H/6ufj/+nm4f/r6OT/7erm/+3q5v/u6+f/7+zo//Dt
389 | 6f/w7ur/8e7q//Lv6//y7+v/8u/r//Lv6//x7ur/8e7q//Dt6f/v7Oj/7uvn/+3q5v/r6OT/6eXh/+fj
390 | 3v/i3tn/2tbR/8vHw//IxcD/RkRC/wAAAP+xpWP/5NZ//9fKd/9CPSb/AAAA/wYGGv8ICXf/Dg7L/w4O
391 | yf8PDs7/Dw7S/w8O0/8PDtP/Dw7S/w4O0P8ODcr/DQ7L/w4Oxf8KC2P/AAAA/xgeG/+JpXT/nbh5/6m2
392 | cf+3t2v/vLNm/8q9Zv/Qv2P/zr1f/2ekcP9npHD/Zqdw/2Kvdf9is3f/Zbd6/1+tef8MFxP/AAAA/wsM
393 | kf8ODtH/Dg3I/w4O0/8PD9j/Dw/a/w8P2/8PD9v/Dw/a/w8P2v8PD9j/Dw7X/w4Nwf8GB2T/BgZT/wQF
394 | G/8AAAD/V4p8/2mjhf8AAAD/Lici/4x2Z/+MeGn/loFy/56Gdv+hi3z/pI+A/6qWh/+0oZL/w7aq/+Hc
395 | 1f/q5+P/5+Tf/+jl4P/q5+L/6ufj/+rn4//q5+P/6+jk/+3q5v/v6+j/7+zo/+/s6P/u6+f/7uvn/+/s
396 | 6P/w7en/8e7q//Hu6v/w7en/7+zo/+7r5//t6ub/7Ojk/+vn4v/o5N//5eHc/+Dc1//W087/z8rF/7Gs
397 | p/8GBgj/LSga/8m1fP9dVD//AAAA/wkHL/8FBVP/CQh5/w4OzP8PD9b/EA/Y/xAP2/8PD9v/Dw/b/w8P
398 | 2/8PD9n/Dw/Y/w8O0f8NDsj/Dg7Q/wwLbP8AAAD/MjMr/6uwd/++rmz/uKFj/6WOWP+ok1j/taJa/8az
399 | Xf9ooXD/aaVx/2enb/9kqG//ZKZw/260fv81WUb/AAAA/wkKX/8ODs3/Dg3H/w8O0/8QD9j/EBDb/xAO
400 | 3P8QDtz/EA7c/xAO3P8QDtz/EA/a/xAP3P8ODsX/Bwdc/wcGYP8ICGL/AAAA/x4vLf8tST//AAAA/2VX
401 | S/+Qe2v/k39u/5uHdv+gi3z/pI+A/6qVhv+wnY7/wrOn/+Hd1v/n5eD/5eLd/+Xi3f/m497/7Onk//Tx
402 | 7f/8+fT///35///8+P/9+/b//Pn1//369f///fn////8/////P///fn/+fby//Hu6v/t6ub/7evn/+/s
403 | 6P/u6+f/7erm/+zo5f/r5uP/6ubh/+fj3v/j39r/3trV/9DMx//QzMb/Xlxa/wAAAP9tX0v/EQ8L/wEA
404 | Dv8JCHL/BgZS/wkIdP8OD9L/EA/a/xAP2/8QDtz/EA7c/xAO3P8QDtz/EA7c/xAP2/8PD9j/Dw7R/w0N
405 | xv8ODcT/BwY1/wAAAP96c1b/uaVr/6KMWv+dh1X/moNT/5V9Tv+gilP/aaFw/2mjcv9ppnL/aqhx/2in
406 | bf9bm2v/DRYQ/wAADv8NDbD/DQ7J/w8O0f8PD9j/EA/b/xAO3P8PDtz/EA/c/xAP3P8PDtz/EA7c/xAO
407 | 2/8QD97/DQ2+/wYGWP8HB2P/CQmC/wQELf8DAgD/AAAD/xUSD/+CcGH/kn1u/5mFdf+fi3r/o45//6iT
408 | hP+vnIz/uaib/9rUzf/m49//4d7Z/+nm4P/28+7/+fbx/+jl4f/IxcH/oJ6b/3h3df9dXFv/TExK/0RD
409 | Qv9GRUT/UE9O/2RjYv+BgH7/rKqn/9XT0P/08u7////8//z69v/w7en/6+jk/+3q5v/t6eX/7Ofk/+rm
410 | 4f/o5N//5uLd/+Hd2P/X08//1NDL/52Zlf8AAAD/CgoM/wMCAP8GBUf/CQmC/wcGV/8IB2v/Dg7P/xAP
411 | 3f8QD9v/EA7c/w8P3P8QD9z/Dw7c/w8O3P8QDtz/Dw/b/w8P1/8PDs3/Dg7M/w0MkP8AAAD/OjMr/7Wf
412 | bf+lkGD/p5Fg/6SPW/+YhFL/loJS/3KXd/9uonP/a6Zu/2SbY/9Ym17/PG5M/wAAAP8HBk7/Dg7K/w0O
413 | yf8PDtb/EBDa/xAO3P8QDtz/ERDc/xMT3P8UFNz/ExLc/xEQ3P8QDtz/Dw7f/wwMrf8GBlH/CAhu/woK
414 | g/8HBlj/BAMA/wAAAP9FOzT/loBx/5aBcv+eiXr/o45//6iSg/+smYr/s6OV/9HIvv/h3tn/5uPe//bz
415 | 7v/i4Nv/paOf/1taWP8jISH/AwMD/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
416 | AP8IBwf/LS0s/2xrav+4tbP/8vDs///8+P/v7Oj/6ubj/+zn5P/r5+L/6eXg/+fj3v/k4Nv/3trV/9TQ
417 | y//Dv7n/JCQk/wAAAP8EAwr/CAhv/wkJgP8HB2P/BwZd/w4OxP8QD97/EA7c/xER3P8TE9z/FBTc/xIS
418 | 3P8QENz/EA7c/xAO3P8PD9r/Dw7U/w4OyP8ODr7/AgEj/w4MBf+WhGD/pJBi/56LXv+ei13/mohY/5eE
419 | Vf95kXb/bJRq/1eZXf9SkVn/XqNs/y9TPv8AAAD/Cgt//w0Ozf8ODs3/Dw/Y/xAP2/8QD9z/EhHd/xoZ
420 | 3f8kJN//KSng/yEg3/8XFtz/ERDc/w8P3v8LCpL/BgZP/wgId/8JCID/CAhy/wEBCv8EAwT/c2NY/5eC
421 | cv+ch3j/oo1+/6aRgf+ql4j/sJ+Q/8W5rv/e29P/7uzl/9zZ1P97eHX/HRwc/wAAAP8BAQH/AAAA/wIC
422 | Av8GBgb/CAgH/wcHB/8GBgX/BQUF/wUFBf8GBgb/BwcH/wgICP8GBgb/AQEB/wAAAP8BAQD/AAAA/ysq
423 | Kf+TkY//7+3p//j08P/o5OH/6+fi/+rm4P/o5N//5eHc/+Hd2P/W0s3/2NTN/2dlZf8AAAD/BgUi/wkJ
424 | fv8ICH3/Bwhv/wYGUP8NDK7/Dw/e/xER3P8YGN3/JCPg/yop4f8iIt//Fxfd/xIQ3P8QDtz/EA/b/w8P
425 | 1/8NDsr/Dg7K/wcHUv8AAAD/YFQ8/4t6Tf+KelD/intR/4p4T/+Jd03/bIlo/2GKZP9XlWD/V5Ja/2io
426 | eP8rSTv/AAAA/wwMlP8ODsz/Dw7P/xAP2f8QD9v/ERDc/xcW3f8tLOH/UFDl/11d5/9FReP/IyPe/xQU
427 | 3P8PD9f/CAhw/wUGVf8JCHv/CQh+/woJev8AABH/ExAM/4h3av+ZhHX/oIt8/6WPgf+plYX/rp2N/7qq
428 | nf/X08r/8/Dn/5qYlf8WFhX/AAAA/wEBAf8GBgX/BgYG/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
429 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/BwcH/wUFBf8BAQH/AAAA/yUkJP+9urf//vv3/+fk
430 | 3//q5uH/6eXg/+fj3v/k4Nv/3NjT/9nVz/+cmZj/AAAA/wUELv8JCYL/CQh9/wkId/8FBk3/CwqM/xEQ
431 | 3v8WFdz/Kirg/01N5P9dXej/SEjk/yYm3/8VFN3/EA/c/xAP2/8PD9j/Dg7M/w4Ozf8JCWr/AAAA/09G
432 | MP+EdUT/f3BD/4ByRf+Bckj/gXJI/2Cbcv9glWv/YJRl/1qabP9ns4X/K0s7/wAAAP8MDZv/Dg3M/w8O
433 | 0P8QD9n/EA7c/xIQ3f8cG97/QkHj/3l47P+NjO//aGjp/zEx4f8WF+D/Dg7A/wUFUf8HB2P/CQl8/wkH
434 | fv8JCnz/AAAV/xEOCf+Pem7/n4l6/6OOgP+ok4T/rpmK/7Ggkv/NxLn/7uvj/3Vzb/8BAAD/AQEB/wIC
435 | Av8AAAD/AAAA/wAAAP8ODQ3/MzIx/1xbWf+EgoD/nZyZ/6uqqP+wrq3/sK6t/6qop/+ZmJf/fXx7/1RT
436 | Uv8qKSn/BwcH/wAAAP8AAAD/AAAA/wMDA/8AAAD/CQgI/5eVkv/9+vb/6eXh/+nl4P/o5N//5eHc/9/b
437 | 1v/e2tX/pKGe/wAAAP8DBDP/CAmD/wkIfP8JCXr/BgZW/wcGY/8RENH/Ghrf/z084v90der/jo3v/2xs
438 | 6v81NeL/GBjd/xEQ3f8QDtz/Dw/Y/w4OzP8ODs7/Cgpx/wAAAP9USjP/iHxI/31xQf99bz//dmc8/3xs
439 | RP9koHT/Yphu/16nc/9as3v/Z8uQ/y5WQ/8AAAD/DA2T/w4OzP8PDs//EA/Z/xAP2/8SENz/Gxve/zw9
440 | 4/9vcOr/goLu/2Fh6P8vLuD/FhXf/wsLlv8GBUr/CAhx/wkJfP8JCH7/CQl5/wAAEP8WEw//lYJ2/6KN
441 | fv+nkoP/q5eJ/7Cdj/++sKT/4d3U/19eWv8AAAD/AgIC/wAAAP8KCgr/MTAv/2FgXv+opaL/2NXS//Lw
442 | 7P/9+/b///75///9+P///Pj///z4///9+f///vr////9/////////v3/9PLx/9XT0f+enZv/VVVU/yor
443 | Kv8EBQT/AAAA/wEBAf8AAAD/f317//f07//p5OH/6eXg/+fj3v/i3tn/4t7Z/66qqf8BAQD/AwMs/wkJ
444 | gv8JCHz/CQl7/wcHaP8FBUn/DQ2s/xoZ4P84OOL/a2zp/4OD7v9kZej/MjLi/xcX3f8RD9z/EA/b/w8P
445 | 1/8ODsz/Dw7N/wkJZ/8AAAD/V041/4F0P/91aTn/eWs5/3hoN/98azz/apht/2aicv9duXj/Y7Bx/27O
446 | j/9DdV//AAAA/woLc/8NDsz/Dg7M/w8P1/8QD9v/EBDc/xUU3v8jI97/Ojvi/0VE5P8zNOH/HR3f/xAQ
447 | w/8HBlv/BgZd/wgId/8JCHv/CQh//wkJb/8AAAD/LCcl/6OPgP+jkIH/qpaH/66cjv+yopX/3dXL/19e
448 | W/8AAAD/AAAA/xMSEv9ubGn/ysjD/+/s5//49O//+PXw//Hu6f/t6eX/6+jk/+zp5f/u6uf/7+zo//Dt
449 | 6f/w7en/8e7r//Hu6//x7ez/8e7t//Px8P/7+fX////9//79+//39fH/xMPB/15dXf8KCgn/AQEB/wAA
450 | AP+Bf3z//fj0/+fj3v/p5eD/5eHc/+Le2P/KxsT/FRYR/wAAFP8LCX3/CQh8/wgJe/8ICHX/BgZS/wgI
451 | b/8TE9L/ISHf/zk54v9FReT/NTXi/x8e3v8TEtz/EA/c/xAP2/8PD9X/Dg7J/w4Oyf8GBUX/AQAA/3ls
452 | QP+RfkH/gWs5/414O/+ZhT7/rZ1J/26rdf9soG3/ba54/2+zev90x4r/Y6B1/wMAAP8FBTv/Dg7G/w4O
453 | yf8PDtX/Dw/a/xAP2/8RENz/FRTd/xsa3v8dHd3/GRjd/xMS1/8JCX7/BQVJ/wgIcP8ICXj/CAh6/wkJ
454 | g/8ICE//AAAA/1JIRf+qlob/pZKE/62ai/+vnY//ybuu/5+clf8AAAD/AgIC/1NTUP/PzMb/+PTv/+3q
455 | 5f/m497/5uPe/+jl4f/r6OT/7erm/+/s6P/w7en/8u/r//Pw7P/08e3/9PHt//Ty7//z8fH/9fHw//by
456 | 8f/28vH/8vDv//Du7f/y7e3/8/Dt//v59f////3/ysjF/0dFRf8AAAD/CAcH/8XCv//07+z/6OPg/+jk
457 | 3//g3Nf/4NzY/z89Pv8AAAD/Cwpp/wkJgP8JCXr/CQh4/wcHaf8FBEn/Cwub/xQU3f8aGtz/HR3e/xkY
458 | 3f8UE93/ERDc/xAP2/8QD9n/Dw7S/w4Oyf8PDrT/AAAT/xgXC/+tn07/qZRG/6SKQv+3o0r/wrFQ/8q6
459 | VP92pGr/dahv/3eqcv9/p3L/frZ2/4q6ef8iKSD/AAAA/w0Mnv8NDsr/Dg7O/w8P1/8PD9r/EA/b/xAQ
460 | 3P8REdz/ERHc/xAQ3v8LC5//BQVI/wcHYf8ICXj/CAl6/wcIev8JCX3/AwMc/wMDAP+Bc2r/qJWH/6qX
461 | if+vno//sqGU/9fNwf9EQ0H/BwYG/6WinP/w7uX/6OTe/+Hd2f/l4t3/6OXg/+rn4v/r6OT/7erm/+7r
462 | 5//w7en/8e7q//Lw6//z8O3/9PHu//Tx7//08vD/9PLx//Xz8v/28/L/9vPy//Xz8v/18vH/9vLx//Xx
463 | 7//y7uz/7+vp//r49P/+/Pj/nJqZ/wAAAP9nZ2T//vr2/+fj4P/q5eH/497a/+fk3v+EgoP/AAAA/wcH
464 | Of8JCYP/CAh6/wkJev8ICHb/BgZX/wUFUv8MDbf/ERHf/xER3P8SEdz/EBDb/xAP2/8PD9r/Dg/V/w4N
465 | y/8ODc3/Cwt4/wAAAP9XUC3/zrxW/7+sUf/GsFT/y7dV/8q3Vf/It1j/fbF0/4Gqbv+Frm//irV0/5W5
466 | df+zy4b/dn9b/wAAAP8JBz7/Dg3H/w4Oxv8PDtH/Dw/X/xAP2v8QD9r/EBDc/w8P3f8MDKn/BQVH/wUE
467 | P/8GBlj/Bwdo/wgIcP8ICYD/CAdO/wAAAP80Ly7/pJKE/6aTh/+um43/saGT/7eqnf/Z08j/kY+J/7q2
468 | r//v6+L/3NnR/+He2P/m497/5+Tf/+nm4f/q5+L/7Onk/+3q5v/u6+f/8O3p//Lv6//z8Oz/9PDu//Xx
469 | 8P/08vH/9fPy//b08//29PP/9vTz//b08//29PP/9vTz//fz8v/28vH/9fHw//Tw8P/x7ev/8Ozo////
470 | //+6ubb/qaek//f08P/r6OT/7Ofk/+fj3//g3Nf/ysfE/xwbHP8AAAD/CQln/wgIff8ICG7/Bwdl/wYG
471 | VP8EBDr/BgZZ/w0Nvv8RD9//EA/b/xAP2v8QD9r/Dw/W/w4Ozv8NDsn/Dg21/wMCGf8HBwH/sqRQ/9jF
472 | XP/MuVz/0Ltd/9G7XP/Pu1r/0L5f/4XAeP+Mr2j/j6xl/63Adf/T0IP/y8uC/9jRgv85Nin/AAAA/wwL
473 | av8ODs7/DQ7I/w8O0/8RD9r/EA/d/w4Oz/8KC5X/BQZQ/wUEPP8EBTv/BAQ7/wQFQP8FBVH/BgVR/wUD
474 | C/8AAAD/ZVlU/6qYif+plor/sZ6R/7Wkl//Ataj/19PK/+fi2P/j3tX/2tfP/+Dc1//k4Nv/5+Pe/+fk
475 | 3//p5uH/6ufj/+zp5f/u6+f/7+zo//Hu6v/z8Oz/9PDv//Tx8P/08vH/9fPy//b08//29PP/9/X0//f1
476 | 9P/39fT/9/X0//b08//29PP/9fPy//Ty8f/z8fD/9PHw//Tw7v/v7Oj/+vj0//r49P/u6+f/7uvn/+3p
477 | 5f/p5uL/3tvX/+Dd2P9GREb/AAAA/wYFGv8GBln/BQVK/wQFPv8EBDz/BAQ8/wUFPP8GBl3/Cwyo/w4P
478 | 1v8QD93/EA/Z/w4Oz/8ODsr/DQ3G/woKQ/8AAAD/Z2E//+DUbP/UxGT/2cRp/9bAX//Ywl3/3clk/97N
479 | af+PunH/qr1o/8TEcP/VzID/3s6D/9rLgf/e0IT/vbBz/xQTEf8AAAD/DAtt/w0Ozv8ODs7/Dg7G/wwM
480 | pf8ICHH/BgZd/wcHa/8ICHH/CAhr/wcHXf8FBUn/BAQ3/wIBCf8CAgP/AAAB/3JmXP+rmoz/rJqN/7Oi
481 | lf+4p5r/yr+0/9nXzf/X08r/2tbO/97b0//h3df/5ODb/+fj3v/n5N//6ebh/+vo5P/s6eX/7uvn//Dt
482 | 6f/y7+v/8/Dt//Tx8P/18vH/9fPy//b08//39fT/+Pb1//j29f/49vX/+ff2//j29f/39fT/9vT0//b0
483 | 8//18/L/9fPy//Xy8f/18fD/9PHu//Ht6v/w7en/8e7q//Dt6f/u6+f/7Onl/+He2v/l4d3/V1ZU/wAA
484 | AP8EBAL/AgIT/wQEPv8FBkz/BgZi/wgHbf8ICHH/Bwdm/wYGXf8JCH3/DQyw/w4Nyf8ODtH/DQ7E/wsK
485 | Sf8AAAD/NjMl/9vOef/f1Hv/3s9y/+HOa//gy2r/4Mpk/+LMY//p1Wz/rcFw/8fHef/Xx3j/08V3/9fJ
486 | gP/ZyoX/08WB/+DRhf+uoWz/EhEP/wAAAP8IBkP/CAh4/wYHWv8GBU//Bwdq/w0Njv8VFaP/FRWo/w8P
487 | ov8LC5b/CAiE/wYFTf8BAQD/AQIF/wAAAP9/cmf/rpyP/66dkf+1pZj/u6yf/8/Jvv/Y1sz/2NXN/9vY
488 | 0P/e29P/4d7W/+Lf2f/j39v/5uPe/+jl4f/q5+P/6+jk/+vo5P/v7Oj/8/Ds//Tx7v/08vH/9fPy//b0
489 | 8//39fT/+Pb1//n39v/59/b/+ff2//j29f/18/L/9vTz//f18//29PP/9fPy//Lw7//18fD/9vLx//Xx
490 | 8f/08e//8/Ds//Lv6//x7ur/8O3p/+7r5//j4Nz/6ebi/2lnZf8AAAD/BAQG/wIBB/8GB2L/CQmG/wsL
491 | mv8REaX/Fhap/xMTn/8LC4f/BgZh/wUGTv8HB2H/CAh2/wYGLf8AAAD/NzIj/+XUdf/15Xj/8+J8//bm
492 | gv/w337/7dxz/+DTZv/m12L/3dZm/9rMfP/Ux3r/0sV5/83Bcv/SxHj/2MqE/9fIhv/UxYH/4tGG/7yv
493 | df8wLCT/AAAA/wQDF/8EBT7/CAhs/w0Nmf8gILT/Pz/P/z8/1P8jI8T/Dw+v/wsLoP8ICG//AQEA/wIB
494 | B/8CAQL/iHtw/7Cfkv+xoJX/uaic/7+xpf/TzsX/2dXM/9nWzv/c2dH/3tvT/93a0//r5+L/+vfx//bz
495 | 7f/z8ev/9fPu//v59P////v/+PXw/+/s6v/08vD/9fPy//b08//39fT/+ff2//n39v/6+Pf/+vj3//f1
496 | 9P/9/Pv//////////////////////////////////Pr6//Pw7//08vH/9fLx//Xx7//08O//8+/t//Lv
497 | 6v/w7en/5uPf/+zp5f92dHL/AAAA/wUEBv8CAg7/CQmG/wwLof8SErP/KirJ/0ND1v84Ocn/GRmt/wwL
498 | kf8HB2D/BAQ2/wMDDP8AAAD/XVY1//Loff//84D//ut9///tg//+7YX/9+iB/+vge/+1vW3/tMVt/8DN
499 | b//XyoH/0cV6/9THff/VyH//0cV4/9PGff/Vx4P/2MmJ/9PEg//f0oz/3dKO/zYyJP8AAAH/CQlf/woL
500 | lv8QEKv/MDDH/1xd4v9bXOP/NTXS/xMTtf8LDKz/CAdo/wMDAP8AAAX/BQUE/5CDeP+yopX/tKOY/7ur
501 | n//EuK3/19LJ/9nUzP/Z187/29jQ/9zZ0f/z7+j/yMbB/2tqZ/84NzX/Ly4t/y8uLf83NjX/dXRz/9zZ
502 | 1/////7/8u/u//X08//39fT/+ff2//r49//6+Pf/+/n4//j29v//////6Ofn/4KBgf89PDz/MDAw/zEx
503 | Mf85OTn/amlo/9TS0v//////9PPy//Xy8f/28/L/9fHx//Tw7//08O3/8u7s/+nl4v/v7Oj/gX99/wAA
504 | AP8FBQb/AwIG/woJh/8MDKv/GBi8/0BA2P9gYeT/VVXd/yYlv/8NDab/CgqQ/wkISP8AAAD/eHBC////
505 | if/77YD//eqC//7uhv/97Ir//++N/+jgf/+wyIT/pMOI/5i8gf+OtHf/1siA/9XHfv/WyH//2s2K/9jL
506 | hP/Txn3/0cR8/9TIh//XzI7/0MWH/9zNgP+OhVb/AAAA/wkIOf8LDKz/Dg+0/yIivf9AQc3/Q0PP/yko
507 | xf8REbz/DAym/wMDIP8ODQT/HhsU/wICAv+XiH7/tKSY/7anm/+9raH/yL6z/9jTy//Y08z/2dfN/9vZ
508 | z//r6OH/fn14/wkKCf8wMDH/aWlq/35+f/+CgoL/bm5v/y0tLf8FBAT/h4aF///////08vH/+Pb1//n3
509 | 9v/6+Pf/+/n4//j29v//////mJiY/wkJCf8mJib/ampq/4GBgf9/f3//a2tr/zU1Nf8ICAj/eHh3//38
510 | /P/39fT/9fPy//Xz8v/08vH/9fHw//Tw7//r5+X/8e7p/4aEgv8AAAD/MjAq/wMCAP8HB0P/Cwy0/xQU
511 | u/8vL8j/RkXR/zs7y/8bG7n/DQ62/wwMm/8DAhv/DQwF/93Tc///84P//OqE///tif/+7o3//+6T//rs
512 | h//L0YT/n7iI/5bFiP+UwIb/jrCC/9PGff/UyIH/2cyH/9fKgv/d0I//3NGS/9DEeP/Ownf/1suK/9DF
513 | fP/NwXb/3dCB/0I/K/8AAAD/Cgk7/w0Nl/8SErr/HBvF/x4dx/8UFMD/Dg6d/wsJMP8AAAD/bWY+/1pU
514 | LP8AAAD/m42B/7emmv+5qZ3/vq+j/8rDuP/Y1Mv/2dTL/9nVy//q593/XVxZ/wQFBf+VlZX/2dnZ/+Li
515 | 4f/19fX/5ubm/8vLy//BwcH/kZGR/xUVFf99fHz///////b08v/6+Pf/+/n5//j29v//////kpKS/xEQ
516 | EP+Hh4f/wMDA/8nJyf/j4+P/9fX1/+Pj4//b29v/m5ub/woKCv9SUVH///7+//b08//29PP/9vTz//Xz
517 | 8f/18fD/7eno//Pv7f+KiIb/AAAA/4mBW/84NSn/AAAA/woKSv8PD6v/FxfC/x8fxv8ZGcL/ERC2/w0M
518 | hv8JCCT/AAAA/4V8Rv///Yn/++mC///tif//7o///+6T//7ul///75T/292E/5q8if+Vx4r/jsuE/4+7
519 | hf/SxHv/2s6M/9/Vlv/Zzoj/1Mh7/9rPif/Tx3j/ybxm/8S2Xv/NvmX/08Rt/97Obv/KvGX/My4g/wAA
520 | AP8BAQb/AgIx/wcHSv8IB0r/AgI2/wEBCv8AAAD/Tkku///4hf9TTyv/AAAA/5qNgf+6qZ3/u6uf/7+x
521 | pf/Ox73/2dXL/9bRyP/r5dz/h4SA/wkJCv+vr6//39/f/+bm5v/t7e3/gYGB/yUlJf8ICAj/BwcH/y8v
522 | L/9bW1v/BwYG/5WUlP//////9/X0//j29v//////qamp/wYGBv9YWFj/NjY2/wgICP8HBwf/ISEh/3Z2
523 | dv/n5+f/6enp/97e3v+7u7v/Dw8P/39+fv//////9PLx//f19P/29PP/9vPy/+7q6f/18vH/iIaE/wAA
524 | AP+dlFz/0cZ//yIgGf8AAAD/AgET/wUEPv8ICEv/BwdH/wEBJf8BAQD/AAAA/2leLv/76WX//ut6//7t
525 | iv//7o7//+6U///umP/+7pr///Cd/+/qj/+hyon/mMCK/5DEh/+Nz4b/08d+/9rQjv/f15n/3taV/87D
526 | cP/Mv2n/y71m/76uT/++rU//wLBV/8i2XP/gzlz/+ONg/+PRXP+IfDz/NzIX/wsJAf8AAAD/AAAA/wYF
527 | AP8yLxr/pJlX//nygv///4z/X1kx/wAAAP+ViH7/vaui/7ysof/As6j/0MnA/9jUyv/c187/08/H/xQU
528 | E/+Dg4P/39/f/+fn5//w8PD/RkZG/wAAAP8CAgL/AAAA/wAAAP8AAAD/BwcH/yQkJP8NDQ3/0NDQ////
529 | /////f3/4eDg/xYWFv8gICD/CQkJ/wAAAP8AAAD/AAAA/wICAv8AAAD/NTU1/+jo6P/q6ur/3t7e/5WV
530 | lf8PDg7/3dzb///9/P/39fT/9/X0//b08//t7Ov/9vTz/3x7ev8AAAD/nZRc/+/jiv/Sxnz/d25M/x4c
531 | E/8CAgD/AAAB/wEAAP8NDAT/Qj0g/7inSf//9GP//elk//3nav/+7IP//+6V///vl//+7pr//u2f//3t
532 | m//v6o3/rMuJ/5K7i/+Vxo3/kNCJ/9HFev/Z0o//3NaX/9jQjP/Sx33/zL1j/76uTP+8rEn/va1M/7+u
533 | T//fy1L//eZS//3mUv/95lL///JX//3rVv/jzlL/yLxh/8i8ZP/g0G3/+/B+///9hv/46YH///6T/3px
534 | RP8AAAD/i392/7+upf+7raL/wrWq/9HMwv/V0cj/6uXb/4OBfP8fHx//zs7O/97e3v//////a2tr/wAA
535 | AP8GBgb/AgIC/wEBAf8BAQH/AwMD/wEBAf8HBwf/BAQE/05OTv///////////2JhYf8BAQH/CQkJ/wEB
536 | Af8CAgL/AQEB/wEBAf8EBAT/BwcH/wAAAP9YWFj//v7+/9/f3//W1tb/Kyws/319fP//////9vTz//n3
537 | 9v/39fT/7uzr//f19P9qaWj/AAAA/76zbf/36Yn/5tmB//fli//j0YT/0sFu/8KxU//BsVL/08Fa//jp
538 | Yf//9WT/++Vi//7nav//6XH//ul3//7sjv/+753//u6d//7vmf//8JL/xNSI/5bDkf+Zv47/lcKN/47I
539 | if/NwHD/08qE/9fQkv/Yz4//0sh+/8O1Wf+9q0v/vatL/7ypS//ZxFD//udT///oUv//51L//+dS//3l
540 | Uf/+5lD///Jr///4ef//+Hr///V9//7uf//864T/++qI////mf+Xjlj/AAAA/3lvaP/Bsaj/u66i/8S3
541 | rP/SzsT/1dHI/+rk2/9BPz3/Wlpb/9/f3//u7u7/2tra/w0NDf8AAAD/AQEB/wAAAP8CAgL/AwMD/wAA
542 | AP8EBAT/AAAA/xUUFf8MDAz/xsfG/93c3P8SEhL/FRYW/wAAAP8BAQH/AAAA/wICAv8BAQH/AAAA/wMD
543 | A/8DAwP/AwMD/8nJyf/z8/P/4ODg/2xsbP83Nzf///////j29v/59/f/+ff2//Du7f/29PP/UE9P/wAA
544 | AP/e0YD///iS//rqiP/554b//euG///1iP//93z///Bl///qZP/952T/++Vn///oa///6XH//+l4///p
545 | fv/+6YL//+2U//Xrjf/Q24f/0d+G/9XdiP+lzIv/jsGI/5DIjf+Q2JD/z8J5/83Bd//QxoL/2M6S/9XI
546 | e//GtVz/valN/7ulSv/Fr0z/79lR///oUv/+5lL//+dS///nUv//5k///upi//3sdf/863X//Ot5//3s
547 | fv/+7oX//+6M//zskP///J//ua5t/wAAAP9gWVP/wrSq/7ytpP/EuK7/087E/9nUy//d2ND/ISAf/4SF
548 | hf/h4eH/+/v7/6enp/8AAAD/AwMD/wAAAP8AAAD/AQEB/wAAAP8BAQH/AQEB/wAAAP8UFBT/Kioq/2tr
549 | a/98fHz/JCQk/xsbG/8AAAD/AQEB/wAAAP8AAAD/CwsL/x4eHv8CAgL/BAQE/wAAAP+bm5v//v7+/+Dg
550 | 4P+Xl5f/HBwc//Lx8f/9+/v/+ff3//n39v/x8O//8e7u/y8vMf8RDwX/9OaS///ylv/+7ZL//++Q//7u
551 | jf/97Iv//OyN//zpff/952r//uhu///pcf//6XT//ul5///pfv//6oL//umG//3pe//P1oD/nLyR/5q9
552 | jP+myIr/m8qP/4/Mi/+TzIv/kNSM/9THf//Sxnr/ybxp/82/bv/Xx3P/0b5j/76pTv/GsEz/7dRQ///n
553 | Uv//51L//+dS///nUv//5lD//ulf//7tdf//7Xb//+16///ugP//7ob//+6M///vkv/97pf///ac/+DP
554 | df8AAAD/OzYz/8GyqP+9rqX/xbmv/9POxP/b187/0czD/xcWFf+bm5z/4eHh//////+dnZ3/AAAA/wMD
555 | A/8CAgL/AAAA/x4eHv+np6f/2tra/3x8fP8AAAD/CQkJ/3l5ef8gICD/GRkZ/3Z2dv8SEhL/AAAA/wMD
556 | A/8AAAD/Nzc3/9jY2P/9/f3/sLCw/xUVFf8AAAD/l5eX///////h4eH/rKys/xISEv/e3d3///////r4
557 | +P/59/b/9vT0/97c2/8JCQ3/Ozci///3n//+7pj//++Y///vlv//75X//++U///vlP//75X//uuD///p
558 | df//6Xn//+l7//7pfv//6oH//umE///rhf/w53L/nMR2/5O/hv+bwY//l76O/5nGjv+Tzov/kcqH/47C
559 | gv/Qw2v/0cNn/8O0Uv/Nulf/zLhY/76oTf/JsU//8dlT///qUv//51L//+dS///nUv/+51D//uhc//7t
560 | df//7Xf//+57///ugP//7of//++M///vkv//75f//u+c//7si///7IH/LCgV/w4NEf+0ppv/wLCn/8W5
561 | r//Tz8X/3djP/83IwP8VFRT/oqKi/+Pj4//6+vr/xcXF/wAAAP8CAgL/AwMD/wAAAP+kpKT///////v7
562 | +///////NTU1/wkJCf/FxcX/JiYm/xMTE//ExMT/IyMj/wAAAP8EBAT/AAAA/7e3t///////+Pj4////
563 | //9vb2//AAAA/7a2tv/+/v7/4uLi/7Kysv8RERH/2djY///////6+Pj/+Pb2//z6+/+4trX/AAAA/3dx
564 | Sf///6T/++uW///vmf//75n//++Y///vmP//75j//++Y///vmv/+64b//ul8///qf///6oD//+qC///p
565 | hf/863f/v9hz/4u6fP+Is3f/jr6C/5vEkP+Vvoz/ks+L/5DYh/+NzYH/w7RX/72tSv+/r0v/xrJN/8ex
566 | Tv/ErEr/6tNS///nVP//5lL//+dS///nUv//51L//udX//7scv//7nj//+58///ugf//7of//++M///v
567 | kv//75b///Ca//7vlv/753////mJ/2dgNv8AAAD/lYqA/8S2rP/CuK7/08/F/9vVzv/Uzsf/GBgW/5eY
568 | mP/l5eX/7u7u//r6+v87Ozv/AAAA/wgICP8AAAD/qqqq///////5+fn//////zAwMP9SUlL/7e3t/zs7
569 | O/8pKSn/5+fn/3Jycv8AAAD/CAgI/wAAAP+fn5////////n5+f//////Tk5O/xsbG//19fX/8vLy/+Xl
570 | 5f+pqan/ExMT/+Ti4v//////+/n5//b09P//////fX18/wAAAP+0pmD///2f//vtmP//8Jr///Ca///v
571 | mf//75n//++Z///vmf//75r//vCY//7rhf//6n///+qC///pg///6oT//ex6/8rdc/+Qu3r/hrp8/4e7
572 | e/+JtoP/jbqM/468i/+TyYj/k8mF/76uTP/QvU3/28hO/9vGTv/XwE3/6tFQ///pUf//51H//+dS///o
573 | U///6FT//udT//7qbP//7nv//+59///ug///7oj//++N///vkv//75b//u+Y//7wnf//7In//OZ+///4
574 | i/+toVz/AAAA/2JaVf/Juq//wbWs/9POxP/Y08v/4NrS/yMiIP+BgYH/5uXl/+rq6v/+/v7/yMjI/wwM
575 | DP8AAAD/AAAA/zQ0NP/l5eX//////5+fn/8iIiL/3Nzc/+Xl5f9NTU3/Ojo6/9/f3//j4+P/NTU1/wAA
576 | AP8AAAD/HR0d/7q6uv/r6+v/gICA/wAAAP+4uLj//////+zs7P/m5ub/lJSU/x0dHf/29fX///7+//v6
577 | +v/49fX/+Pb2/zc3Of8FBAD/6NZy///yj//975v///CZ///vmf//75r//++c///vm///75z//++c///v
578 | nf/+75n//+qE///pgv//6YT//+qD//7qhP//7X//2+Jx/8zddv/Q33b/rMt0/9The/+p2Y3/j8OK/5PQ
579 | hP/ax1P/+eFV///nVP/95lP//ORS//7nU///51P//+dT///nVP//51b//+ZW///oZP//7Hv//+x////t
580 | hP//7on//+6O///vkv//75b//++Y///vnP/+7pX//uqA//3pgv//7Yb/69t7/w0MBP8iIB//wLCn/8S2
581 | rf/RzcP/1tDJ/+rk3P8+PTr/Xl9f/+Tk5P/q6ur/8vLy///////Hx8f/LS0t/wAAAP8AAAD/BwcH/x4e
582 | Hv83Nzf/3Nzc//Hx8f/g4OD/U1NT/z4+Pv/c3Nz/7u7u/+jo6P9AQED/AAAA/wEBAf8BAQH/AAAA/xcX
583 | F/+3t7f///////Ly8v/s7Oz/5eXl/3Jycv82Njb///////v6+v/7+fn///39/9LQz/8AAAD/SEMl///1
584 | g//86H7//+6Y///vnP//75z//++c///vnP//75z//++c///vnP//75z//++d///ulf//6oT//+qE///q
585 | hP//6oT//emE///rgP//7IH//ex7//jsev//7X3/x+Z4/8TihP/k7IH/9+Fc///oW///51n//+dX///o
586 | Vv//51b//+dX///nV///51n//+dZ//7mYf//6nv//+uB///shv//7Ir//+2P///tk///7pX//+6Y///v
587 | mv//7pv//uqG///pgf//6YP//OaB///2iv9aUy//AAAA/5eMg//KvbL/z8m//9XQyf/t59//bmxo/zMz
588 | NP/a2tr/5eXl//T09P/y8vL//f39//X19f+3t7f/i4uL/4WFhf+tra3/9PT0//r6+v/m5ub/4eHh/0tL
589 | S/85OTn/3d3d/+Xl5f/4+Pj/+Pj4/7y8vP+MjIz/iIiI/6+vr//z8/P//v7+//Ly8v/09PT/5+fn/9/f
590 | 3/9CQkL/Z2dn///////6+Pj/+Pb2//////+GhIL/AAAA/6CUU///+Ib/+uR7//7riv//753//+6c///u
591 | nf//7pz//+6c///unP//7p3//++c///um///757//+yP//7pgv//6YX//+mE///phP/+6YX//emE//3p
592 | hP/+6YT//uiA//Xrdf/87oL//+2Q//3mY//+52H//+df///nXP/+51z//udc///nXP//513//+df//7n
593 | Yv/+6Xv//+qD///qh///64v//+yP///sk///7JX//+yX///smv//7Z3//uyU//7nf///6IL//+iC//vl
594 | gP//9Yn/tqhf/wAAAP9NSET/yb2y/8zEu//X0sv/5d/X/62qpP8SEhL/vb29/+Pj4//x8fH/9fX1//Ly
595 | 8v/19fX///////////////////////b29v/y8vL/5+fn/9ra2v86Ojr/KCgo/9XV1f/m5ub/8vLy//X1
596 | 9f/+/v7/////////////////9/f3//Ly8v/19fX/8vLy/+Pj4//Jycn/FxcX/66urv//////+vj4//v6
597 | +v/x7+//JiYo/w0KA//q13f//+yB//3nf//+54D//+yV///unf//7Zz//+2d///tnP//7Zz//+2d///t
598 | nP//7Zz//+2c//7tmv/+6Yj//+eC///nhP//54P//+eD//7ngv/+54L//+iD//Hccv/x3HT/7tZw/+/a
599 | bf//5mr//+Vn///lZf//5mP//+Zj///mYv//5mL//+Zk//7lZf/+6Xj//+qG///qhv//6oz//+uP///r
600 | kf//7JT//+yW///sl///65n//uya//7nhv/+5X///+aB///mgf/+5YH//+eC//vmgv8rJxb/AwMG/6+j
601 | mf/Pxrz/19LL/9rUzf/g3dT/IyIh/3l5ev/j4+P/6+vr//T09P/19fX/9PT0//Ly8v/x8fH/8fHx//Ly
602 | 8v/19fX/8/Pz/+Xl5f/Ozs7/IyMj/xMTE//FxcX/5OTk//Ly8v/19fX/8vLy//Hx8f/x8fH/8vLy//T0
603 | 9P/19fX/9fX1/+zs7P/k5OT/jIyM/xkZGf/y8vL///////n4+P//////xMTC/wAAAP9nXzb///WH//zj
604 | fv//54H//+aA//7niP//7J3//+ye///snv//7J7//+yd///sm///7Zv//+2b///sm///7Jv//+uZ//7n
605 | hf/+5YH//uWD///mhP/75Hv/9uFx//jhdf/Mw2z/rKtv/6OocP+nqG3//uNu//7kbP//5Gr//+Rp///j
606 | aP//4mf//+Jo//7iaP/+5nX//+mG///oh///6Ir//umN///pkP//6ZP//uqU///qlv//6pb//+uZ//7o
607 | j//+5Hz//+SA///jgP//44D//+OA//zgf///8oj/nY9S/wAAAP94cGn/0ci9/9TPyP/X0sv/7Ojf/4B+
608 | ef8fHyD/zMzM/+Tk5P/y8vL/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1/+/v7//j4+P/q6ur/xIS
609 | Ev8KCgr/nZ2d/+Pj4//u7u7/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//Ly8v/j4+P/1NTU/ysr
610 | K/92dnb///////r5+f/49/f//////2FhYv8AAAD/08Jt///thv/94oH//+WC///lg//+5IH//umS///s
611 | n///653//+ud///rnf//65z//+qc///qnP//6pv//+ma///qmv/+6JT//uSC///kgv/+437/5ddv/66/
612 | bP+wwW7/gbBy/4Wlcf+Emm7/hZ9x///hb///4W7//uFt///ibP//4Wv//uFr//7hav/+5HX//ueG///n
613 | hv//54n//+iL//7pjf//6ZD//+mS///pkv//6ZP//+qV///qkv/+433//+N7///kfP//433//+N+///j
614 | f///43///uN+///qiP81MSD/CgkM/7ivo//W0Mf/2NTM/9rXz//n5Nz/LCsq/1lZWv/h4eH/5ubm//Ly
615 | 8v/09PT/9fX1//X19f/19fX/9fX1//T09P/n5+f/4eHh/1lZWf9RUVH/Y2Nj/0ZGRv/f39//5ubm//T0
616 | 9P/19fX/9fX1//X19f/19fX/9fX1//Ly8v/n5+f/4+Pj/2xsbP8gICD/9vb2//7+/v/5+Pj//////8HA
617 | v/8AAAD/cGY6///1iv/74YD//+SC///lg///5YP//+WD//7kg//+6pr//+ue///rnf//65z//+qc///q
618 | m///6Zv//+qZ///qmP//6pf//uqY//7okf/95ID//+N6/83Oaf9+pm//ca5z/3azb/90tGv/esBp/3zL
619 | aP//4Gv//+Br///gav//4Gr//+Fr///gaf/+4W///ueA///mgv//5oT//+eH///niP//6Ir//+iM///o
620 | jv//6Y7//+iQ///qk//+5YH//+F1///jeP//4nj//+N5///jev//43v//+N8//zfeP//9JL/t61z/wAA
621 | AP9aVVD/29XK/9XTyv/Y1c3/6OXd/7e1r/8FBAX/nJuc/+Tk5P/m5ub/8fHx//T09P/19fX/9fX1//T0
622 | 9P/w8PD/4ODg/8fHx/8SEhL/sLCw/8nJyf8LCwv/u7u7/+Dg4P/v7+//9fX1//X19f/19fX/9PT0//Ly
623 | 8v/n5+f/5OTk/6SkpP8DAwP/tLS0///////5+fn/+vj4//78/P88PD7/BgQA/+LQdv//6oT//eOA//7l
624 | gf//5IH//+SB///kgv/+5ID//ueO///rnf//65n//+uZ///qmf//6pj//+qY///ql///6pb//+qV///q
625 | lP/+6pX//ueK///iff/+43P/w8xr/4a5bv91qG3/e8Bv/3fFav91tGn//99o///fZ///32f//99o///f
626 | Z///32n//uR5//7mfv//5n7//uaA//7mgv//5oP//+aF///nh///54j//+eK///ojf/+54j//uFy//7i
627 | c///4nT//+J0///idf//4nb//+J2///ieP/+4nj//eeP///0nf87NyT/AAAA/6Wflv/h3dT/2NTN/9rX
628 | z//z7+f/hoWB/xUVFf+3t7f/4eHh/+Li4v/r6+v/8PDw//Hx8f/v7+//4uLi/9/f3/9kZGT/KSkp//n5
629 | +f//////Ozo6/1BQUP/d3d3/4eHh/+/v7//y8vL/8fHx/+zs7P/i4uL/4eHh/8PDw/8YGBj/enp6////
630 | ///6+fn/+Pf3//////+ampj/AAAA/2JaM///8of//N9+///jgP//43///+OA///jgP//44D//+SA///k
631 | gP/+6ZT//+qa///pmP//6Zf//+qX///qlv//6ZX//+mU///pk///6ZL//+mS///pkv/+5oP//+J5//rm
632 | bP+mz2n/eK9y/4y9b/99unL/e5dt///fZf//3mX//95l///eZf/+3mX//uJz///kev//5Hr//+V8///l
633 | ff//5X///uWA///mgv//5oT//+aF///mhv//54n//uJ2//7gbv//4HD//+Bw///hcv//4XP//uFz//7h
634 | dP//4XP//uN9//znkv//9Jr/uaxu/wAAAP8pJyX/1NDI/9vXz//c2dH/3drS//f07v9lZGL/BAQF/5KS
635 | kv/a2tr/4uHh/+Li4v/i4uL/39/f/+Dg4P+SkpL/AwMD/7q6uv///////////83MzP8FBQX/goKC/+Dg
636 | 4P/e3t7/4+Pj/+Li4v/h4eH/3d3d/56env8KCgr/ZWVl///////6+vr/+vn5///////a2tr/Dg4P/xEP
637 | C//gznv//+mC//7igP//44D//+OA///jgP//44D//+R////jgP//4n7//uaG///qmP//6pb//+qV///q
638 | lf/+6pT//+mT///pk///6ZL//+mR///pkP//6I7//uiO///kf//24HH/4OBs/6LBbP92n3D/fqlz/3uY
639 | bP//3V///91f///dX///3V3//t9n//7ic///4nP//+N1///jdv//43f//+R4///kev//5Xv//+V9///l
640 | fv//5oH//uR5///eZv//32j//99p///fav//4Gv//+Bs///gbf//4G///uBs//7lgf//6Y///OaL///4
641 | mP9yaUL/AAAA/2BeWf/m4tv/2dbO/+Dd1f/i3tn/8/Dq/4F/fP8EAwP/MzQ0/4qKiv+0tLT/vb29/7a2
642 | tv93d3f/AAAA/42Li///////9/X0//j29v//////oaKi/wAAAP9sbGz/tbW1/729vf+2trb/kJCQ/zw8
643 | PP8BAQH/d3d3//7+/v/7+/v/+vr6//r6+v/6+vr/Q0JB/wAAAP+hmWX///iZ//vgeP//5H3//+N9///j
644 | ff//43z//+N8///jff//43z//+N8///iev//6Iv//+uU///qkv//6ZL//+iR///pkP//6JD//+iO///o
645 | jf//6Iz//+eL///niv//54f//eF4///gb//c3mn/kblt/4CSbP92j2j//9xV///cVv//3FX//t1Z//7h
646 | Z///4Wn//+Fq///ia//+4mz//+Ju///jb//+43H//+Ry///kdP//5HX//+V3//7fYv/+3V3//95f///e
647 | X///3mD//99h///eYf//32P//99j//7gZ//+5oH//+eD//7mg///6Yb/9+eH/zo0H/8AAAD/hoR+/+zo
648 | 3//b19D/49/a/+bh3f/7+fP/0c7K/15cW/8bGxr/EhIS/xQUFP8QERH/HRwc/6inp///////9vTz//r4
649 | 9//7+fn/+Pf3//////+5uLj/IiIi/w8PD/8UFBT/EhIS/xkZGf9XV1f/0tLS///////6+vr/+/v7//j3
650 | 9///////cHBu/wAAAP9jWzv///ea//vnjv/+43n//+N2///jdv//43b//+N3///jdv//4nb//+J1///i
651 | df/+4nT//uN3///pjP//6I3//+iL///oiv//6Ir//+eJ///oh///6Ib//+eF///mhP/+5oP//uaC//7l
652 | ff/94W3/5tVi/6O7af97mG7/dZJp///bUv//21H//ttS//7fXv//4GL//+Bi///gZf//4WX//uFn///h
653 | af//4mr//+Ns//7jbf/+427//uRx///gZv//3Ff//t1Z///dWf//3Vr//91b//7dW///3Vz//t5d//7d
654 | W//+4Wr//+d9///mfP//53///eR+///vhf/bzHL/FxQM/wAAAP+fnJb/7erk/97a1f/n497/5ePe//Lw
655 | 7P///vr/7erm/8vJxv+9u7j/ysnH//Hw7///////9fPy//j29f/6+Pf/+/n5//z6+v/6+Pj///////j4
656 | +P/T09P/wsLC/9DQ0P/z8/P///////7+/v/6+/v/+/v7//f39///////j42M/wAAAP82MSD/8+aN///s
657 | kP/+6ZD//uV9///icf/+4nP//uJz//7ic//+4nL//+Fy///icf/+4nH//uJy//7hb//+5H3//+mK///o
658 | h///54f//+eG///nhP/+54P//+eC///ngf/+5oD//+aA///mff/95n7//+Zz/8bGYP94oW//eptu/3ac
659 | av//21D//9pO///dV//+31///99e///gYP//32H//+Bi///hZP//4WX//+Fn///hZ///4mn//+Nr//7i
660 | av/+3Fb//9xT///cVf//3FX//9xW///cVv//3Vf//91Y///dWf//3Fj//uNu//7lef//5Xj//+V5///m
661 | ev/84nn///OD/8GyYf8IBgP/CAgI/6aknf/y7+n/4t/a/+nm4f/q5+P/6ubi//Hu6f/69/L//vz4//z6
662 | +P/29PL/8/Hw//j29f/59/b/+vj3//v5+P/7+vn//fv7//r4+P/9/Pz///////////////////7+//v5
663 | +f/8+vr//fv7//r5+f//////nZyb/wAAAP8fGxL/3dB9///xkP/95on//+mN//7nhP/+4m///+Fw///h
664 | b///4W///+Fu///hbv//4W7//+Fu//7hbf//4W3//+Fu//7mgf//54T//+eD///mgv//5oH//uaB///m
665 | fv//5n3//uV8///lfP//5Xv//uR5//zidP/X0mb/faFn/2+WZv92pWv//thM///aUv//3Fn//txZ//7c
666 | Wv//3Vz//t1d//7eXv/+3l///t5g///eYv//32P//+Bj///hZ//+21j//tlN///aUP/+2lD//tpQ//7Z
667 | Uf/+2VH//tpS///bU//+2lL//txa///jcf/+43L//uNx//7jcv/+43P//uR0//vgcv//73v/y7hg/xsX
668 | Df8BAQL/gX96//Dt6P/m497/6ebi/+3q5v/u6+j/7+zo//Dt6v/w7u3/8/Hw//b08//49vX/+ff2//n3
669 | 9v/6+Pf/+/n5//z6+v/9+/v//Pv7//v6+v/7+fn/+/r6//z7+//+/Pz/+/n5//z7+//8/Pv/cW9u/wAA
670 | AP8yLRv/4dB5///vif/844P//ueG///mhf//5oX//uFx///faf//32r//99q///faf//32n//99p///f
671 | af/+32j//t9o///eZ//+323//uV///7lfv//5H3//uR8//7ke//+5Hv//uR5///jeP//43f//uN2///j
672 | df/33nD/zNBv/4anbP9ijmT/bppm//7aTP//3FT//9xV///dVf//3Ff//91Y///eWv//3lv//95c///e
673 | Xf//317//99f//7gYf/+3lz//tlL///ZTP//2U3//9lN///ZTf//2k7//9lO///ZTv//2k///tlN//7f
674 | X///427//+Js//7ibP//4m3//uJu//7jbv//42//+95t///xef/WwFf/Ix0M/wAAAP93dHD/9/Tv/+zp
675 | 5f/o5eH/7+zo//Hu6v/y7+z/8vDv//Ty8f/29PP/9/X0//j29f/59/b/+vj3//v5+P/8+vr//Pr6//37
676 | +//++/v//Pz8//z8/P/7+/v/+Pf3//79/f/+/v7/YGBe/wAAAP88NSD/6tp6///whf/74n7//+aA//7m
677 | gP//5oD//+aC//7jdv//3mT//95m///eZf//3mX//95l///eZP//3mT//95k///eZP/+3mT//t5h///h
678 | cP/+5Xr//uR4///keP//43f//uN2//7jdv/+43X//+N1///ic///4nL//uJz///jbP/PzGn/k7xp/3Sv
679 | bP/+2FD//tlR///aUv//21L//9tV///bVv//21f//9xY//7cWv/+3Vr//t1b//3eXP/+3l7//9lO///X
680 | SP//10r//tdJ//7XS//+10z//9dM///XTP//10z//9dM//7YTv/+32X//+Fo///haP//4Wn//+Fp//7h
681 | av/+4Wr//+Fq///iav/63Wr//+Va/+TGSf86MRX/AAAA/1ZUUP/f3Nf/+ffy/+zp5f/t6ub/8u/s//Lw
682 | 7//08vH/9fPy//f19P/49vX/+ff2//r49//6+Pj/+/n6//z6+v/9+/v//fv7//z6+v/59/f/+/r6////
683 | ///e3dz/Q0NB/wAAAP9USyr/9OF5///qfv/84Xj//+V7///le///5Xv//+V6///lev/+5Hj//91i///c
684 | X///3GD//9xg///cX///3F///9xf///cX///3F///txf///cX///3WH//+Jz///idP//4nP//+Jy///i
685 | cv//4XH//+Fw///hcP//4W///+Bv///gbv/94G3//99n//bdYv+Pv2f//NdO//zXT//72E//+9hQ//vY
686 | U//72VT/+9lU//vZVv/82Vj//dpY//3aWf/721v/+9lU//vURv/81Uj/+9VH//vVSP/71En/+9RJ//vV
687 | Sf/71En/+9VK//rUSP/72FL//N5l//3dY//93WT//t5k//zeZf/83mb//N5m//3fZv/832f//d5l//nU
688 | TP/+3U3/99dO/1ZHHf8AAAD/HBwb/56cmP/28u7//Pn1//Dt6f/u6+r/8vDv//Xz8v/29PP/9/X0//n3
689 | 9v/6+Pf/+vj4//v5+f/7+fn/+vj4//n39//8+/v///////j39/+SkY//EBEQ/wAAAP90ZC3//+t3//zk
690 | df/733L//eJ0//3hdP/94nT//eJ0//3ic//94XP//eJ1//3dZf/92Vj//dpb//3aWv/92Vn//dlZ//3Z
691 | Wv/+2lr//dlZ//3ZWf/92Vr//dlZ//3cYv/94G///d9t//zfbf/9323//N9s//zfbP/93mv//d5q//3f
692 | av/83mn//d9o//3eaP/33Gb/2dNh//nTS//51Ez/+tRN//rVT//61VD/+9VR//rWUf/611L/+9dU//vX
693 | Vf/811b/+thY//rTS//60UX/+tFH//rRRv/60Ub/+tJH//rSR//60kf/+tJH//rSR//50Ub/+tlY//zc
694 | Yf/822D//Nth//zaYf/822H//Nti//rbY//622L/+ttk//vZXf/600j/99BH//vVSv/82Ev/iXQq/woJ
695 | BP8AAAD/Ojk3/6+uqf/18+/////7//r39f/z8fD/8vDv//Px8P/08vH/9fPy//b09P/39fX/+/n5///+
696 | /v//////9vb1/6empP8qKir/AAAA/xYUCf+iizj//+BX//rdaf/53W3/+99u//vfbv/73m7/+99u//vf
697 | bv/73m7/+t5t//rfbv/73Wn/+9VV//vWVP/81lX//dZV//3WVf/81lT//NVU//3WVf/91lX//dVV//vW
698 | Vv/711X/+9xk//vdav/73Gj//N1o//zcaP/73Gf//Nxn//zcZv/83Gb/+9tl//vbZP/822X//Ntk//7Z
699 | Yf/600v/+tNL//rUS//61E3/+tVP//vVUP/71lD/+9ZR//vWUv/81lP//NdV//vVUP/70UX/+9FG//vR
700 | Rv/70Ub/+9FG//vRRv/70Ub/+9FG//vRRf/70UT/+dNI//vaXf/82l7//Ntf//zaX//82l///Npf//zb
701 | X//722D/+9pf//vbYf/711X/+tFG//rSR//50Ub/+dFH///gTP/Yt0D/VEcb/wAAAP8AAAD/Li4v/4+O
702 | if/X1dL//Pr5//////////////////////////////////39/P/S0c7/gH9+/yAhI/8AAAD/BwUC/2tZ
703 | I//nxUj//+FS//nRS//62V7/+95q//vdaP/83Wn//N5p//zeaf/83mn/+91o//vdaP/73Wj//N1p//zX
704 | V//71E//+9VR//vVUP/71FH/+9VR//vVUf/81VH//NVR//zVUv/81VL//NVR//zXV//83GT//Ntk//zb
705 | ZP/822T//Ntk//3bY//922P//Npj//zaYv/82mL//Npi//vZYf/62WH/+tNJ//rTSf/51Er/+dRK//rU
706 | TP/71U3/+tVO//rWT//71lD/+9ZR//zWUv/60kb/+9FC//vRQ//70UP/+9FD//vRQ//70UP/+9FD//vR
707 | Q//70UP/+9BB//nVTv/62Vz/+tlb//vaW//72lv/+9pb//vaXP/72l3//Npd//vaXf/7217/+tRO//rR
708 | Q//60kX/+tJE//nRRP/2zkP//dlH///dSf/IqTr/WUsa/wgGAf8AAAD/BAQH/zU1OP9jYmL/f399/4yM
709 | iv+Lioj/enl4/1tZWv8qKy7/AgIE/wAAAP8RDQP/bVwh/9i1P///4E7//NdK//fQSP/600j/+tdT//zd
710 | ZP/83GP//Ntj//zcZP/93GT//Nxk//zcZP/83GT//Ntk//3cZf/82Vv/+tRL//rUTP/61Ez/+tRN//rU
711 | Tf/61E3/+tRN//rUTf/61E3/+tRN//vVTv/71E3/+9ha//zbYf/72l//+9lf//vZX//72l//+tpe//vZ
712 | Xf/62V3/+9ld//vZXP/72Vz/+9lc//rTRv/600f/+tNI//rUSf/61Er/+tRK//rVS//61Uv/+tVM//rX
713 | Tv/71Ej/+tBA//rRQf/60UH/+tFB//rRQf/60UH/+tFB//rRQf/60UL/+tFB//rRQf/72FT/+tlZ//rZ
714 | WP/72Vj/+9lY//vaWP/62Vn/+tlZ//rZWf/72lr/+9pa//rTRf/60EH/+tFD//rRQv/60UL/+tFC//jP
715 | Qv/5zkH//tpF///dRf/jwEf/mYY8/0g/Gv8LCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Eg4B/1dJ
716 | GP+ojjH/7MdC///gSf/+2Ub/+M9D//rRRf/70kX/+9JE//vUSv/72l7//Npe//zaX//82l7//Npe//vb
717 | Xv/821///Ntf//zbX//8217/+9pd//vUS//700f/+9NI//rTSP/600n/+tNJ//vTSf/700n/+9NJ//vT
718 | Sf/700r/+9NJ//vUTv/82Vv/+9lb//vYWv/72Vr/+9lZ//vYWf/72Fn/+9hZ//vYWP/82Ff//NhY//zY
719 | WP/700X/+9NF//vTRv/71Ef/+9RI//vUSf/71Ur/+9VL//vVS//71Uv//NFB//zRP//70ED/+9FA//vR
720 | QP/70UD/+9FA//vRQP/70UD/+9FA//vRP//800X//NlW//3ZVv/82Vb//NlX//zZV//82Vf//NlX//zZ
721 | WP/82Vj//NlZ//zYVf/70UH/+9FA//zRQP/80UD//NFB//zRQf/80UH/+9FB//nPQf/5zj7//tpO///p
722 | YP//5F7/789W/9K2Tf+2nkP/qpM+/6yVP/++pEb/271R//XSUv//3Ub//99G//7UQ//4zkL/+c9C//vR
723 | Q//80UP/+9FD//vRQ//80UT/+9hX//zaWv/82lr//Npa//zaWv/82lr//Npa//zaWv/72lr//NlZ//za
724 | W//81U///NJE//zSRf/70kX/+9JF//vSRf/70kb/+9JG//vSR//70kf/+9JH//zTR//700b//NZQ//zY
725 | V//72Fb/+9hW//zXVf/811X//dhV//zXVP/81lP//NZT//zXU//811P/+dND//nTRP/400T/+NNE//nU
726 | Rv/51Ef/+NRH//nVSP/51Ur/+dJD//nRPv/50T//+dE+//nRPv/50T7/+dE+//nRPv/40T7/+NE+//jR
727 | P//50T7/+tZN//rZVP/62FP/+thT//nXVf/52FX/+tlV//rZVf/62VX/+tlV//nZV//51k3/+dA+//nR
728 | P//50T//+dI///nRP//50UD/+dFA//nRQP/50UD/+dA+//jUS//21lb/99ZV//3cWP//4Vr//+Vb///n
729 | W///5lv//+Ra///gW//82lT/9s8///XOPv/40ED/+dFA//nRQf/50UH/+dFB//nRQf/50UH/+dA///nW
730 | Tf/52Vj/+tlW//vZV//72Ff/+9hX//vYV//72Ff/+9hX//vYVv/72Ff/+thU//nSQ//50kL/+dJD//nS
731 | Q//50kP/+dJC//rSQ//60kT/+tJE//rSRP/60kP/+tJE//rSRf/61lD/+9dT//rXUf/611H/+tdR//zW
732 | UP/71k//+9ZP//vWT//71k//+9VP//rSP//600D/+dNA//nTQf/500L/+tNC//nUQ//51UX/+dRD//rR
733 | PP/70Tz/+9E8//vRPP/70Tz/+9E8//vRPP/70Tz/+9E8//vRPP/70Tz/+tI+//rXTf/72E7//NhP//zY
734 | T//62E//+thP//rYUP/62FD/+tlQ//rZUP/52VL/+tRE//vRO//70Tz/+9E8//vRPP/70Tz/+9E8//vR
735 | PP/70Tz/+9E8//rROv/61kr/+9lT//rYUf/511H/+NZR//fVUP/31VD/99VQ//jWUf/511L/+ddP//rR
736 | Pv/70Tz/+9E8//rRPP/50Tz/+dE9//nRPf/50T3/+dE9//jRO//500X/+tlT//rYUf/62FL/+9hS//vY
737 | Uv/62FH/+thR//rYUP/62FD/+thQ//rYUf/500T/+dE8//nSPv/50j7/+dE+//rSP//60j//+tI///rS
738 | P//60j//+tI///rSP//60j7/+dND//vWTP/71kv/+9ZL//rWS//51Ur/+dVK//rWSv/51kn/+dVJ//rV
739 | Sf/60T3/+dE+//nSP//60j//+tJA//rTQP/500H/+dNB//nRPP/60Dv/+9A8//vQPP/70Dz/+9A8//vQ
740 | O//70Dv/+9A8//vQO//70Dz/+9A7//rSQP/61k3/+tdL//vXTf/7103/+tdN//rXTf/6107/+tdO//rX
741 | Tv/6107/+9dP//rSQP/70Dv/+9A8//vQPP/70Dz/+9A8//vQPP/70Dz/+9A8//vQPP/60Dr/+tVI//vZ
742 | UP/62E//+thP//rYT//72E//+9hP//vYT//72FD/+9hR//vXTv/60T3/+9A7//vQPP/60Dz/+dE7//nQ
743 | O//5zzv/+dA7//nQO//5zzv/+dE///rXTv/6107/+9dO//rYT//62E//+tdO//rXTv/62E7/+tdO//rX
744 | Tf/710//+tVI//nQPP/60Dz/+tA8//rQPP/60Dz/+tA8//nQPP/50Dz/+tA8//rRPP/60Tz/+tE9//nR
745 | PP/51EX/+tZJ//rVSP/51Uj/+dRG//jURv/51Eb/+dNG//nTRf/600X/+dI9//nRPf/50T7/+dI///nS
746 | P//50kD/+dJA//nRPv/50Dr/+dA6//nQOv/50Dr/+dA6//nQOv/50Dr/+dA6//nQOv/50Dr/+dA7//jQ
747 | Ov/51EX/+tZM//rWTP/61kz/+tVN//rWTf/61k3/+tdO//rXTv/6107/+tdO//rWTP/50Dz/+s88//nQ
748 | PP/50Dz/+dA8//nQPP/50Dz/+dA8//nQPP/60Dz/+dA7//nVSf/610//+ddO//nXTv/6107/+ddO//rX
749 | Tv/5107/+tdO//vXTv/6107/+dE+//rPPP/50Dz/+tA8//rPPP/60Dz/+tA8//rQPP/60Dz/+tA8//rQ
750 | PP/61Uv/+tdO//rWTv/61k7/+tZO//rWTf/71k3/+9ZN//rWTf/61U3/+tZM//rWTP/60T//+dA8//rQ
751 | Pf/60Dz/+tA8//rQPP/60Dz/+s88//rQPP/50D3/+dA9//nQPf/50Dz/+dE+//nURv/500j/+dNH//nU
752 | Rv/500X/+dNF//nTRP/500T/+dNE//vPPf/7zz7//M8///vPPv/70D//+9FA//zQQP/7zjz/+847//vO
753 | O//6zjv/+s47//rOO//6zjv/+s47//rOO//6zjv/+s47//rOOv/7zjz//NNJ//vVSv/81Uv//NVL//zV
754 | S//81Ez//NRM//vVTP/71Uz/+9VM//zWTf/900n/+846//rOO//6zjv/+s47//rOO//6zjv/+s47//rO
755 | O//6zjv/+s47//rOOv/71En//NVO//zVTf/81U3//NVN//zVTf/81U3//NVN//zVTf/81U3/+9VN//vQ
756 | Pv/6zjv/+s47//rOO//6zjv/+s47//rOO//6zjv/+s47//rOO//7zTr/+9NH//vVTf/81Ez//NRM//zU
757 | TP/81Ev//NRL//zUTP/81Ev//NRL//3USv/81Ez/+9JD//vOOv/6zjv/+s47//rOO//6zjv/+s47//rO
758 | O//6zjv/+847//vOO//7zjv/+848//vOO//80EH/+9FF//vRRP/80UP/+9FD//vQQv/80EP//NBC//zQ
759 | Qv/7zDz/+8w9//vMPv/6zD7/+80///vOQP/6zT3/+sw6//vMO//7zDv/+8w7//vMO//7zDv/+8w7//vM
760 | O//7zDv/+8w7//vMO//6zDr/+85A//vSSv/80kn//NJK//zSSv/80kr//NJL//zSS//700z//NNL//zT
761 | TP/9007/+9BE//rLOv/7zDv/+8w7//vMO//7zDv/+8w7//vMO//7zDv/+8w7//vMO//7zDv//NJK//zT
762 | Tv/80k3//NNN//zSTf/80k3//NJN//zSTf/80k3//NJN//zTTf/7zT7/+8w6//vMO//7zDv/+8w7//vM
763 | O//6zDv/+8w7//vMO//6zDv/+ss6//vOQv/7003//NJL//3SS//80kv//NJL//zRS//80kr//NJK//vS
764 | Sv/70kn/+9JJ//vRSP/6zDz/+sw7//rMO//6zDv/+sw7//rMO//6zDv/+sw7//rMO//6zDv/+sw7//rM
765 | O//7zDv/+8w8//vOQv/7z0T/+85C//vOQ//7zkL/+85B//vNQf/7zUH/+Ms8//jLPf/4yz7/+co+//nL
766 | Pv/5yz7/+sk6//nJOv/5yjr/+co6//nKOv/5yjr/+co6//nKOv/5yjr/+co6//nKOv/5yjr/+ck6//nO
767 | RP/5z0f/+tBI//rQSP/60Ej/+tBJ//rPSv/60Er/+9BJ//rRSv/60Er/+tFM//nMQP/5yTn/+co6//nK
768 | Ov/5yjr/+co6//nKOv/5yjr/+co6//nKOv/5yTn/+co7//nQSf/50Uz/+dBL//nQS//50Uz/+dFM//nR
769 | TP/50Uz/+dFM//nRS//60Uz/+cs///nJOf/5yjr/+co6//nKOv/5yTr/+ck6//nKOv/5yjr/+co6//nJ
770 | Of/6yj3/+89K//vPSv/6z0v/+s9K//rPS//6z0r/+tBI//rQSP/60Ej/+dBI//nPR//5z0j/+cs///nJ
771 | Of/6yTr/+sk7//rJPP/6yTz/+sk8//rJPP/5yjz/+co8//nKPP/5yjz/+co7//nJO//5yj7/+s1D//rM
772 | Qf/6zEL/+ctB//jLQf/6y0H/+stB//nKPP/5yj3/+ck9//jKPf/5yj3/+ck7//jIOv/4yDv/+cg7//nI
773 | O//5yDv/+cg7//nIO//5yDv/+cg7//nIO//5yDv/+ck6//nKPP/6zkb/+s5H//rOR//6zkf/+s5H//vP
774 | SP/5z0j/+s9J//rPSv/6z0r/+s9K//rPSf/5yj3/+ck6//nIO//4yDv/+Mg7//nIO//5yDv/+cg7//nI
775 | O//5yDv/+cg6//nJPP/6z0n/+tBL//rQS//60Ev/+tBL//rQS//60Ev/+tBL//rQS//60Ev/+tBL//nK
776 | QP/4yDr/+cg7//nIO//5yDv/+Mg7//jIO//5yDv/+cg7//nIO//4yDv/+Mk7//nOR//6z0r/+s9J//vP
777 | Sf/7z0j/+s5I//rOR//7zkf/+85H//rNR//6zUf/+s5I//rNQ//5yTr/+Mg7//nJO//5yTv/+ck7//nJ
778 | O//5yTv/+Mk7//jJO//4yTv/+Mk7//jJO//4yTv/+Mg7//rKP//6y0L/+ctB//nLQP/4ykD/+cpA//nK
779 | QP/5yTv/+ck8//rJPf/4yj3/+Mk8//nJOv/5yTr/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJ
780 | O//5yTv/+ck7//jJOf/5zEH/+s1G//rNRv/7zkb/+85G//vORv/6zUb/+c9G//rPSP/6z0n/+tBI//rR
781 | Sf/5z0X/+ck6//nJO//5yTr/+ck6//nJOv/5yTr/+Mk6//jJOv/5yTv/+ck7//nJOv/5yTz/+s9I//rQ
782 | Sv/7z0r/+89K//rPSv/6z0r/+s9K//rPSv/6z0r/+s9J//rQSv/5y0D/+ck6//nJO//5yTv/+ck7//nJ
783 | O//5yTv/+ck7//nJO//5yTv/+ck7//jJOv/6zUL/+tBI//rPR//7zUb/+85G//rNRv/7zkb/+s1G//rN
784 | Rv/7zkb/+s5G//rORv/6zkb/+co8//jJOv/5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJ
785 | O//5yTv/+ck7//jJOf/5yTv/+cs+//nLP//5yz//+ctA//nKQP/5yj//+ck7//nJO//6yjz/+so8//nK
786 | O//4yjj/+ck6//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTr/+cxD//nN
787 | RP/5zUT/+c5F//rORf/6zkX/+s5F//rORf/7z0b/+89G//rPR//60En/+c1C//nKOP/5yjn/+ck5//nK
788 | Of/5yjn/+co5//nJOP/5yTj/+ck7//nJO//5yTv/+co8//rPR//50Ej/+dBI//nQSP/60Ej/+dBI//nP
789 | R//50Ej/+dBI//rQSP/50Ej/+ctB//nJOv/5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJ
790 | O//5yDr/+ss+//rOR//6zUb/+s1G//rORf/6zkX/+s5F//rORf/6zkX/+s5F//rORf/5zUT/+c1F//nK
791 | P//5yDr/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nJO//5yTv/+ck7//nK
792 | O//5yz7/+co+//jKPf/4yj3/+Mo9//nJO//5yTv/+Mo7//nKO//5yjr/+co5//nJOv/5yTr/+ck6//nJ
793 | Ov/5yTr/+ck6//nJOv/5yTr/+ck6//nJOv/5yTr/+cs8//nOQ//5zUP/+c1E//rNRP/6zkT/+s5F//rO
794 | Rf/6zkX/+s9G//rPRv/6z0b/+9BI//nMQP/5yjn/+co6//nKOv/5yjr/+co5//nKOf/5yjn/+co5//nK
795 | Ov/5yTr/+ck6//nKPP/6z0f/+c9H//nPR//5z0f/+89H//rPR//6z0f/+s5G//rORv/6z0b/+s9H//nM
796 | Qf/5yDn/+ck7//nJOv/5yTr/+ck6//nJOv/5yTr/+ck6//nJOv/5yTv/+ck5//jKO//6zkX/+s5F//rO
797 | Rf/6zkX/+s5F//rORf/6zUT/+c1E//nNRP/5zUT/+c1E//nOQ//5zUH/+Mk6//nJOv/5yTr/+ck6//nJ
798 | Ov/5yTr/+ck6//nJOv/5yTr/+ck6//nJOv/5yTr/+ck6//nJOv/5yTn/+co8//nKPf/5yj3/+Mo8//jK
799 | PP/6yTj/+sk4//rKOP/6yjj/+co4//nKOf/7yjj/+sk3//rJN//6yTf/+sk3//rJN//6yTf/+sk3//rJ
800 | N//6yTf/+sk3//vLPf/6zEH/+s1A//rNQf/6zUL/+s1B//vNQv/7zUP/+s9C//vPRP/8z0X/+9BF//vQ
801 | RP/6zDv/+ss4//rLOf/7yzn/+ss4//nKOP/6yzn/+so4//nKOP/5yjj/+co4//rKN//6yzv/+89F//vO
802 | Rf/7zkX/+85E//vORP/7zkX/+85F//vORf/6zkX/+s5E//vPRf/6zD//+sk2//rJOP/6yTf/+sk3//rJ
803 | N//6yTf/+sk3//rJN//6yDj/+sk3//rJN//6yjj/+81C//vOQ//7zUP/+81D//vNQ//6zEP/+s1C//rO
804 | Qv/6zUL/+s1B//rNQf/7zUD/+s1A//nKOv/6yTf/+sk3//rJN//6yTf/+sk3//rJN//6yTf/+sk3//rJ
805 | N//6yTf/+sk3//rJN//6yTf/+sk3//rJOP/7yjr/+co7//rKOv/6yjn/AAAAAAAAAAAAAAAAAMo4/wAA
806 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK
807 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA
808 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA
809 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA
810 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK
811 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA
812 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA
813 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA
814 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK
815 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA
816 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA
817 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA
818 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK
819 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA
820 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA
821 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA
822 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK
823 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA
824 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA
825 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA
826 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK
827 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA
828 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAA
829 | AAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAA
830 | AAAAAAAAAAAAAADKOP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADK
831 | OP8AAAAAAAAAAAAAAAAAyjj/AAAAAAAAAAAAAAAAAMo4/wAAAAAAAAAAAAAAAADKOP8AAAAAAAAAAAAA
832 | AAAAyjj/AAAAAAAAAAAAAAAAAMo4/w==
833 |
834 |
835 |
--------------------------------------------------------------------------------
/CodemastersBinImage/icon100x100.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lab313ru/CodemastersBinImage/10090d756d50ec8f5bdbb0f829e1a3eee71d12dc/CodemastersBinImage/icon100x100.ico
--------------------------------------------------------------------------------
/CodemastersBinImage/win_imploder.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lab313ru/CodemastersBinImage/10090d756d50ec8f5bdbb0f829e1a3eee71d12dc/CodemastersBinImage/win_imploder.dll
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # CodemastersBinImage
2 | Codemasters Sega Mega Drive / Genesis games Images converter
3 |
4 | This tool allows you to extract and insert back general graphics in **Sega Genesis** / **Mega Drive** games by **Codemasters**.
5 |
6 | Features:
7 | - Search general graphics data in ROMs;
8 | - Exporting graphics to BMP images;
9 | - Imploding your images back into ROM;
10 | - In case of compressed image is greater than original one, compressed binary will be saved separately for manual insertion.
11 |
--------------------------------------------------------------------------------