// File: rpavlik[P]edid-decode/parse-di-ext-block.cpp
// Function: edid_state::parse_display_caps(unsigned char const*)
void edid_state::parse_display_caps(const unsigned char *x)
{
	data_block = "Display Capabities & Feature Support Set";
	printf("  %s:\n", data_block.c_str());

	unsigned short v = x[0x14];

	printf("    Legacy Modes: %s VGA/DOS Legacy Timing Modes are supported\n",
	       (v & 0x80) ? "All" : "Not all");
	printf("    Stereo Video: ");
	switch ((v & 0x70) >> 4) {
	case 0x00: printf("No direct stereo\n"); break;
	case 0x01: printf("Field seq. stereo via stereo sync signal\n"); break;
	case 0x02: printf("auto-stereoscopic, column interleave\n"); break;
	case 0x03: printf("auto-stereoscopic, line interleave\n"); break;
	default:
		   printf("Unknown (0x%02x)\n", (v & 0x70) >> 4);
		   fail("Unknown Stereo Video 0x%02x.\n", (v & 0x70) >> 4);
		   break;
	}
	printf("    Scaler On Board: %s\n", (v & 0x08) ? "Yes" : "No");
	printf("    Image Centering: %s\n", (v & 0x04) ? "Yes" : "No");
	printf("    Conditional Update: %s\n", (v & 0x02) ? "Yes" : "No");
	printf("    Interlaced Video: %s\n", (v & 0x01) ? "Yes" : "No");

	v = x[0x15];
	printf("    Frame Lock: %s\n", (v & 0x80) ? "Yes" : "No");
	printf("    Frame Rate Conversion: ");
	switch ((v & 0x60) >> 5) {
	case 0x00: printf("Not supported\n"); break;
	case 0x01: printf("Vertical is converted to a single frequency\n"); break;
	case 0x02: printf("Horizontal is convertred to a single frequency\n"); break;
	case 0x03: printf("Both Vertical & Horizontal are converted to single frequencies\n"); break;
	}
	if (v & 0x1f)
		fail("Bits 4-0 of byte 0x15 should be 0.\n");
	v = x[0x16] | (x[0x17] << 8);
	printf("    Vertical Frequency: ");
	if (!v) {
		printf("Not available\n");
	} else if (v == 0xffff) {
		printf("Reserved\n");
		fail("Vertical Frequency uses 0xffff (reserved value).\n");
	} else {
		printf("%.2f kHz\n", v / 100.0);
	}
	v = x[0x18] | (x[0x19] << 8);
	printf("    Horizontal Frequency: ");
	if (!v) {
		printf("Not available\n");
	} else if (v == 0xffff) {
		printf("Reserved\n");
		fail("Horizontal Frequency uses 0xffff (reserved value).\n");
	} else {
		printf("%.2f kHz\n", v / 100.0);
	}

	v = x[0x1a];
	printf("    Display/Scan Orientation Definition Type: ");
	switch ((v & 0xc0) >> 6) {
	case 0x00: printf("Not defined\n"); break;
	case 0x01: printf("Fixed Orientation\n"); break;
	case 0x02: printf("Pivots: Default Orientation\n"); break;
	case 0x03: printf("Pivots: Current Orientation (requires multiple EDID Extension Tables)\n"); break;
	}
	printf("    Screen Orientation: %s\n",
	       (v & 0x20) ? "Portrait" : "Landscape");
	printf("    Zero Pixel Location: ");
	switch ((v & 0x18) >> 3) {
	case 0x00: printf("Upper Left\n"); break;
	case 0x01: printf("Upper Right\n"); break;
	case 0x02: printf("Lower Left\n"); break;
	case 0x03: printf("Lower Right\n"); break;
	}
	printf("    Scan Direction: ");
	switch ((v & 0x06) >> 1) {
	case 0x00: printf("Not defined\n"); break;
	case 0x01: printf("Fast Scan is on the Major (Long) Axis and Slow Scan is on the Minor Axis\n"); break;
	case 0x02: printf("Fast Scan is on the Minor (Short) Axis and Slow Scan is on the Major Axis\n"); break;
	case 0x03:
		   printf("Reserved\n");
		   fail("Scan Direction used the reserved value 0x03.\n");
		   break;
	}
	printf("    Standalone Projector: %s\n",
	       (v & 0x01) ? "Yes" : "No");

	v = x[0x1b];
	printf("    Default Color/Luminance Decoding: ");
	switch (v) {
	case 0x00: printf("Not defined\n"); break;
	case 0x01: printf("BGR\n"); break;
	case 0x02: printf("Y/C (S-Video) NTSC\n"); break;
	case 0x03: printf("Y/C (S-Video) PAL\n"); break;
	case 0x04: printf("Y/C (S-Video) SECAM\n"); break;
	case 0x05: printf("YCrCb 4:4:4 per SMPTE 293M & 294M\n"); break;
	case 0x06: printf("YCrCb 4:2:2 per SMPTE 293M & 294M\n"); break;
	case 0x07: printf("YCrCb 4:2:0 per SMPTE 293M & 294M\n"); break;
	case 0x08: printf("YCrCb per SMPTE 260M (Legacy HDTV)\n"); break;
	case 0x09: printf("YPbPr per SMPTE 240M (Legacy HDTV)\n"); break;
	case 0x0a: printf("YCrCb per SMPTE 274M (Modern HDTV)\n"); break;
	case 0x0b: printf("YPbPr per SMPTE 274M (Modern HDTV)\n"); break;
	case 0x0c: printf("Y B-Y R-Y BetaCam (Sony)\n"); break;
	case 0x0d: printf("Y B-Y R-Y M-2 (Matsushita)\n"); break;
	case 0x0e: printf("Monochrome\n"); break;
	default:
		   printf("Unknown (0x%02x)\n", v);
		   fail("Unknown Default Color/Luminance Decoding 0x%02x.\n", v);
		   break;
	}
	v = x[0x1c];
	printf("    Preferred Color/Luminance Decoder: ");
	switch (v) {
	case 0x00: printf("Uses Default Decoding\n"); break;
	case 0x01: printf("BGR\n"); break;
	case 0x02: printf("Y/C (S-Video)\n"); break;
	case 0x03: printf("Yxx (SMPTE 2xxM)\n"); break;
	case 0x04: printf("Monochrome\n"); break;
	default:
		   printf("Unknown (0x%02x)\n", v);
		   fail("Unknown Preferred Color/Luminance Decoding 0x%02x.\n", v);
		   break;
	}
	v = x[0x1d];
	if (v && (x[0x1e] & 0xfc)) {
		printf("    Color/Luminance Decoding Capabilities:\n");
		printf("      BGR: %s\n", (v & 0x80) ? "Yes" : "No");
		printf("      Y/C (S-Video) NTSC: %s\n", (v & 0x40) ? "Yes" : "No");
		printf("      Y/C (S-Video) PAL: %s\n", (v & 0x20) ? "Yes" : "No");
		printf("      Y/C (S-Video) SECAM: %s\n", (v & 0x10) ? "Yes" : "No");
		printf("      YCrCb 4:4:4 per SMPTE 293M & 294M: %s\n", (v & 0x08) ? "Yes" : "No");
		printf("      YCrCb 4:2:2 per SMPTE 293M & 294M: %s\n", (v & 0x04) ? "Yes" : "No");
		printf("      YCrCb 4:2:0 per SMPTE 293M & 294M: %s\n", (v & 0x02) ? "Yes" : "No");
		printf("      YCrCb per SMPTE 260M (Legacy HDTV): %s\n", (v & 0x01) ? "Yes" : "No");
		v = x[0x1e];
		printf("      YPbPr per SMPTE 240M (Legacy HDTV): %s\n", (v & 0x80) ? "Yes" : "No");
		printf("      YCrCb per SMPTE 274M (Modern HDTV): %s\n", (v & 0x40) ? "Yes" : "No");
		printf("      YPbPr per SMPTE 274M (Modern HDTV): %s\n", (v & 0x20) ? "Yes" : "No");
		printf("      Y B-Y R-Y BetaCam (Sony): %s\n", (v & 0x10) ? "Yes" : "No");
		printf("      Y B-Y R-Y M-2 (Matsushita): %s\n", (v & 0x08) ? "Yes" : "No");
		printf("      Monochrome: %s\n", (v & 0x04) ? "Yes" : "No");
	} else {
		printf("    Color/Luminance Decoding Capabilities: None\n");
	}
	if (v & 0x03)
		fail("Bits 1-0 of byte 0x1e should be 0.\n");

	v = x[0x1f];
	printf("    Dithering: %s\n", (v & 0x80) ? "Yes" : "No");
	if (v & 0x7f)
		fail("Bits 6-0 of byte 0x1f should be 0.\n");
	v = x[0x20];
	printf("    Supported Color Bit-Depth of Sub-Channel 0 (Blue): ");
	if (!v) {
		printf("No Information\n");
	} else if (v <= 16) {
		printf("%u\n", v);
	} else {
		printf("Reserved (0x%02x)\n", v);
		fail("Supported Color Bit-Depth of Sub-Channel Blue value is 0x%02x.\n", v);
	}
	v = x[0x21];
	printf("    Supported Color Bit-Depth of Sub-Channel 1 (Green): ");
	if (!v) {
		printf("No Information\n");
	} else if (v <= 16) {
		printf("%u\n", v);
	} else {
		printf("Reserved (0x%02x)\n", v);
		fail("Supported Color Bit-Depth of Sub-Channel Green value is 0x%02x.\n", v);
	}
	v = x[0x22];
	printf("    Supported Color Bit-Depth of Sub-Channel 2 (Red): ");
	if (!v) {
		printf("No Information\n");
	} else if (v <= 16) {
		printf("%u\n", v);
	} else {
		printf("Reserved (0x%02x)\n", v);
		fail("Supported Color Bit-Depth of Sub-Channel Red value is 0x%02x.\n", v);
	}
	v = x[0x23];
	printf("    Supported Color Bit-Depth of Sub-Channel 0 (Cb/Pb): ");
	if (!v) {
		printf("No Information\n");
	} else if (v <= 16) {
		printf("%u\n", v);
	} else {
		printf("Reserved (0x%02x)\n", v);
		fail("Supported Color Bit-Depth of Sub-Channel Cb/Pb value is 0x%02x.\n", v);
	}
	v = x[0x24];
	printf("    Supported Color Bit-Depth of Sub-Channel 1 (Y): ");
	if (!v) {
		printf("No Information\n");
	} else if (v <= 16) {
		printf("%u\n", v);
	} else {
		printf("Reserved (0x%02x)\n", v);
		fail("Supported Color Bit-Depth of Sub-Channel Y value is 0x%02x.\n", v);
	}
	v = x[0x25];
	printf("    Supported Color Bit-Depth of Sub-Channel 2 (Cr/Pr): ");
	if (!v) {
		printf("No Information\n");
	} else if (v <= 16) {
		printf("%u\n", v);
	} else {
		printf("Reserved (0x%02x)\n", v);
		fail("Supported Color Bit-Depth of Sub-Channel Cr/Pr value is 0x%02x.\n", v);
	}

	v = x[0x26];
	printf("    Aspect Ratio Conversion Modes:");
	if (!v) {
		printf(" None\n");
	} else {
		printf("\n");
		printf("      Full Mode: %s\n", (v & 0x80) ? "Yes" : "No");
		printf("      Zoom Mode: %s\n", (v & 0x40) ? "Yes" : "No");
		printf("      Squeeze (Side Bars/Letterbox) Mode: %s\n", (v & 0x20) ? "Yes" : "No");
		printf("      Variable (Expand/Shrink) Mode: %s\n", (v & 0x10) ? "Yes" : "No");
	}
	if (v & 0x0f)
		fail("Bits 3-0 of byte 0x26 should be 0.\n");
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
movq %rdi, -0x30(%rbp)
leaq 0x15fe6(%rip), %rsi     # 0x41bfc
callq 0x4420
movq -0x30(%rbp), %rdi
callq 0x4150
movq %rax, %rsi
leaq 0x84c3(%rip), %rdi      # 0x340f1
xorl %eax, %eax
movb %al, -0x21(%rbp)
callq 0x4050
movb -0x21(%rbp), %al
movq -0x10(%rbp), %rcx
movzbl 0x14(%rcx), %ecx
movw %cx, -0x12(%rbp)
movb -0x12(%rbp), %cl
testb %cl, %cl
leaq 0x16012(%rip), %rcx     # 0x41c65
leaq 0x1600f(%rip), %rsi     # 0x41c69
cmovsq %rcx, %rsi
leaq 0x15fc0(%rip), %rdi     # 0x41c25
callq 0x4050
movb -0x21(%rbp), %al
leaq 0x15ffd(%rip), %rdi     # 0x41c71
callq 0x4050
movzwl -0x12(%rbp), %eax
andl $0x70, %eax
shrl $0x4, %eax
movl %eax, %ecx
movq %rcx, -0x20(%rbp)
subl $0x3, %eax
ja 0x2bce2
movq -0x20(%rbp), %rax
leaq 0x1554b(%rip), %rcx     # 0x411e4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0x15fdb(%rip), %rdi     # 0x41c84
movb $0x0, %al
callq 0x4050
jmp 0x2bd14
leaq 0x15fdd(%rip), %rdi     # 0x41c96
movb $0x0, %al
callq 0x4050
jmp 0x2bd14
leaq 0x15ff7(%rip), %rdi     # 0x41cc0
movb $0x0, %al
callq 0x4050
jmp 0x2bd14
leaq 0x1600d(%rip), %rdi     # 0x41ce6
movb $0x0, %al
callq 0x4050
jmp 0x2bd14
movzwl -0x12(%rbp), %esi
andl $0x70, %esi
sarl $0x4, %esi
leaq 0x8545(%rip), %rdi      # 0x34238
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %edx
andl $0x70, %edx
sarl $0x4, %edx
xorl %edi, %edi
leaq 0x15ffd(%rip), %rsi     # 0x41d0a
movb $0x0, %al
callq 0x47d0
movzwl -0x12(%rbp), %eax
movb %al, %cl
leaq 0x103b2(%rip), %rax     # 0x3c0d3
movq %rax, -0x48(%rbp)
leaq 0x103ab(%rip), %rsi     # 0x3c0d7
movq %rsi, -0x50(%rbp)
testb $0x8, %cl
cmovneq %rax, %rsi
leaq 0x15fea(%rip), %rdi     # 0x41d28
xorl %eax, %eax
movb %al, -0x39(%rbp)
callq 0x4050
movq -0x50(%rbp), %rsi
movq -0x48(%rbp), %rcx
movb -0x39(%rbp), %al
movzwl -0x12(%rbp), %edx
testb $0x4, %dl
cmovneq %rcx, %rsi
leaq 0x15fdc(%rip), %rdi     # 0x41d41
callq 0x4050
movq -0x50(%rbp), %rsi
movq -0x48(%rbp), %rcx
movb -0x39(%rbp), %al
movzwl -0x12(%rbp), %edx
testb $0x2, %dl
cmovneq %rcx, %rsi
leaq 0x15fd3(%rip), %rdi     # 0x41d5a
callq 0x4050
movq -0x50(%rbp), %rsi
movq -0x48(%rbp), %rcx
movb -0x39(%rbp), %al
movb -0x12(%rbp), %dl
testb $0x1, %dl
cmovneq %rcx, %rsi
leaq 0x15fce(%rip), %rdi     # 0x41d76
callq 0x4050
movq -0x50(%rbp), %rsi
movq -0x48(%rbp), %rcx
movb -0x39(%rbp), %al
movq -0x10(%rbp), %rdx
movzbl 0x15(%rdx), %edx
movw %dx, -0x12(%rbp)
movb -0x12(%rbp), %dl
testb %dl, %dl
cmovsq %rcx, %rsi
leaq 0x15fbc(%rip), %rdi     # 0x41d90
callq 0x4050
movb -0x39(%rbp), %al
leaq 0x15fc1(%rip), %rdi     # 0x41da4
callq 0x4050
movzwl -0x12(%rbp), %eax
andl $0x60, %eax
shrl $0x5, %eax
movl %eax, %ecx
movq %rcx, -0x38(%rbp)
subl $0x3, %eax
ja 0x2be4f
movq -0x38(%rbp), %rax
leaq 0x153ec(%rip), %rcx     # 0x411f4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0xfcb2(%rip), %rdi      # 0x3baca
movb $0x0, %al
callq 0x4050
jmp 0x2be4f
leaq 0x15f98(%rip), %rdi     # 0x41dc0
movb $0x0, %al
callq 0x4050
jmp 0x2be4f
leaq 0x15fb5(%rip), %rdi     # 0x41ded
movb $0x0, %al
callq 0x4050
jmp 0x2be4f
leaq 0x15fd5(%rip), %rdi     # 0x41e1d
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %eax
andl $0x1f, %eax
cmpl $0x0, %eax
je 0x2be6b
xorl %edi, %edi
leaq 0x15ff9(%rip), %rsi     # 0x41e5d
movb $0x0, %al
callq 0x47d0
movq -0x10(%rbp), %rax
movzbl 0x16(%rax), %eax
movq -0x10(%rbp), %rcx
movzbl 0x17(%rcx), %ecx
shll $0x8, %ecx
orl %ecx, %eax
movw %ax, -0x12(%rbp)
leaq 0x15ff6(%rip), %rdi     # 0x41e81
movb $0x0, %al
callq 0x4050
cmpw $0x0, -0x12(%rbp)
jne 0x2bea9
leaq 0x15ffa(%rip), %rdi     # 0x41e9a
movb $0x0, %al
callq 0x4050
jmp 0x2bef8
movzwl -0x12(%rbp), %eax
cmpl $0xffff, %eax           # imm = 0xFFFF
jne 0x2bed4
leaq 0x13769(%rip), %rdi     # 0x3f624
movb $0x0, %al
callq 0x4050
xorl %edi, %edi
leaq 0x15fde(%rip), %rsi     # 0x41ea9
movb $0x0, %al
callq 0x47d0
jmp 0x2bef6
movzwl -0x12(%rbp), %eax
cvtsi2sd %eax, %xmm0
movsd 0x3154(%rip), %xmm1     # 0x2f038
divsd %xmm1, %xmm0
leaq 0x15fec(%rip), %rdi     # 0x41edb
movb $0x1, %al
callq 0x4050
jmp 0x2bef8
movq -0x10(%rbp), %rax
movzbl 0x18(%rax), %eax
movq -0x10(%rbp), %rcx
movzbl 0x19(%rcx), %ecx
shll $0x8, %ecx
orl %ecx, %eax
movw %ax, -0x12(%rbp)
leaq 0x15fcd(%rip), %rdi     # 0x41ee5
movb $0x0, %al
callq 0x4050
cmpw $0x0, -0x12(%rbp)
jne 0x2bf36
leaq 0x15f6d(%rip), %rdi     # 0x41e9a
movb $0x0, %al
callq 0x4050
jmp 0x2bf85
movzwl -0x12(%rbp), %eax
cmpl $0xffff, %eax           # imm = 0xFFFF
jne 0x2bf61
leaq 0x136dc(%rip), %rdi     # 0x3f624
movb $0x0, %al
callq 0x4050
xorl %edi, %edi
leaq 0x15fa8(%rip), %rsi     # 0x41f00
movb $0x0, %al
callq 0x47d0
jmp 0x2bf83
movzwl -0x12(%rbp), %eax
cvtsi2sd %eax, %xmm0
movsd 0x30c7(%rip), %xmm1     # 0x2f038
divsd %xmm1, %xmm0
leaq 0x15f5f(%rip), %rdi     # 0x41edb
movb $0x1, %al
callq 0x4050
jmp 0x2bf85
movq -0x10(%rbp), %rax
movzbl 0x1a(%rax), %eax
movw %ax, -0x12(%rbp)
leaq 0x15f9c(%rip), %rdi     # 0x41f34
xorl %eax, %eax
callq 0x4050
movzbl -0x12(%rbp), %eax
shrl $0x6, %eax
movl %eax, %ecx
movq %rcx, -0x58(%rbp)
subl $0x3, %eax
ja 0x2c003
movq -0x58(%rbp), %rax
leaq 0x15248(%rip), %rcx     # 0x41204
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0xfe00(%rip), %rdi      # 0x3bdcc
movb $0x0, %al
callq 0x4050
jmp 0x2c003
leaq 0x15f87(%rip), %rdi     # 0x41f63
movb $0x0, %al
callq 0x4050
jmp 0x2c003
leaq 0x15f8a(%rip), %rdi     # 0x41f76
movb $0x0, %al
callq 0x4050
jmp 0x2c003
leaq 0x15f97(%rip), %rdi     # 0x41f93
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %eax
movb %al, %cl
leaq 0x15fe6(%rip), %rax     # 0x41ff6
leaq 0x15fe8(%rip), %rsi     # 0x41fff
testb $0x20, %cl
cmovneq %rax, %rsi
leaq 0x15fb5(%rip), %rdi     # 0x41fda
xorl %eax, %eax
movb %al, -0x61(%rbp)
callq 0x4050
movb -0x61(%rbp), %al
leaq 0x12d13(%rip), %rdi     # 0x3ed4c
callq 0x4050
movzwl -0x12(%rbp), %eax
andl $0x18, %eax
shrl $0x3, %eax
movl %eax, %ecx
movq %rcx, -0x60(%rbp)
subl $0x3, %eax
ja 0x2c0a5
movq -0x60(%rbp), %rax
leaq 0x151b6(%rip), %rcx     # 0x41214
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0xfd2c(%rip), %rdi      # 0x3bd9a
movb $0x0, %al
callq 0x4050
jmp 0x2c0a5
leaq 0xfd28(%rip), %rdi      # 0x3bda6
movb $0x0, %al
callq 0x4050
jmp 0x2c0a5
leaq 0xfd25(%rip), %rdi      # 0x3bdb3
movb $0x0, %al
callq 0x4050
jmp 0x2c0a5
leaq 0xfd21(%rip), %rdi      # 0x3bdbf
movb $0x0, %al
callq 0x4050
leaq 0x12cbc(%rip), %rdi     # 0x3ed68
xorl %eax, %eax
callq 0x4050
movzwl -0x12(%rbp), %eax
andl $0x6, %eax
shrl %eax
movl %eax, %ecx
movq %rcx, -0x70(%rbp)
subl $0x3, %eax
ja 0x2c129
movq -0x70(%rbp), %rax
leaq 0x15152(%rip), %rcx     # 0x41224
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0xfcea(%rip), %rdi      # 0x3bdcc
movb $0x0, %al
callq 0x4050
jmp 0x2c129
leaq 0xfce7(%rip), %rdi      # 0x3bdd9
movb $0x0, %al
callq 0x4050
jmp 0x2c129
leaq 0xfd21(%rip), %rdi      # 0x3be23
movb $0x0, %al
callq 0x4050
jmp 0x2c129
leaq 0x13512(%rip), %rdi     # 0x3f624
movb $0x0, %al
callq 0x4050
xorl %edi, %edi
leaq 0xfd4c(%rip), %rsi      # 0x3be6e
movb $0x0, %al
callq 0x47d0
movb -0x12(%rbp), %cl
leaq 0xffa0(%rip), %rax      # 0x3c0d3
leaq 0xff9d(%rip), %rsi      # 0x3c0d7
testb $0x1, %cl
cmovneq %rax, %rsi
leaq 0x15ec1(%rip), %rdi     # 0x42009
xorl %eax, %eax
movb %al, -0x79(%rbp)
callq 0x4050
movb -0x79(%rbp), %al
movq -0x10(%rbp), %rcx
movzbl 0x1b(%rcx), %ecx
movw %cx, -0x12(%rbp)
leaq 0x15ebf(%rip), %rdi     # 0x42027
callq 0x4050
movzwl -0x12(%rbp), %eax
movq %rax, -0x78(%rbp)
subq $0xe, %rax
ja 0x2c29e
movq -0x78(%rbp), %rax
leaq 0x150aa(%rip), %rcx     # 0x41234
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0xfc32(%rip), %rdi      # 0x3bdcc
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15735(%rip), %rdi     # 0x418e2
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15e8e(%rip), %rdi     # 0x4204e
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15e8f(%rip), %rdi     # 0x42062
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15e8f(%rip), %rdi     # 0x42075
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15e91(%rip), %rdi     # 0x4208a
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15ea1(%rip), %rdi     # 0x420ad
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15eb1(%rip), %rdi     # 0x420d0
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15ec1(%rip), %rdi     # 0x420f3
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15ed2(%rip), %rdi     # 0x42117
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15ee6(%rip), %rdi     # 0x4213b
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15efa(%rip), %rdi     # 0x4215f
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15f0e(%rip), %rdi     # 0x42183
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15f18(%rip), %rdi     # 0x4219d
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
leaq 0x15f24(%rip), %rdi     # 0x421b9
movb $0x0, %al
callq 0x4050
jmp 0x2c2c4
movzwl -0x12(%rbp), %esi
leaq 0x7f8f(%rip), %rdi      # 0x34238
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %edx
xorl %edi, %edi
leaq 0x15f08(%rip), %rsi     # 0x421c5
movb $0x0, %al
callq 0x47d0
movq -0x10(%rbp), %rax
movzbl 0x1c(%rax), %eax
movw %ax, -0x12(%rbp)
leaq 0x15f20(%rip), %rdi     # 0x421f7
xorl %eax, %eax
callq 0x4050
movzwl -0x12(%rbp), %eax
movq %rax, -0x88(%rbp)
subq $0x4, %rax
ja 0x2c356
movq -0x88(%rbp), %rax
leaq 0x14f73(%rip), %rcx     # 0x41270
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0x15f12(%rip), %rdi     # 0x4221f
movb $0x0, %al
callq 0x4050
jmp 0x2c37c
leaq 0x155c5(%rip), %rdi     # 0x418e2
movb $0x0, %al
callq 0x4050
jmp 0x2c37c
leaq 0x15f09(%rip), %rdi     # 0x42236
movb $0x0, %al
callq 0x4050
jmp 0x2c37c
leaq 0x15f08(%rip), %rdi     # 0x42245
movb $0x0, %al
callq 0x4050
jmp 0x2c37c
leaq 0x15e6c(%rip), %rdi     # 0x421b9
movb $0x0, %al
callq 0x4050
jmp 0x2c37c
movzwl -0x12(%rbp), %esi
leaq 0x7ed7(%rip), %rdi      # 0x34238
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %edx
xorl %edi, %edi
leaq 0x15ee2(%rip), %rsi     # 0x42257
movb $0x0, %al
callq 0x47d0
movq -0x10(%rbp), %rax
movzbl 0x1d(%rax), %eax
movw %ax, -0x12(%rbp)
cmpw $0x0, -0x12(%rbp)
je 0x2c617
movq -0x10(%rbp), %rax
movzbl 0x1e(%rax), %eax
andl $0xfc, %eax
cmpl $0x0, %eax
je 0x2c617
leaq 0x15edb(%rip), %rdi     # 0x4228b
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x80, %ecx
leaq 0xfd0f(%rip), %rsi      # 0x3c0d7
leaq 0xfd04(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15eda(%rip), %rdi     # 0x422b7
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x40, %ecx
leaq 0xfce5(%rip), %rsi      # 0x3c0d7
leaq 0xfcda(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15ebf(%rip), %rdi     # 0x422c6
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x20, %ecx
leaq 0xfcbb(%rip), %rsi      # 0x3c0d7
leaq 0xfcb0(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15eb3(%rip), %rdi     # 0x422e4
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x10, %ecx
leaq 0xfc91(%rip), %rsi      # 0x3c0d7
leaq 0xfc86(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15ea6(%rip), %rdi     # 0x42301
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x8, %ecx
leaq 0xfc67(%rip), %rsi      # 0x3c0d7
leaq 0xfc5c(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15e9b(%rip), %rdi     # 0x42320
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x4, %ecx
leaq 0xfc3d(%rip), %rsi      # 0x3c0d7
leaq 0xfc32(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15e9e(%rip), %rdi     # 0x4234d
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x2, %ecx
leaq 0xfc13(%rip), %rsi      # 0x3c0d7
leaq 0xfc08(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15ea1(%rip), %rdi     # 0x4237a
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x1, %ecx
leaq 0xfbe9(%rip), %rsi      # 0x3c0d7
leaq 0xfbde(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15ea4(%rip), %rdi     # 0x423a7
movb $0x0, %al
callq 0x4050
movq -0x10(%rbp), %rax
movzbl 0x1e(%rax), %eax
movw %ax, -0x12(%rbp)
movzwl -0x12(%rbp), %ecx
andl $0x80, %ecx
leaq 0xfbb0(%rip), %rsi      # 0x3c0d7
leaq 0xfba5(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15e99(%rip), %rdi     # 0x423d5
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x40, %ecx
leaq 0xfb86(%rip), %rsi      # 0x3c0d7
leaq 0xfb7b(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15e9d(%rip), %rdi     # 0x42403
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x20, %ecx
leaq 0xfb5c(%rip), %rsi      # 0x3c0d7
leaq 0xfb51(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15ea1(%rip), %rdi     # 0x42431
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x10, %ecx
leaq 0xfb32(%rip), %rsi      # 0x3c0d7
leaq 0xfb27(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15ea5(%rip), %rdi     # 0x4245f
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x8, %ecx
leaq 0xfb08(%rip), %rsi      # 0x3c0d7
leaq 0xfafd(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15e9f(%rip), %rdi     # 0x42483
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x4, %ecx
leaq 0xfade(%rip), %rsi      # 0x3c0d7
leaq 0xfad3(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15e9b(%rip), %rdi     # 0x424a9
movb $0x0, %al
callq 0x4050
jmp 0x2c625
leaq 0x15ea1(%rip), %rdi     # 0x424bf
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %eax
andl $0x3, %eax
cmpl $0x0, %eax
je 0x2c641
xorl %edi, %edi
leaq 0x15eb6(%rip), %rsi     # 0x424f0
movb $0x0, %al
callq 0x47d0
movq -0x10(%rbp), %rax
movzbl 0x1f(%rax), %eax
movw %ax, -0x12(%rbp)
movzwl -0x12(%rbp), %ecx
andl $0x80, %ecx
leaq 0xfa79(%rip), %rsi      # 0x3c0d7
leaq 0xfa6e(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15ea1(%rip), %rdi     # 0x42514
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %eax
andl $0x7f, %eax
cmpl $0x0, %eax
je 0x2c696
xorl %edi, %edi
leaq 0x15e98(%rip), %rsi     # 0x42527
movb $0x0, %al
callq 0x47d0
movq -0x10(%rbp), %rax
movzbl 0x20(%rax), %eax
movw %ax, -0x12(%rbp)
leaq 0x15ea2(%rip), %rdi     # 0x4254b
movb $0x0, %al
callq 0x4050
cmpw $0x0, -0x12(%rbp)
jne 0x2c6c7
leaq 0x15ec5(%rip), %rdi     # 0x42583
movb $0x0, %al
callq 0x4050
jmp 0x2c70c
movzwl -0x12(%rbp), %eax
cmpl $0x10, %eax
jg 0x2c6e4
movzwl -0x12(%rbp), %esi
leaq 0x13199(%rip), %rdi     # 0x3f874
movb $0x0, %al
callq 0x4050
jmp 0x2c70a
movzwl -0x12(%rbp), %esi
leaq 0x15ea4(%rip), %rdi     # 0x42593
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %edx
xorl %edi, %edi
leaq 0x15ea3(%rip), %rsi     # 0x425a6
movb $0x0, %al
callq 0x47d0
jmp 0x2c70c
movq -0x10(%rbp), %rax
movzbl 0x21(%rax), %eax
movw %ax, -0x12(%rbp)
leaq 0x15ec7(%rip), %rdi     # 0x425e6
movb $0x0, %al
callq 0x4050
cmpw $0x0, -0x12(%rbp)
jne 0x2c73d
leaq 0x15e4f(%rip), %rdi     # 0x42583
movb $0x0, %al
callq 0x4050
jmp 0x2c782
movzwl -0x12(%rbp), %eax
cmpl $0x10, %eax
jg 0x2c75a
movzwl -0x12(%rbp), %esi
leaq 0x13123(%rip), %rdi     # 0x3f874
movb $0x0, %al
callq 0x4050
jmp 0x2c780
movzwl -0x12(%rbp), %esi
leaq 0x15e2e(%rip), %rdi     # 0x42593
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %edx
xorl %edi, %edi
leaq 0x15ea6(%rip), %rsi     # 0x4261f
movb $0x0, %al
callq 0x47d0
jmp 0x2c782
movq -0x10(%rbp), %rax
movzbl 0x22(%rax), %eax
movw %ax, -0x12(%rbp)
leaq 0x15ecb(%rip), %rdi     # 0x42660
movb $0x0, %al
callq 0x4050
cmpw $0x0, -0x12(%rbp)
jne 0x2c7b3
leaq 0x15dd9(%rip), %rdi     # 0x42583
movb $0x0, %al
callq 0x4050
jmp 0x2c7f8
movzwl -0x12(%rbp), %eax
cmpl $0x10, %eax
jg 0x2c7d0
movzwl -0x12(%rbp), %esi
leaq 0x130ad(%rip), %rdi     # 0x3f874
movb $0x0, %al
callq 0x4050
jmp 0x2c7f6
movzwl -0x12(%rbp), %esi
leaq 0x15db8(%rip), %rdi     # 0x42593
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %edx
xorl %edi, %edi
leaq 0x15ea8(%rip), %rsi     # 0x42697
movb $0x0, %al
callq 0x47d0
jmp 0x2c7f8
movq -0x10(%rbp), %rax
movzbl 0x23(%rax), %eax
movw %ax, -0x12(%rbp)
leaq 0x15ecb(%rip), %rdi     # 0x426d6
movb $0x0, %al
callq 0x4050
cmpw $0x0, -0x12(%rbp)
jne 0x2c829
leaq 0x15d63(%rip), %rdi     # 0x42583
movb $0x0, %al
callq 0x4050
jmp 0x2c86e
movzwl -0x12(%rbp), %eax
cmpl $0x10, %eax
jg 0x2c846
movzwl -0x12(%rbp), %esi
leaq 0x13037(%rip), %rdi     # 0x3f874
movb $0x0, %al
callq 0x4050
jmp 0x2c86c
movzwl -0x12(%rbp), %esi
leaq 0x15d42(%rip), %rdi     # 0x42593
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %edx
xorl %edi, %edi
leaq 0x15eaa(%rip), %rsi     # 0x4270f
movb $0x0, %al
callq 0x47d0
jmp 0x2c86e
movq -0x10(%rbp), %rax
movzbl 0x24(%rax), %eax
movw %ax, -0x12(%rbp)
leaq 0x15ecf(%rip), %rdi     # 0x42750
movb $0x0, %al
callq 0x4050
cmpw $0x0, -0x12(%rbp)
jne 0x2c89f
leaq 0x15ced(%rip), %rdi     # 0x42583
movb $0x0, %al
callq 0x4050
jmp 0x2c8e4
movzwl -0x12(%rbp), %eax
cmpl $0x10, %eax
jg 0x2c8bc
movzwl -0x12(%rbp), %esi
leaq 0x12fc1(%rip), %rdi     # 0x3f874
movb $0x0, %al
callq 0x4050
jmp 0x2c8e2
movzwl -0x12(%rbp), %esi
leaq 0x15ccc(%rip), %rdi     # 0x42593
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %edx
xorl %edi, %edi
leaq 0x15eaa(%rip), %rsi     # 0x42785
movb $0x0, %al
callq 0x47d0
jmp 0x2c8e4
movq -0x10(%rbp), %rax
movzbl 0x25(%rax), %eax
movw %ax, -0x12(%rbp)
leaq 0x15ecb(%rip), %rdi     # 0x427c2
movb $0x0, %al
callq 0x4050
cmpw $0x0, -0x12(%rbp)
jne 0x2c915
leaq 0x15c77(%rip), %rdi     # 0x42583
movb $0x0, %al
callq 0x4050
jmp 0x2c95a
movzwl -0x12(%rbp), %eax
cmpl $0x10, %eax
jg 0x2c932
movzwl -0x12(%rbp), %esi
leaq 0x12f4b(%rip), %rdi     # 0x3f874
movb $0x0, %al
callq 0x4050
jmp 0x2c958
movzwl -0x12(%rbp), %esi
leaq 0x15c56(%rip), %rdi     # 0x42593
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %edx
xorl %edi, %edi
leaq 0x15eaa(%rip), %rsi     # 0x427fb
movb $0x0, %al
callq 0x47d0
jmp 0x2c95a
movq -0x10(%rbp), %rax
movzbl 0x26(%rax), %eax
movw %ax, -0x12(%rbp)
leaq 0x15ecf(%rip), %rdi     # 0x4283c
movb $0x0, %al
callq 0x4050
cmpw $0x0, -0x12(%rbp)
jne 0x2c98e
leaq 0x15b67(%rip), %rdi     # 0x424e9
movb $0x0, %al
callq 0x4050
jmp 0x2ca47
leaq 0x2f74(%rip), %rdi      # 0x2f909
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x80, %ecx
leaq 0xf72a(%rip), %rsi      # 0x3c0d7
leaq 0xf71f(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15e9d(%rip), %rdi     # 0x4285f
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x40, %ecx
leaq 0xf700(%rip), %rsi      # 0x3c0d7
leaq 0xf6f5(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15e88(%rip), %rdi     # 0x42874
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x20, %ecx
leaq 0xf6d6(%rip), %rsi      # 0x3c0d7
leaq 0xf6cb(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15e73(%rip), %rdi     # 0x42889
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %ecx
andl $0x10, %ecx
leaq 0xf6ac(%rip), %rsi      # 0x3c0d7
leaq 0xf6a1(%rip), %rax      # 0x3c0d3
cmpl $0x0, %ecx
cmovneq %rax, %rsi
leaq 0x15e77(%rip), %rdi     # 0x428b7
movb $0x0, %al
callq 0x4050
movzwl -0x12(%rbp), %eax
andl $0xf, %eax
cmpl $0x0, %eax
je 0x2ca63
xorl %edi, %edi
leaq 0x15e84(%rip), %rsi     # 0x428e0
movb $0x0, %al
callq 0x47d0
addq $0x90, %rsp
popq %rbp
retq
nopl (%rax)