imports System
imports System.Runtime.InteropServices
module CodeIQ2549
const bufsiz as integer=32
'MacPorts
'const libgmp as string="/opt/local/lib/libgmp.dylib"
'ideone
const libgmp as string="/usr/lib/i386-linux-gnu/libgmp.so.10"
'const libgmp as string="/usr/lib/libgmp.so.3"
'paiza.io/atcoder
'const libgmp as string="/usr/lib/x86_64-linux-gnu/libgmp.so.10"
'wandbox/yukicoder
'const libgmp as string="/usr/lib64/libgmp.so.10"
'AOJ
'const libgmp as string="/usr/lib64/libgmp.so.3"
<DllImport("msvcrt",CallingConvention:=CallingConvention.Cdecl)>shared function write(x as integer,y as string,z as integer) as integer
end function
<DllImport
("msvcrt",CallingConvention
:=CallingConvention.
Cdecl)>shared
function fopen(x as string
,y as string
) as IntPtr
end function
<DllImport
("msvcrt",CallingConvention
:=CallingConvention.
Cdecl)>shared
function fflush(x as IntPtr
) as integer
end function
<DllImport
("msvcrt",CallingConvention
:=CallingConvention.
Cdecl)>shared
function puts(x as string
) as integer
end function
<DllImport
("msvcrt",CallingConvention
:=CallingConvention.
Cdecl)>shared
function system(x as string
) as integer
end function
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_init(a as IntPtr)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_clear(a as IntPtr)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_out_str(a as IntPtr,b as integer,c as IntPtr)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_set(a as IntPtr,b as IntPtr)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_set_str(a as IntPtr,b as string,c as integer)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_set_si(a as IntPtr,b as long)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared function __gmpz_cmp_si(a as IntPtr,b as long) as integer
end function
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared function __gmpz_get_si(a as IntPtr) as long
end function
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_abs(a as IntPtr,b as IntPtr)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_add(a as IntPtr,b as IntPtr,c as IntPtr)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_add_ui(a as IntPtr,b as IntPtr,c as long)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_mul(a as IntPtr,b as IntPtr,c as IntPtr)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_mul_si(a as IntPtr,b as IntPtr,c as long)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_mul_ui(a as IntPtr,b as IntPtr,c as long)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_sub(a as IntPtr,b as IntPtr,c as IntPtr)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_sub_ui(a as IntPtr,b as IntPtr,c as long)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_ui_sub(a as IntPtr,b as long,c as IntPtr)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_tdiv_q(a as IntPtr,b as IntPtr,c as IntPtr)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_tdiv_r(a as IntPtr,b as IntPtr,c as IntPtr)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_tdiv_q_ui(a as IntPtr,b as IntPtr,c as long)
end sub
<DllImport(libgmp,CallingConvention:=CallingConvention.Cdecl)>shared sub __gmpz_tdiv_r_ui(a as IntPtr,b as IntPtr,c as long)
end sub
sub mul(a1 as IntPtr,b1 as IntPtr,c1 as IntPtr,d1 as IntPtr,a2 as IntPtr,b2 as IntPtr,c2 as IntPtr,d2 as IntPtr)
dim a0 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(a0)
dim b0 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(b0)
dim c0 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(c0)
dim d0 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(d0)
dim t as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(t)
dim u as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(u)
__gmpz_mul(t,a1,a2)
__gmpz_mul(u,b1,c2)
__gmpz_add(a0,t,u)
__gmpz_mul(t,a1,b2)
__gmpz_mul(u,b1,d2)
__gmpz_add(b0,t,u)
__gmpz_mul(t,c1,a2)
__gmpz_mul(u,d1,c2)
__gmpz_add(c0,t,u)
__gmpz_mul(t,c1,b2)
__gmpz_mul(u,d1,d2)
__gmpz_add(d0,t,u)
__gmpz_set(a1,a0)
__gmpz_set(b1,b0)
__gmpz_set(c1,c0)
__gmpz_set(d1,d0)
__gmpz_clear(a0):Marshal.FreeHGlobal(a0)
__gmpz_clear(b0):Marshal.FreeHGlobal(b0)
__gmpz_clear(c0):Marshal.FreeHGlobal(c0)
__gmpz_clear(d0):Marshal.FreeHGlobal(d0)
__gmpz_clear(t):Marshal.FreeHGlobal(t)
__gmpz_clear(u):Marshal.FreeHGlobal(u)
end sub
sub Main()
dim stdout as IntPtr
=fopen("/dev/stdout","w")
dim a1 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(a1)
dim b1 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(b1)
dim c1 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(c1)
dim d1 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(d1)
dim a2 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(a2)
dim b2 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(b2)
dim c2 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(c2)
dim d2 as IntPtr=Marshal.AllocHGlobal(bufsiz):__gmpz_init(d2)
__gmpz_set_si(a1,1)
__gmpz_set_si(b1,0)
__gmpz_set_si(c1,0)
__gmpz_set_si(d1,1)
__gmpz_set_si(a2,1)
__gmpz_set_si(b2,1)
__gmpz_set_si(c2,1)
__gmpz_set_si(d2,0)
dim N as integer=int(Console.ReadLine())
N=((N+3)\2)*2
while N>0
if (N mod 2)>0
mul(a1,b1,c1,d1,a2,b2,c2,d2)
end if
mul(a2,b2,c2,d2,a2,b2,c2,d2)
N\=2
end while
__gmpz_sub_ui(c1,c1,1)
__gmpz_out_str(stdout,10,c1)
__gmpz_clear(a1):Marshal.FreeHGlobal(a1)
__gmpz_clear(b1):Marshal.FreeHGlobal(b1)
__gmpz_clear(c1):Marshal.FreeHGlobal(c1)
__gmpz_clear(d1):Marshal.FreeHGlobal(d1)
__gmpz_clear(a2):Marshal.FreeHGlobal(a2)
__gmpz_clear(b2):Marshal.FreeHGlobal(b2)
__gmpz_clear(c2):Marshal.FreeHGlobal(c2)
__gmpz_clear(d2):Marshal.FreeHGlobal(d2)
end sub
end module
aW1wb3J0cyBTeXN0ZW0KaW1wb3J0cyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMKCm1vZHVsZSBDb2RlSVEyNTQ5Cgljb25zdCBidWZzaXogYXMgaW50ZWdlcj0zMgoKCSdNYWNQb3J0cwoJJ2NvbnN0IGxpYmdtcCBhcyBzdHJpbmc9Ii9vcHQvbG9jYWwvbGliL2xpYmdtcC5keWxpYiIKCSdpZGVvbmUKCWNvbnN0IGxpYmdtcCBhcyBzdHJpbmc9Ii91c3IvbGliL2kzODYtbGludXgtZ251L2xpYmdtcC5zby4xMCIKCSdjb25zdCBsaWJnbXAgYXMgc3RyaW5nPSIvdXNyL2xpYi9saWJnbXAuc28uMyIKCSdwYWl6YS5pby9hdGNvZGVyCgknY29uc3QgbGliZ21wIGFzIHN0cmluZz0iL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9saWJnbXAuc28uMTAiCgknd2FuZGJveC95dWtpY29kZXIKCSdjb25zdCBsaWJnbXAgYXMgc3RyaW5nPSIvdXNyL2xpYjY0L2xpYmdtcC5zby4xMCIKCSdBT0oKCSdjb25zdCBsaWJnbXAgYXMgc3RyaW5nPSIvdXNyL2xpYjY0L2xpYmdtcC5zby4zIgoKCTxEbGxJbXBvcnQoIm1zdmNydCIsQ2FsbGluZ0NvbnZlbnRpb246PUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKT5zaGFyZWQgZnVuY3Rpb24gd3JpdGUoeCBhcyBpbnRlZ2VyLHkgYXMgc3RyaW5nLHogYXMgaW50ZWdlcikgYXMgaW50ZWdlcgoJZW5kIGZ1bmN0aW9uCgk8RGxsSW1wb3J0KCJtc3ZjcnQiLENhbGxpbmdDb252ZW50aW9uOj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCk+c2hhcmVkIGZ1bmN0aW9uIGZvcGVuKHggYXMgc3RyaW5nLHkgYXMgc3RyaW5nKSBhcyBJbnRQdHIKCWVuZCBmdW5jdGlvbgoJPERsbEltcG9ydCgibXN2Y3J0IixDYWxsaW5nQ29udmVudGlvbjo9Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpPnNoYXJlZCBmdW5jdGlvbiBmZmx1c2goeCBhcyBJbnRQdHIpIGFzIGludGVnZXIKCWVuZCBmdW5jdGlvbgoJPERsbEltcG9ydCgibXN2Y3J0IixDYWxsaW5nQ29udmVudGlvbjo9Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpPnNoYXJlZCBmdW5jdGlvbiBwdXRzKHggYXMgc3RyaW5nKSBhcyBpbnRlZ2VyCgllbmQgZnVuY3Rpb24KCTxEbGxJbXBvcnQoIm1zdmNydCIsQ2FsbGluZ0NvbnZlbnRpb246PUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKT5zaGFyZWQgZnVuY3Rpb24gc3lzdGVtKHggYXMgc3RyaW5nKSBhcyBpbnRlZ2VyCgllbmQgZnVuY3Rpb24KCjxEbGxJbXBvcnQobGliZ21wLENhbGxpbmdDb252ZW50aW9uOj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCk+c2hhcmVkIHN1YiBfX2dtcHpfaW5pdChhIGFzIEludFB0cikKZW5kIHN1Ygo8RGxsSW1wb3J0KGxpYmdtcCxDYWxsaW5nQ29udmVudGlvbjo9Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpPnNoYXJlZCBzdWIgX19nbXB6X2NsZWFyKGEgYXMgSW50UHRyKQplbmQgc3ViCjxEbGxJbXBvcnQobGliZ21wLENhbGxpbmdDb252ZW50aW9uOj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCk+c2hhcmVkIHN1YiBfX2dtcHpfb3V0X3N0cihhIGFzIEludFB0cixiIGFzIGludGVnZXIsYyBhcyBJbnRQdHIpCmVuZCBzdWIKPERsbEltcG9ydChsaWJnbXAsQ2FsbGluZ0NvbnZlbnRpb246PUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKT5zaGFyZWQgc3ViIF9fZ21wel9zZXQoYSBhcyBJbnRQdHIsYiBhcyBJbnRQdHIpCmVuZCBzdWIKPERsbEltcG9ydChsaWJnbXAsQ2FsbGluZ0NvbnZlbnRpb246PUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKT5zaGFyZWQgc3ViIF9fZ21wel9zZXRfc3RyKGEgYXMgSW50UHRyLGIgYXMgc3RyaW5nLGMgYXMgaW50ZWdlcikKZW5kIHN1Ygo8RGxsSW1wb3J0KGxpYmdtcCxDYWxsaW5nQ29udmVudGlvbjo9Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpPnNoYXJlZCBzdWIgX19nbXB6X3NldF9zaShhIGFzIEludFB0cixiIGFzIGxvbmcpCmVuZCBzdWIKPERsbEltcG9ydChsaWJnbXAsQ2FsbGluZ0NvbnZlbnRpb246PUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKT5zaGFyZWQgZnVuY3Rpb24gX19nbXB6X2NtcF9zaShhIGFzIEludFB0cixiIGFzIGxvbmcpIGFzIGludGVnZXIKZW5kIGZ1bmN0aW9uCjxEbGxJbXBvcnQobGliZ21wLENhbGxpbmdDb252ZW50aW9uOj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCk+c2hhcmVkIGZ1bmN0aW9uIF9fZ21wel9nZXRfc2koYSBhcyBJbnRQdHIpIGFzIGxvbmcKZW5kIGZ1bmN0aW9uCjxEbGxJbXBvcnQobGliZ21wLENhbGxpbmdDb252ZW50aW9uOj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCk+c2hhcmVkIHN1YiBfX2dtcHpfYWJzKGEgYXMgSW50UHRyLGIgYXMgSW50UHRyKQplbmQgc3ViCjxEbGxJbXBvcnQobGliZ21wLENhbGxpbmdDb252ZW50aW9uOj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCk+c2hhcmVkIHN1YiBfX2dtcHpfYWRkKGEgYXMgSW50UHRyLGIgYXMgSW50UHRyLGMgYXMgSW50UHRyKQplbmQgc3ViCjxEbGxJbXBvcnQobGliZ21wLENhbGxpbmdDb252ZW50aW9uOj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCk+c2hhcmVkIHN1YiBfX2dtcHpfYWRkX3VpKGEgYXMgSW50UHRyLGIgYXMgSW50UHRyLGMgYXMgbG9uZykKZW5kIHN1Ygo8RGxsSW1wb3J0KGxpYmdtcCxDYWxsaW5nQ29udmVudGlvbjo9Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpPnNoYXJlZCBzdWIgX19nbXB6X211bChhIGFzIEludFB0cixiIGFzIEludFB0cixjIGFzIEludFB0cikKZW5kIHN1Ygo8RGxsSW1wb3J0KGxpYmdtcCxDYWxsaW5nQ29udmVudGlvbjo9Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpPnNoYXJlZCBzdWIgX19nbXB6X211bF9zaShhIGFzIEludFB0cixiIGFzIEludFB0cixjIGFzIGxvbmcpCmVuZCBzdWIKPERsbEltcG9ydChsaWJnbXAsQ2FsbGluZ0NvbnZlbnRpb246PUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKT5zaGFyZWQgc3ViIF9fZ21wel9tdWxfdWkoYSBhcyBJbnRQdHIsYiBhcyBJbnRQdHIsYyBhcyBsb25nKQplbmQgc3ViCjxEbGxJbXBvcnQobGliZ21wLENhbGxpbmdDb252ZW50aW9uOj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCk+c2hhcmVkIHN1YiBfX2dtcHpfc3ViKGEgYXMgSW50UHRyLGIgYXMgSW50UHRyLGMgYXMgSW50UHRyKQplbmQgc3ViCjxEbGxJbXBvcnQobGliZ21wLENhbGxpbmdDb252ZW50aW9uOj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCk+c2hhcmVkIHN1YiBfX2dtcHpfc3ViX3VpKGEgYXMgSW50UHRyLGIgYXMgSW50UHRyLGMgYXMgbG9uZykKZW5kIHN1Ygo8RGxsSW1wb3J0KGxpYmdtcCxDYWxsaW5nQ29udmVudGlvbjo9Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpPnNoYXJlZCBzdWIgX19nbXB6X3VpX3N1YihhIGFzIEludFB0cixiIGFzIGxvbmcsYyBhcyBJbnRQdHIpCmVuZCBzdWIKPERsbEltcG9ydChsaWJnbXAsQ2FsbGluZ0NvbnZlbnRpb246PUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKT5zaGFyZWQgc3ViIF9fZ21wel90ZGl2X3EoYSBhcyBJbnRQdHIsYiBhcyBJbnRQdHIsYyBhcyBJbnRQdHIpCmVuZCBzdWIKPERsbEltcG9ydChsaWJnbXAsQ2FsbGluZ0NvbnZlbnRpb246PUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKT5zaGFyZWQgc3ViIF9fZ21wel90ZGl2X3IoYSBhcyBJbnRQdHIsYiBhcyBJbnRQdHIsYyBhcyBJbnRQdHIpCmVuZCBzdWIKPERsbEltcG9ydChsaWJnbXAsQ2FsbGluZ0NvbnZlbnRpb246PUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKT5zaGFyZWQgc3ViIF9fZ21wel90ZGl2X3FfdWkoYSBhcyBJbnRQdHIsYiBhcyBJbnRQdHIsYyBhcyBsb25nKQplbmQgc3ViCjxEbGxJbXBvcnQobGliZ21wLENhbGxpbmdDb252ZW50aW9uOj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCk+c2hhcmVkIHN1YiBfX2dtcHpfdGRpdl9yX3VpKGEgYXMgSW50UHRyLGIgYXMgSW50UHRyLGMgYXMgbG9uZykKZW5kIHN1YgoKCXN1YiBtdWwoYTEgYXMgSW50UHRyLGIxIGFzIEludFB0cixjMSBhcyBJbnRQdHIsZDEgYXMgSW50UHRyLGEyIGFzIEludFB0cixiMiBhcyBJbnRQdHIsYzIgYXMgSW50UHRyLGQyIGFzIEludFB0cikKCQlkaW0gYTAgYXMgSW50UHRyPU1hcnNoYWwuQWxsb2NIR2xvYmFsKGJ1ZnNpeik6X19nbXB6X2luaXQoYTApCgkJZGltIGIwIGFzIEludFB0cj1NYXJzaGFsLkFsbG9jSEdsb2JhbChidWZzaXopOl9fZ21wel9pbml0KGIwKQoJCWRpbSBjMCBhcyBJbnRQdHI9TWFyc2hhbC5BbGxvY0hHbG9iYWwoYnVmc2l6KTpfX2dtcHpfaW5pdChjMCkKCQlkaW0gZDAgYXMgSW50UHRyPU1hcnNoYWwuQWxsb2NIR2xvYmFsKGJ1ZnNpeik6X19nbXB6X2luaXQoZDApCgkJZGltIHQgYXMgSW50UHRyPU1hcnNoYWwuQWxsb2NIR2xvYmFsKGJ1ZnNpeik6X19nbXB6X2luaXQodCkKCQlkaW0gdSBhcyBJbnRQdHI9TWFyc2hhbC5BbGxvY0hHbG9iYWwoYnVmc2l6KTpfX2dtcHpfaW5pdCh1KQoKCQlfX2dtcHpfbXVsKHQsYTEsYTIpCgkJX19nbXB6X211bCh1LGIxLGMyKQoJCV9fZ21wel9hZGQoYTAsdCx1KQoJCV9fZ21wel9tdWwodCxhMSxiMikKCQlfX2dtcHpfbXVsKHUsYjEsZDIpCgkJX19nbXB6X2FkZChiMCx0LHUpCgkJX19nbXB6X211bCh0LGMxLGEyKQoJCV9fZ21wel9tdWwodSxkMSxjMikKCQlfX2dtcHpfYWRkKGMwLHQsdSkKCQlfX2dtcHpfbXVsKHQsYzEsYjIpCgkJX19nbXB6X211bCh1LGQxLGQyKQoJCV9fZ21wel9hZGQoZDAsdCx1KQoKCQlfX2dtcHpfc2V0KGExLGEwKQoJCV9fZ21wel9zZXQoYjEsYjApCgkJX19nbXB6X3NldChjMSxjMCkKCQlfX2dtcHpfc2V0KGQxLGQwKQoKCQlfX2dtcHpfY2xlYXIoYTApOk1hcnNoYWwuRnJlZUhHbG9iYWwoYTApCgkJX19nbXB6X2NsZWFyKGIwKTpNYXJzaGFsLkZyZWVIR2xvYmFsKGIwKQoJCV9fZ21wel9jbGVhcihjMCk6TWFyc2hhbC5GcmVlSEdsb2JhbChjMCkKCQlfX2dtcHpfY2xlYXIoZDApOk1hcnNoYWwuRnJlZUhHbG9iYWwoZDApCgkJX19nbXB6X2NsZWFyKHQpOk1hcnNoYWwuRnJlZUhHbG9iYWwodCkKCQlfX2dtcHpfY2xlYXIodSk6TWFyc2hhbC5GcmVlSEdsb2JhbCh1KQoJZW5kIHN1YgoKCXN1YiBNYWluKCkKCQlkaW0gc3Rkb3V0IGFzIEludFB0cj1mb3BlbigiL2Rldi9zdGRvdXQiLCJ3IikKCgkJZGltIGExIGFzIEludFB0cj1NYXJzaGFsLkFsbG9jSEdsb2JhbChidWZzaXopOl9fZ21wel9pbml0KGExKQoJCWRpbSBiMSBhcyBJbnRQdHI9TWFyc2hhbC5BbGxvY0hHbG9iYWwoYnVmc2l6KTpfX2dtcHpfaW5pdChiMSkKCQlkaW0gYzEgYXMgSW50UHRyPU1hcnNoYWwuQWxsb2NIR2xvYmFsKGJ1ZnNpeik6X19nbXB6X2luaXQoYzEpCgkJZGltIGQxIGFzIEludFB0cj1NYXJzaGFsLkFsbG9jSEdsb2JhbChidWZzaXopOl9fZ21wel9pbml0KGQxKQoJCWRpbSBhMiBhcyBJbnRQdHI9TWFyc2hhbC5BbGxvY0hHbG9iYWwoYnVmc2l6KTpfX2dtcHpfaW5pdChhMikKCQlkaW0gYjIgYXMgSW50UHRyPU1hcnNoYWwuQWxsb2NIR2xvYmFsKGJ1ZnNpeik6X19nbXB6X2luaXQoYjIpCgkJZGltIGMyIGFzIEludFB0cj1NYXJzaGFsLkFsbG9jSEdsb2JhbChidWZzaXopOl9fZ21wel9pbml0KGMyKQoJCWRpbSBkMiBhcyBJbnRQdHI9TWFyc2hhbC5BbGxvY0hHbG9iYWwoYnVmc2l6KTpfX2dtcHpfaW5pdChkMikKCgkJX19nbXB6X3NldF9zaShhMSwxKQoJCV9fZ21wel9zZXRfc2koYjEsMCkKCQlfX2dtcHpfc2V0X3NpKGMxLDApCgkJX19nbXB6X3NldF9zaShkMSwxKQoJCV9fZ21wel9zZXRfc2koYTIsMSkKCQlfX2dtcHpfc2V0X3NpKGIyLDEpCgkJX19nbXB6X3NldF9zaShjMiwxKQoJCV9fZ21wel9zZXRfc2koZDIsMCkKCgkJZGltIE4gYXMgaW50ZWdlcj1pbnQoQ29uc29sZS5SZWFkTGluZSgpKQoJCU49KChOKzMpXDIpKjIKCQl3aGlsZSBOPjAKCQkJaWYgKE4gbW9kIDIpPjAKCQkJCW11bChhMSxiMSxjMSxkMSxhMixiMixjMixkMikKCQkJZW5kIGlmCgkJCW11bChhMixiMixjMixkMixhMixiMixjMixkMikKCQkJTlw9MgoJCWVuZCB3aGlsZQoJCV9fZ21wel9zdWJfdWkoYzEsYzEsMSkKCQlfX2dtcHpfb3V0X3N0cihzdGRvdXQsMTAsYzEpCgkJZmZsdXNoKHN0ZG91dCkKCQlwdXRzKCIiKQoJCWZmbHVzaChzdGRvdXQpCgoJCV9fZ21wel9jbGVhcihhMSk6TWFyc2hhbC5GcmVlSEdsb2JhbChhMSkKCQlfX2dtcHpfY2xlYXIoYjEpOk1hcnNoYWwuRnJlZUhHbG9iYWwoYjEpCgkJX19nbXB6X2NsZWFyKGMxKTpNYXJzaGFsLkZyZWVIR2xvYmFsKGMxKQoJCV9fZ21wel9jbGVhcihkMSk6TWFyc2hhbC5GcmVlSEdsb2JhbChkMSkKCQlfX2dtcHpfY2xlYXIoYTIpOk1hcnNoYWwuRnJlZUhHbG9iYWwoYTIpCgkJX19nbXB6X2NsZWFyKGIyKTpNYXJzaGFsLkZyZWVIR2xvYmFsKGIyKQoJCV9fZ21wel9jbGVhcihjMik6TWFyc2hhbC5GcmVlSEdsb2JhbChjMikKCQlfX2dtcHpfY2xlYXIoZDIpOk1hcnNoYWwuRnJlZUhHbG9iYWwoZDIpCgllbmQgc3ViCmVuZCBtb2R1bGU=