#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int strlen(char *);
int is_valid(char *egn) {
  if (strlen(egn) != 10)
    return 0;
  short mounth = ((egn[2] - 48) * 10 + (egn[1] - 48)),
        day = ((egn[4] - 48) * 10 + (egn[5] - 48));
  if (!((mounth > 0 && mounth < 12) || (mounth > 20 && mounth < 32) ||
        (mounth > 40 && mounth < 52)))
    return 0;
  if (!(day > 0 || day <= 31))
    return 0;
  if ((((((egn[0] - 48) * 2 + (egn[1] - 48) * 4 + (egn[2] - 48) * 8 +
          (egn[3] - 48) * 5 + (egn[4] - 48) * 10 + (egn[5] - 48) * 9 +
          (egn[6] - 48) * 7 + (egn[7] - 48) * 3 + (egn[8] - 48) * 6) %
         11) == 10) &&
       (egn[9] - 48) == 0))
    return 1;
  if ((((egn[0] - 48) * 2 + (egn[1] - 48) * 4 + (egn[2] - 48) * 8 +
        (egn[3] - 48) * 5 + (egn[4] - 48) * 10 + (egn[5] - 48) * 9 +
        (egn[6] - 48) * 7 + (egn[7] - 48) * 3 + (egn[8] - 48) * 6) %
       11) == (egn[9] - 48))
    return 1;
  return 0;
}


x86 assembly (clang, -O0):
<is_valid>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
cmp    $0xa,%eax
je     113a <is_valid+0x2a>
movl   $0x0,-0x4(%rbp)
jmp    1371 <is_valid+0x261>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %ax,-0x12(%rbp)
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x5(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %ax,-0x14(%rbp)
movswl -0x12(%rbp),%eax
cmp    $0x0,%eax
jle    1192 <is_valid+0x82>
movswl -0x12(%rbp),%eax
cmp    $0xc,%eax
jl     11d2 <is_valid+0xc2>
movswl -0x12(%rbp),%eax
cmp    $0x14,%eax
jle    11ac <is_valid+0x9c>
movswl -0x12(%rbp),%eax
cmp    $0x20,%eax
jl     11d2 <is_valid+0xc2>
movswl -0x12(%rbp),%eax
cmp    $0x28,%eax
jle    11c6 <is_valid+0xb6>
movswl -0x12(%rbp),%eax
cmp    $0x34,%eax
jl     11d2 <is_valid+0xc2>
movl   $0x0,-0x4(%rbp)
jmp    1371 <is_valid+0x261>
movswl -0x14(%rbp),%eax
cmp    $0x0,%eax
jg     11f8 <is_valid+0xe8>
movswl -0x14(%rbp),%eax
cmp    $0x1f,%eax
jle    11f8 <is_valid+0xe8>
movl   $0x0,-0x4(%rbp)
jmp    1371 <is_valid+0x261>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
shl    $0x1,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
sub    $0x30,%ecx
shl    $0x2,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x2(%rcx),%ecx
sub    $0x30,%ecx
shl    $0x3,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x3(%rcx),%ecx
sub    $0x30,%ecx
imul   $0x5,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x4(%rcx),%ecx
sub    $0x30,%ecx
imul   $0xa,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x5(%rcx),%ecx
sub    $0x30,%ecx
imul   $0x9,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x6(%rcx),%ecx
sub    $0x30,%ecx
imul   $0x7,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x7(%rcx),%ecx
sub    $0x30,%ecx
imul   $0x3,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x8(%rcx),%ecx
sub    $0x30,%ecx
imul   $0x6,%ecx,%ecx
add    %ecx,%eax
mov    $0xb,%ecx
cltd
idiv   %ecx
cmp    $0xa,%edx
jne    12b6 <is_valid+0x1a6>
mov    -0x10(%rbp),%rax
movsbl 0x9(%rax),%eax
sub    $0x30,%eax
cmp    $0x0,%eax
jne    12b6 <is_valid+0x1a6>
movl   $0x1,-0x4(%rbp)
jmp    1371 <is_valid+0x261>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
shl    $0x1,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
sub    $0x30,%ecx
shl    $0x2,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x2(%rcx),%ecx
sub    $0x30,%ecx
shl    $0x3,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x3(%rcx),%ecx
sub    $0x30,%ecx
imul   $0x5,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x4(%rcx),%ecx
sub    $0x30,%ecx
imul   $0xa,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x5(%rcx),%ecx
sub    $0x30,%ecx
imul   $0x9,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x6(%rcx),%ecx
sub    $0x30,%ecx
imul   $0x7,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x7(%rcx),%ecx
sub    $0x30,%ecx
imul   $0x3,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x8(%rcx),%ecx
sub    $0x30,%ecx
imul   $0x6,%ecx,%ecx
add    %ecx,%eax
mov    $0xb,%ecx
cltd
idiv   %ecx
mov    -0x10(%rbp),%rax
movsbl 0x9(%rax),%eax
sub    $0x30,%eax
cmp    %eax,%edx
jne    136a <is_valid+0x25a>
movl   $0x1,-0x4(%rbp)
jmp    1371 <is_valid+0x261>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<is_valid>:
push   %rbx
mov    %rdi,%rbx
call   1030 <strlen@plt>
mov    %eax,%ecx
xor    %eax,%eax
cmp    $0xa,%ecx
jne    1157 <is_valid+0x47>
movsbl 0x2(%rbx),%ecx
lea    (%rcx,%rcx,4),%esi
movsbl 0x1(%rbx),%edx
lea    (%rdx,%rsi,2),%edi
add    $0xfffffdef,%edi
cmp    $0xb,%edi
jb     1159 <is_valid+0x49>
lea    (%rdx,%rsi,2),%edi
add    $0xfffffddb,%edi
cmp    $0xb,%edi
jb     1159 <is_valid+0x49>
lea    (%rdx,%rsi,2),%esi
add    $0xfffffdc7,%esi
cmp    $0xa,%esi
jbe    1159 <is_valid+0x49>
pop    %rbx
ret
movsbl (%rbx),%r8d
shl    $0x2,%edx
movsbl 0x3(%rbx),%esi
lea    (%rsi,%rsi,4),%r9d
movsbl 0x4(%rbx),%edi
lea    (%rdi,%rdi,4),%r10d
movsbl 0x5(%rbx),%eax
lea    (%rax,%rax,8),%r11d
movsbl 0x6(%rbx),%esi
lea    0x0(,%rsi,8),%edi
sub    %esi,%edi
movsbl 0x7(%rbx),%esi
lea    (%rsi,%rsi,2),%esi
movsbl 0x8(%rbx),%eax
lea    (%rax,%rax,2),%eax
lea    (%rdx,%rcx,8),%ecx
lea    (%rcx,%r8,2),%ecx
add    %r9d,%ecx
lea    (%rcx,%r10,2),%ecx
add    %r11d,%ecx
add    %edi,%ecx
add    %esi,%ecx
lea    (%rcx,%rax,2),%eax
add    $0xfffff5e0,%eax
movslq %eax,%rcx
imul   $0x2e8ba2e9,%rcx,%rax
mov    %rax,%rdx
shr    $0x3f,%rdx
sar    $0x21,%rax
add    %edx,%eax
lea    (%rax,%rax,4),%edx
lea    (%rax,%rdx,2),%eax
sub    %eax,%ecx
mov    0x9(%rbx),%dl
cmp    $0xa,%ecx
jne    11e5 <is_valid+0xd5>
mov    $0x1,%eax
cmp    $0x30,%dl
je     1157 <is_valid+0x47>
movsbl %dl,%edx
add    $0xffffffd0,%edx
xor    %eax,%eax
cmp    %edx,%ecx
sete   %al
pop    %rbx
ret

LLVM IR (-O0):
define i32 @is_valid(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i16
%5 = alloca i16
store i8* %0, i8** %3
%6 = load i8*, i8** %3
%7 = call i32 @strlen(i8* %6)
%8 = icmp ne i32 %7, 10
br i1 %8, label %9, label %10
9: ; preds = %1
store i32 0, i32* %2
br label %215
10: ; preds = %1
%11 = load i8*, i8** %3
%12 = getelementptr inbounds i8, i8* %11, i64 2
%13 = load i8, i8* %12
%14 = sext i8 %13 to i32
%15 = sub nsw i32 %14, 48
%16 = mul nsw i32 %15, 10
%17 = load i8*, i8** %3
%18 = getelementptr inbounds i8, i8* %17, i64 1
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = sub nsw i32 %20, 48
%22 = add nsw i32 %16, %21
%23 = trunc i32 %22 to i16
store i16 %23, i16* %4
%24 = load i8*, i8** %3
%25 = getelementptr inbounds i8, i8* %24, i64 4
%26 = load i8, i8* %25
%27 = sext i8 %26 to i32
%28 = sub nsw i32 %27, 48
%29 = mul nsw i32 %28, 10
%30 = load i8*, i8** %3
%31 = getelementptr inbounds i8, i8* %30, i64 5
%32 = load i8, i8* %31
%33 = sext i8 %32 to i32
%34 = sub nsw i32 %33, 48
%35 = add nsw i32 %29, %34
%36 = trunc i32 %35 to i16
store i16 %36, i16* %5
%37 = load i16, i16* %4
%38 = sext i16 %37 to i32
%39 = icmp sgt i32 %38, 0
br i1 %39, label %40, label %44
40: ; preds = %10
%41 = load i16, i16* %4
%42 = sext i16 %41 to i32
%43 = icmp slt i32 %42, 12
br i1 %43, label %61, label %44
44: ; preds = %40, %10
%45 = load i16, i16* %4
%46 = sext i16 %45 to i32
%47 = icmp sgt i32 %46, 20
br i1 %47, label %48, label %52
48: ; preds = %44
%49 = load i16, i16* %4
%50 = sext i16 %49 to i32
%51 = icmp slt i32 %50, 32
br i1 %51, label %61, label %52
52: ; preds = %48, %44
%53 = load i16, i16* %4
%54 = sext i16 %53 to i32
%55 = icmp sgt i32 %54, 40
br i1 %55, label %56, label %60
56: ; preds = %52
%57 = load i16, i16* %4
%58 = sext i16 %57 to i32
%59 = icmp slt i32 %58, 52
br i1 %59, label %61, label %60
60: ; preds = %56, %52
store i32 0, i32* %2
br label %215
61: ; preds = %56, %48, %40
%62 = load i16, i16* %5
%63 = sext i16 %62 to i32
%64 = icmp sgt i32 %63, 0
br i1 %64, label %70, label %65
65: ; preds = %61
%66 = load i16, i16* %5
%67 = sext i16 %66 to i32
%68 = icmp sle i32 %67, 31
br i1 %68, label %70, label %69
69: ; preds = %65
store i32 0, i32* %2
br label %215
70: ; preds = %65, %61
%71 = load i8*, i8** %3
%72 = getelementptr inbounds i8, i8* %71, i64 0
%73 = load i8, i8* %72
%74 = sext i8 %73 to i32
%75 = sub nsw i32 %74, 48
%76 = mul nsw i32 %75, 2
%77 = load i8*, i8** %3
%78 = getelementptr inbounds i8, i8* %77, i64 1
%79 = load i8, i8* %78
%80 = sext i8 %79 to i32
%81 = sub nsw i32 %80, 48
%82 = mul nsw i32 %81, 4
%83 = add nsw i32 %76, %82
%84 = load i8*, i8** %3
%85 = getelementptr inbounds i8, i8* %84, i64 2
%86 = load i8, i8* %85
%87 = sext i8 %86 to i32
%88 = sub nsw i32 %87, 48
%89 = mul nsw i32 %88, 8
%90 = add nsw i32 %83, %89
%91 = load i8*, i8** %3
%92 = getelementptr inbounds i8, i8* %91, i64 3
%93 = load i8, i8* %92
%94 = sext i8 %93 to i32
%95 = sub nsw i32 %94, 48
%96 = mul nsw i32 %95, 5
%97 = add nsw i32 %90, %96
%98 = load i8*, i8** %3
%99 = getelementptr inbounds i8, i8* %98, i64 4
%100 = load i8, i8* %99
%101 = sext i8 %100 to i32
%102 = sub nsw i32 %101, 48
%103 = mul nsw i32 %102, 10
%104 = add nsw i32 %97, %103
%105 = load i8*, i8** %3
%106 = getelementptr inbounds i8, i8* %105, i64 5
%107 = load i8, i8* %106
%108 = sext i8 %107 to i32
%109 = sub nsw i32 %108, 48
%110 = mul nsw i32 %109, 9
%111 = add nsw i32 %104, %110
%112 = load i8*, i8** %3
%113 = getelementptr inbounds i8, i8* %112, i64 6
%114 = load i8, i8* %113
%115 = sext i8 %114 to i32
%116 = sub nsw i32 %115, 48
%117 = mul nsw i32 %116, 7
%118 = add nsw i32 %111, %117
%119 = load i8*, i8** %3
%120 = getelementptr inbounds i8, i8* %119, i64 7
%121 = load i8, i8* %120
%122 = sext i8 %121 to i32
%123 = sub nsw i32 %122, 48
%124 = mul nsw i32 %123, 3
%125 = add nsw i32 %118, %124
%126 = load i8*, i8** %3
%127 = getelementptr inbounds i8, i8* %126, i64 8
%128 = load i8, i8* %127
%129 = sext i8 %128 to i32
%130 = sub nsw i32 %129, 48
%131 = mul nsw i32 %130, 6
%132 = add nsw i32 %125, %131
%133 = srem i32 %132, 11
%134 = icmp eq i32 %133, 10
br i1 %134, label %135, label %143
135: ; preds = %70
%136 = load i8*, i8** %3
%137 = getelementptr inbounds i8, i8* %136, i64 9
%138 = load i8, i8* %137
%139 = sext i8 %138 to i32
%140 = sub nsw i32 %139, 48
%141 = icmp eq i32 %140, 0
br i1 %141, label %142, label %143
142: ; preds = %135
store i32 1, i32* %2
br label %215
143: ; preds = %135, %70
%144 = load i8*, i8** %3
%145 = getelementptr inbounds i8, i8* %144, i64 0
%146 = load i8, i8* %145
%147 = sext i8 %146 to i32
%148 = sub nsw i32 %147, 48
%149 = mul nsw i32 %148, 2
%150 = load i8*, i8** %3
%151 = getelementptr inbounds i8, i8* %150, i64 1
%152 = load i8, i8* %151
%153 = sext i8 %152 to i32
%154 = sub nsw i32 %153, 48
%155 = mul nsw i32 %154, 4
%156 = add nsw i32 %149, %155
%157 = load i8*, i8** %3
%158 = getelementptr inbounds i8, i8* %157, i64 2
%159 = load i8, i8* %158
%160 = sext i8 %159 to i32
%161 = sub nsw i32 %160, 48
%162 = mul nsw i32 %161, 8
%163 = add nsw i32 %156, %162
%164 = load i8*, i8** %3
%165 = getelementptr inbounds i8, i8* %164, i64 3
%166 = load i8, i8* %165
%167 = sext i8 %166 to i32
%168 = sub nsw i32 %167, 48
%169 = mul nsw i32 %168, 5
%170 = add nsw i32 %163, %169
%171 = load i8*, i8** %3
%172 = getelementptr inbounds i8, i8* %171, i64 4
%173 = load i8, i8* %172
%174 = sext i8 %173 to i32
%175 = sub nsw i32 %174, 48
%176 = mul nsw i32 %175, 10
%177 = add nsw i32 %170, %176
%178 = load i8*, i8** %3
%179 = getelementptr inbounds i8, i8* %178, i64 5
%180 = load i8, i8* %179
%181 = sext i8 %180 to i32
%182 = sub nsw i32 %181, 48
%183 = mul nsw i32 %182, 9
%184 = add nsw i32 %177, %183
%185 = load i8*, i8** %3
%186 = getelementptr inbounds i8, i8* %185, i64 6
%187 = load i8, i8* %186
%188 = sext i8 %187 to i32
%189 = sub nsw i32 %188, 48
%190 = mul nsw i32 %189, 7
%191 = add nsw i32 %184, %190
%192 = load i8*, i8** %3
%193 = getelementptr inbounds i8, i8* %192, i64 7
%194 = load i8, i8* %193
%195 = sext i8 %194 to i32
%196 = sub nsw i32 %195, 48
%197 = mul nsw i32 %196, 3
%198 = add nsw i32 %191, %197
%199 = load i8*, i8** %3
%200 = getelementptr inbounds i8, i8* %199, i64 8
%201 = load i8, i8* %200
%202 = sext i8 %201 to i32
%203 = sub nsw i32 %202, 48
%204 = mul nsw i32 %203, 6
%205 = add nsw i32 %198, %204
%206 = srem i32 %205, 11
%207 = load i8*, i8** %3
%208 = getelementptr inbounds i8, i8* %207, i64 9
%209 = load i8, i8* %208
%210 = sext i8 %209 to i32
%211 = sub nsw i32 %210, 48
%212 = icmp eq i32 %206, %211
br i1 %212, label %213, label %214
213: ; preds = %143
store i32 1, i32* %2
br label %215
214: ; preds = %143
store i32 0, i32* %2
br label %215
215: ; preds = %214, %213, %142, %69, %60, %9
%216 = load i32, i32* %2
ret i32 %216
}

LLVM IR (-O2):
define i32 @is_valid(i8* %0) {
%2 = tail call i32 @strlen(i8* %0)
%3 = icmp eq i32 %2, 10
br i1 %3, label %4, label %71
4: ; preds = %1
%5 = getelementptr inbounds i8, i8* %0, i64 2
%6 = load i8, i8* %5
%7 = sext i8 %6 to i32
%8 = mul nsw i32 %7, 10
%9 = getelementptr inbounds i8, i8* %0, i64 1
%10 = load i8, i8* %9
%11 = sext i8 %10 to i32
%12 = add nsw i32 %8, %11
%13 = add nsw i32 %12, -529
%14 = icmp ult i32 %13, 11
%15 = add nsw i32 %12, -549
%16 = icmp ult i32 %15, 11
%17 = select i1 %14, i1 true, i1 %16
%18 = add nsw i32 %12, -569
%19 = icmp ult i32 %18, 11
%20 = select i1 %17, i1 true, i1 %19
br i1 %20, label %21, label %71
21: ; preds = %4
%22 = getelementptr inbounds i8, i8* %0, i64 5
%23 = getelementptr inbounds i8, i8* %0, i64 4
%24 = load i8, i8* %0
%25 = sext i8 %24 to i32
%26 = shl nsw i32 %25, 1
%27 = shl nsw i32 %11, 2
%28 = shl nsw i32 %7, 3
%29 = getelementptr inbounds i8, i8* %0, i64 3
%30 = load i8, i8* %29
%31 = sext i8 %30 to i32
%32 = mul nsw i32 %31, 5
%33 = load i8, i8* %23
%34 = sext i8 %33 to i32
%35 = mul nsw i32 %34, 10
%36 = load i8, i8* %22
%37 = sext i8 %36 to i32
%38 = mul nsw i32 %37, 9
%39 = getelementptr inbounds i8, i8* %0, i64 6
%40 = load i8, i8* %39
%41 = sext i8 %40 to i32
%42 = mul nsw i32 %41, 7
%43 = getelementptr inbounds i8, i8* %0, i64 7
%44 = load i8, i8* %43
%45 = sext i8 %44 to i32
%46 = mul nsw i32 %45, 3
%47 = getelementptr inbounds i8, i8* %0, i64 8
%48 = load i8, i8* %47
%49 = sext i8 %48 to i32
%50 = mul nsw i32 %49, 6
%51 = add nsw i32 %28, -2592
%52 = add nsw i32 %51, %27
%53 = add nsw i32 %52, %26
%54 = add nsw i32 %53, %32
%55 = add nsw i32 %54, %35
%56 = add i32 %55, %38
%57 = add i32 %56, %42
%58 = add i32 %57, %46
%59 = add i32 %58, %50
%60 = srem i32 %59, 11
%61 = icmp eq i32 %60, 10
%62 = getelementptr inbounds i8, i8* %0, i64 9
%63 = load i8, i8* %62
%64 = icmp eq i8 %63, 48
%65 = select i1 %61, i1 %64, i1 false
br i1 %65, label %71, label %66
66: ; preds = %21
%67 = sext i8 %63 to i32
%68 = add nsw i32 %67, -48
%69 = icmp eq i32 %60, %68
%70 = zext i1 %69 to i32
br label %71
71: ; preds = %21, %4, %66, %1
%72 = phi i32 [ 0, %1 ], [ 0, %4 ], [ %70, %66 ], [ 1, %21 ]
ret i32 %72
}