1 /*
2  * PROJECT:     apphelp_apitest
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     Common data / functions for apphelp_apitest
5  * COPYRIGHT:   Copyright 2015-2018 Mark Jansen (mark.jansen@reactos.org)
6  */
7 
8 #include <exdisp.h>
9 #include <winbase.h>
10 #include "wine/test.h"
11 
12 
13 static IMAGE_DOS_HEADER dos_header =
14 {
15     IMAGE_DOS_SIGNATURE, /* e_magic */
16     144, /* e_cblp */
17     3, /* e_cp */
18     0, /* e_crlc */
19     4, /* e_cparhdr */
20     0, /* e_minalloc */
21     65535, /* e_maxalloc */
22     0, /* e_ss */
23     184, /* e_sp */
24     0, /* e_csum */
25     0, /* e_ip */
26     0, /* e_cs */
27     64, /* e_lfarlc */
28     0, /* e_ovno */
29     { 0 }, /* e_res[4] */
30     0, /* e_oemid */
31     0, /* e_oeminfo */
32     { 0 }, /* e_res2[10] */
33     0x80 /* e_lfanew */
34 };
35 
36 static IMAGE_NT_HEADERS32 nt_header =
37 {
38     IMAGE_NT_SIGNATURE, /* Signature */
39     {
40         IMAGE_FILE_MACHINE_I386, /* Machine */
41         2, /* NumberOfSections */
42         0x12345, /* TimeDateStamp */
43         0, /* PointerToSymbolTable */
44         0, /* NumberOfSymbols */
45         sizeof(IMAGE_OPTIONAL_HEADER), /* SizeOfOptionalHeader */
46         IMAGE_FILE_RELOCS_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_32BIT_MACHINE /* Characteristics */
47     },
48     {
49         IMAGE_NT_OPTIONAL_HDR_MAGIC, /* Magic */
50         6, /* MajorLinkerVersion */
51         3, /* MinorLinkerVersion */
52         0, /* SizeOfCode */
53         0, /* SizeOfInitializedData */
54         0, /* SizeOfUninitializedData */
55         0x1000, /* AddressOfEntryPoint */
56         0x1000, /* BaseOfCode */
57         0, /* BaseOfData */
58         0x400000, /* ImageBase */
59         0x1000, /* SectionAlignment */
60         0x200, /* FileAlignment */
61         4, /* MajorOperatingSystemVersion */
62         1, /* MinorOperatingSystemVersion */
63         4, /* MajorImageVersion */
64         2, /* MinorImageVersion */
65         4, /* MajorSubsystemVersion */
66         3, /* MinorSubsystemVersion */
67         0, /* Win32VersionValue */
68         0x3000, /* SizeOfImage */
69         0x200, /* SizeOfHeaders */
70         0xBAAD, /* CheckSum: This checksum is not the correct checksum, intentionally! */
71         IMAGE_SUBSYSTEM_WINDOWS_CUI, /* Subsystem */
72         0, /* DllCharacteristics */
73         0x100000, /* SizeOfStackReserve */
74         0x1000, /* SizeOfStackCommit */
75         0x100000, /* SizeOfHeapReserve */
76         0x1000, /* SizeOfHeapCommit */
77         0, /* LoaderFlags */
78         0x10, /* NumberOfRvaAndSizes */
79         {
80             /* IMAGE_DIRECTORY_ENTRY_EXPORT */
81             {
82                 0x2370, /* VirtualAddress */
83                 76, /* Size */
84             },
85             { 0 },
86             /* IMAGE_DIRECTORY_ENTRY_RESOURCE */
87             {
88                 0x2000, /* VirtualAddress */
89                 868, /* Size */
90             },
91         } /* DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] */
92     }
93 };
94 
95 static IMAGE_SECTION_HEADER section_headers[] =
96 {
97     {
98         { '.','t','e','x','t',0 }, /* Name */
99         { 24 }, /* VirtualSize */
100         0x1000, /* VirtualAddress */
101         0x200, /* SizeOfRawData */
102         0x200, /* PointerToRawData */
103         0, /* PointerToRelocations */
104         0, /* PointerToLinenumbers */
105         0, /* NumberOfRelocations */
106         0, /* NumberOfLinenumbers */
107         IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ /* Characteristics */
108     },
109     {
110         { '.','r','s','r','c',0 }, /* Name */
111         { 880 }, /* VirtualSize */
112         0x2000, /* VirtualAddress */
113         0x400, /* SizeOfRawData */
114         0x400, /* PointerToRawData */
115         0, /* PointerToRelocations */
116         0, /* PointerToLinenumbers */
117         0, /* NumberOfRelocations */
118         0, /* NumberOfLinenumbers */
119         IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ /* Characteristics */
120     }
121 };
122 
123 static const unsigned char text_section[] =
124 {
125     0x33, 0xc0,     /* xor eax, eax */
126     0xc3            /* ret */
127 };
128 
129 
130 /* taken from fusionpriv.h */
131 typedef struct
132 {
133     WORD wLength;
134     WORD wValueLength;
135     WORD wType;
136     WCHAR szKey[17];
137     VS_FIXEDFILEINFO Value;
138 } VS_VERSIONINFO;
139 
140 typedef struct
141 {
142     WORD wLength;
143     WORD wValueLength;
144     WORD wType;
145     WCHAR szKey[15];
146 } STRINGFILEINFO;
147 
148 typedef struct
149 {
150     WORD wLength;
151     WORD wValueLength;
152     WORD wType;
153     WCHAR szKey[9];
154 } STRINGTABLE;
155 
156 typedef struct
157 {
158     WORD wLength;
159     WORD wValueLength;
160     WORD wType;
161 } STRINGHDR;
162 
163 typedef struct
164 {
165     WORD wLength;
166     WORD wValueLength;
167     WORD wType;
168     WCHAR szKey[13];
169 } VARFILEINFO;
170 
171 typedef struct
172 {
173     WORD wLength;
174     WORD wValueLength;
175     WORD wType;
176     WCHAR szKey[13];
177     DWORD Value;
178 } VAR;
179 
180 typedef struct rsrc_section_t
181 {
182     IMAGE_RESOURCE_DIRECTORY header;
183     IMAGE_RESOURCE_DIRECTORY_ENTRY file_info_id;
184     IMAGE_RESOURCE_DIRECTORY file_info_header;
185     IMAGE_RESOURCE_DIRECTORY_ENTRY version_info_id;
186     IMAGE_RESOURCE_DIRECTORY version_info_header;
187     IMAGE_RESOURCE_DIRECTORY_ENTRY version_lang_id;
188     IMAGE_RESOURCE_DATA_ENTRY version_data_entry;
189 
190     VS_VERSIONINFO version_info;
191     STRINGFILEINFO string_file_info;
192     STRINGTABLE string_table;
193 
194     STRINGHDR FileVersion_hdr;
195     WCHAR FileVersion_key[13];
196     WCHAR FileVersion_val[8];
197 
198     STRINGHDR ProductVersion_hdr;
199     WCHAR ProductVersion_key[15];
200     WCHAR ProductVersion_val[8];
201 
202     STRINGHDR CompanyName_hdr;
203     WCHAR CompanyName_key[13];
204     WCHAR CompanyName_val[12];
205 
206     STRINGHDR FileDescription_hdr;
207     WCHAR FileDescription_key[17];
208     WCHAR FileDescription_val[16];
209 
210     STRINGHDR InternalName_hdr;
211     WCHAR InternalName_key[13];
212     WCHAR InternalName_val[14];
213 
214     STRINGHDR LegalCopyright_hdr;
215     WCHAR LegalCopyright_key[15];
216     WCHAR LegalCopyright_val[16];
217 
218     STRINGHDR LegalTrademarks_hdr;
219     WCHAR LegalTrademarks_key[17];
220     WCHAR LegalTrademarks_val[16];
221 
222     STRINGHDR OriginalFilename_hdr;
223     WCHAR OriginalFilename_key[17];
224     WCHAR OriginalFilename_val[18];
225 
226     STRINGHDR Productname_hdr;
227     WCHAR Productname_key[13];
228     WCHAR Productname_val[12];
229 
230     VARFILEINFO file_info;
231     VAR translation;
232 } rsrc_section_t;
233 
234 #define    RT_VERSION_DW       16
235 static const rsrc_section_t rsrc_section =
236 {
237     /* header */
238     {
239         0, /* Characteristics */
240         0x55FE8E21, /* TimeDateStamp, 20/09/2015 10:44:49 */
241         0, /* MajorVersion */
242         0, /* MinorVersion */
243         0, /* NumberOfNamedEntries */
244         1, /* NumberOfIdEntries */
245     },
246     /* file_info_id */
247     {
248         {{
249                 RT_VERSION_DW, /* NameOffset:31 */
250             0 /* NameIsString:1 */
251         }},
252         {
253             0x80000018 /* OffsetToData */
254         }
255     },
256     /* file_info_header */
257     {
258         0, /* Characteristics */
259         0x55FE8E21, /* TimeDateStamp, 20/09/2015 10:44:49 */
260         0, /* MajorVersion */
261         0, /* MinorVersion */
262         0, /* NumberOfNamedEntries */
263         1, /* NumberOfIdEntries */
264     },
265     /* version_info_id */
266     {
267         {{
268             VS_VERSION_INFO, /* NameOffset:31 */
269             0 /* NameIsString:1 */
270         }},
271         {
272             0x80000030 /* OffsetToData */
273         },
274     },
275     /* version_info_header */
276     {
277         0, /* Characteristics */
278         0x55FE8E21, /* TimeDateStamp, 20/09/2015 10:44:49 */
279         0, /* MajorVersion */
280         0, /* MinorVersion */
281         0, /* NumberOfNamedEntries */
282         1, /* NumberOfIdEntries */
283     },
284     /* version_lang_id */
285     {
286         {{
287             1033, /* NameOffset:31 */
288             0 /* NameIsString:1 */
289         }},
290         {
291             0x48 /* OffsetToDirectory */
292         }
293     },
294     /* version_data_entry */
295     {
296         0x2058, /* OffsetToData */
297         0x30C, /* Size */
298         0, /* CodePage */
299         0, /* Reserved */
300     },
301 
302     /* version_info */
303     {
304     0x30C, /* wLength */
305     0x34, /* wValueLength */
306     0, /* wType: Binary */
307     { 'V','S','_','V','E','R','S','I','O','N','_','I','N','F','O','\0','\0' }, /* szKey[17] */
308         /* Value */
309         {
310             0xFEEF04BD, /* dwSignature */
311             0x10000, /* dwStrucVersion */
312             0x10000, /* dwFileVersionMS */
313             0, /* dwFileVersionLS */
314             0x10000, /* dwProductVersionMS */
315             1, /* dwProductVersionLS */
316             0, /* dwFileFlagsMask */
317             0, /* dwFileFlags */
318             VOS__WINDOWS32, /* dwFileOS */
319             VFT_APP, /* dwFileType */
320             0, /* dwFileSubtype */
321             0x01d1a019, /* dwFileDateMS */
322             0xac754c50 /* dwFileDateLS */
323         },
324     },
325 
326     /* string_file_info */
327     {
328         0x26C, /* wLength */
329         0, /* wValueLength */
330         1, /* wType: Text */
331         { 'S','t','r','i','n','g','F','i','l','e','I','n','f','o','\0' } /* szKey[15] */
332     },
333     /* string_table */
334     {
335         0x248, /* wLength */
336         0, /* wValueLength */
337         1, /* wType: Text */
338         { 'F','F','F','F','0','0','0','0','\0' } /* szKey[9] */
339     },
340 
341     /* FileVersion */
342     {
343         48, /* wLength */
344         8, /* wValueLength */
345         1, /* wType: Text */
346     },
347     { 'F','i','l','e','V','e','r','s','i','o','n','\0' },
348     { '1','.','0','.','0','.','0','\0' },
349 
350     /* ProductVersion */
351     {
352         52, /* wLength */
353         8, /* wValueLength */
354         1, /* wType: Text */
355     },
356     { 'P','r','o','d','u','c','t','V','e','r','s','i','o','n','\0' },
357     { '1','.','0','.','0','.','1','\0' },
358 
359     /* CompanyName */
360     {
361         56, /* wLength */
362         12, /* wValueLength */
363         1, /* wType: Text */
364     },
365     { 'C','o','m','p','a','n','y','N','a','m','e','\0' },
366     { 'C','o','m','p','a','n','y','N','a','m','e','\0' },
367 
368     /* FileDescription */
369     {
370         72, /* wLength */
371         16, /* wValueLength */
372         1, /* wType: Text */
373     },
374     { 'F','i','l','e','D','e','s','c','r','i','p','t','i','o','n','\0' },
375     { 'F','i','l','e','D','e','s','c','r','i','p','t','i','o','n','\0' },
376 
377     /* InternalName */
378     {
379         58, /* wLength */
380         13, /* wValueLength */
381         1, /* wType: Text */
382     },
383     { 'I','n','t','e','r','n','a','l','N','a','m','e','\0' },
384     { 'I','n','t','e','r','n','a','l','N','a','m','e','\0' },
385 
386     /* LegalCopyright */
387     {
388         66, /* wLength */
389         15, /* wValueLength */
390         1, /* wType: Text */
391     },
392     { 'L','e','g','a','l','C','o','p','y','r','i','g','h','t','\0' },
393     { 'L','e','g','a','l','C','o','p','y','r','i','g','h','t','\0' },
394 
395     /* LegalTrademarks */
396     {
397         72, /* wLength */
398         16, /* wValueLength */
399         1, /* wType: Text */
400     },
401     { 'L','e','g','a','l','T','r','a','d','e','m','a','r','k','s','\0' },
402     { 'L','e','g','a','l','T','r','a','d','e','m','a','r','k','s','\0' },
403 
404     /* OriginalFilename */
405     {
406         74, /* wLength */
407         17, /* wValueLength */
408         1, /* wType: Text */
409     },
410     { 'O','r','i','g','i','n','a','l','F','i','l','e','n','a','m','e','\0' },
411     { 'O','r','i','g','i','n','a','l','F','i','l','e','n','a','m','e','\0' },
412 
413     /* ProductName */
414     {
415         56, /* wLength */
416         12, /* wValueLength */
417         1, /* wType: Text */
418     },
419     { 'P','r','o','d','u','c','t','N','a','m','e','\0' },
420     { 'P','r','o','d','u','c','t','N','a','m','e','\0' },
421 
422 
423     /* file_info */
424     {
425         0x44, /* wLength */
426         0, /* wValueLength */
427         1, /* wType: Text */
428         { 'V','a','r','F','i','l','e','I','n','f','o','\0' } /* szKey[13] */
429     },
430 
431     /* translation */
432     {
433         0x24, /* wLength */
434         4, /* wValueLength */
435         0, /* wType: Binary */
436         { 'T','r','a','n','s','l','a','t','i','o','n','\0' }, /* szKey[13] */
437         0xffff /* Value */
438     }
439 };
440 
441 typedef struct export_section_t
442 {
443     IMAGE_EXPORT_DIRECTORY desc;
444     char binary_name[10];
445 } export_section_t;
446 
447 /* This export section is not complete, but the Name RVA is only taken into account */
448 static export_section_t export_dir =
449 {
450     {
451         0, /* Characteristics */
452         0, /* TimeDateStamp */
453         0, /* MajorVersion */
454         0, /* MinorVersion */
455         0x2398, /* Name (RVA) */
456         1, /* Base */
457         0, /* NumberOfFunctions */
458         0, /* NumberOfNames */
459         0, /* AddressOfFunctions (RVA)  */
460         0, /* AddressOfNames (RVA) */
461         0, /* AddressOfNameOrdinals (RVA) */
462     },
463     { 'T','e','S','t','2','.','e','x','e',0 }, /* binary_name */
464 };
465 
466 
467 void test_create_exe_imp(const WCHAR* name, int skip_rsrc_exports)
468 {
469     HANDLE file;
470     char *buf, *cur;
471     DWORD size = 0x800;
472     buf = malloc(size);
473 
474     file = CreateFileW(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
475     winetest_ok(file != INVALID_HANDLE_VALUE, "can't create file\n");
476     if(file == INVALID_HANDLE_VALUE)
477         return;
478 
479     memset(buf, 0, size);
480     cur = buf;
481     cur = memcpy(buf, &dos_header, sizeof(dos_header));
482     cur += dos_header.e_lfanew;
483 
484     memcpy(cur, &nt_header, sizeof(nt_header));
485     if (skip_rsrc_exports)
486     {
487         ((IMAGE_NT_HEADERS32*)cur)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = 0;
488         ((IMAGE_NT_HEADERS32*)cur)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = 0;
489     }
490     cur += sizeof(nt_header);
491     memcpy(cur, section_headers, sizeof(section_headers));
492 
493     /* write code section: */
494     cur = buf + section_headers[0].PointerToRawData;
495     memcpy(cur, text_section, sizeof(text_section));
496 
497     if (!skip_rsrc_exports)
498     {
499         /* write resource section: */
500         cur = buf + section_headers[1].PointerToRawData;
501         memcpy(cur, &rsrc_section, sizeof(rsrc_section));
502 
503         /* write minimal export directory: */
504         cur += 0x370;
505         memcpy(cur, &export_dir, sizeof(export_dir));
506     }
507 
508     WriteFile(file, buf, size, &size, NULL);
509     free(buf);
510     CloseHandle(file);
511 }
512 
513 
514 /* Almost everything in this filetype is ignored, only e_lfanew, ne_restab and ne_nrestab are relevant */
515 void test_create_ne_imp(const WCHAR* name, int skip_names)
516 {
517     HANDLE file;
518     DWORD size;
519     IMAGE_DOS_HEADER MZ_hdr = { IMAGE_DOS_SIGNATURE, 0 };
520     IMAGE_OS2_HEADER NE_hdr = { IMAGE_OS2_SIGNATURE, 0 };
521     static const BYTE NE_names[] =
522     {
523         /* Show that the length is used, not the nullterm*/
524         11,'T','E','S','T','M','O','D','.','h','X','x','x',0,0,0,
525         20,'M','O','D',' ','D','E','S','C','R','I','P','T','I','O','N',' ','H','E','R','E',0,0,0
526     };
527 
528     file = CreateFileW(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
529     winetest_ok(file != INVALID_HANDLE_VALUE, "can't create file\n");
530     if(file == INVALID_HANDLE_VALUE)
531         return;
532 
533     MZ_hdr.e_lfanew = sizeof(MZ_hdr);
534     if (!skip_names)
535     {
536         NE_hdr.ne_restab = sizeof(NE_hdr);  /* First entry (pascal string + ordinal) = module name */
537         NE_hdr.ne_nrestab = sizeof(MZ_hdr) + sizeof(NE_hdr) + 16;  /* First entry (pascal string + ordinal) = module description */
538     }
539 
540     WriteFile(file, &MZ_hdr, sizeof(MZ_hdr), &size, NULL);
541     WriteFile(file, &NE_hdr, sizeof(NE_hdr), &size, NULL);
542     WriteFile(file, NE_names, sizeof(NE_names), &size, NULL);
543 
544     CloseHandle(file);
545 }
546 
547 void test_create_file_imp(const WCHAR* name, const char* contents, size_t len)
548 {
549     HANDLE file = CreateFileW(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
550     winetest_ok(file != INVALID_HANDLE_VALUE, "can't create file\n");
551     if (file != INVALID_HANDLE_VALUE)
552     {
553         if (contents && len)
554         {
555             DWORD size;
556             WriteFile(file, contents, (DWORD)len, &size, NULL);
557         }
558         CloseHandle(file);
559     }
560 }
561 
562 static unsigned char win10Header[8] = {
563     0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
564 };
565 static unsigned char rawData[2356] = {
566     0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x73, 0x64, 0x62, 0x66,
567     0x02, 0x78, 0x3E, 0x01, 0x00, 0x00, 0x03, 0x78, 0x44, 0x00, 0x00, 0x00,
568     0x02, 0x38, 0x07, 0x70, 0x03, 0x38, 0x01, 0x60, 0x16, 0x40, 0x01, 0x00,
569     0x00, 0x00, 0x01, 0x98, 0x30, 0x00, 0x00, 0x00, 0x4C, 0x4C, 0x41, 0x5F,
570     0x54, 0x53, 0x45, 0x54, 0xC6, 0x01, 0x00, 0x00, 0x53, 0x49, 0x44, 0x5F,
571     0x54, 0x53, 0x45, 0x54, 0x56, 0x02, 0x00, 0x00, 0x57, 0x45, 0x4E, 0x5F,
572     0x54, 0x53, 0x45, 0x54, 0xEC, 0x02, 0x00, 0x00, 0x4B, 0x32, 0x57, 0x5F,
573     0x54, 0x53, 0x45, 0x54, 0x7C, 0x03, 0x00, 0x00, 0x03, 0x78, 0x0E, 0x00,
574     0x00, 0x00, 0x02, 0x38, 0x07, 0x70, 0x03, 0x38, 0x0B, 0x60, 0x01, 0x98,
575     0x00, 0x00, 0x00, 0x00, 0x03, 0x78, 0x0E, 0x00, 0x00, 0x00, 0x02, 0x38,
576     0x07, 0x70, 0x03, 0x38, 0x20, 0x60, 0x01, 0x98, 0x00, 0x00, 0x00, 0x00,
577     0x03, 0x78, 0x0E, 0x00, 0x00, 0x00, 0x02, 0x38, 0x04, 0x70, 0x03, 0x38,
578     0x01, 0x60, 0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x03, 0x78, 0x26, 0x00,
579     0x00, 0x00, 0x02, 0x38, 0x0D, 0x70, 0x03, 0x38, 0x15, 0x40, 0x01, 0x98,
580     0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
581     0x74, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
582     0x50, 0x04, 0x00, 0x00, 0x03, 0x78, 0x14, 0x00, 0x00, 0x00, 0x02, 0x38,
583     0x10, 0x70, 0x03, 0x38, 0x01, 0x60, 0x16, 0x40, 0x01, 0x00, 0x00, 0x00,
584     0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x03, 0x78, 0x0E, 0x00, 0x00, 0x00,
585     0x02, 0x38, 0x12, 0x70, 0x03, 0x38, 0x06, 0x90, 0x01, 0x98, 0x00, 0x00,
586     0x00, 0x00, 0x03, 0x78, 0x14, 0x00, 0x00, 0x00, 0x02, 0x38, 0x12, 0x70,
587     0x03, 0x38, 0x04, 0x90, 0x16, 0x40, 0x01, 0x00, 0x00, 0x00, 0x01, 0x98,
588     0x00, 0x00, 0x00, 0x00, 0x03, 0x78, 0x3E, 0x00, 0x00, 0x00, 0x02, 0x38,
589     0x07, 0x70, 0x03, 0x38, 0x04, 0x90, 0x01, 0x98, 0x30, 0x00, 0x00, 0x00,
590     0xED, 0xB4, 0x89, 0x50, 0xB1, 0xA4, 0x82, 0xA7, 0xEC, 0x02, 0x00, 0x00,
591     0x85, 0x2B, 0x88, 0x40, 0x97, 0x76, 0xA6, 0xC4, 0xC6, 0x01, 0x00, 0x00,
592     0x77, 0x7A, 0xBF, 0x48, 0x78, 0xB1, 0x69, 0xD2, 0x56, 0x02, 0x00, 0x00,
593     0xD0, 0x15, 0xE6, 0xCB, 0xE8, 0x90, 0x68, 0xFE, 0x7C, 0x03, 0x00, 0x00,
594     0x01, 0x70, 0x42, 0x03, 0x00, 0x00, 0x01, 0x50, 0x3E, 0xD6, 0xC0, 0x02,
595     0x1A, 0xB9, 0xD1, 0x01, 0x22, 0x60, 0x06, 0x00, 0x00, 0x00, 0x01, 0x60,
596     0x1C, 0x00, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x00, 0x07, 0x90,
597     0x10, 0x00, 0x00, 0x00, 0xB0, 0x0E, 0x9B, 0xE3, 0xDB, 0x55, 0x0B, 0x45,
598     0x9B, 0xD4, 0xD2, 0x0C, 0x94, 0x84, 0x26, 0x0F, 0x02, 0x70, 0x00, 0x00,
599     0x00, 0x00, 0x0B, 0x70, 0x32, 0x00, 0x00, 0x00, 0x01, 0x60, 0x3E, 0x00,
600     0x00, 0x00, 0x09, 0x70, 0x26, 0x00, 0x00, 0x00, 0x01, 0x60, 0x5C, 0x00,
601     0x00, 0x00, 0x08, 0x60, 0x82, 0x00, 0x00, 0x00, 0x03, 0x70, 0x06, 0x00,
602     0x00, 0x00, 0x03, 0x60, 0xA0, 0x00, 0x00, 0x00, 0x03, 0x70, 0x08, 0x00,
603     0x00, 0x00, 0x01, 0x10, 0x03, 0x60, 0xBE, 0x00, 0x00, 0x00, 0x07, 0x70,
604     0x8A, 0x00, 0x00, 0x00, 0x01, 0x60, 0xDC, 0x00, 0x00, 0x00, 0x06, 0x60,
605     0x00, 0x01, 0x00, 0x00, 0x05, 0x60, 0x2C, 0x01, 0x00, 0x00, 0x04, 0x90,
606     0x10, 0x00, 0x00, 0x00, 0x3F, 0xC9, 0x50, 0x4E, 0x63, 0xB8, 0xFA, 0x4D,
607     0xBA, 0xE2, 0xD8, 0x0E, 0xF4, 0xCE, 0x5C, 0x89, 0x0D, 0x70, 0x24, 0x00,
608     0x00, 0x00, 0x17, 0x40, 0x01, 0x00, 0x00, 0x00, 0x10, 0x40, 0x01, 0x00,
609     0x00, 0x00, 0x15, 0x40, 0x01, 0x00, 0x00, 0x00, 0x24, 0x40, 0x72, 0x00,
610     0x6F, 0x00, 0x25, 0x40, 0x67, 0x00, 0x72, 0x00, 0x26, 0x40, 0x00, 0x00,
611     0x00, 0x00, 0x08, 0x70, 0x32, 0x00, 0x00, 0x00, 0x01, 0x60, 0x5C, 0x01,
612     0x00, 0x00, 0x09, 0x60, 0x66, 0x01, 0x00, 0x00, 0x10, 0x60, 0x84, 0x01,
613     0x00, 0x00, 0x11, 0x60, 0xA2, 0x01, 0x00, 0x00, 0x13, 0x60, 0xB8, 0x01,
614     0x00, 0x00, 0x06, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
615     0x0D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x70,
616     0x90, 0x00, 0x00, 0x00, 0x01, 0x60, 0xCE, 0x01, 0x00, 0x00, 0x06, 0x60,
617     0xF8, 0x01, 0x00, 0x00, 0x05, 0x60, 0x2A, 0x02, 0x00, 0x00, 0x04, 0x90,
618     0x10, 0x00, 0x00, 0x00, 0xE1, 0x20, 0x67, 0x15, 0x98, 0xEF, 0x04, 0x4D,
619     0x96, 0x5A, 0xD8, 0x5D, 0xE0, 0x5E, 0x6D, 0x9F, 0x0D, 0x70, 0x24, 0x00,
620     0x00, 0x00, 0x17, 0x40, 0x01, 0x00, 0x00, 0x00, 0x10, 0x40, 0x02, 0x00,
621     0x00, 0x00, 0x15, 0x40, 0x02, 0x00, 0x00, 0x00, 0x24, 0x40, 0x20, 0x00,
622     0x32, 0x00, 0x25, 0x40, 0x2E, 0x00, 0x38, 0x00, 0x26, 0x40, 0x00, 0x00,
623     0x00, 0x00, 0x08, 0x70, 0x38, 0x00, 0x00, 0x00, 0x01, 0x60, 0x5C, 0x01,
624     0x00, 0x00, 0x09, 0x60, 0x66, 0x01, 0x00, 0x00, 0x10, 0x60, 0x84, 0x01,
625     0x00, 0x00, 0x11, 0x60, 0xA2, 0x01, 0x00, 0x00, 0x02, 0x50, 0x00, 0x00,
626     0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x50, 0x01, 0x00, 0x00, 0x00,
627     0x00, 0x00, 0x01, 0x00, 0x0B, 0x40, 0xAD, 0xBA, 0x00, 0x00, 0x13, 0x60,
628     0xB8, 0x01, 0x00, 0x00, 0x07, 0x70, 0x8A, 0x00, 0x00, 0x00, 0x01, 0x60,
629     0x60, 0x02, 0x00, 0x00, 0x06, 0x60, 0x80, 0x02, 0x00, 0x00, 0x05, 0x60,
630     0x9E, 0x02, 0x00, 0x00, 0x04, 0x90, 0x10, 0x00, 0x00, 0x00, 0x69, 0xEF,
631     0x70, 0xCE, 0x1D, 0xA2, 0x8B, 0x40, 0x84, 0x5B, 0xF9, 0x9E, 0xAC, 0x06,
632     0x09, 0xE7, 0x08, 0x70, 0x32, 0x00, 0x00, 0x00, 0x01, 0x60, 0x5C, 0x01,
633     0x00, 0x00, 0x09, 0x60, 0x66, 0x01, 0x00, 0x00, 0x10, 0x60, 0x84, 0x01,
634     0x00, 0x00, 0x11, 0x60, 0xA2, 0x01, 0x00, 0x00, 0x02, 0x50, 0x00, 0x00,
635     0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x50, 0x01, 0x00, 0x00, 0x00,
636     0x00, 0x00, 0x01, 0x00, 0x13, 0x60, 0xB8, 0x01, 0x00, 0x00, 0x08, 0x70,
637     0x12, 0x00, 0x00, 0x00, 0x01, 0x60, 0xC0, 0x02, 0x00, 0x00, 0x01, 0x40,
638     0x04, 0x00, 0x00, 0x00, 0x03, 0x40, 0xB0, 0xB0, 0xB0, 0xB0, 0x0B, 0x70,
639     0x0C, 0x00, 0x00, 0x00, 0x01, 0x60, 0x3E, 0x00, 0x00, 0x00, 0x1A, 0x40,
640     0x8E, 0x01, 0x00, 0x00, 0x07, 0x70, 0xCE, 0x00, 0x00, 0x00, 0x01, 0x60,
641     0xEC, 0x02, 0x00, 0x00, 0x06, 0x60, 0x0E, 0x03, 0x00, 0x00, 0x05, 0x60,
642     0x26, 0x03, 0x00, 0x00, 0x04, 0x90, 0x10, 0x00, 0x00, 0x00, 0x44, 0xD1,
643     0xEA, 0xB4, 0x40, 0xF6, 0x4B, 0x4E, 0x94, 0xC4, 0x0C, 0x7F, 0xA8, 0x66,
644     0x23, 0xB0, 0x08, 0x70, 0x94, 0x00, 0x00, 0x00, 0x01, 0x60, 0x5C, 0x01,
645     0x00, 0x00, 0x01, 0x40, 0x00, 0x08, 0x00, 0x00, 0x03, 0x40, 0x29, 0xD6,
646     0x8B, 0x17, 0x09, 0x60, 0x66, 0x01, 0x00, 0x00, 0x10, 0x60, 0x84, 0x01,
647     0x00, 0x00, 0x11, 0x60, 0xA2, 0x01, 0x00, 0x00, 0x12, 0x60, 0x42, 0x03,
648     0x00, 0x00, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
649     0x03, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x40,
650     0x03, 0x00, 0x00, 0x00, 0x09, 0x40, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x40,
651     0x01, 0x00, 0x00, 0x00, 0x0B, 0x40, 0xAD, 0xBA, 0x00, 0x00, 0x1C, 0x40,
652     0x02, 0x00, 0x04, 0x00, 0x13, 0x60, 0xB8, 0x01, 0x00, 0x00, 0x14, 0x60,
653     0x68, 0x03, 0x00, 0x00, 0x15, 0x60, 0x90, 0x03, 0x00, 0x00, 0x16, 0x60,
654     0xB0, 0x03, 0x00, 0x00, 0x06, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
655     0x01, 0x00, 0x0D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
656     0x1D, 0x40, 0x45, 0x23, 0x01, 0x00, 0x1E, 0x40, 0x45, 0x23, 0x01, 0x00,
657     0x0B, 0x70, 0x06, 0x00, 0x00, 0x00, 0x01, 0x60, 0xD4, 0x03, 0x00, 0x00,
658     0x0D, 0x70, 0x1E, 0x00, 0x00, 0x00, 0x15, 0x40, 0x02, 0x00, 0x00, 0x00,
659     0x0E, 0x70, 0x06, 0x00, 0x00, 0x00, 0x19, 0x60, 0xEC, 0x03, 0x00, 0x00,
660     0x1B, 0x60, 0xF8, 0x01, 0x00, 0x00, 0x18, 0x60, 0x2A, 0x04, 0x00, 0x00,
661     0x0D, 0x70, 0x1E, 0x00, 0x00, 0x00, 0x15, 0x40, 0x01, 0x00, 0x00, 0x00,
662     0x0E, 0x70, 0x06, 0x00, 0x00, 0x00, 0x19, 0x60, 0x4A, 0x04, 0x00, 0x00,
663     0x1B, 0x60, 0x00, 0x01, 0x00, 0x00, 0x18, 0x60, 0x82, 0x04, 0x00, 0x00,
664     0x01, 0x78, 0x96, 0x04, 0x00, 0x00, 0x01, 0x88, 0x10, 0x00, 0x00, 0x00,
665     0x32, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x2E, 0x00,
666     0x33, 0x00, 0x00, 0x00, 0x01, 0x88, 0x1C, 0x00, 0x00, 0x00, 0x61, 0x00,
667     0x70, 0x00, 0x70, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00,
668     0x5F, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x31, 0x00,
669     0x00, 0x00, 0x01, 0x88, 0x18, 0x00, 0x00, 0x00, 0x54, 0x00, 0x65, 0x00,
670     0x73, 0x00, 0x74, 0x00, 0x4E, 0x00, 0x65, 0x00, 0x77, 0x00, 0x4D, 0x00,
671     0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x20, 0x00,
672     0x00, 0x00, 0x56, 0x00, 0x69, 0x00, 0x72, 0x00, 0x74, 0x00, 0x75, 0x00,
673     0x61, 0x00, 0x6C, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x69, 0x00,
674     0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, 0x00, 0x00, 0x01, 0x88,
675     0x18, 0x00, 0x00, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6D, 0x00,
676     0x65, 0x00, 0x41, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x76, 0x00,
677     0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x18, 0x00, 0x00, 0x00, 0x65, 0x00,
678     0x78, 0x00, 0x63, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x64, 0x00, 0x65, 0x00,
679     0x2E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x01, 0x88,
680     0x18, 0x00, 0x00, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x6C, 0x00,
681     0x75, 0x00, 0x64, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x64, 0x00, 0x6C, 0x00,
682     0x6C, 0x00, 0x00, 0x00, 0x01, 0x88, 0x1E, 0x00, 0x00, 0x00, 0x74, 0x00,
683     0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x61, 0x00, 0x6C, 0x00,
684     0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x78, 0x00,
685     0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x26, 0x00, 0x00, 0x00, 0x61, 0x00,
686     0x70, 0x00, 0x70, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00,
687     0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5F, 0x00,
688     0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00,
689     0x01, 0x88, 0x2A, 0x00, 0x00, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00,
690     0x68, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00, 0x5F, 0x00, 0x76, 0x00,
691     0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00,
692     0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00,
693     0x01, 0x88, 0x04, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x01, 0x88,
694     0x18, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00,
695     0x61, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00,
696     0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x18, 0x00, 0x00, 0x00, 0x50, 0x00,
697     0x72, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x63, 0x00, 0x74, 0x00,
698     0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0x88,
699     0x10, 0x00, 0x00, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x2E, 0x00,
700     0x30, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x88, 0x10, 0x00,
701     0x00, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x2E, 0x00, 0x30, 0x00,
702     0x2E, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x88, 0x24, 0x00, 0x00, 0x00,
703     0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x64, 0x00,
704     0x69, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00,
705     0x77, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x65, 0x00, 0x00, 0x00,
706     0x01, 0x88, 0x2C, 0x00, 0x00, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00,
707     0x68, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00, 0x5F, 0x00, 0x6E, 0x00,
708     0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x69, 0x00,
709     0x73, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00,
710     0x00, 0x00, 0x01, 0x88, 0x30, 0x00, 0x00, 0x00, 0x61, 0x00, 0x70, 0x00,
711     0x70, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00, 0x5F, 0x00,
712     0x76, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x72, 0x00,
713     0x5F, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6C, 0x00,
714     0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x88, 0x1A, 0x00,
715     0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x5F, 0x00,
716     0x6E, 0x00, 0x65, 0x00, 0x77, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x78, 0x00,
717     0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x18, 0x00, 0x00, 0x00, 0x66, 0x00,
718     0x69, 0x00, 0x78, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x77, 0x00, 0x5F, 0x00,
719     0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0x88,
720     0x1C, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x78, 0x00, 0x6E, 0x00,
721     0x65, 0x00, 0x77, 0x00, 0x5F, 0x00, 0x76, 0x00, 0x65, 0x00, 0x6E, 0x00,
722     0x64, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x01, 0x88, 0x26, 0x00,
723     0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x5F, 0x00,
724     0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x66, 0x00,
725     0x69, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x78, 0x00,
726     0x74, 0x00, 0x00, 0x00, 0x01, 0x88, 0x1C, 0x00, 0x00, 0x00, 0x74, 0x00,
727     0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x77, 0x00, 0x32, 0x00,
728     0x6B, 0x00, 0x33, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x65, 0x00,
729     0x00, 0x00, 0x01, 0x88, 0x12, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00,
730     0x78, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00,
731     0x00, 0x00, 0x01, 0x88, 0x16, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00,
732     0x78, 0x00, 0x5F, 0x00, 0x76, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00,
733     0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x01, 0x88, 0x20, 0x00, 0x00, 0x00,
734     0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, 0x65, 0x00,
735     0x73, 0x00, 0x63, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x74, 0x00,
736     0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x01, 0x88, 0x22, 0x00,
737     0x00, 0x00, 0x4F, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00,
738     0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00,
739     0x65, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00,
740     0x01, 0x88, 0x1A, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00,
741     0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4E, 0x00,
742     0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x1E, 0x00,
743     0x00, 0x00, 0x4C, 0x00, 0x65, 0x00, 0x67, 0x00, 0x61, 0x00, 0x6C, 0x00,
744     0x43, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00,
745     0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x88, 0x12, 0x00,
746     0x00, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x53, 0x00, 0x72, 0x00,
747     0x76, 0x00, 0x30, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x88, 0x38, 0x00,
748     0x00, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3A, 0x00,
749     0x2F, 0x00, 0x2F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x63, 0x00,
750     0x74, 0x00, 0x6F, 0x00, 0x73, 0x00, 0x2E, 0x00, 0x6F, 0x00, 0x72, 0x00,
751     0x67, 0x00, 0x2F, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x61, 0x00,
752     0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x88,
753     0x1A, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x20, 0x00,
754     0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00,
755     0x64, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x88, 0x32, 0x00, 0x00, 0x00,
756     0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3A, 0x00, 0x2F, 0x00,
757     0x2F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00,
758     0x6F, 0x00, 0x73, 0x00, 0x2E, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x67, 0x00,
759     0x2F, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00,
760     0x00, 0x00, 0x01, 0x88, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x6C, 0x00,
761     0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x20, 0x00, 0x69, 0x00, 0x74, 0x00,
762     0x21, 0x00, 0x00, 0x00
763 };
764 
765 DWORD test_get_db_size()
766 {
767     return sizeof(rawData);
768 }
769 
770 void test_create_db_imp(const WCHAR* name, int win10)
771 {
772     HANDLE file = CreateFileW(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
773     winetest_ok(file != INVALID_HANDLE_VALUE, "can't create file '%s'\n", wine_dbgstr_w(name));
774     if (file != INVALID_HANDLE_VALUE)
775     {
776         DWORD size;
777         WriteFile(file, rawData, sizeof(rawData), &size, NULL);
778         if (win10)
779         {
780             SetFilePointer(file, 0, NULL, FILE_BEGIN);
781             WriteFile(file, win10Header, sizeof(win10Header), &size, NULL);
782         }
783         CloseHandle(file);
784     }
785 }
786 
787 static DWORD g_WinVersion;
788 DWORD get_host_winver(void)
789 {
790     if (!g_WinVersion)
791     {
792         RTL_OSVERSIONINFOEXW rtlinfo = {0};
793         void (__stdcall* pRtlGetVersion)(RTL_OSVERSIONINFOEXW*);
794         pRtlGetVersion = (void (__stdcall*)(RTL_OSVERSIONINFOEXW*))GetProcAddress(GetModuleHandleA("ntdll"), "RtlGetVersion");
795 
796         rtlinfo.dwOSVersionInfoSize = sizeof(rtlinfo);
797         pRtlGetVersion(&rtlinfo);
798         g_WinVersion = (rtlinfo.dwMajorVersion << 8) | rtlinfo.dwMinorVersion;
799     }
800     return g_WinVersion;
801 }
802 
803 DWORD get_module_version(HMODULE mod)
804 {
805     DWORD dwVersion = 0;
806     HRSRC hResInfo = FindResource(mod, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
807     DWORD dwSize = SizeofResource(mod, hResInfo);
808     if (hResInfo && dwSize)
809     {
810         VS_FIXEDFILEINFO *lpFfi;
811         UINT uLen;
812 
813         HGLOBAL hResData = LoadResource(mod, hResInfo);
814         LPVOID pRes = LockResource(hResData);
815         HLOCAL pResCopy = LocalAlloc(LMEM_FIXED, dwSize);
816 
817         CopyMemory(pResCopy, pRes, dwSize);
818         FreeResource(hResData);
819 
820         if (VerQueryValueW(pResCopy, L"\\", (LPVOID*)&lpFfi, &uLen))
821         {
822             dwVersion = (HIWORD(lpFfi->dwProductVersionMS) << 8) | LOWORD(lpFfi->dwProductVersionMS);
823             if (!dwVersion)
824                 dwVersion = (HIWORD(lpFfi->dwFileVersionMS) << 8) | LOWORD(lpFfi->dwFileVersionMS);
825         }
826 
827         LocalFree(pResCopy);
828     }
829 
830     return dwVersion;
831 }
832 
833 void silence_debug_output(void)
834 {
835     if (GetEnvironmentVariableA("SHIM_DEBUG_LEVEL", NULL, 0) == ERROR_ENVVAR_NOT_FOUND)
836         SetEnvironmentVariableA("SHIM_DEBUG_LEVEL", "0");
837     if (GetEnvironmentVariableA("SHIMENG_DEBUG_LEVEL", NULL, 0) == ERROR_ENVVAR_NOT_FOUND)
838         SetEnvironmentVariableA("SHIMENG_DEBUG_LEVEL", "0");
839 }
840 
841