Repository: roundsheep/rpp Branch: master Commit: 45fe569af4ad Files: 336 Total size: 1.3 MB Directory structure: gitextract_hzk6_p1w/ ├── README.md ├── bin/ │ ├── build.bat │ ├── build_run.bat │ ├── check_all.bat │ ├── compile_speed.bat │ ├── example/ │ │ ├── 1.h │ │ ├── 10_1.h │ │ ├── 10_2.h │ │ ├── 10_3.h │ │ ├── 11_1.h │ │ ├── 11_2.h │ │ ├── 11_3.h │ │ ├── 11_4.h │ │ ├── 11_5.h │ │ ├── 11_6.h │ │ ├── 11_7.h │ │ ├── 12.h │ │ ├── 13.h │ │ ├── 14_1.h │ │ ├── 14_2.h │ │ ├── 16_1.h │ │ ├── 16_2.h │ │ ├── 16_3.h │ │ ├── 16_4.h │ │ ├── 17_1.h │ │ ├── 17_2.h │ │ ├── 18_1.h │ │ ├── 18_2.h │ │ ├── 19_1.h │ │ ├── 19_2.h │ │ ├── 2.h │ │ ├── 20.h │ │ ├── 21_1.h │ │ ├── 21_2.h │ │ ├── 22_1.h │ │ ├── 22_2.h │ │ ├── 23_1.h │ │ ├── 23_2.h │ │ ├── 23_3.h │ │ ├── 24.h │ │ ├── 25_1.h │ │ ├── 25_2.h │ │ ├── 25_3.h │ │ ├── 26_1.h │ │ ├── 26_2.h │ │ ├── 27.h │ │ ├── 28.h │ │ ├── 29.h │ │ ├── 3.h │ │ ├── 30_1.h │ │ ├── 30_2.h │ │ ├── 31.h │ │ ├── 32_1.h │ │ ├── 32_2.h │ │ ├── 32_3.h │ │ ├── 33_1.h │ │ ├── 33_2.h │ │ ├── 34_1.h │ │ ├── 34_2.h │ │ ├── 35.h │ │ ├── 36_1.h │ │ ├── 36_10.h │ │ ├── 36_2.h │ │ ├── 36_3.h │ │ ├── 36_4.h │ │ ├── 36_5.h │ │ ├── 36_6.h │ │ ├── 36_7.h │ │ ├── 36_8.h │ │ ├── 36_9.h │ │ ├── 40_1.h │ │ ├── 40_2.h │ │ ├── 40_3.h │ │ ├── 40_4.h │ │ ├── 40_5.h │ │ ├── 42.h │ │ ├── 44.h │ │ ├── 4_1.h │ │ ├── 4_2.h │ │ ├── 50.h │ │ ├── 51.h │ │ ├── 52.h │ │ ├── 53.h │ │ ├── 54.h │ │ ├── 55.h │ │ ├── 56.h │ │ ├── 57.h │ │ ├── 5_1.h │ │ ├── 5_2.h │ │ ├── 6.h │ │ ├── 7.h │ │ ├── 8.h │ │ ├── 9.h │ │ ├── answer/ │ │ │ ├── 1.txt │ │ │ ├── 10_1.txt │ │ │ ├── 10_2.txt │ │ │ ├── 10_3.txt │ │ │ ├── 11_1.txt │ │ │ ├── 11_2.txt │ │ │ ├── 11_3.txt │ │ │ ├── 11_4.txt │ │ │ ├── 11_5.txt │ │ │ ├── 11_6.txt │ │ │ ├── 11_7.txt │ │ │ ├── 12.txt │ │ │ ├── 13.txt │ │ │ ├── 14_1.txt │ │ │ ├── 17_1.txt │ │ │ ├── 17_2.txt │ │ │ ├── 18_1.txt │ │ │ ├── 18_2.txt │ │ │ ├── 19_1.txt │ │ │ ├── 19_2.txt │ │ │ ├── 2.txt │ │ │ ├── 20.txt │ │ │ ├── 21_1.txt │ │ │ ├── 21_2.txt │ │ │ ├── 22_1.txt │ │ │ ├── 23_1.txt │ │ │ ├── 23_2.txt │ │ │ ├── 23_3.txt │ │ │ ├── 24.txt │ │ │ ├── 25_1.txt │ │ │ ├── 25_2.txt │ │ │ ├── 25_3.txt │ │ │ ├── 26_1.txt │ │ │ ├── 26_2.txt │ │ │ ├── 27.txt │ │ │ ├── 28.txt │ │ │ ├── 29.txt │ │ │ ├── 3.txt │ │ │ ├── 30_1.txt │ │ │ ├── 30_2.txt │ │ │ ├── 31.txt │ │ │ ├── 32_1.txt │ │ │ ├── 32_2.txt │ │ │ ├── 32_3.txt │ │ │ ├── 33_1.txt │ │ │ ├── 33_2.txt │ │ │ ├── 34_1.txt │ │ │ ├── 34_2.txt │ │ │ ├── 35.txt │ │ │ ├── 36_1.txt │ │ │ ├── 36_10.txt │ │ │ ├── 36_2.txt │ │ │ ├── 36_3.txt │ │ │ ├── 36_4.txt │ │ │ ├── 36_5.txt │ │ │ ├── 36_6.txt │ │ │ ├── 36_7.txt │ │ │ ├── 42.txt │ │ │ ├── 44.txt │ │ │ ├── 4_1.txt │ │ │ ├── 4_2.txt │ │ │ ├── 50.txt │ │ │ ├── 51.txt │ │ │ ├── 52.txt │ │ │ ├── 53.txt │ │ │ ├── 54.txt │ │ │ ├── 55.txt │ │ │ ├── 56.txt │ │ │ ├── 57.txt │ │ │ ├── 5_1.txt │ │ │ ├── 5_2.txt │ │ │ ├── 6.txt │ │ │ ├── 7.txt │ │ │ ├── 8.txt │ │ │ └── 9.txt │ │ ├── asm_opt.h │ │ ├── bf.h │ │ ├── check.h │ │ ├── code.h │ │ ├── compile_speed.h │ │ ├── count.h │ │ ├── find.h │ │ ├── http.h │ │ ├── line_check.h │ │ ├── lisp.h │ │ ├── run.h │ │ ├── snake.h │ │ ├── speed_test.h │ │ ├── time.h │ │ └── win.h │ ├── gl/ │ │ ├── 1.h │ │ ├── 2.h │ │ ├── 3.h │ │ ├── frame.h │ │ ├── gl.h │ │ ├── line.h │ │ └── sphere.h │ ├── ide/ │ │ ├── License.txt │ │ ├── SciTE.properties │ │ ├── SciTEGlobal.properties │ │ ├── asm.properties │ │ ├── cpp.properties │ │ ├── lisp.properties │ │ ├── luaCOPYRIGHT │ │ ├── modules.api │ │ ├── python.properties │ │ └── scite.1 │ ├── launch_ide.bat │ ├── line_check.bat │ ├── nasm/ │ │ ├── bin.bat │ │ ├── bin.h │ │ ├── cell.h │ │ ├── dec.inc │ │ ├── grldr │ │ ├── menu.lst │ │ └── windemos.inc │ ├── open_cmd.bat │ ├── rcheck.bat │ ├── rinf/ │ │ ├── conf.txt │ │ ├── key.txt │ │ ├── match.txt │ │ ├── optr.txt │ │ └── optr2.txt │ ├── rjit.bat │ ├── rjit_win.bat │ ├── rpack.bat │ ├── rpack_win.bat │ ├── rsrc/ │ │ ├── basic.h │ │ ├── carray.h │ │ ├── char.h │ │ ├── chs.h │ │ ├── double.h │ │ ├── double_j.h │ │ ├── double_n.h │ │ ├── eval.h │ │ ├── float.h │ │ ├── func.h │ │ ├── int.h │ │ ├── int8.h │ │ ├── int8_j.h │ │ ├── int8_n.h │ │ ├── math.h │ │ ├── new.h │ │ ├── ralgo.h │ │ ├── rbuf.h │ │ ├── rbufm.h │ │ ├── rcc.h │ │ ├── rcode.h │ │ ├── rcode_n.h │ │ ├── rdic.h │ │ ├── rdir.h │ │ ├── rf.h │ │ ├── rf_g.h │ │ ├── rf_j.h │ │ ├── rf_n.h │ │ ├── rff.h │ │ ├── rff_j.h │ │ ├── rff_n.h │ │ ├── rfile.h │ │ ├── rfs.h │ │ ├── rfs_j.h │ │ ├── rfs_n.h │ │ ├── rhash.h │ │ ├── rlist.h │ │ ├── rmutex.h │ │ ├── rmutex_j.h │ │ ├── rmutex_n.h │ │ ├── rp.h │ │ ├── rpp.h │ │ ├── rset.h │ │ ├── rsock.h │ │ ├── rstr.h │ │ ├── rstrw.h │ │ ├── short.h │ │ ├── uint.h │ │ ├── ushort.h │ │ ├── var.h │ │ └── varf.h │ └── run.bat ├── del.bat ├── proj/ │ ├── rpp.sln │ ├── rpp.vcxproj │ ├── rpp.vcxproj.filters │ └── rpp_win/ │ ├── rpp_win.sln │ ├── rpp_win.vcxproj │ └── rpp_win.vcxproj.filters ├── rlib/ │ ├── gbk.txt │ ├── ralgo.h │ ├── rbase.h │ ├── rbuf.h │ ├── rclass.h │ ├── rcode.h │ ├── rdb.h │ ├── rdic.h │ ├── rdir.h │ ├── rf.h │ ├── rfile.h │ ├── rhash.h │ ├── rindex.h │ ├── rlist.h │ ├── rmutex.h │ ├── rset.h │ ├── rsock.h │ ├── rstr.h │ ├── rstrw.h │ └── rthread.h ├── rpp/ │ ├── rpp.cpp │ ├── rpp_def.h │ ├── rpp_win.cpp │ ├── talloc.h │ ├── tanalyse.h │ ├── tconf.h │ ├── tsh.h │ ├── tstruct.h │ ├── tvm.h │ ├── tvm_struct.h │ ├── zadd.h │ ├── zasm.h │ ├── zautof.h │ ├── zbin.h │ ├── zclass.h │ ├── zcontrol.h │ ├── zctl.h │ ├── zexp.h │ ├── zfind.h │ ├── zftl.h │ ├── zjit.h │ ├── zjitb.h │ ├── zjitf.h │ ├── zjiti.h │ ├── zlambda.h │ ├── zmac.h │ ├── zmain.h │ ├── zmatch.h │ ├── zmemb.h │ ├── znasm.h │ ├── zopt.h │ ├── zpre.h │ ├── zread.h │ ├── zsent.h │ ├── zsrep.h │ └── zsuper.h └── update.txt ================================================ FILE CONTENTS ================================================ ================================================ FILE: bin/build.bat ================================================ @echo off rpp.exe example\run.h %1 -build ================================================ FILE: bin/build_run.bat ================================================ @echo off rem cd /d %~dp0 rpp.exe example\run.h %1 ================================================ FILE: bin/check_all.bat ================================================ rjit example\check.h ================================================ FILE: bin/compile_speed.bat ================================================ rpp example\compile_speed.h pause ================================================ FILE: bin/example/11_4.h ================================================  void main() { putsl(XC_SY_DEFAULT) putsl(test()) putsl(test2()) } mac test() 123 mac test2() { 234 } mac XC_SY_DEFAULT { (1+ 2+ 3) } ================================================ FILE: bin/example/11_5.h ================================================  void main() { B 1 2 C 1 [2 *3] C 1 [2*3*4] D 1 [2 3] v=array[7,8,9] v.join('').printl v=E(1,2,3) v.join('').printl v=E(1,2,3,4) v.join('').printl } mac$ B _word _word { rf.printl($0##$1) } mac$ C _word [ _mword ] { putsl($0+$1) } mac$ D _word [ _mword ] { putsl($0+$1=>0+$1=>1) } mac$ E ( _mword ) { array[$0] } ================================================ FILE: bin/example/11_6.h ================================================  void main() { ==> 2 3 <== ┏━━━━━┓ ┃ 1 2 ┃ ┃ 3 4 ┃ ┗━━━━━┛ } mac$ ==> _word _word <== { putsl(rstr($0)+rstr($1)) } mac$ ┏━━━━━┓┃ _word _word ┃ ┃ _word _word ┃┗━━━━━┛ { putsl(rstr($0)+'--'+rstr($1)+'--'+rstr($2)+'--'+rstr($3)) } ================================================ FILE: bin/example/11_7.h ================================================ /* 对比宏和模板函数 注意宏是无格式的,因此花括号和分号不可省略 */ void main() { putsl fb(1,2) putsl fb(0.5,0.6) putsl fa_int(1,2) putsl fa_double(0.5,0.6) } T fb(T a,T b) { return a+b; } fa int fa double define$ fa _word { $0 fa_##$0($0 a,$0 b) { return a+b; } } ================================================ FILE: bin/example/17_1.h ================================================ /* 闭包 */ void main() { int a=2 void[lambda(){puts a}] } ================================================ FILE: bin/example/17_2.h ================================================ /* 匿名函数 */ void main() { p=lambda(int a,int b){ putsl a+b } void[p,1,2] p=lambda(int,int a,int b){ return a+b } putsl int[p,1,2] } ================================================ FILE: bin/example/22_2.h ================================================ main { stdcall["MessageBoxA",0,"abc","123",0] stdcall["MessageBoxW",0,utf16c("abc"),utf16c("123"),0] @MessageBoxA(0,"aaa","bbb",0) #ifdef _JIT void[rf.find_dll("MessageBoxA"),0,"111","222",0] #endif } ================================================ FILE: bin/example/28.h ================================================ /* 全局变量定义的时候不能使用类型推断 */ int g_a=2 rbuf g_b(3) main { putsl g_a b=g_b b.count.printl } ================================================ FILE: bin/example/34_2.h ================================================ //嵌套类和嵌套命名空间 namespace A { } class A.B { int m_b A.B() { putsl('constructor') } static void func() { putsl('func') } } namespace A.B.C { void func() { putsl('func') } } void main() { A.B b b.m_b=3 putsl(b.m_b) A.B.func() A.B.C.func() } ================================================ FILE: bin/example/36_6.h ================================================ import rdic.h main { rdic a a['abc']=3 a['121213']=4 a['1']=1 for i=1 to 1000 a[i.torstr]=i a['121213'].printl } ================================================ FILE: bin/example/36_7.h ================================================ /* read self */ import "rfile.h" main { rfile file("example/36_7.h") file.read_all.sub(3).print //auto close file in destructor } ================================================ FILE: bin/example/42.h ================================================ /* RPP不支持重载小括号, 但是可以重载中括号实现C++的函数对象(仿函数) */ void main() { A a=lambda(int,int n){return n*n} puts a[3] } class A { void* m_func =(void* p) { m_func=p } T1 [](T2 n) { return T1[m_func,n] } } ================================================ FILE: bin/example/44.h ================================================ /* 惰性求值的方式实现短路求值 RPP是同时支持call_by_name和call_by_need和call_by_value的语言 该示例只能以JIT模式运行 */ import eval.h void main() { int* p=null //不能用 p!=null&&*p==2 因为 && 是非惰性的 if and(p!=null,*p==2) putsl('and') rbuf v //不能用 v.empty||v[0]!=5 因为 || 是非惰性的 if or(v.empty,v[0]!=5) putsl('or') //and和or是惰性的,可以带多个参数 if and(2>1,p==null,v.empty,3!=4) putsl('true') if and(and(2>1),3!=4) putsl('true') a=1 b=2 c=3 putsl and(and(a,b),c) putsl or(or(a,b),c) a=0 b=1 c=0 putsl and(and(a,b),c) putsl or(or(a,b),c) putsl or(and(a,b),c) putsl and(or(a,b),c) } ================================================ FILE: bin/example/50.h ================================================  main { test1 test2 test3 test4 test5 test6 } //浮点测试 test1 { putsl 0.2+0.3 putsl 0.2*0.3 putsl 0.2/0.3 putsl 0.2-0.3 putsl 0.2<0.3 putsl 0.2>0.3 a=99.2*20 putsl a putsl(-2) } //逻辑运算测试 test2 { putsl 0&&0 putsl 1&&0 putsl 0&&1 putsl 1&&1 putsl 0||0 putsl 1||0 putsl 0||1 putsl 1||1 } //自动类型转换测试 test3 { uint a=1 int c=5 putsl a+sizeof(int)!=c } //64位运算测试 test4 { int8 a=9 int8 b=3 putsl a/b putsl a*b putsl a%b putsl a-b putsl ab } test5 { if (2)==2 putsl('ok',,,) } test6 { putsl ORM[1,2] putsl ORM[1,2,4,8] putsl ORM[1] } ================================================ FILE: bin/example/51.h ================================================ /* 仅用位运算实现加减乘除,面试专用 */ main { fadd(1,2).printl fadd(19,29999).printl fsub(-1,3).printl fsub(19,2345).printl fmul(99,98).printl fmul(-29,235).printl fdiv(99,98).printl fdiv(9,3).printl fdiv(-9,3).printl fdiv(8,3).printl } int fadd(int x,int y) { for a=AND(x,y) b=XOR(x,y) x=SHL(a,1) y=b ifn a break return b } int fneg(int x) { return fadd(NOT(x),1) } int fsub(int x,int y) { return fadd(x,fneg(y)) } int fmul(int x,int y) { m=1 z=0 if x<0 x=fneg(x) y=fneg(y) for x>=m&&y if AND(x,m) z=fadd(y,z) y=SHL(y,1) m=SHL(m,1) return z } int fdiv(int x,int y) { c=0 sign=0 if x<0 x=fneg(x) sign=XOR(sign,1) if y<0 y=fneg(y) sign=XOR(sign,1) if y for x>=y x=fsub(x,y) c=fadd(c,1) if sign c=fneg(c) return c } ================================================ FILE: bin/example/52.h ================================================ /* 全排列的非递归实现,支持去掉重复 */ void main() { rbuf v #v.push(1,2,3,4) for v.join('').printl ifn next_permutation(v) break } bool next_permutation(rbuf& v) { if v.count<=1 return false next=v.count-1 for temp=next next-- if v[next](v[next],v[mid]) r_reverse(v,temp) return true if next==0 r_reverse(v,0) return false } ================================================ FILE: bin/example/53.h ================================================ /* KMP算法 */ void main() { putsl(find('abc123','c1')) putsl(find('abc123','c2')) } int find(rstr s,rstr p) { next=get_next(p) i=0 j=0 for i get_next(rstr p) { rbuf next(p.count) next[0]=-1 k=-1 j=0 for j stack #stack.push(3,4,1,9,10,2) print(stack) func(stack) print(stack) reverse(stack) print(stack) sort(stack) print(stack) } void print(rbuf& stack) { for i=0 to stack.count-1 putsl(stack[i]) putsl } void sort(rbuf& stack) { if stack.empty return a=stack.pop if stack.empty stack.push(a) return sort(stack) b=stack.pop if a& stack) { if stack.count<=1 return a=stack.pop func(stack) b=stack.pop if a& stack) { if stack.count<=1 return a=stack.pop reverse(stack) b=stack.pop reverse(stack) stack.push(a) reverse(stack) stack.push(b) } ================================================ FILE: bin/example/56.h ================================================ /* 组合遍历 */ main { n=7 sum=0 for i=0;i[1,2,3,4,5] v.join(' ').printl v.parallel(4,lambda(int& a){ a*=3 }) v.join(' ').printl } ================================================ FILE: bin/example/answer/1.txt ================================================ 3 ================================================ FILE: bin/example/answer/10_1.txt ================================================ 553628800553628800 ================================================ FILE: bin/example/answer/10_2.txt ================================================ 259 ================================================ FILE: bin/example/answer/10_3.txt ================================================ 1 rp 47 ================================================ FILE: bin/example/answer/11_1.txt ================================================ 9 5 55 3628800 ================================================ FILE: bin/example/answer/11_2.txt ================================================ 1 abc 98 3 ================================================ FILE: bin/example/answer/11_3.txt ================================================ 1 abc 2 5 20 100 ================================================ FILE: bin/example/answer/11_4.txt ================================================ 6 123 234 ================================================ FILE: bin/example/answer/11_5.txt ================================================ 12 7 25 6 789 123 1234 ================================================ FILE: bin/example/answer/11_6.txt ================================================ 23 1--2--3--4 ================================================ FILE: bin/example/answer/11_7.txt ================================================ 3 1.100000 3 1.100000 ================================================ FILE: bin/example/answer/12.txt ================================================ 3 3 3 3 ================================================ FILE: bin/example/answer/13.txt ================================================ 33333 ================================================ FILE: bin/example/answer/14_1.txt ================================================ 123 123 2 3 99 98 test main C 5 ================================================ FILE: bin/example/answer/17_1.txt ================================================ 2 ================================================ FILE: bin/example/answer/17_2.txt ================================================ 3 3 ================================================ FILE: bin/example/answer/18_1.txt ================================================ 12 ================================================ FILE: bin/example/answer/18_2.txt ================================================ 12 ================================================ FILE: bin/example/answer/19_1.txt ================================================ 3 6 103 10 16 ================================================ FILE: bin/example/answer/19_2.txt ================================================ 3 5 ================================================ FILE: bin/example/answer/2.txt ================================================ 3 ================================================ FILE: bin/example/answer/20.txt ================================================ 43 ================================================ FILE: bin/example/answer/21_1.txt ================================================ 02 ================================================ FILE: bin/example/answer/21_2.txt ================================================ 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 ================================================ FILE: bin/example/answer/22_1.txt ================================================ 3 3 0 1 -1 3 ================================================ FILE: bin/example/answer/23_1.txt ================================================ uint uint uint rstr int 97 255 ================================================ FILE: bin/example/answer/23_2.txt ================================================ 2 ================================================ FILE: bin/example/answer/23_3.txt ================================================ int int 0 ================================================ FILE: bin/example/answer/24.txt ================================================ 411c12 ================================================ FILE: bin/example/answer/25_1.txt ================================================ 0000011111222223333344444 ================================================ FILE: bin/example/answer/25_2.txt ================================================ 000011112222000011112222000011112222000011112222000011112222 ================================================ FILE: bin/example/answer/25_3.txt ================================================ 000011112222000011112222000011112222000011112222000011112222 ================================================ FILE: bin/example/answer/26_1.txt ================================================ func int func char ================================================ FILE: bin/example/answer/26_2.txt ================================================ 22 ================================================ FILE: bin/example/answer/27.txt ================================================ 2253344 ================================================ FILE: bin/example/answer/28.txt ================================================ 2 3 ================================================ FILE: bin/example/answer/29.txt ================================================ 23 ================================================ FILE: bin/example/answer/3.txt ================================================ 3 ================================================ FILE: bin/example/answer/30_1.txt ================================================ i>=10 1 0 ================================================ FILE: bin/example/answer/30_2.txt ================================================ 3 ================================================ FILE: bin/example/answer/31.txt ================================================ 123 123 abc'123 abc'123 97 97 97 100000000 100000000 10 10 10 0.500000 ================================================ FILE: bin/example/answer/32_1.txt ================================================ pass 1 pass 1 pass 1 pass 1 pass 1 pass 2 other pass 2 pass 2 pass 2 other other default default default ================================================ FILE: bin/example/answer/32_2.txt ================================================ 123456789123456789123456789123456789 ================================================ FILE: bin/example/answer/32_3.txt ================================================ a less than b a less than b 0123456789 ================================================ FILE: bin/example/answer/33_1.txt ================================================ 23 ================================================ FILE: bin/example/answer/33_2.txt ================================================ 34 ================================================ FILE: bin/example/answer/34_1.txt ================================================ 2224 ================================================ FILE: bin/example/answer/34_2.txt ================================================ constructor constructor 3 func func ================================================ FILE: bin/example/answer/35.txt ================================================ 3 2 1 ================================================ FILE: bin/example/answer/36_1.txt ================================================ 3 2 4 3 2 4 ================================================ FILE: bin/example/answer/36_10.txt ================================================ protected code ================================================ FILE: bin/example/answer/36_2.txt ================================================ 1 2 3 1 3 1 3 ================================================ FILE: bin/example/answer/36_3.txt ================================================ 4 ================================================ FILE: bin/example/answer/36_4.txt ================================================ 321 1343 fj242i 12 12 1343 321 fj242i 12 2 ================================================ FILE: bin/example/answer/36_5.txt ================================================ 3 6 123 ================================================ FILE: bin/example/answer/36_6.txt ================================================ 4 ================================================ FILE: bin/example/answer/36_7.txt ================================================ /* read self */ import "rfile.h" main { rfile file("example/36_7.h") file.read_all.sub(3).print //auto close file in destructor } ================================================ FILE: bin/example/answer/42.txt ================================================ 9 ================================================ FILE: bin/example/answer/44.txt ================================================ or true true 1 1 0 1 0 0 ================================================ FILE: bin/example/answer/4_1.txt ================================================ 3 ================================================ FILE: bin/example/answer/4_2.txt ================================================ 3 3 0 4 ================================================ FILE: bin/example/answer/50.txt ================================================ 0.500000 0.060000 0.666667 -0.100000 1 0 1984.000000 -2 0 0 0 1 0 1 1 1 0 3 27 0 6 0 1 ok 3 15 1 ================================================ FILE: bin/example/answer/51.txt ================================================ 3 30018 -4 -2326 9702 -6815 1 3 -3 2 ================================================ FILE: bin/example/answer/52.txt ================================================ 1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321 ================================================ FILE: bin/example/answer/53.txt ================================================ 2 -1 ================================================ FILE: bin/example/answer/54.txt ================================================ 1 1 ================================================ FILE: bin/example/answer/55.txt ================================================ 3 4 1 9 10 2 1 2 3 4 9 10 10 9 4 3 2 1 1 2 3 4 9 10 ================================================ FILE: bin/example/answer/56.txt ================================================ 35 120 720 35 ================================================ FILE: bin/example/answer/57.txt ================================================ 1 2 3 4 5 3 6 9 12 15 ================================================ FILE: bin/example/answer/5_1.txt ================================================ 454545 ================================================ FILE: bin/example/answer/5_2.txt ================================================ true232323233 ================================================ FILE: bin/example/answer/6.txt ================================================ 1abc 123abc 123abc ================================================ FILE: bin/example/answer/7.txt ================================================ -2-2-222 ================================================ FILE: bin/example/answer/8.txt ================================================ 3eax is not zero ================================================ FILE: bin/example/answer/9.txt ================================================ cab132 123abc ================================================ FILE: bin/example/asm_opt.h ================================================ /* 汇编优化工具 使汇编代码更具可读性,并提高汇编速度 优化15000行大约需要30秒 */ import rfile.h main { //name=getsl name='http.asm' s=rfile.read_all_n(name) s=s.replace('\n','\r\n') s=s.replace('dword esp','esp') s=s.replace('dword ebp','ebp') s=s.replace('dword edi','edi') s=s.replace('dword esi','esi') s=s.replace('dword ebx','ebx') s=s.replace(',ecx',', ecx') s=s.replace('ebx,0','ebx , 0') s=s.replace('ecx,[','ecx , [') s=s.replace('mov dword [ edi ] , esi','mov [ edi ] , esi') s=opt_sym(s) s=line_del(s) s=opt_jmp(s) s=line_del(s) s=opt_two(s) s=line_del(s) s=sym_replace(s) s=line_del(s) rfile.write_all_n(name,s) } rstr line_del(rstr& s) { return s.replace('\r\n\r\n\r\n','\r\n\r\n') } //符号替换 rstr sym_replace(rstr s) { rbuf arr r_split_e(s,'\r\n',arr) rstr ret for i in arr temp=arr[i] if temp.get_top==`:&&is_symbol(temp.sub(0,temp.count-1)) ret+=sym_trans(temp.sub(0,temp.count-1))+':' ret+='\r\n' continue if (temp.sub(0,5)==' jmp '|| temp.sub(0,6)==' call '|| temp.sub(0,5)==' jnz '|| temp.sub(0,4)==' jg '|| temp.sub(0,4)==' jl '|| temp.sub(0,5)==' jae '|| temp.sub(0,4)==' jz ') index=temp.find(' ') symbol=temp.sub(index+1) if is_symbol(symbol) ret+=temp.sub(0,index+1)+sym_trans(symbol) ret+='\r\n' continue ret+=temp ret+='\r\n' return ret } rstr sym_trans(rstr s) { rstr ret for i in s two=s.sub(i,i+2) if two=='28'||two=='29'//() i++ ret+='_' elif two=='2E'||two=='2C'||two=='5F'//.,_ i++ ret+='_' elif two=='26' i++ ret+='q' elif two=='7E' i++ ret+='d' elif two=='7C' i++ ret+='h' elif two=='5B' i++ ret+='i' elif two=='5D' i++ ret+='j' elif two=='3D'//= i++ ret+='a' elif two=='2B' i++ ret+='b' elif two=='2D'//- i++ ret+='s' elif two=='2A'//* i++ ret+='t' elif two=='2F' i++ ret+='f' elif two=='25' i++ ret+='e' elif two=='21'//! i++ ret+='o' elif two=='3E'//> i++ ret+='x' elif two=='3C'//< i++ ret+='y' else ret+=s[i] return seq_replace(ret) } rstr seq_replace(rstr s) { //s=s.replace('__','_') //s=s.replace('__','_') //s=s.replace('__','_') if s.get_top==`_ s.pop if s.get_top==`_ s.pop return s } //无引用符号删除 rstr opt_sym(rstr s) { rbuf arr r_split_e(s,'\r\n',arr) rstr ret for i in arr temp=arr[i] full=temp.sub(0,temp.count-1) if temp.get_top==`:&&is_symbol(full) symbol=get_symbol(full) ifn symbol.empty if get_count(arr,i,symbol,full)==1 continue ret+=temp ret+='\r\n' return ret } //jmp后接一个跳转符号 rstr opt_jmp(rstr s) { rbuf arr r_split_e(s,'\r\n',arr) rstr ret for i in arr temp=arr[i] a=arr.get(i+1) full=a.sub(0,a.count-1) if temp.sub(0,5)==' jmp '&&temp.sub(5)==full&&a.get_top==`: symbol=get_symbol(full) ifn symbol.empty if get_count(arr,i,symbol,full)==2 i++ continue else continue ret+=temp ret+='\r\n' return ret } //连续2个jmp,后一个jmp不可能被执行 rstr opt_two(rstr s) { rbuf arr r_split_e(s,'\r\n',arr) rstr ret for i in arr temp=arr[i] a=arr.get(i+1) if temp.sub(0,5)==' jmp '&&a.sub(0,5)==' jmp ' ret+=temp ret+='\r\n' i++ continue ret+=temp ret+='\r\n' return ret } int get_count(rbuf& arr,int i,rstr& symbol,rstr& full) { for j=i-1;j>=0;j-- if arr[j].sub(0,arr[j].count-1)==symbol&&`:==arr[j].get_top break for k=i+1;k=0;i-- if s[i]==`_&&s.sub(i+1).is_number return s.sub(0,i) return '' } int find_count(rbuf& arr,int left,int right,rstr& symbol) { count=0 for i=left;i<=right;i++ count+=find_count(arr[i],symbol) return count } int find_count(rstr src,rstr dst) { count=0 for i in src if src.sub(i,i+dst.count)==dst count++ return count } bool is_symbol(rstr s) { for i in s ifn is_symbol(s[i]) return false return true } bool is_symbol(char ch) { return ch>=`A&&ch<=`Z||ch>=`a&&ch<=`z||ch>=`0&&ch<=`9||ch==`_ } ================================================ FILE: bin/example/bf.h ================================================ /* BF解释器增强版,支持32位运算 这个语言并不像看上去那么简单,下面是一个BF版的Hello World: ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++. >+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. */ void main() { code=getsl rbuf data(30000) rf.memset(data.begin,0,data.size) pd=0 for pc=0;pc pd++ case `< pd-- case `+ data[pd]++ case `- data[pd]-- case `. puts(rstr.format('%c',data[pd])) case `, data[pd]=rf.getch case `[ ifn data[pd] pc=find< ++ >(pc,code,`[,`]) continue//这里也可用continued case `] if data[pd] pc=find< -- >(pc,code,`],`[) continue } int find(int pc,rstr& code,int left,int right) { count=0 for i=pc;;i T if code[i]==left count++ elif code[i]==right count-- if count==0 return i } ================================================ FILE: bin/example/check.h ================================================ /* 分别以解释方式和编译方式运行example下所有例子, 并与标准答案进行对比,以此来检验编译器的正确性。 */ import rdir.h import rfile.h int g_sta_ok int g_total main { use_paral=rf.get_param.get_top=='-paral' g_sta_ok=1 start=rf.tick g_total=0 v=rdir.get_file_bfs('./example/') rbuf vname for i in v name=rdir.get_name(v[i]) suffix=rdir.get_suffix(name) if suffix!='h' continue a=name.sub(0,name.count-2) if is_ignore(a) continue vname.push(a) rbuf vtime num=4 time=rf.tick if use_paral vname.parallel(num,lambda(rstr& b){ check_interpret(b) }) else for i in vname check_interpret(vname[i]) vtime.push(rf.tick-time) time=rf.tick if use_paral vname.parallel(num,lambda(rstr& b){ check_jit(b) }) else for i in vname check_jit(vname[i]) vtime.push(rf.tick-time) time=rf.tick if use_paral vname.parallel(num,lambda(rstr& b){ check_pack(b) }) else for i in vname check_pack(vname[i]) vtime.push(rf.tick-time) time=rf.tick if use_paral vname.parallel(num,lambda(rstr& b){ check_exe(b) }) else for i in vname check_exe(vname[i]) vtime.push(rf.tick-time) putsl for i in vtime putsl 'time'+i+': '+vtime[i] putsl putsl('total: '+g_total) putsl('time: '+(rf.tick-start)) putsl('state: '+r_cond(g_sta_ok,'ok','error')) rf.getch } bool is_ignore(rstr a) { ifn a.sub(0,1).is_number return true if a=='14_2'||a=='22_2'||a=='36_8'||a=='36_9' return true if a.sub(0,3)=='16_' return true if a.sub(0,3)=='40_' return true return false } check_interpret(rstr a) { if a=='21_2'||a=='44'||a=='14_1' return rf.cmd('rpp example/'+a+'.h > example/answer/'+a+'_tmp.txt') check_interpret('example/answer/'+a+'_tmp.txt', 'example/answer/'+a+'.txt') } check_jit(rstr a) { rf.cmd('rjit example\\'+a+'.h > example/answer/'+a+'_tmp.txt') check_jit('example/answer/'+a+'_tmp.txt','example/answer/'+a+'.txt') } check_pack(rstr a) { rf.cmd('rpack example\\'+a+'.h') rf.cmd('example\\'+a+'.exe > example/answer/'+a+'_tmp.txt') check_pack('example/answer/'+a+'_tmp.txt','example/answer/'+a+'.txt') rfile.remove('example\\'+a+'.exe') } check_exe(rstr a) { if a=='13'||a=='22_1'||a=='44'||a=='14_1' return rf.cmd('run example\\'+a+'.h > example/answer/'+a+'_tmp.txt') check_exe('example/answer/'+a+'_tmp.txt','example/answer/'+a+'.txt') } check_interpret(rstr a,rstr b) { //不严谨,应该使用互斥体 g_total++ cont=rfile.read_all_n(a); if cont.count>0&&cont==rfile.read_all_n(b) puts('ok ') else puts('* * * error ') g_sta_ok=0 putsl('interpret '+a.sub(15)+' vs '+b.sub(15)) ifn rfile.remove(a) putsl('* * * error ') g_sta_ok=0 } check_jit(rstr a,rstr b) { g_total++ cont=rfile.read_all_n(a); if cont.count>0&&cont==rfile.read_all_n(b) puts('ok ') else puts('* * * error ') g_sta_ok=0 putsl('jit '+a.sub(15)+' vs '+b.sub(15)) ifn rfile.remove(a) putsl('* * * error ') g_sta_ok=0 } check_pack(rstr a,rstr b) { g_total++ cont=rfile.read_all_n(a); if cont.count>0&&cont==rfile.read_all_n(b) puts('ok ') else puts('* * * error ') g_sta_ok=0 putsl('pack '+a.sub(15)+' vs '+b.sub(15)) ifn rfile.remove(a) putsl('* * * error ') g_sta_ok=0 } check_exe(rstr a,rstr b) { g_total++ cont=rfile.read_all_n(a) cont=cont.sub(cont.find('\x73\x0d\x0a')+3)//去掉golink打印的信息 if cont.count>0&&cont==rfile.read_all_n(b) puts('ok ') else puts('* * * error ') g_sta_ok=0 putsl('exe '+a.sub(15)+' vs '+b.sub(15)) ifn rfile.remove(a) putsl('* * * error ') g_sta_ok=0 } ================================================ FILE: bin/example/code.h ================================================ /* 检查当前目录下文本文件的编码类型 */ import "rdir.h" main { v=rdir.get_file_bfs('./') for i in v { if v[i].get_top==`/ continue rfile file(v[i]) rbuf buf(3) ifn(file.read(3,buf.begin)) break s=v[i]+' ' if(buf[0]==0xff&&buf[1]==0xfe) s+='utf16' elif(buf[0]==0xef&&buf[1]==0xbb&&buf[2]==0xbf) s+='utf8' else s+='gbk' s.printl } } ================================================ FILE: bin/example/compile_speed.h ================================================ //1.h amd 3.45GHZ cost time 3600ms ,new version 2800ms 1.89 2609ms fix2 2516ms 2094ms //36_2.h cost time 5375ms (1.83 4985ms),new version 4438ms 1.89 4156ms 3375ms main { start=rf.tick for i=1 to 10 //rf.cmd("rpp example\\36_2.h") rf.cmd("rpp example\\1.h") putsl putsl(rf.tick-start) } ================================================ FILE: bin/example/count.h ================================================ /* 统计当前目录下代码行数 如果使用utf16统计更准确 */ import rdir.h import rfile.h int g_sum=0 count_line(rstr name) { s=rfile.read_all_n(name) sum=1 for i=0;i['cpp','h'] str='s_ret' //todo utf16转换 v=rdir.get_file_bfs(dir) for i in v name=rdir.get_name(v[i]) suffix=rdir.get_suffix(name) if(v[i].get_top()==`/) continue ifn arr.exist(suffix) continue s=rfile.read_all_n(v[i]) if s.find(str)(temp,'\r\n') for i in v ifn check_line(v[i]) putsl('line '+(i+1)) return false return true } bool check_file(rstr name) { rfile file(name) rbuf buf(3) ifn(file.read(3,buf.begin)) return false ok=false if(buf[0]==0xff&&buf[1]==0xfe) s=rfile.read_all_n(name).sub(2) ok=check_s(rstrw(s.begin,s.count)) elif(buf[0]==0xef&&buf[1]==0xbb&&buf[2]==0xbf) s=rfile.read_all_n(name).sub(3) ok=check_s(rstrw(s)) if ok return true putsl(name) return false } void main() { if rf.get_param.count<3 return v=rdir.get_file_bfs(rf.get_param.top) for i in v name=v[i] if name.sub(name.count-2)=='.h' ifn check_file(name) break elif name.sub(name.count-4)=='.cpp' ifn check_file(name) break } ================================================ FILE: bin/example/lisp.h ================================================ /* 60行RPP实现的lisp解释器 未处理lambda、上下文等,有待完善 */ void main() { for putsl(eval(getsl)) } rstr eval(rstr s) { return eval(tokenize(s).split(' ')) } rstr eval(rbuf& v) { if v.get(0)!='(' return v.get(0) next=find(v.sub(2))+2 switch v.get(1) case '+' return eval(v.sub(2,next)).toint+eval(v.sub(next,v.count-1)).toint case '-' return eval(v.sub(2,next)).toint-eval(v.sub(next,v.count-1)).toint case '*' return eval(v.sub(2,next)).toint*eval(v.sub(next,v.count-1)).toint case '/' return eval(v.sub(2,next)).toint/eval(v.sub(next,v.count-1)).toint return '' } int find(rbuf& v) { return r_cond(v.get(0)=='(',find_sbk(v)+1,1) } int find_sbk(rbuf& v) { count=0 for i in v if '('==v[i] ++count if ')'==v[i] --count if 0==count return i return v.count } rstr tokenize(rstr s) { rstr ret for i in s if s[i]==`( ret+=' ( ' elif s[i]==`) ret+=' ) ' elif s[i]==0xa||s[i]==0xd||s[i]==9 ret+=' ' else ret+=s[i] return ret } ================================================ FILE: bin/example/run.h ================================================ /* 编译生成exe并运行 */ import rfile.h import rdir.h main { v=rf.get_param if v.count<3 putsl('invaild param') return a=v[2] if rf.cmd('rpp.exe -win '+a)==0 putsl('compile error') return b=rdir.get_real_name(a) if rf.cmd('nasm\\nasm.exe -f win32 '+b+'.asm -o '+b+'.obj')==0 clear(b) putsl('asm error') return cmd='nasm\\GoLink.exe /console /mix /entry _main ' cmd+=b+'.obj msvcrt.dll ws2_32.dll kernel32.dll user32.dll' if rf.cmd(cmd)==0 clear(b) putsl('link error') return clear(b) if v.count==3 rf.cmd(b+'.exe') elif v.count==4&&v.get(3)=='-build' ; elif v.count==4&&v.get(3)=='-del' rf.cmd(b+'.exe') ifn rfile.remove(rcode.gbk_to_utf8(b)+'.exe') ;//很可能是由于golink没有关闭EXE导致无法删除 elif v.count==4&&v.get(3)=='-check' ifn rfile.remove(rcode.gbk_to_utf8(b)+'.exe') putsl 'delete error' } clear(rstr b) { b=rcode.gbk_to_utf8(b) rfile.remove(b+'.asm') rfile.remove(b+'.obj') } ================================================ FILE: bin/example/snake.h ================================================ /* 彩色版控制台贪食蛇 该游戏只能以解释模式或JIT模式运行 */ int g_std_out rbuf g_arr int g_next int g_food void main() { begin: init start=rf.tick for key if rf.tick-start<100 continue start=rf.tick ifn check goto begin g_arr.push_front(g_arr[0]+g_next) if g_food!=g_arr[0] g_arr.pop else food update } void update() { for i=0 to 199 gotoxy(i%10*2,i/10) if g_arr.exist(i) out("■") elif i==g_food out("★") else puts(" ") } void init() { rf.srand g_std_out=rf.GetStdHandle(-11) g_next=10 g_arr.clear g_arr.push(105) food CONSOLE_CURSOR_INFO cur_info cur_info.dwSize=1 cur_info.bVisible=0 rf.SetConsoleCursorInfo(g_std_out,&cur_info) rf.cmd("mode con cols=20 lines=22")//保留一行留给输入法 rf.SetConsoleTextAttribute(g_std_out,0x0a) gotoxy(0,20) puts(" ******************") } void key() { if rf.GetAsyncKeyState(0x26) temp=-10 elif rf.GetAsyncKeyState(0x28) temp=10 elif rf.GetAsyncKeyState(0x25) temp=-1 elif rf.GetAsyncKeyState(0x27) temp=1 else return if g_arr.count<2||g_arr.get(1)!=g_arr.get(0)+temp g_next=temp } bool check() { temp=g_arr[0]+g_next if temp<0||temp>199||int.abs(temp%10-g_arr[0]%10)>1||g_arr.exist(temp) rf.MessageBoxA(0,('over len '+g_arr.count).cstr,"",0) return false return true } void food() { g_food=rf.rand()%200 if g_arr.exist(g_food) food } void out(char* s) { puts(rcode.utf8_to_gbk(s)) } void gotoxy(int x,int y) { COORD pos pos.x=x pos.y=y rf.SetConsoleCursorPosition(g_std_out,*(&pos).to) } struct CONSOLE_CURSOR_INFO { int dwSize bool bVisible } struct COORD { ushort x ushort y } ================================================ FILE: bin/example/time.h ================================================ main { s=getsl start=rf.tick rf.cmd(s) putsl putsl(rf.tick-start) } ================================================ FILE: bin/gl/1.h ================================================ /* 下面是编译期计算示例,sum是一个宏,计算从0加到N */ import rpp.h void main() { putsl sum(100)//输出5050 putsl sum(10)//输出55 } macro void sum(rbuf& v,int index) { result=0 param=v.get(index+2).val.toint for i=0;i<=param;i++ result+=i v[index].val=result for i=1;i<=3;i++ v[index+i].val.clear } ================================================ FILE: bin/gl/2.h ================================================ /* RPP的macro具有和Lisp宏一样强大的表达能力 这种宏可以用写代码对代码进行变换,这就比C语言的宏强大得多 下面是变参宏示例 注意macro只能是全局的 */ import rpp.h void main() { putsl sum(98,56) putsl sum(1,2,3,4) putsl sum(43,534,65,645,54,2) } macro void sum(rbuf& v,int index) { left=index+1 right=find_symm_sbk(v,left) result=0 for i=index+2;i& v,int index) { count=v[index-1].val.toint for i=index;i define M3DVector4f carray define M3DMatrix44f carray class GLFrame { M3DVector3f vOrigin M3DVector3f vForward M3DVector3f vUp GLFrame() { vOrigin[0]=0.0f vOrigin[1]=0.0f vOrigin[2]=0.0f vUp[0]=0.0f vUp[1]=1.0f vUp[2]=0.0f vForward[0]=0.0f vForward[1]=0.0f vForward[2]=-1.0f } void MoveForward(float fDelta) { vOrigin[0]+=vForward[0]*fDelta vOrigin[1]+=vForward[1]*fDelta vOrigin[2]+=vForward[2]*fDelta } void MoveRight(float fDelta) { M3DVector3f vCross m3dCrossProduct(vCross,vUp,vForward) vOrigin[0]+=vCross[0]*fDelta vOrigin[1]+=vCross[1]*fDelta vOrigin[2]+=vCross[2]*fDelta } static void m3dGetPlaneEquation(M3DVector4f& planeEq,M3DVector3f& p1, M3DVector3f& p2,M3DVector3f& p3) { M3DVector3f v1 M3DVector3f v2 v1[0]=p3[0]-p1[0] v1[1]=p3[1]-p1[1] v1[2]=p3[2]-p1[2] v2[0]=p2[0]-p1[0] v2[1]=p2[1]-p1[1] v2[2]=p2[2]-p1[2] m3dCrossProduct(*(&planeEq).to,v1,v2) m3dNormalizeVector(*(&planeEq).to) planeEq[3]=-(planeEq[0]*p3[0]+planeEq[1]*p3[1]+planeEq[2]*p3[2]) } static float m3dGetVectorLengthSquared(M3DVector3f& u) { return(u[0]*u[0])+(u[1]*u[1])+(u[2]*u[2]) } static float m3dGetVectorLength(M3DVector3f& u) { return FL(math.sqrt(double(m3dGetVectorLengthSquared(u)))) } static void m3dNormalizeVector(M3DVector3f& u) { m3dScaleVector3(u,1.0f/m3dGetVectorLength(u)) } static void m3dScaleVector3(M3DVector3f& v,float scale) { v[0]*=scale v[1]*=scale v[2]*=scale } static void m3dCrossProduct(M3DVector3f& result,M3DVector3f& u,M3DVector3f& v) { result[0]=u[1]*v[2]-v[1]*u[2] result[1]=-u[0]*v[2]+v[0]*u[2] result[2]=u[0]*v[1]-v[0]*u[1] } void ApplyCameraTransform(bool bRotOnly=false) { M3DMatrix44f m GetCameraOrientation(m) @glMultMatrixf(&m) if(!bRotOnly) { @glTranslatef(-vOrigin[0],-vOrigin[1],-vOrigin[2]) } } static void m3dMakePlanarShadowMatrix( M3DMatrix44f& proj, M3DVector4f& planeEq, M3DVector4f& vLightPos) { float a=planeEq[0] float b=planeEq[1] float c=planeEq[2] float d=planeEq[3] float dx=-vLightPos[0] float dy=-vLightPos[1] float dz=-vLightPos[2] proj[0]=b*dy+c*dz proj[1]=-a*dy proj[2]=-a*dz proj[3]=0.0 proj[4]=-b*dx proj[5]=a*dx+c*dz proj[6]=-b*dz proj[7]=0.0 proj[8]=-c*dx proj[9]=-c*dy proj[10]=a*dx+b*dy proj[11]=0.0 proj[12]=-d*dx proj[13]=-d*dy proj[14]=-d*dz proj[15]=a*dx+b*dy+c*dz } mac M(row,col) m[col*4+row] void GetCameraOrientation(M3DMatrix44f& m) { M3DVector3f x M3DVector3f z z[0]=-vForward[0] z[1]=-vForward[1] z[2]=-vForward[2] m3dCrossProduct(x,vUp,z) M(0,0)=x[0] M(0,1)=x[1] M(0,2)=x[2] M(0,3)=0.0 M(1,0)=vUp[0] M(1,1)=vUp[1] M(1,2)=vUp[2] M(1,3)=0.0 M(2,0)=z[0] M(2,1)=z[1] M(2,2)=z[2] M(2,3)=0.0 M(3,0)=0.0 M(3,1)=0.0 M(3,2)=0.0 M(3,3)=1.0 } } ================================================ FILE: bin/gl/gl.h ================================================  void init_glut() { v=rf.get_param num=v.count rbuf argv for i=0;i,*((&(a)).to+1) } mac cd_protect { push ebx; push esi; push edi; } mac cd_ret { pop edi; pop esi; pop ebx; pop ebp; retn; } mac GL_PI 3.1415926 #define GL_POINTS 0x0000 #define GL_LINES 0x0001 #define GL_MODELVIEW 0x1700 #define GL_PROJECTION 0x1701 #define GLfloat float #define GL_COLOR_BUFFER_BIT 0x00004000 #define GL_DEPTH_BUFFER_BIT 0x00000100 #define GLUT_KEY_F1 0x0001 #define GLUT_KEY_F2 0x0002 #define GLUT_KEY_F3 0x0003 #define GLUT_KEY_F4 0x0004 #define GLUT_KEY_F5 0x0005 #define GLUT_KEY_F6 0x0006 #define GLUT_KEY_F7 0x0007 #define GLUT_KEY_F8 0x0008 #define GLUT_KEY_F9 0x0009 #define GLUT_KEY_F10 0x000A #define GLUT_KEY_F11 0x000B #define GLUT_KEY_F12 0x000C #define GLUT_KEY_LEFT 0x0064 #define GLUT_KEY_UP 0x0065 #define GLUT_KEY_RIGHT 0x0066 #define GLUT_KEY_DOWN 0x0067 #define GLUT_KEY_PAGE_UP 0x0068 #define GLUT_KEY_PAGE_DOWN 0x0069 #define GLUT_KEY_HOME 0x006A #define GLUT_KEY_END 0x006B #define GLUT_KEY_INSERT 0x006C #define GLUT_LEFT_BUTTON 0x0000 #define GLUT_MIDDLE_BUTTON 0x0001 #define GLUT_RIGHT_BUTTON 0x0002 #define GLUT_DOWN 0x0000 #define GLUT_UP 0x0001 #define GLUT_LEFT 0x0000 #define GLUT_ENTERED 0x0001 #define GLUT_RGB 0x0000 #define GLUT_RGBA 0x0000 #define GLUT_INDEX 0x0001 #define GLUT_SINGLE 0x0000 #define GLUT_DOUBLE 0x0002 #define GLUT_ACCUM 0x0004 #define GLUT_ALPHA 0x0008 #define GLUT_DEPTH 0x0010 #define GLUT_STENCIL 0x0020 #define GLUT_MULTISAMPLE 0x0080 #define GLUT_STEREO 0x0100 #define GLUT_LUMINANCE 0x0200 #define GLUT_MENU_NOT_IN_USE 0x0000 #define GLUT_MENU_IN_USE 0x0001 #define GLUT_NOT_VISIBLE 0x0000 #define GLUT_VISIBLE 0x0001 #define GLUT_HIDDEN 0x0000 #define GLUT_FULLY_RETAINED 0x0001 #define GLUT_PARTIALLY_RETAINED 0x0002 #define GLUT_FULLY_COVERED 0x0003 #define GL_LIGHT0 0x4000 #define GL_LIGHT1 0x4001 #define GL_LIGHT2 0x4002 #define GL_LIGHT3 0x4003 #define GL_LIGHT4 0x4004 #define GL_LIGHT5 0x4005 #define GL_LIGHT6 0x4006 #define GL_LIGHT7 0x4007 #define GL_AMBIENT 0x1200 #define GL_DIFFUSE 0x1201 #define GL_SPECULAR 0x1202 #define GL_POSITION 0x1203 #define GL_SPOT_DIRECTION 0x1204 #define GL_SPOT_EXPONENT 0x1205 #define GL_SPOT_CUTOFF 0x1206 #define GL_CONSTANT_ATTENUATION 0x1207 #define GL_LINEAR_ATTENUATION 0x1208 #define GL_QUADRATIC_ATTENUATION 0x1209 #define GL_DEPTH_TEST 0x0B71 #define GL_LIGHTING 0x0B50 #define GL_FRONT 0x0404 #define GL_BACK 0x0405 #define GL_CCW 0x0901 #define GL_CULL_FACE 0x0B44 #define GL_LIGHT_MODEL_AMBIENT 0x0B53 #define GL_COLOR_MATERIAL 0x0B57 #define GL_AMBIENT_AND_DIFFUSE 0x1602 #define GL_SHININESS 0x1601 ================================================ FILE: bin/gl/line.h ================================================ /* RPP for OpenGL 使用上下左右旋转,代码摘自《OpenGL超级宝典》 该例子只能以JIT模式运行,并且需要最新的显卡驱动 运行命令:rjit gl\line.h */ import math.h import gl.h double g_x double g_y void main() { g_x=0 g_y=0 void* handle=@LoadLibraryA("gl/freeglut.dll") if handle==null return void[rf.find_dll("set_dll_list")] init_glut @glutInitWindowSize(800,600) @glutCreateWindow("line") @glutInitDisplayMode(ORM[GLUT_DOUBLE,GLUT_RGBA,GLUT_DEPTH]) @glutDisplayFunc(&render) @glutSpecialFunc(lambda(int key,int x,int y){ cd_protect input(key,x,y) cd_ret }) @glutReshapeFunc(lambda(int w,int h){ cd_protect change(w,h) cd_ret }) init() @glutMainLoop() @FreeLibrary(handle) } cfunc void render() { @glClear(GL_COLOR_BUFFER_BIT) @glPushMatrix() @glRotatef(FL(g_x),1.0f,0.0f,0.0f) @glRotatef(FL(g_y),0.0f,1.0f,0.0f) @glBegin(GL_LINES) z=0.0 for angle=0.0;angle<=GL_PI;angle+=GL_PI/20.0 x=50.0*math.sin(angle) y=50.0*math.cos(angle) @glVertex3f(FL(x),FL(y),FL(z)) x=50.0*math.sin(angle+GL_PI) y=50.0*math.cos(angle+GL_PI) @glVertex3f(FL(x),FL(y),FL(z)) @glEnd() @glPopMatrix() @glutSwapBuffers() } void input(int key,int x,int y) { switch key case GLUT_KEY_UP g_x-=5.0 case GLUT_KEY_DOWN g_x+=5.0 case GLUT_KEY_LEFT g_y-=5.0 case GLUT_KEY_RIGHT g_y+=5.0 @glutPostRedisplay() } void change(int w,int h) { range=100.0 if h==0 h=1 @glViewport(0,0,w,h) @glMatrixMode(GL_PROJECTION) @glLoadIdentity() if w<=h @glOrtho(D8(-range),D8(range),D8(-range*h/w), D8(range*h/w),D8(-range),D8(range)) else @glOrtho(D8(-range*w/h),D8(range*w/h),D8(-range), D8(range),D8(-range),D8(range)) @glMatrixMode(GL_MODELVIEW) @glLoadIdentity() } void init() { @glClearColor(0.0f,0.0f,0.0f,0.0f) @glColor3f(0.0f,1.0f,0.0f) } ================================================ FILE: bin/gl/sphere.h ================================================ /* RPP for OpenGL 使用上下左右移动,代码摘自《OpenGL超级宝典》 该例子只能以JIT模式运行,并且需要最新的显卡驱动 运行命令:rjit gl\sphere.h */ import math.h import gl.h import frame.h M3DMatrix44f g_shadow_matrix GLFrame g_camera double g_y carray g_light_pos carray g_no_light carray g_low_light carray g_bright_light void main() { g_y=0 g_light_pos=array[-100.0f, 100.0f, 50.0f, 1.0f] g_no_light=array[0.0f, 0.0f, 0.0f, 0.0f] g_low_light=array[0.25f, 0.25f, 0.25f, 1.0f] g_bright_light=array[1.0f, 1.0f, 1.0f, 1.0f] void* handle=@LoadLibraryA("gl/freeglut.dll") if handle==null return void[rf.find_dll("set_dll_list")] init_glut @glutInitWindowSize(800,600) @glutCreateWindow("sphere") @glutInitDisplayMode(ORM[GLUT_DOUBLE,GLUT_RGBA,GLUT_DEPTH]) @glutDisplayFunc(&render) @glutSpecialFunc(lambda(int key,int x,int y){ cd_protect input(key,x,y) cd_ret }) @glutReshapeFunc(lambda(int w,int h){ cd_protect change(w,h) cd_ret }) init() @glutMainLoop() @FreeLibrary(handle) } void draw(int shadow) { if shadow==0 g_y+=0.3f else @glColor3f(0.0f,0.0f,0.0f) if shadow==0 @glColor3f(0.0f,1.0f,0.0f) @glPushMatrix() @glTranslatef(0.0f,0.1f,-2.5f) if shadow==0 @glColor3f(0.0f,0.0f,1.0f) @glPushMatrix() @glRotatef(FL(-g_y*2.0f),0.0f,1.0f,0.0f) @glTranslatef(1.0f,0.0f,0.0f) @glutWireTorus(D8(0.1),D8(0.1),17,9) @glPopMatrix() if shadow==0 @glColor3f(0.0f,1.0f,0.0f) @glMaterialfv(GL_FRONT,GL_SPECULAR,&g_bright_light) @glRotatef(g_y.tofloat,0.0f,1.0f,0.0f) @glutWireTorus(D8(0.15),D8(0.35),61,37) @glMaterialfv(GL_FRONT,GL_SPECULAR,&g_no_light) @glPopMatrix() } cfunc void render() { @glClear(ORM[GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT]) @glPushMatrix() g_camera.ApplyCameraTransform() @glLightfv(GL_LIGHT0,GL_POSITION,&g_light_pos) @glColor3f(0.60f,0.40f,0.10f) @glDisable(GL_DEPTH_TEST) @glDisable(GL_LIGHTING) @glPushMatrix() @glMultMatrixf(&g_shadow_matrix) draw(1) @glPopMatrix() @glEnable(GL_LIGHTING) @glEnable(GL_DEPTH_TEST) draw(0) @glPopMatrix() @glutSwapBuffers() @glutPostRedisplay() } void input(int key,int x,int y) { switch key case GLUT_KEY_UP g_camera.MoveForward(0.1f) case GLUT_KEY_DOWN g_camera.MoveForward(-0.1f) case GLUT_KEY_LEFT g_camera.MoveRight(0.1f) case GLUT_KEY_RIGHT g_camera.MoveRight(-0.1f) @glutPostRedisplay() } void change(int w,int h) { if h==0 h=1 @glViewport(0,0,w,h) @glMatrixMode(GL_PROJECTION) @glLoadIdentity() @gluPerspective(D8(35.0),D8(double(w)/h),D8(1.0f),D8(50.0f)) @glMatrixMode(GL_MODELVIEW) @glLoadIdentity() } void init() { M3DVector3f vPoints0=array[0.0f,-0.4f,0.0f] M3DVector3f vPoints1=array[10.0f,-0.4f,0.0f] M3DVector3f vPoints2=array[5.0f,-0.4f,-5.0f] @glClearColor(g_low_light[0],g_low_light[1],g_low_light[2],g_low_light[3]) @glCullFace(GL_BACK) @glFrontFace(GL_CCW) @glEnable(GL_CULL_FACE) @glEnable(GL_DEPTH_TEST) @glLightModelfv(GL_LIGHT_MODEL_AMBIENT,&g_no_light) @glLightfv(GL_LIGHT0,GL_AMBIENT,&g_low_light) @glLightfv(GL_LIGHT0,GL_DIFFUSE,&g_bright_light) @glLightfv(GL_LIGHT0,GL_SPECULAR,&g_bright_light) @glEnable(GL_LIGHTING) @glEnable(GL_LIGHT0) M3DVector4f vPlaneEquation GLFrame.m3dGetPlaneEquation(vPlaneEquation,vPoints0,vPoints1,vPoints2) GLFrame.m3dMakePlanarShadowMatrix(g_shadow_matrix,vPlaneEquation,g_light_pos) @glEnable(GL_COLOR_MATERIAL) @glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE) @glMateriali(GL_FRONT,GL_SHININESS,128) } ================================================ FILE: bin/ide/License.txt ================================================ License for Scintilla and SciTE Copyright 1998-2003 by Neil Hodgson All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ================================================ FILE: bin/ide/SciTE.properties ================================================ # SciTE.properties is the per directory local options file and can be used to # override settings made in SciTEGlobal.properties, SciTEUser.properties and # SciTEDirectory.properties. command.build.directory.*.cxx=..\win32 command.build.directory.*.h=..\win32 command.build.*.cxx=nmake -f scite.mak DEBUG=1 QUIET=1 command.build.*.h=nmake -f scite.mak DEBUG=1 QUIET=1 command.go.*.cxx=..\bin\SciTE command.go.*.h=..\bin\SciTE command.go.needs.*.cxx=cmd /c cd ..\win32 && nmake -f scite.mak DEBUG=1 QUIET=1 ================================================ FILE: bin/ide/SciTEGlobal.properties ================================================ # Global initialisation file for SciTE # For Linux, place in $prefix/share/scite # For Windows, place in same directory as SciTE.EXE (or Sc1.EXE) # Documentation at http://www.scintilla.org/SciTEDoc.html # Globals # Window sizes and visibility if PLAT_WIN position.left=0 position.top=0 if PLAT_GTK position.left=5 position.top=22 position.width=576 position.height=740 #position.maximize=1 #position.tile=1 #full.screen.hides.menu=1 #minimize.to.tray=1 split.vertical=0 #output.horizontal.size=200 #output.vertical.size=60 #output.initial.hide=1 #horizontal.scrollbar=0 #horizontal.scroll.width=10000 #horizontal.scroll.width.tracking=0 #output.horizontal.scrollbar=0 #output.horizontal.scroll.width=10000 #output.horizontal.scroll.width.tracking=0 #output.scroll=0 #error.select.line=1 #end.at.last.line=0 tabbar.visible=1 #tabbar.hide.one=1 #tabbar.multiline=1 #toolbar.visible=1 #toolbar.usestockicons=1 #toolbar.large=1 #menubar.detachable=1 #undo.redo.lazy=1 statusbar.visible=1 #fileselector.width=800 #fileselector.height=600 #fileselector.show.hidden=1 #magnification=-1 #output.magnification=-1 # Sizes and visibility in edit pane line.margin.visible=1 line.margin.width=4 margin.width=16 #fold.margin.width=16 #fold.margin.colour=#FF0000 #fold.margin.highlight.colour=#0000FF #blank.margin.left=4 #blank.margin.right=4 buffered.draw=1 #phases.draw=2 if PLAT_WIN technology=1 #font.quality=3 if PLAT_MAC font.quality=3 # Element styles #view.eol=1 #control.char.symbol=. caret.period=500 view.whitespace=0 view.indentation.whitespace=1 view.indentation.guides=1 view.indentation.examine=3 highlight.indentation.guides=1 #caret.fore=#FF0000 #caret.additional.blinks=0 #caret.width=2 #caret.line.back=#FFFED8 #caret.line.back.alpha=63 edge.column=200 edge.mode=0 edge.colour=#C0DCC0 braces.check=1 braces.sloppy=1 #selection.fore=#006000 # DADADA used as background because it yields standard silver C0C0C0 # on low colour displays and a reasonable light grey on higher bit depths if PLAT_WINNT selection.alpha=32 selection.back=#000000 if PLAT_GTK selection.alpha=30 selection.back=#000000 if PLAT_MAC selection.alpha=32 selection.back=#000000 #selection.additional.fore=#0000A0 #selection.additional.back=#000080 #selection.additional.alpha=20 #selection.rectangular.switch.mouse=1 #selection.multiple=0 #selection.additional.typing=0 #virtual.space=3 #rectangular.selection.modifier=4 #whitespace.fore=#FF0000 #whitespace.back=#FFF0F0 #error.marker.fore=#0000A0 #error.marker.back=#DADAFF #error.inline=1 bookmark.fore=#BE0000 #bookmark.back=#FFFFA0 #bookmark.alpha= #find.mark=#0000FF #find.mark.indicator=style:compositionthick,colour:#FFB700,under #highlight.current.word=1 #highlight.current.word.by.style=1 #highlight.current.word.colour=#00D040 #highlight.current.word.indicator=style:roundbox,colour:#0080FF,under,outlinealpha:140,fillalpha:80 #indicators.alpha=63 #indicators.under=1 # Scripting ext.lua.startup.script=$(SciteUserHome)/SciTEStartup.lua ext.lua.auto.reload=1 #ext.lua.reset=1 # Checking are.you.sure=1 #are.you.sure.for.build=1 #save.all.for.build=1 #quit.on.close.last=1 #load.on.activate=1 #save.on.deactivate=1 #are.you.sure.on.reload=1 #save.on.timer=20 #reload.preserves.undo=1 #check.if.already.open=1 #temp.files.sync.load=1 default.file.ext=.cxx #source.default.extensions=.h|.cxx|.bat #title.full.path=1 #title.show.buffers=1 #pathbar.visible=1 #save.recent=1 #save.session=1 #session.bookmarks=1 #session.folds=1 #save.position=1 #save.find=1 #open.dialog.in.file.directory=1 #strip.trailing.spaces=1 #ensure.final.line.end=1 #ensure.consistent.line.ends=1 #save.deletes.first=1 #save.check.modified.time=1 buffers=40 #buffers.zorder.switching=1 api.*=$(SciteDefaultHome)\modules.api #locale.properties=locale.de.properties #translation.missing=*** #read.only=1 #background.open.size=20000 #background.save.size=20000 if PLAT_GTK background.save.size=10000000 #max.file.size=1 # Indentation tabsize=8 indent.size=8 use.tabs=1 indent.auto=1 indent.automatic=1 indent.opening=0 indent.closing=0 #tab.indents=0 #backspace.unindents=0 # Wrapping of long lines wrap=1 wrap.style=2 cache.layout=3 output.wrap=1 output.cache.layout=3 #wrap.visual.flags=3 #wrap.visual.flags.location=3 #wrap.indent.mode=1 #wrap.visual.startindent=4 # Folding # enable folding, and show lines below when collapsed. fold=1 fold.compact=1 fold.flags=16 fold.symbols=1 #fold.highlight=1 #fold.highlight.colour=#00C0C0 #fold.on.open=1 fold.comment=1 fold.preprocessor=1 # Find and Replace # Internal search always available with recursive capability so use in preference to external tool find.command= # findstr is available on recent versions of Windows including 2000 #if PLAT_WIN # find.command=findstr /n /s $(find.what) $(find.files) #find.input=$(find.what) #if PLAT_GTK # find.command=grep --line-number "$(find.what)" $(find.files) find.files=*.c *.cxx *.h #find.in.files.close.on.find=0 #find.in.dot=1 #find.in.binary=1 #find.in.directory= #find.close.on.find=0 #find.replace.matchcase=1 #find.replace.escapes=1 #find.replace.regexp=1 #find.replace.regexp.posix=1 #find.replace.wrap=0 #find.replacewith.focus=0 #find.replace.advanced=1 find.use.strip=1 #find.strip.incremental=1 #find.indicator.incremental=style:compositionthick,colour:#FFB700,under replace.use.strip=1 #replace.strip.incremental=1 #strip.button.height=24 # Behaviour #eol.mode=LF eol.auto=1 clear.before.execute=0 #vc.home.key=1 #wrap.aware.home.end.keys=1 autocompleteword.automatic=1 #autocomplete.choose.single=1 #autocomplete.*.fillups=([ word.chars.d=.$(chars.alpha)$(chars.numeric)_# autocomplete.*.start.characters=$(word.chars.d) caret.policy.xslop=1 caret.policy.width=20 caret.policy.xstrict=0 caret.policy.xeven=0 caret.policy.xjumps=0 caret.policy.yslop=1 caret.policy.lines=1 caret.policy.ystrict=1 caret.policy.yeven=1 caret.policy.yjumps=0 #visible.policy.strict=1 #visible.policy.slop=1 #visible.policy.lines=4 #time.commands=1 #caret.sticky=1 #properties.directory.enable=1 # Status Bar statusbar.number=4 statusbar.text.1=\ li=$(LineNumber) co=$(ColumnNumber) $(OverType) ($(EOLMode)) $(FileAttr) statusbar.text.2=\ $(BufferLength) chars in $(NbOfLines) lines. Sel: $(SelLength) chars. statusbar.text.3=\ Now is: Date=$(CurrentDate) Time=$(CurrentTime) statusbar.text.4=\ $(FileNameExt) : $(FileDate) - $(FileTime) | $(FileAttr) if PLAT_WIN command.scite.help="file://$(SciteDefaultHome)\SciTEDoc.html" command.scite.help.subsystem=2 if PLAT_GTK command.print.*=a2ps "$(FileNameExt)" command.scite.help=xdg-open "file://$(SciteDefaultHome)/SciTEDoc.html" # Internationalisation # Japanese input code page 932 and ShiftJIS character set 128 #code.page=932 #character.set=128 # Unicode code.page=65001 #code.page=936 character.set=132 #command.discover.properties=python /home/user/FileDetect.py "$(FilePath)" # Required for Unicode to work on GTK+: #LC_CTYPE=en_US.UTF-8 if PLAT_GTK output.code.page=65001 if PLAT_MAC output.code.page=65001 # Export #export.keep.ext=1 export.html.wysiwyg=1 #export.html.tabs=1 #export.html.folding=1 export.html.styleused=1 #export.html.title.fullpath=1 #export.rtf.tabs=1 #export.rtf.font.face=Arial #export.rtf.font.size=9 #export.rtf.tabsize=8 #export.rtf.wysiwyg=0 #export.tex.title.fullpath=1 # Magnification (added to default screen font size) export.pdf.magnification=0 # Font: Courier, Helvetica or Times (Courier line-wraps) export.pdf.font=Helvetica # Page size (in points): width, height # E.g. Letter 612,792; A4 595,842; maximum 14400,14400 export.pdf.pagesize=595,842 # Margins (in points): left, right, top, bottom export.pdf.margins=72,72,72,72 export.xml.collapse.spaces=1 export.xml.collapse.lines=1 # Define values for use in the imported properties files chars.alpha=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ chars.numeric=0123456789 chars.accented= # This is a better set for Russian: #chars.accented=娸 # The open.filter setting is used in the file selector which has a menu of filters to apply # to the types of files seen when opening. # There is a limit (possibly 256 characters) to the length of a filter on Windows, # so not all source extensions can be in this setting. source.files=*.asm;*.c;*.cc;*.cpp;*.cxx;*.cs;*.h;*.hh;*.hxx;*.hpp;\ *.idl;*.odl;*.rc;*.rc2;*.dlg;*.def;\ *.vb;*.vbs;*.bas;*.frm;*.cls;*.ctl;\ *.java;*.js;*.py;*.pyw;*.pl;*.rb;*.cgi;*.lua;*.conf;\ make*;*.mak;\ *.properties;*.html;*.xml;*.iface;*.bat;*.e;*.m;*.mm;\ *.sh;*.patch # Each platform has a different idea of the most important filters if PLAT_WIN all.files=All Files (*.*)|*.*| top.filters=All Source|$(source.files)|$(all.files) if PLAT_GTK all.files=All Files (*)|*|Hidden Files (.*)|.*| top.filters=All Source|$(source.files)|$(all.files) # As OS X only greys out filtered files, show all as default if PLAT_MAC all.files=All Files (*.*)|*.*| top.filters=$(all.files)All Source|$(source.files)| open.filter=\ $(top.filters)\ $(filter.ada)\ $(filter.conf)\ $(filter.asm)\ $(filter.asn1)\ $(filter.ave)\ $(filter.baan)\ $(filter.bash)\ $(filter.caml)\ $(filter.cmake)\ $(filter.cpp)\ #$(filter.ch)\ $(filter.css)\ $(filter.d)\ $(filter.eiffel)\ $(filter.erlang)\ $(filter.fortran)\ $(filter.gap)\ #$(filter.hs)\ $(filter.idl)\ $(filter.inno)\ $(filter.java)\ $(filter.js)\ $(filter.kix)\ $(filter.lout)\ $(filter.lua)\ $(filter.matlab)\ $(filter.metapost)\ $(filter.mmixal)\ #$(filter.modula3)\ $(filter.nncrontab)\ $(filter.nsis)\ $(filter.opal)\ $(filter.pascal)\ $(filter.perl)\ $(filter.php)\ $(filter.pov)\ $(filter.powershell)\ $(filter.prg)\ $(filter.properties)\ $(filter.ps)\ $(filter.python)\ $(filter.r)\ $(filter.ruby)\ #$(filter.rust)\ $(filter.sql)\ $(filter.specman)\ $(filter.tcl)\ $(filter.tex)\ $(filter.text)\ $(filter.txt2tags)\ $(filter.vb)\ $(filter.web)\ $(filter.yaml)\ $(filter.verilog)\ $(filter.vhdl) #save.filter=$(open.filter) # Give symbolic names to the set of fonts used in the standard styles. if PLAT_WIN font.base=font:Verdana,size:13 font.small=font:Verdana,size:13 font.comment=font:Georgia,size:10.1 font.code.comment.box=$(font.comment) font.code.comment.line=$(font.comment) font.code.comment.doc=$(font.comment) font.code.comment.nested=$(font.comment) font.text=font:Times New Roman,size:11 font.text.comment=font:Verdana,size:9 font.embedded.base=font:Verdana,size:9 font.embedded.comment=font:Comic Sans MS,size:8 font.monospace=font:Consolas,size:8.9 font.vbs=font:Lucida Sans Unicode,size:10 if PLAT_GTK font.base=font:Bitstream Vera Sans,size:9 font.small=font:Bitstream Vera Sans,size:8 font.comment=font:Bitstream Vera Serif,size:9 font.code.comment.box=$(font.comment) font.code.comment.line=$(font.comment) font.code.comment.doc=$(font.comment) font.code.comment.nested=$(font.comment) font.text=font:Bitstream Charter,size:10 font.text.comment=font:Serif,size:9 font.embedded.base=font:Serif,size:9 font.embedded.comment=font:Serif,size:9 font.monospace=font:Bitstream Vera Sans Mono,size:9 font.vbs=font:Bitstream Vera Sans Mono,size:9 if PLAT_MAC font.base=font:Verdana,size:12 font.small=font:Verdana,size:10 font.comment=font:Georgia,size:13 font.code.comment.box=$(font.comment) font.code.comment.line=$(font.comment) font.code.comment.doc=$(font.comment) font.code.comment.nested=$(font.comment) font.text=font:Times New Roman,size:13 font.text.comment=font:Verdana,size:11 font.embedded.base=font:Verdana,size:11 font.embedded.comment=font:Comic Sans MS,size:10 font.monospace=font:Courier New,size:12 font.vbs=font:Lucida Sans Unicode,size:12 font.js=$(font.comment) # Give symbolic names to the set of colours used in the standard styles. colour.code.comment.box=fore:#007F00 colour.code.comment.line=fore:#007F00 colour.code.comment.doc=fore:#3F703F colour.code.comment.nested=fore:#A0C0A0 colour.text.comment=fore:#0000FF,back:#D0F0D0 colour.other.comment=fore:#007F00 colour.embedded.comment=back:#E0EEFF colour.embedded.js=back:#F0F0FF colour.notused=back:#FF0000 colour.number=fore:#007F7F colour.keyword=fore:#00007F colour.string=fore:#7F007F colour.char=fore:#7F007F colour.operator=fore:#000000 colour.preproc=fore:#7F7F00 colour.error=fore:#FFFF00,back:#FF0000 # Global default styles for all languages # Default style.*.32=$(font.monospace),size:15 # Line number style.*.33=back:#C0C0C0,$(font.base) # Brace highlight style.*.34=fore:#0000FF,bold # Brace incomplete highlight style.*.35=fore:#FF0000,bold # Control characters style.*.36= # Indentation guides style.*.37=fore:#C0C0C0,back:#FFFFFF # Printing #print.colour.mode=1 print.magnification=-1 # Windows-only setup: left, right, top, bottom margins, in local units: # hundredths of millimeters or thousandths of inches print.margins=1500,1000,1000,1500 # Header/footer: print.header.format=$(FileNameExt) -- Printed on $(CurrentDate), $(CurrentTime) -- Page $(CurrentPage) print.footer.format=$(FilePath) -- File date: $(FileDate) -- File time: $(FileTime) # Header/footer style print.header.style=font:Arial,size:12,bold print.footer.style=font:Arial Narrow,size:10,italics # Warnings - only works on Windows and needs to be pointed at files on machine #if PLAT_WIN # warning.findwrapped=100,E:\Windows\Media\SFX\Boing.wav # warning.notfound=0,Effect.wav # warning.wrongfile=0,Glass.wav # warning.executeok=0,Fanfare.wav # warning.executeko=100,GlassBreak.wav # warning.nootherbookmark=100,Boing2.wav # Define the Lexer menu, # Each item contains three parts: menu string | file extension | key # The only keys allowed currently are based on F-keys and alphabetic keys and look like # [Ctrl+][Shift+][Fn|a] such as F12 or Ctrl+Shift+D. # A '&' may be placed before a letter to be used as an accelerator. This does not work on GTK+. keyText=Shift+F11 keyMake=Ctrl+Shift+F11 keyHTML=F12 keyXML=Shift+F12 # On OS X, F11 is used by Expose, F12 by Dashbard if PLAT_MAC os.x.home.end.keys=1 keyText=Shift+F13 keyMake=Ctrl+Shift+F13 keyHTML=Ctrl+Shift+F14 keyXML=Shift+F14 default.languages=\ Text|txt|$(keyText)|\ &C / C++|c||\ Lisp|lisp||\ Pytho&n|py|| menu.language=$(default.languages) # User defined key commands user.shortcuts=\ Ctrl+Shift+V|IDM_PASTEANDDOWN|\ Ctrl+PageUp|IDM_PREVFILE|\ Ctrl+PageDown|IDM_NEXTFILE| #KeypadPlus|IDM_EXPAND|\ #KeypadMinus|IDM_BLOCK_COMMENT| #user.context.menu=\ #||\ #Next File|IDM_NEXTFILE|\ #Prev File|IDM_PREVFILE| # To keep menus short, these .properties files are not loaded by default. imports.exclude=abaqus asl asn1 au3 avenue avs baan blitzbasic bullant \ cobol cmake csound ecl escript flagship forth freebasic gap haskell inno \ kix latex lot lout metapost mmixal modula3 nimrod nncrontab nsis \ opal oscript powerpro powershell purebasic r rebol rust \ scriptol smalltalk sorcins spice specman \ tacl tal txt2tags verilog vhdl # Newly removed: ave baan escript lot metapost mmixal # The set of imports allowed can be set with #imports.include=ave # Import all the language specific properties files in this directory import * ================================================ FILE: bin/ide/asm.properties ================================================ # Define SciTE settings for Assembler files (NASM) # Originally by Black Horus blackhorus@gmx.net 2002 # Updated by Kein-Hong Man mkh@pl.jaring.my 2003-10 # Updated by Marat Dukhan (mdukhan3.at.gatech.dot.edu) 10/4/2011 # Nasm files file.patterns.asm=*.asm #file.patterns.as=*.s filter.asm=Assembler x86/x64(asm)|$(file.patterns.asm)| filter.as=Assembler x86/x64(as)|$(file.patterns.as)| lexer.$(file.patterns.asm)=asm lexer.$(file.patterns.as)=as bcd_instruction=aaa aad aam aas daa das flow_instruction=ja jae jb jbe jc jcxz je jg jge jl jle jmp jna \ jnae jnb jnbe jnc jne jng jnge jnl jnle jno jnp jns jnz \ jo jp jpe jpo js jz \ jcxz jecxz jrcxz \ loop loope loopne loopz loopnz \ call ret alu_instruction=add sub adc sbb neg cmp inc dec \ and or xor not test \ shl shr sal sar shld shrd rol ror rcl rcr \ cbw cwd cwde cdq cdqe cqo \ bsf bsr bt btc btr bts \ idiv imul div mul bswap \ nop mem_instruction=lea \ mov movsx movsxd movzx \ xlatb bound \ xchg xadd cmpxchg cmpxchg8b cmpxchg16b stack_instruction=push pop pushad popad pushf popf pushfd popfd pushfq popfq pred_instruction=seta setae setb setbe setc sete setg setge setl \ setle setna setnae setnb setnbe setnc setne setng setnge \ setnl setnle setno setnp setns setnz seto setp setpe setpo \ sets setz \ salc flag_instruction=clc cld stc std cmc lahf sahf cmov_instruction=cmovo cmovno cmovb cmovc cmovnae cmovae cmovnb \ cmovnc cmove cmovz cmovne cmovnz cmovbe cmovna cmova \ cmovnbe cmovs cmovns cmovp cmovpe cmovnp cmovpo cmovl \ cmovnge cmovge cmovnl cmovle cmovng cmovg cmovnle prefix_instruction=lock rep repe repz repne repnz string_instruction=cmpsb cmpsw cmpsq \ movsb movsw movsq \ scasb scasw scasd scasq \ stosb stosw stosd stosq info_instruction=cpuid rdtsc rdtscp rdpmc xgetbv lwp_instruction=llwpcb slwpcb lwpval lwpins ext_instruction=crc32 popcnt lzcnt tzcnt movbe pclmulqdq rdrand bmi1_instruction=andn bextr blsi blsmk blsr bmi2_instruction=bzhi mulx pdep pext rorx sarx shlx shrx tbm_instruction=blcfill blci blcic blcmsk blcs blsfill blsic t1mskc tzmsk fpu_instruction=f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcom fcomp fcompp fdecstp \ fdisi fdiv fdivp fdivr fdivrp feni ffree fiadd ficom ficomp fidiv \ fidivr fild fimul fincstp finit fist fistp fisub fisubr fld fld1 \ fldcw fldenv fldenvw fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul \ fmulp fnclex fndisi fneni fninit fnop fnsave fnsavew fnstcw fnstenv \ fnstenvw fnstsw fpatan fprem fptan frndint frstor frstorw fsave \ fsavew fscale fsqrt fst fstcw fstenv fstenvw fstp fstsw fsub fsubp \ fsubr fsubrp ftst fwait fxam fxch fxtract fyl2x fyl2xp1 \ fsetpm fcos fldenvd fnsaved fnstenvd fprem1 frstord fsaved fsin fsincos \ fstenvd fucom fucomp fucompp fcomi fcomip fucomi fucomip ffreep \ fcmovb fcmove fcmovbe fcmovu fcmovnb fcmovne fcmovnbe fcmovnu mmx_instruction=movd movq \ paddb paddw paddd paddsb paddsw paddusb paddusw \ psubb psubw psubd psubsb psubsw psubusb psubusw \ pand pandn por pxor \ pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw \ pmaddwd pmulhw pmullw \ psllw pslld psllq psrlw psrld psrlq psraw psrad \ packuswb packsswb packssdw \ punpcklbw punpcklwd punpckldq punpckhbw punpckhwd punpckhdq \ emms mmx2_instruction=pavgb pavgw \ pextrw pinsrw pmovmskb \ pmaxsw pmaxub pminsw pminub \ pmulhuw psadbw pshufw \ prefetchnta prefetcht0 prefetcht1 prefetcht2 \ maskmovq movntq sfence emmx_instruction=paddsiw psubsiw \ pmulhrw pmachriw pmulhriw \ pmagw pdistib paveb \ pmvzb pmvnzb pmvlzb pmvgezb k3d_instruction=pfacc pfadd pfsub pfsubr pfmul \ pfcmpeq pfcmpge pfcmpgt \ pfmax pfmin \ pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt \ pi2fd pf2id \ pavgusb pmulhrw \ femms k3d2_instruction=pfnacc pfpnacc pi2fw pf2iw pswapd k3dgeode_instruction=pfrsqrtv pfrcpv k3dprefetch_instruction=prefetch prefetchw sse_instruction=addss addps subss subps \ mulss mulps divss divps sqrtss sqrtps \ rcpss rcpps rsqrtss rsqrtps \ maxss maxps minss minps \ cmpss comiss ucomiss cmpps \ cmpeqss cmpltss cmpless cmpunordss cmpneqss cmpnltss cmpnless cmpordss \ cmpeqps cmpltps cmpleps cmpunordps cmpneqps cmpnltps cmpnleps cmpordps \ andnps andps orps xorps \ cvtsi2ss cvtss2si cvttss2si \ cvtpi2ps cvtps2pi cvttps2pi \ movss movlps movhps movlhps movhlps movaps movups movntps movmskps \ shufps unpckhps unpcklps \ ldmxcsr stmxcsr sse2_instruction=addpd addsd subpd subsd \ mulsd mulpd divsd divpd sqrtsd sqrtpd \ maxsd maxpd minsd minpd \ cmpsd comisd ucomisd cmppd \ cmpeqsd cmpltsd cmplesd cmpunordsd cmpneqsd cmpnltsd cmpnlesd cmpordsd \ cmpeqpd cmpltpd cmplepd cmpunordpd cmpneqpd cmpnltpd cmpnlepd cmpordpd \ andnpd andpd orpd xorpd \ cvtsd2ss cvtpd2ps cvtss2sd cvtps2pd \ cvtdq2ps cvtps2dq cvttps2dq \ cvtdq2pd cvtpd2dq cvttpd2dq \ cvtsi2sd cvtsd2si cvttsd2si \ cvtpi2pd cvtpd2pi cvttpd2pi \ movsd movlpd movhpd movapd movupd movntpd movmskpd \ shufpd unpckhpd unpcklpd \ movnti movdqa movdqu movntdq maskmovdqu \ movdq2q movq2dq \ paddq psubq pmuludq \ pslldq psrldq \ punpcklqdq punpckhqdq \ pshufhw pshuflw pshufd \ lfence mfence sse3_instruction=addsubps addsubpd \ haddps haddpd hsubps hsubpd \ movsldup movshdup movddup \ lddqu \ fisttp ssse3_instruction=psignb psignw psignd \ pabsb pabsw pabsd \ palignr pshufb \ pmulhrsw pmaddubsw \ phaddw phaddd phaddsw \ phsubw phsubd phsubsw sse4a_instruction=extrq insertq \ movntsd movntss sse41_instruction=mpsadbw phminposuw \ pmuldq pmulld \ dpps dppd \ blendps blendpd blendvps blendvpd pblendvb pblendw \ pmaxsb pmaxuw pmaxsd pmaxud pminsb pminuw pminsd pminud \ roundps roundss roundpd roundsd \ insertps pinsrb pinsrd pinsrq \ extractps pextrb pextrd pextrq \ pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq \ pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq \ ptest \ pcmpeqq \ packusdw \ movntdqa sse42_instruction=pcmpgtq \ pcmpestri pcmpestrm pcmpistri pcmpistrm aes_instruction=aesenc aesenclast aesdec aesdeclast aeskeygenassist aesimc padlock_instruction=xcryptcbc xcryptcfb xcryptctr xcryptecb xcryptofb \ xsha1 xsha256 montmul xstore avx_instruction=vaddss vaddps vaddsd vaddpd vsubss vsubps vsubsd vsubpd \ vaddsubps vaddsubpd \ vhaddps vhaddpd vhsubps vhsubpd \ vmulss vmulps vmulsd vmulpd \ vmaxss vmaxps vmaxsd vmaxpd vminss vminps vminsd vminpd \ vandps vandpd vandnps vandnpd vorps vorpd vxorps vxorpd \ vblendps vblendpd vblendvps vblendvpd \ vcmpss vcomiss vucomiss vcmpsd vcomisd vucomisd vcmpps vcmppd \ vcmpeqss vcmpltss vcmpless vcmpunordss vcmpneqss vcmpnltss vcmpnless vcmpordss \ vcmpeq_uqss vcmpngess vcmpngtss vcmpfalsess vcmpneq_oqss vcmpgess vcmpgtss vcmptruess \ vcmpeq_osss vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss \ vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss \ vcmpeqps vcmpltps vcmpleps vcmpunordps vcmpneqps vcmpnltps vcmpnleps vcmpordps \ vcmpeq_uqps vcmpngeps vcmpngtps vcmpfalseps vcmpneq_oqps vcmpgeps vcmpgtps vcmptrueps \ vcmpeq_osps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps \ vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps \ vcmpeqsd vcmpltsd vcmplesd vcmpunordsd vcmpneqsd vcmpnltsd vcmpnlesd vcmpordsd \ vcmpeq_uqsd vcmpngesd vcmpngtsd vcmpfalsesd vcmpneq_oqsd vcmpgesd vcmpgtsd vcmptruesd \ vcmpeq_ossd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd \ vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd \ vcmpeqpd vcmpltpd vcmplepd vcmpunordpd vcmpneqpd vcmpnltpd vcmpnlepd vcmpordpd \ vcmpeq_uqpd vcmpngepd vcmpngtpd vcmpfalsepd vcmpneq_oqpd vcmpgepd vcmpgtpd vcmptruepd \ vcmpeq_ospd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd \ vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd \ vcvtsd2ss vcvtpd2ps vcvtss2sd vcvtps2pd \ vcvtsi2ss vcvtss2si vcvttss2si \ vcvtpi2ps vcvtps2pi vcvttps2pi \ vcvtdq2ps vcvtps2dq vcvttps2dq \ vcvtdq2pd vcvtpd2dq vcvttpd2dq \ vcvtsi2sd vcvtsd2si vcvttsd2si \ vcvtpi2pd vcvtpd2pi vcvttpd2pi \ vdivss vdivps vdivsd vdivpd vsqrtss vsqrtps vsqrtsd vsqrtpd \ vdpps vdppd \ vmaskmovps vmaskmovpd \ vmovss vmovsd vmovaps vmovapd vmovups vmovupd vmovntps vmovntpd \ vmovhlps vmovlhps vmovlps vmovlpd vmovhps vmovhpd \ vmovsldup vmovshdup vmovddup \ vmovmskps vmovmskpd \ vroundss vroundps vroundsd vroundpd \ vrcpss vrcpps vrsqrtss vrsqrtps \ vunpcklps vunpckhps vunpcklpd vunpckhpd \ vbroadcastss vbroadcastsd vbroadcastf128 \ vextractps vinsertps vextractf128 vinsertf128 \ vshufps vshufpd vpermilps vpermilpd vperm2f128 \ vtestps vtestpd \ vpaddb vpaddusb vpaddsb vpaddw vpaddusw vpaddsw vpaddd vpaddq \ vpsubb vpsubusb vpsubsb vpsubw vpsubusw vpsubsw vpsubd vpsubq \ vphaddw vphaddsw vphaddd vphsubw vphsubsw vphsubd \ vpsllw vpslld vpsllq vpsrlw vpsrld vpsrlq vpsraw vpsrad \ vpand vpandn vpor vpxor \ vpblendwb vpblendw \ vpsignb vpsignw vpsignd \ vpavgb vpavgw \ vpabsb vpabsw vpabsd \ vmovd vmovq vmovdqa vmovdqu vlddqu vmovntdq vmovntdqa vmaskmovdqu \ vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq \ vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq \ vpackuswb vpacksswb vpackusdw vpackssdw \ vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq \ vpmaddubsw vpmaddwd \ vpmullw vpmulhuw vpmulhw vpmulhrsw vpmulld vpmuludq vpmuldq \ vpmaxub vpmaxsb vpmaxuw vpmaxsw vpmaxud vpmaxsd \ vpminub vpminsb vpminuw vpminsw vpminud vpminsd \ vpmovmskb vptest \ vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq \ vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq \ vpslldq vpsrldq vpalignr \ vpshufb vpshuflw vpshufhw vpshufd \ vpextrb vpextrw vpextrd vpextrq vpinsrb vpinsrw vpinsrd vpinsrq \ vpsadbw vmpsadbw vphminposuw \ vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm \ vpclmulqdq vaesenc vaesenclast vaesdec vaesdeclast vaeskeygenassist vaesimc \ vldmxcsr vstmxcsr vzeroall vzeroupper avx2_instruction=vbroadcasti128 vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq \ vpblendd \ vpermd vpermq vperm2i128 \ vextracti128 vinserti128 \ vpmaskmovd vpmaskmovq \ vpsllvd vpsllvq vpsravd vpsrlvd vpsrldq \ vpgatherdd vpgatherqd vgatherdq vgatherqq \ vpermps vpermpd \ vgatherdpd vgatherqpd vgatherdps vgatherqps xop_instruction=vfrczss vfrczps vfrczsd vfrczpd \ vpermil2ps vperlil2pd \ vtestps vtestpd \ vpcomub vpcomb vpcomuw vpcomw vpcomud vpcomd vpcomuq vpcomq \ vphaddubw vphaddbw vphaddubd vphaddbd vphaddubq vphaddbq \ vphadduwd vphaddwd vphadduwq vphaddwq vphaddudq vphadddq \ vphsubbw vphsubwd vphsubdq \ vpmacsdd vpmacssdd vpmacsdql vpmacssdql vpmacsdqh vpmacssdqh \ vpmacsww vpmacssww vpmacswd vpmacsswd \ vpmadcswd vpmadcsswd \ vpcmov vpperm \ vprotb vprotw vprotd vprotq \ vpshab vpshaw vpshad vpshaq \ vpshlb vpshlw vpshld vpshlq cvt16_instruction=vcvtph2ps vcvtps2ph fma4_instruction=vfmaddss vfmaddps vfmaddsd vfmaddpd \ vfmsubss vfmsubps vfmsubsd vfmsubpd \ vnfmaddss vnfmaddps vnfmaddsd vnfmaddpd \ vnfmsubss vnfmsubps vnfmsubsd vnfmsubpd \ vfmaddsubps vfmaddsubpd vfmsubaddps vfmsubaddpd fma3_instruction=vfmadd132ss vfmadd213ss vfmadd231ss \ vfmadd132ps vfmadd213ps vfmadd231ps \ vfmadd132sd vfmadd213sd vfmadd231sd \ vfmadd132pd vfmadd213pd vfmadd231pd \ vfmaddsub132ps vfmaddsub213ps vfmaddsub231ps \ vfmaddsub132pd vfmaddsub213pd vfmaddsub231pd \ vfmsubadd132ps vfmsubadd213ps vfmsubadd231ps \ vfmsubadd132pd vfmsubadd213pd vfmsubadd231pd \ vfmsub132ss vfmsub213ss vfmsub231ss \ vfmsub132ps vfmsub213ps vfmsub231ps \ vfmsub132sd vfmsub213sd vfmsub231sd \ vfmsub132pd vfmsub213pd vfmsub231pd \ vfnmadd132ss vfnmadd213ss vfnmadd231ss \ vfnmadd132ps vfnmadd213ps vfnmadd231ps \ vfnmadd132sd vfnmadd213sd vfnmadd231sd \ vfnmadd132pd vfnmadd213pd vfnmadd231pd \ vfnmsub132ss vfnmsub213ss vfnmsub231ss \ vfnmsub132ps vfnmsub213ps vfnmsub231ps \ vfnmsub132sd vfnmsub213sd vfnmsub231sd \ vfnmsub132pd vfnmsub213pd vfnmsub231pd register=al ah bl bh cl ch dl dh \ ax bx cx dx si di bp \ eax ebx ecx edx esi edi ebx esp \ st0 st1 st2 st3 st4 st5 st6 st7 \ mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 \ xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 \ ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 \ fs register_64=sil dil bpl \ r8b r9b r10b r11b r12b r13b r14b r15b \ r8w r9w r10w r11w r12w r13w r14w r15w \ rax rcx rdx rbx rsp rbp rsi rdi \ r8 r9 r10 r11 r12 r13 r14 r15 \ xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 \ ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 \ gs directive_nasm=db dw dd dq dt do dy \ resb resw resd resq rest reso resy incbin equ times safeseh \ __utf16__ __utf32__ %+ \ default cpu float start imagebase osabi \ ..start ..imagebase ..gotpc ..gotoff ..gottpoff ..got ..plt ..sym ..tlsie \ section segment __sect__ group absolute \ .bss .comment .data .lbss .ldata .lrodata .rdata .rodata .tbss .tdata .text \ alloc bss code exec data noalloc nobits noexec nowrite progbits rdata tls write \ private public common stack overlay class \ extern global common import export \ %define %idefine %xdefine %ixdefine %assign %undef %? %?? \ %defstr %idefstr %deftok %ideftok \ %strcat %strlen %substr \ %macro %imacro %rmacro %exitmacro %endmacro %unmacro \ %if %ifn %elif %elifn %else %endif \ %ifdef %ifndef %elifdef %elifndef \ %ifmacro %ifnmacro %elifmacro %elifnmacro \ %ifctx %ifnctx %elifctx %elifnctx \ %ifidn %ifnidn %elifidn %elifnidn \ %ifidni %ifnidni %elifidni %elifnidni \ %ifid %ifnid %elifid %elifnid \ %ifnum %ifnnum %elifnum %elifnnum \ %ifstr %ifnstr %elifstr %elifnstr \ %iftoken %ifntoken %eliftoken %elifntoken \ %ifempty %elifempty %ifnempty %elifnempty \ %ifenv %ifnenv %elifenv %elifnenv \ %rep %exitrep %endrep \ %while %exitwhile %endwhile \ %include %pathsearch %depend %use \ %push %pop %repl %arg %local %stacksize flat flat64 large small \ %error %warning %fatal \ %00 .nolist %rotate %line %! %final %clear \ struc endstruc istruc at iend \ align alignb sectalign \ bits use16 use32 use64 \ __nasm_major__ __nasm_minor__ __nasm_subminor__ ___nasm_patchlevel__ \ __nasm_version_id__ __nasm_ver__ \ __file__ __line__ __pass__ __bits__ __output_format__ \ __date__ __time__ __date_num__ __time_num__ __posix_time__ \ __utc_date__ __utc_time__ __utc_date_num__ __utc_time_num__ \ __float_daz__ __float_round__ __float__ \ __use_altreg__ altreg \ __use_smartalign__ smartalign __alignmode__ \ __use_fp__ __infinity__ __nan__ __qnan__ __snan__ \ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ directive_operand_nasm=a16 a32 a64 o16 o32 o64 strict \ byte word dword qword tword oword yword nosplit \ %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 \ abs rel \ $ $$ \ seg wrt keywords.$(file.patterns.asm)=$(bcd_instruction) $(flow_instruction) $(alu_instruction) $(mem_instruction) $(stack_instruction) $(pred_instruction) $(flag_instruction) $(cmov_instruction) $(prefix_instruction) $(string_instruction) $(info_instruction) $(lwp_instruction) $(ext_instruction) $(bmi1_instruction) $(bmi2_instruction) keywords2.$(file.patterns.asm)=$(fpu_instruction) keywords3.$(file.patterns.asm)=$(register) $(register_64) keywords4.$(file.patterns.asm)=$(directive_nasm) keywords5.$(file.patterns.asm)=$(directive_operand_nasm) keywords6.$(file.patterns.asm)=$(mmx_instruction) $(mmx2_instruction) $(emmx_instruction) $(k3d_instruction) $(k3d2_instruction) $(k3dgeode_instruction) $(k3dprefetch_instruction) $(sse_instruction) $(sse2_instruction) $(sse3_instruction) $(ssse3_instruction) $(sse4a_instruction) $(sse41_instruction) $(sse42_instruction) $(aes_instruction) $(padlock_instruction) $(avx_instruction) $(avx2_instruction) $(xop_instruction) $(cvt16_instruction) $(fma4_instruction) $(fma3_instruction) keywords.$(file.patterns.as)=$(bcd_instruction) $(flow_instruction) $(alu_instruction) $(mem_instruction) $(stack_instruction) $(pred_instruction) $(flag_instruction) $(cmov_instruction) $(prefix_instruction) $(string_instruction) $(info_instruction) $(lwp_instruction) $(ext_instruction) $(bmi1_instruction) $(bmi2_instruction) keywords2.$(file.patterns.as)=$(fpu_instruction) keywords3.$(file.patterns.as)=$(register) $(register_64) keywords4.$(file.patterns.as)=$(directive_nasm) keywords5.$(file.patterns.as)=$(directive_operand_nasm) keywords6.$(file.patterns.as)=$(mmx_instruction) $(mmx2_instruction) $(emmx_instruction) $(k3d_instruction) $(k3d2_instruction) $(k3dgeode_instruction) $(k3dprefetch_instruction) $(sse_instruction) $(sse2_instruction) $(sse3_instruction) $(ssse3_instruction) $(sse4a_instruction) $(sse41_instruction) $(sse42_instruction) $(aes_instruction) $(padlock_instruction) $(avx_instruction) $(avx2_instruction) $(xop_instruction) $(cvt16_instruction) $(fma4_instruction) $(fma3_instruction) comment.block.asm=; comment.block.as=# # Assembler Styles #style.asm.32=fore:#808080,font:Verdana,size:8 #style.as.32=$(style.asm.32) # Default style.asm.0= style.asm.0=$(style.asm.0) # Comment style.asm.1=fore:#adadad style.as.1=$(style.asm.1) #$(colour.code.comment.line),font:Comic Sans MS,size:8 # Number style.asm.2=fore:#ff0000 style.as.2=$(style.asm.2) # String style.asm.3=$(colour.string) style.as.3=$(style.asm.3) # Operator style.asm.4=$(colour.operator),bold style.as.4=$(style.asm.4) # Identifier style.asm.5= style.as.5=$(style.asm.5) # CPU instruction style.asm.6=$(colour.keyword),bold style.as.6=$(style.asm.6) #fore:#0000ff # FPU instruction style.asm.7=fore:#0000ff style.as.7=$(style.asm.7) # Register style.asm.8=fore:#46aa03,bold style.as.8=$(style.asm.8) # assembler Directive style.asm.9=fore:#0000ff style.as.9=$(style.asm.9) # assembler Directive Operand style.asm.10=fore:#0000ff style.as.10=$(style.asm.10) # Comment block (GNU as /*...*/ syntax, unimplemented) style.asm.11=$(colour.code.comment.box),$(font.code.comment.box) style.as.11=$(style.asm.11) # Character/String (single quote) (also character prefix in GNU as) style.asm.12=$(colour.char) style.as.12=$(style.asm.12) # End of line where string is not closed style.asm.13=fore:#000000,back:#E0C0E0,eolfilled style.as.13=$(style.asm.13) # Extended instructions style.asm.14=fore:#B00040 style.as.14=$(style.asm.14) command.compile.$(file.patterns.asm)=nasm $(FileNameExt) command.name.0.*.asm=Link command.0.*.asm=link $(FileName) statement.indent.$(file.patterns.asm)=9 .if statement.indent.$(file.patterns.as)=9 .if ================================================ FILE: bin/ide/cpp.properties ================================================ # Define SciTE settings for C++, C, C#, Ch, Java, IDL, JavaScript, Flash (ActionScript 2) files. # sma files are Small script (C-like) file.patterns.cpp=*.c;*.cc;*.cpp;*.cxx;*.h;*.hh;*.hpp;*.hxx;*.ipp;*.m;*.mm;*.sma file.patterns.cplusplus=*.cc;*.cpp;*.cxx # jad = decompiled class files; pde = Processing.org sketch files file.patterns.java=*.java;*.jad;*.pde file.patterns.javafx=*.fx # pln, inc and t are SilkTest (4Test) files. file.patterns.test=*.pln;*.inc;*.t # es = JS dialect of Abobe for SVG file.patterns.js=*.js;*.es file.patterns.cs=*.cs file.patterns.rc=*.rc;*.rc2;*.dlg file.patterns.idl=*.idl;*.odl file.patterns.flash=*.as;*.asc;*.jsfl file.patterns.ch=*.ch;*.chf;*.chs file.patterns.vala=*.vala file.patterns.go=*.go file.patterns.pike=*.pike file.patterns.c.like=$(file.patterns.cpp);$(file.patterns.cs);$(file.patterns.idl);$(file.patterns.java);$(file.patterns.js);$(file.patterns.flash);$(file.patterns.ch);$(file.patterns.vala);$(file.patterns.pike) shbang.tcc=cpp shbang.tinycc=cpp filter.cpp=C/C++ (c cc cpp cxx cs vala h hh hxx hpp ipp dlg rc rc2 mak)|\ $(file.patterns.cpp);$(file.patterns.cs);$(file.patterns.rc);$(file.patterns.vala);*.mak;make*| filter.java=Java (java)|*.java| filter.js=JavaScript (js es)|$(file.patterns.js)| filter.idl=IDL (idl odl)|$(file.patterns.idl)| filter.test=SilkTest (pln inc t)|$(file.patterns.test)| filter.flash=Flash (as asc jsfl)|$(file.patterns.flash)| filter.ch=Ch (ch chf chs)|$(file.patterns.ch)| filter.go=Go (go)|$(file.patterns.go)| filter.pike=Pike (pike)|$(file.patterns.pike)| lexer.$(file.patterns.java)=cpp lexer.$(file.patterns.javafx)=cpp lexer.$(file.patterns.cpp)=cpp lexer.$(file.patterns.rc)=cpp lexer.$(file.patterns.idl)=cpp lexer.$(file.patterns.cs)=cpp lexer.$(file.patterns.js)=cpp lexer.$(file.patterns.test)=cpp lexer.$(file.patterns.flash)=cpp lexer.$(file.patterns.ch)=cpp lexer.$(file.patterns.vala)=cpp lexer.$(file.patterns.go)=cpp lexer.$(file.patterns.pike)=cpp keywordclass.cpp=and and_eq asm auto bitand bitor bool break \ case catch char class compl const const_cast constexpr continue \ default delete do double dynamic_cast else enum explicit export extern false float for \ friend goto if inline int long mutable namespace new not not_eq \ operator or or_eq private protected public \ register reinterpret_cast return short signed sizeof static static_cast struct switch \ template this throw true try typedef typeid typename union unsigned using \ virtual void volatile wchar_t while xor xor_eq directives.objective.c=\ @class @defs @protocol @required @optional @end \ @interface @public @package @protected @private @property \ @implementation @synthesize @dynamic \ @throw @try @catch @finally \ @synchronized @autoreleasepool \ @selector @encode \ @compatibility_alias # Since Objective C and C++ share the .h extension, allow Objective C directives as keywords # For stricter display of pure C++, specify keywords.$(file.patterns.cpp)=$(keywordclass.cpp) keywords.$(file.patterns.cpp)=$(keywordclass.cpp) $(directives.objective.c) # keywords2 is for highlighting user defined keywords or function calls or similar #keywords2.$(file.patterns.cpp)=file # keywords3 is for doc comment keywords, highlighted in style 17 #CPP doxygen file.patterns.doxygen.langs=$(file.patterns.cpp);$(file.patterns.java) keywordclass.doxygen=a addindex addtogroup anchor arg attention \ author b brief bug c class code date def defgroup deprecated dontinclude \ e em endcode endhtmlonly endif endlatexonly endlink endverbatim enum example exception \ f$ f[ f] file fn hideinitializer htmlinclude htmlonly \ if image include ingroup internal invariant interface latexonly li line link \ mainpage name namespace nosubgrouping note overload \ p page par param param[in] param[out] \ post pre ref relates remarks return retval \ sa section see showinitializer since skip skipline struct subsection \ test throw throws todo typedef union until \ var verbatim verbinclude version warning weakgroup $ @ \ & < > # { } keywords3.$(file.patterns.doxygen.langs)=$(keywordclass.doxygen) # keywords5 is for preprocessor definitions and will cause inactive code # to be greyed out. This setting is a space separated list of definitions # where a definition may be of the form NAME=VALUE or simply NAME. #keywords5.$(file.patterns.cpp)=_MSC_VER SCI_NAMESPACE GTK_MAJOR_VERSION=2 word.chars.cxx=$(chars.alpha)$(chars.numeric)_# word.characters.$(file.patterns.cpp)=$(word.chars.cxx) calltip.cpp.word.characters=$(chars.alpha)$(chars.numeric)_ comment.block.cpp=//~ #comment.block.at.line.start.cpp=1 comment.stream.start.cpp=/* comment.stream.end.cpp=*/ comment.box.start.cpp=/* comment.box.middle.cpp= * comment.box.end.cpp= */ # Folding #fold.cpp.syntax.based=0 #fold.cpp.comment.multiline=0 #fold.cpp.comment.explicit=0 #defaults for fold.cpp.explicit.start=//{ and fold.cpp.explicit.end=//} # can be replaced by defining custom strings, e.g. //[ and //] #fold.cpp.explicit.start=//[ #fold.cpp.explicit.end=//] #if fold strings are set to something like /*{{{ and /*}}} (Origami/WinF style fold strings), enable # fold.cpp.explicit.anywhere, allowing explicit fold points being anywhere, not just in line comments #fold.cpp.explicit.anywhere=1 #fold.at.else=1 word.characters.$(file.patterns.javafx)=$(word.chars.cxx)$- file.patterns.c.except.cpp=$(file.patterns.cs);$(file.patterns.idl);*.java;$(file.patterns.flash);$(file.patterns.ch) statement.indent.$(file.patterns.c.except.cpp)=5 case default do else for if while statement.indent.$(file.patterns.cpp)=5 case default do else for if private protected public while statement.end.$(file.patterns.c.like)=10 ; statement.lookback.$(file.patterns.c.like)=20 block.start.$(file.patterns.c.like)=10 { block.end.$(file.patterns.c.like)=10 } #autocomplete.cpp.fillups=( #styling.within.preprocessor=1 preprocessor.symbol.$(file.patterns.cpp)=# preprocessor.start.$(file.patterns.cpp)=if ifdef ifndef preprocessor.middle.$(file.patterns.cpp)=else elif preprocessor.end.$(file.patterns.cpp)=endif preprocessor.symbol.$(file.patterns.cs)=# preprocessor.start.$(file.patterns.cs)=if region preprocessor.middle.$(file.patterns.cs)=else elif preprocessor.end.$(file.patterns.cs)=endif endregion keywordclass.ch=\ auto array bool break case char class complex ComplexInf ComplexNaN \ const continue default delete \ do double else enum export extern float for foreach goto if Inf inline int \ long namespace NaN new NULL private public register restrict return short \ signed sizeof static string_t struct switch this typedef union unsigned \ using void volatile wchar_t while __declspec keywords.$(file.patterns.ch)=$(keywordclass.ch) word.chars.ch=$(chars.alpha)$(chars.numeric)_# word.characters.$(file.patterns.ch)=$(word.chars.cxx) comment.block.ch=//~ #comment.block.at.line.start.ch=1 comment.stream.start.ch=/* comment.stream.end.ch=*/ comment.box.start.ch=/* comment.box.middle.ch= * comment.box.end.ch= */ preprocessor.symbol.$(file.patterns.ch)=# preprocessor.start.$(file.patterns.ch)=if ifdef ifndef preprocessor.middle.$(file.patterns.ch)=else elif preprocessor.end.$(file.patterns.ch)=endif keywordclass.cs=abstract as ascending base bool break by byte case catch char checked \ class const continue decimal default delegate descending do double else enum \ equals event explicit extern false finally fixed float for foreach from goto group if \ implicit in int interface internal into is join lock let long namespace new null \ object on operator orderby out override params private protected public \ readonly ref return sbyte sealed select short sizeof stackalloc static \ string struct switch this throw true try typeof uint ulong \ unchecked unsafe ushort using var virtual void volatile where while keywords.$(file.patterns.cs)=$(keywordclass.cs) word.characters.$(file.patterns.cs)=$(word.chars.cxx) keywordclass.go=\ bool byte break case chan complex64 complex128 const continue defer default \ else for func go goto fallthrough false float32 float64 if import int interface int8 int16 int32 int64 \ len map nil package range return select string struct switch true type \ uint uintptr uint8 uint16 uint32 uint64 var keywords.$(file.patterns.go)=$(keywordclass.go) keywordclass.rc=\ ACCELERATORS ALT AUTO3STATE AUTOCHECKBOX AUTORADIOBUTTON \ BEGIN BITMAP BLOCK BUTTON CAPTION CHARACTERISTICS CHECKBOX CLASS \ COMBOBOX CONTROL CTEXT CURSOR DEFPUSHBUTTON DIALOG DIALOGEX DISCARDABLE \ EDITTEXT END EXSTYLE FONT GROUPBOX ICON LANGUAGE LISTBOX LTEXT \ MENU MENUEX MENUITEM MESSAGETABLE POPUP \ PUSHBUTTON RADIOBUTTON RCDATA RTEXT SCROLLBAR SEPARATOR SHIFT STATE3 \ STRINGTABLE STYLE TEXTINCLUDE VALUE VERSION VERSIONINFO VIRTKEY keywords.$(file.patterns.rc)=$(keywordclass.rc) keywordclass.idl=\ aggregatable allocate appobject arrays async async_uuid \ auto_handle \ bindable boolean broadcast byte byte_count \ call_as callback char coclass code comm_status \ const context_handle context_handle_noserialize \ context_handle_serialize control cpp_quote custom \ decode default defaultbind defaultcollelem \ defaultvalue defaultvtable dispinterface displaybind dllname \ double dual \ enable_allocate encode endpoint entry enum error_status_t \ explicit_handle \ fault_status first_is float \ handle_t heap helpcontext helpfile helpstring \ helpstringcontext helpstringdll hidden hyper \ id idempotent ignore iid_as iid_is immediatebind implicit_handle \ import importlib in include in_line int __int64 __int3264 interface \ last_is lcid length_is library licensed local long \ max_is maybe message methods midl_pragma \ midl_user_allocate midl_user_free min_is module ms_union \ ncacn_at_dsp ncacn_dnet_nsp ncacn_http ncacn_ip_tcp \ ncacn_nb_ipx ncacn_nb_nb ncacn_nb_tcp ncacn_np \ ncacn_spx ncacn_vns_spp ncadg_ip_udp ncadg_ipx ncadg_mq \ ncalrpc nocode nonbrowsable noncreatable nonextensible notify \ object odl oleautomation optimize optional out out_of_line \ pipe pointer_default pragma properties propget propput propputref \ ptr public \ range readonly ref represent_as requestedit restricted retval \ shape short signed size_is small source strict_context_handle \ string struct switch switch_is switch_type \ transmit_as typedef \ uidefault union unique unsigned user_marshal usesgetlasterror uuid \ v1_enum vararg version void wchar_t wire_marshal keywordclass.msidl=handle keywordclass.xpidl=attribute native noscript scriptable shared wstring inout keywords.$(file.patterns.idl)=$(keywordclass.idl) $(keywordclass.xpidl) # http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html keywordclass.java=abstract assert boolean break byte case catch char class \ const continue default do double else enum extends final finally float for \ goto if implements import instanceof int interface long \ native new package private protected public \ return short static strictfp super switch synchronized this throw throws \ transient try var void volatile while keywords.$(file.patterns.java)=$(keywordclass.java) keywordclass.javafx=abstract after and as assert at attribute before bind bound break \ catch class continue def delete else exclusive extends false finally for from function \ if import indexof insert instanceof lazy mod new not null \ or override package private protected public-init public public-read \ return reverse sizeof static super then this throw true try typeof \ var while keywords.$(file.patterns.javafx)=$(keywordclass.javafx) # Base types and global functions (defined in javafx.lang.Builtins and javafx.lang.FX) # And now language words deprecated from their keyword status... keywords2.$(file.patterns.javafx)=Boolean Duration Integer Number Object String Void \ Character Byte Short Long Float Double \ isInitialized isSameObject print println \ first in init into inverse last on postinit replace step trigger tween where with # I don't know what first and last nor trigger do. Neither lazy or typeof... keywordclass.javascript=abstract boolean break byte case catch char class \ const continue debugger default delete do double else enum export extends \ final finally float for function goto if implements import in instanceof \ int interface long native new package private protected public \ return short static super switch synchronized this throw throws \ transient try typeof var void volatile while with keywords.$(file.patterns.js)=$(keywordclass.javascript) keywordclass.flash=add and break case catch class continue default delete do \ dynamic else eq extends false finally for function ge get gt if implements import in \ instanceof interface intrinsic le lt ne new not null or private public return \ set static super switch this throw true try typeof undefined var void while with keywordclass2.flash=Array Arguments Accessibility Boolean Button Camera Color \ ContextMenu ContextMenuItem Date Error Function Key LoadVars LocalConnection Math \ Microphone Mouse MovieClip MovieClipLoader NetConnection NetStream Number Object \ PrintJob Selection SharedObject Sound Stage String StyleSheet System TextField \ TextFormat TextSnapshot Video Void XML XMLNode XMLSocket \ _accProps _focusrect _global _highquality _parent _quality _root _soundbuftime \ arguments asfunction call capabilities chr clearInterval duplicateMovieClip \ escape eval fscommand getProperty getTimer getURL getVersion gotoAndPlay gotoAndStop \ ifFrameLoaded Infinity -Infinity int isFinite isNaN length loadMovie loadMovieNum \ loadVariables loadVariablesNum maxscroll mbchr mblength mbord mbsubstring MMExecute \ NaN newline nextFrame nextScene on onClipEvent onUpdate ord parseFloat parseInt play \ prevFrame prevScene print printAsBitmap printAsBitmapNum printNum random removeMovieClip \ scroll set setInterval setProperty startDrag stop stopAllSounds stopDrag substring \ targetPath tellTarget toggleHighQuality trace unescape unloadMovie unLoadMovieNum updateAfterEvent keywords.$(file.patterns.flash)=$(keywordclass.flash) keywords2.$(file.patterns.flash)=$(keywordclass2.flash) keywordclass.vala=if else switch case default break continue return yield for foreach in \ do while try catch finally throw keywordclass2.vala=namespace interface class struct enum delegate signal errordomain \ construct get set value base const static var dynamic weak unowned virtual abstract \ override public protected private extern throws requires ensures yields out ref lock \ using true false null delete generic new this typeof sizeof as owned int string char bool keywords.$(file.patterns.vala)=$(keywordclass.vala) keywords2.$(file.patterns.vala)=$(keywordclass2.vala) keywordclass.pike=constant enum if do for while else foreach case switch break continue \ return typeof catch class lambda import inherit static void int string float mixed object \ function program array mapping multiset keywords.$(file.patterns.pike)=$(keywordclass.pike) # Markers # keywords6.$(file.patterns.c.like)=FIXME TODO XXX HACK UnresolvedMergeConflict UNDONE #lexer.cpp.track.preprocessor=1 #lexer.cpp.update.preprocessor=1 #lexer.cpp.hashquoted.strings=1 # C++ styles # Default #style.cpp.32=$(font.base) # White space style.cpp.0=fore:#808080 # Comment: /* */. style.cpp.1=$(colour.code.comment.box),$(font.code.comment.box) # Line Comment: //. style.cpp.2=$(colour.code.comment.line),$(font.code.comment.line) # Doc comment: block comments beginning with /** or /*! style.cpp.3=$(colour.code.comment.doc),$(font.code.comment.doc) # Number style.cpp.4=$(colour.number) # Keyword style.cpp.5=$(colour.keyword),bold # Double quoted string style.cpp.6=$(colour.string) # Single quoted string style.cpp.7=$(colour.char) # UUIDs (only in IDL) style.cpp.8=fore:#804080 # Preprocessor style.cpp.9=$(colour.preproc) # Operators style.cpp.10=$(colour.operator),bold # Identifiers style.cpp.11= # End of line where string is not closed style.cpp.12=fore:#000000,$(font.monospace),back:#E0C0E0,eolfilled # Verbatim strings for C# style.cpp.13=fore:#007F00,$(font.monospace),back:#E0FFE0,eolfilled # Regular expressions for JavaScript style.cpp.14=fore:#3F7F3F,$(font.monospace),back:#E0F0FF,eolfilled # Doc Comment Line: line comments beginning with /// or //!. style.cpp.15=$(colour.code.comment.doc),$(font.code.comment.doc) # Keywords2 style.cpp.16=fore:#B00040 # Comment keyword style.cpp.17=fore:#3060A0,$(font.code.comment.doc) # Comment keyword error style.cpp.18=fore:#804020,$(font.code.comment.doc) # Raw strings for C++0x style.cpp.20=$(colour.string),back:#FFF3FF,eolfilled # Triple-quoted strings for Vala style.cpp.21=$(font.monospace),fore:#007F00,back:#E0FFE0,eolfilled # Hash-quoted strings for Pike style.cpp.22=$(font.monospace),fore:#007F00,back:#E7FFD7,eolfilled # Preprocessor stream comment style.cpp.23=fore:#659900 # Preprocessor stream doc comment style.cpp.24=$(colour.code.comment.doc) # User defined literals style.cpp.25=fore:#C06000 # Task Marker style.cpp.26=fore:#BE07FF,$(font.code.comment.line) # Inactive states are 64 greater than their active counterparts # White space style.cpp.64=fore:#C0C0C0 # Comment: /* */. style.cpp.65=$(style.cpp.1),fore:#90B090 # Line Comment: //. style.cpp.66=$(style.cpp.2),fore:#90B090 # Doc comment: block comments beginning with /** or /*! style.cpp.67=$(style.cpp.3),fore:#D0D0D0 # Number style.cpp.68=$(style.cpp.4),fore:#90B0B0 # Keyword style.cpp.69=$(style.cpp.5),fore:#9090B0 # Double quoted string style.cpp.70=$(style.cpp.6),fore:#B090B0 # Single quoted string style.cpp.71=$(style.cpp.7),fore:#B090B0 # UUIDs (only in IDL) style.cpp.72=$(style.cpp.8),fore:#C0C0C0 # Preprocessor style.cpp.73=$(style.cpp.9),fore:#B0B090 # Operators style.cpp.74=$(style.cpp.10),fore:#B0B0B0 # Identifiers style.cpp.75=$(style.cpp.11),fore:#B0B0B0 # End of line where string is not closed style.cpp.76=$(style.cpp.12),fore:#000000 # Verbatim strings for C# style.cpp.77=$(style.cpp.13),fore:#90B090 # Regular expressions for JavaScript style.cpp.78=$(style.cpp.14),fore:#7FAF7F # Doc Comment Line: line comments beginning with /// or //!. style.cpp.79=$(style.cpp.15),fore:#C0C0C0 # Keywords2 style.cpp.80=$(style.cpp.16),fore:#C0C0C0 # Comment keyword style.cpp.81=$(style.cpp.17),fore:#C0C0C0 # Comment keyword error style.cpp.82=$(style.cpp.18),fore:#C0C0C0 # Raw strings for C++0x style.cpp.84=$(style.cpp.20),fore:#B090B0 # Triple-quoted strings for Vala style.cpp.85=$(style.cpp.21),fore:#90B090 # Hash-quoted strings for Pike style.cpp.86=$(style.cpp.22),fore:#90B090 # Preprocessor stream comment style.cpp.87=$(style.cpp.23),fore:#A0C090 # Preprocessor stream doc comment style.cpp.88=$(style.cpp.23),fore:#C0C0C0 # User defined literals style.cpp.89=fore:#D7A090 # Task Marker style.cpp.90=fore:#C3A1CF,$(font.code.comment.line) # Braces are only matched in operator style braces.cpp.style=10 ccopts=-pedantic -Os cc=g++ $(ccopts) -c $(FileNameExt) -o $(FileName).o ccc=gcc $(ccopts) -c $(FileNameExt) -o $(FileName).o make.command=make command.0.*="$(SciteDefaultHome)\..\rjit.bat" "$(FilePath)" command.name.0.*=run rpp jit command.shortcut.0.*=F5 command.save.before.0.*=1 command.1.*="$(SciteDefaultHome)\..\rpp.exe" "$(FilePath)" command.name.1.*=run rpp interpret command.shortcut.1.*=F6 command.save.before.1.*=1 command.2.*="$(SciteDefaultHome)\..\rpack.bat" "$(FilePath)" command.name.2.*=build rpp jit command.shortcut.2.*=F7 command.save.before.2.*=1 command.3.*="$(SciteDefaultHome)\..\rjit_win.bat" "$(FilePath)" command.name.3.*=run rpp jit win command.shortcut.3.*=Ctrl+F5 command.save.before.3.*=1 command.4.*="$(SciteDefaultHome)\..\rpack_win.bat" "$(FilePath)" command.name.4.*=build rpp jit win command.shortcut.4.*=Ctrl+F7 command.save.before.4.*=1 ================================================ FILE: bin/ide/lisp.properties ================================================ # Define SciTE settings for lisp and Scheme files. file.patterns.lisp=*.lsp;*.lisp filter.lisp=LISP (lsp lisp)|$(file.patterns.lisp)| file.patterns.scheme=*.scm;*.smd;*.ss filter.scheme=Scheme (scm smd)|$(file.patterns.scheme)| lexer.$(file.patterns.lisp)=lisp lexer.$(file.patterns.scheme)=lisp # lisp build in functions, xlisp dialect keywords.$(file.patterns.lisp)= not defun + - * / = < > <= >= princ \ eval apply funcall quote identity function complement backquote lambda set setq setf \ defun defmacro gensym make symbol intern symbol name symbol value symbol plist get \ getf putprop remprop hash make array aref car cdr caar cadr cdar cddr caaar caadr cadar \ caddr cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr \ cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr cons list append reverse last nth \ nthcdr member assoc subst sublis nsubst nsublis remove length list length \ mapc mapcar mapl maplist mapcan mapcon rplaca rplacd nconc delete atom symbolp numberp \ boundp null listp consp minusp zerop plusp evenp oddp eq eql equal cond case and or let l if prog \ prog1 prog2 progn go return do dolist dotimes catch throw error cerror break \ continue errset baktrace evalhook truncate float rem min max abs sin cos tan expt exp sqrt \ random logand logior logxor lognot bignums logeqv lognand lognor \ logorc2 logtest logbitp logcount integer length nil word.chars.lisp=$(chars.alpha)$(chars.numeric)_-<>.#+@$%^&=*!? word.characters.$(file.patterns.lisp)=$(word.chars.lisp) # Scheme functions, R5RS keywords.$(file.patterns.scheme)= + - * / = < > <= >= => \ abs acos and angle append apply asin assoc assoc assq assv atan \ begin boolean? \ caar cadr call-with-current-continuation call/cc \ call-with-input-file call-with-output-file call-with-values \ car cdr \ caar cadr cdar cddr \ caaar caadr cadar caddr cdaar cdadr cddar cdddr \ caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr \ cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr \ case ceiling char->integer \ char-alphabetic? char-ci<=? char-ci=? char-ci>? \ char-downcase char-lower-case? char-numeric? char-ready? \ char-upcase char-upper-case? char-whitespace? \ char<=? char=? char>? char? \ close-input-port close-output-port complex? cond cons cos \ current-input-port current-output-port \ define define-syntax delay denominator display do dynamic-wind \ else eof-object? eq? equal? eqv? eval even? exact->inexact exact? \ exp expt \ floor for-each force \ gcd \ if imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment \ lambda lcm length let let* let-syntax letrec letrec-syntax \ list list->string list->vector list-ref list-tail list? load log \ magnitude make-polar make-rectangular make-string make-vector \ map max member memq memv min modulo \ negative? newline not null-environment null? number->string number? numerator \ odd? open-input-file open-output-file or output-port? \ pair? peek-char input-port? output-port? positive? procedure? \ quasiquote quote quotient \ rational? rationalize read read-char real-part real? remainder reverse round \ scheme-report-environment set! set-car! set-cdr! sin sqrt string \ string->list string->number string->symbol string-append \ string-ci<=? string-ci=? string-ci>? \ string-copy string-fill! string-length string-ref string-set! \ string<=? string=? string>? string? \ substring symbol->string symbol? syntax-rules \ transcript-off transcript-on truncate \ unquote unquote-splicing \ values vector vector->list vector-fill! vector-length vector-ref vector-set! vector? \ with-input-from-file with-output-to-file write write-char \ zero? word.chars.scheme=$(chars.alpha)$(chars.numeric)!$%&*/:<=>?^_~+-.@ word.characters.$(file.patterns.scheme)=$(word.chars.scheme) comment.block.lisp=; comment.box.start.lisp=;; comment.box.middle.lisp=;; comment.box.end.lisp=;; # LISP styles # Default style.lisp.32=$(font.base) # White space style.lisp.0=fore:#808080 # Line Comment style.lisp.1=$(colour.code.comment.box),$(font.code.comment.box) # Number style.lisp.2=$(colour.number) # Keyword style.lisp.3=$(colour.keyword),bold # String style.lisp.6=$(colour.string) # Operators style.lisp.10=$(colour.operator),bold # Identifiers style.lisp.9= # End of line where string is not closed style.lisp.8=fore:#000000,font:Verdana,size:9,back:#fefecc,eolfilled # Matched Operators style.lisp.34=fore:#0000FF,bold style.lisp.35=fore:#FF0000,bold # Braces are only matched in operator style braces.lisp.style=10 #command.go.$(file.patterns.scheme)=c:\tools\pscheme\pscheme.exe /r $(FilePath) command.go.$(file.patterns.scheme)=c:\tools\gambit\gsi.exe -f $(FilePath) #command.go.$(file.patterns.scheme)=c:\tools\plt\mzscheme.exe -r $(FilePath) command.go.subsystem.$(file.patterns.scheme)=0 ================================================ FILE: bin/ide/luaCOPYRIGHT ================================================ Lua License ----------- Lua is licensed under the terms of the MIT license reproduced below. This means that Lua is free software and can be used for both academic and commercial purposes at absolutely no cost. For details and rationale, see http://www.lua.org/license.html . =============================================================================== Copyright (C) 1994-2008 Lua.org, PUC-Rio. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. =============================================================================== (end of COPYRIGHT) ================================================ FILE: bin/ide/modules.api ================================================ rbool uchar ushort short true false null elif else if ifn while for default namespace friend class goto struct static operator puts putsl getsl findf switch case calle call retn reti push pop jmp jebxz jebxnz halt nop lea mov mov1 mov8 add sub imul idiv imod cesb cnesb cgsb cgesb clsb clesb add8 sub8 imul8 idiv8 imod8 cgsb8 clsb8 _fadd8 _fsub8 _fmul8 _fdiv8 _fcgsb8 _fclsb8 band bor bnot bxor bshl bshr bsar _udiv _umod _ucgsb _ucgesb _uclsb _uclesb rn rd1 rd2 rd4 rd8 rdp esp ebp eax ebx ecx edx esi edi void char int uint int8 double rp var rbuf rstr rcs function break continue continued return this sizeof main include import endif ifdef ifndef define enum to in typeof s_ret s_off s_param s_local mac lambda r_ceil_div r_cond cdecl stdcall array _reti NOT AND OR XOR SHL SHR SAR r_new r_new_n r_delete r_delete_n r_swap r_reverse r_find_pos r_split r_split_e r_qsort r_find_pos_b rbufm rcode rdic rdir rf rff rfs rstrw rsock rset rmutex rlist ================================================ FILE: bin/ide/python.properties ================================================ # Define SciTE settings for Python files. file.patterns.py=*.py;*.pyw file.patterns.scons=SConstruct;SConscript shbang.python=py filter.python=Python (py pyw)|$(file.patterns.py)| lexer.$(file.patterns.py)=python lexer.$(file.patterns.scons)=python keywordclass.python2=and as assert break class continue def del elif \ else except exec finally for from global if import in is lambda not \ or pass print raise return try while with yield keywordclass.python3=False None True and as assert break class continue \ def del elif else except finally for from global if import in is lambda \ nonlocal not or pass raise return try while with yield keywordclass.python=$(keywordclass.python2) # Extra keywords for cython keywordclass.cython=cdef cimport cpdef keywords.$(file.patterns.py)=$(keywordclass.python) $(keywordclass.cython) keywords.$(file.patterns.scons)=$(keywordclass.python) # If you uncomment the 3 lines below, # and put some words after "keywordclass2.python=", # those words will be styled by style.python.14 #keywordclass2.python= #keywords2.$(file.patterns.py)=$(keywordclass2.python) #keywords2.$(file.patterns.scons)=$(keywordclass2.python) #~ statement.indent.$(file.patterns.py)=10 : statement.indent.$(file.patterns.py)=5 class def elif else except finally \ for if try while with statement.lookback.$(file.patterns.py)=0 block.start.$(file.patterns.py)= block.end.$(file.patterns.py)= view.indentation.examine.*.py=2 tab.timmy.whinge.level=1 #fold.quotes.python=1 comment.block.python=#~ indent.python.colon=1 # Python styles # White space style.python.0=fore:#808080 # Comment style.python.1=fore:#007F00,$(font.comment) # Number style.python.2=fore:#007F7F # String style.python.3=fore:#7F007F,$(font.monospace) # Single quoted string style.python.4=fore:#7F007F,$(font.monospace) # Keyword style.python.5=fore:#00007F,bold # Triple quotes style.python.6=fore:#7F0000 # Triple double quotes style.python.7=fore:#7F0000 # Class name definition style.python.8=fore:#0000FF,bold # Function or method name definition style.python.9=fore:#007F7F,bold # Operators style.python.10=bold # Identifiers style.python.11= # Comment-blocks style.python.12=fore:#7F7F7F # End of line where string is not closed style.python.13=fore:#000000,$(font.monospace),back:#E0C0E0,eolfilled # Highlighted identifiers style.python.14=fore:#407090 # Decorators style.python.15=fore:#805000 # Matched Operators style.python.34=fore:#0000FF,bold style.python.35=fore:#FF0000,bold # Braces are only matched in operator style braces.python.style=10 if PLAT_WIN command.go.*.py=pythonw -u "$(FileNameExt)" command.go.subsystem.*.py=1 command.go.*.pyw=pythonw -u "$(FileNameExt)" command.go.subsystem.*.pyw=1 command.build.SConscript=scons.bat --up . command.build.SConstruct=scons.bat . if PLAT_GTK command.go.*.py=python -u "$(FileNameExt)" command.build.SConscript=scons --up . command.build.SConstruct=scons . if PLAT_MAC command.go.*.py=python -u "$(FileNameExt)" command.build.SConscript=scons --up . command.build.SConstruct=scons . command.name.1.$(file.patterns.py)=Syntax Check command.1.$(file.patterns.py)=python -c "import py_compile; py_compile.compile(r'$(FilePath)')" ================================================ FILE: bin/ide/scite.1 ================================================ .TH SCITE 1 "2001 February 26" .SH NAME SciTE \- a programmers text editor .SH SYNOPSIS .br .B SciTE [file ..] .SH DESCRIPTION .B SciTE is a graphical GTK+ based editor. It has support for indenting, highlighting, and shortcuts in a myriad of languages and can be extended by editing object-oriented configuration files. .PP Support is included for Java, C, C++, C#, Shell, Apache. .SH ON-LINE HELP Type Alt-H or Click the Help Pulldown menu. .SH AUTHOR Most of .B SciTE was made by Neil Hodgson, with a lot of help from others. See Help .br .SH BUGS Probably. ================================================ FILE: bin/launch_ide.bat ================================================ start ide\SciTE.exe ================================================ FILE: bin/line_check.bat ================================================ rpp -jit example\line_check.h ../rpp/ rpp -jit example\line_check.h ../rlib/ rpp -jit example\line_check.h rsrc/ rpp -jit example\line_check.h example/ rpp -jit example\line_check.h gl/ pause ================================================ FILE: bin/nasm/bin.bat ================================================ @echo off rem cd /d %~dp0 ..\rpp.exe bin.h %1 ================================================ FILE: bin/nasm/bin.h ================================================  import rfile.h main { v=rf.get_param if v.count<3 putsl('invaild param') return a=v[2] if rf.cmd('..\\rpp.exe -grub '+a)==0 putsl('compile error') return b=a.sub(0,a.count-2) if rf.cmd('nasm.exe '+b+'.asm -o '+b+'.bin')==0 putsl('asm error') rfile.remove(rcode.gbk_to_utf8(b)+'.asm') } ================================================ FILE: bin/nasm/cell.h ================================================ /* 裸机运行细胞自动机(生命游戏) */ import rbufm.h main { rbufm arr(25,80) char* p=4194304 for i=0 to 24 for j=0 to 79 arr[i,j]=(*p).toint%7 p++ char col=0 for view(arr,col) delay trans(arr) } view(rbufm& arr,char& col) { for i=0 to 24 for j=0 to 79 if arr[i,j]==1 rf.text(i*80+j,`*.tochar)//后面加上col可以变换颜色 else rf.text(i*80+j,` .tochar) col++ } //宏不能省略大括号 mac addc(a,b) { if(a>=0&&a<25&&b>=0&&b<80) { if(arr[a,b]==1) { count++; } } } trans(rbufm& arr) { for i=0 to 24 for j=0 to 79 count=0 addc(i-1,j-1) addc(i-1,j) addc(i-1,j+1) addc(i,j-1) addc(i,j+1) addc(i+1,j-1) addc(i+1,j) addc(i+1,j+1) if count==3 arr[i,j]=1 elif count==2 ; else arr[i,j]=0 } delay { for i=0 to 400_0000 ; } ================================================ FILE: bin/nasm/dec.inc ================================================ IMPORT GetCommandLineA IMPORT GetTickCount IMPORT Sleep IMPORT InitializeCriticalSection IMPORT DeleteCriticalSection IMPORT EnterCriticalSection IMPORT LeaveCriticalSection IMPORT _beginthreadex IMPORT WaitForSingleObject IMPORT CloseHandle IMPORT lstrlenW IMPORT FindClose IMPORT FindNextFileW IMPORT FindFirstFileW IMPORT WSAStartup IMPORT WSACleanup IMPORT socket IMPORT connect IMPORT closesocket IMPORT send IMPORT recv IMPORT bind IMPORT listen IMPORT accept IMPORT __iob_func IMPORT _fseeki64 IMPORT _ftelli64 IMPORT _wremove IMPORT _wrename IMPORT _wfopen IMPORT fopen IMPORT fclose IMPORT fread IMPORT fwrite IMPORT fseek IMPORT ftell IMPORT _time32 IMPORT srand IMPORT rand IMPORT exit IMPORT system IMPORT malloc IMPORT free IMPORT memcpy IMPORT memset IMPORT strcpy IMPORT strlen IMPORT strcmp IMPORT sscanf IMPORT sprintf ================================================ FILE: bin/nasm/menu.lst ================================================ color black/cyan yellow/cyan timeout 0 default /default title rpp root (hd0,0) kernel (hd0,0)/cell.bin boot ================================================ FILE: bin/nasm/windemos.inc ================================================ %ifndef __NASMX_DEMOS_INC__ %define __NASMX_DEMOS_INC__ ;// nasmx.inc should always be the first file included. ;// If you get the following nasm error: ;// fatal: unable to open include file 'nasmx.inc' ;// then you need to specify the full directory path to the NASMX ;// include directory using either the NASMENV environment variable or the ;// -I include switch from the command line. ;// For reference see the setpaths.bat file in the NASMX root directory. ;////////////////////////////////////////////////////////////// ;// ;// NASMX Preprocessor ;// Copyright (c) 2005-2013, The NASMX Project ;// %ifndef __NASMX_INCLUDED__ %define __NASMX_INCLUDED__ ;////////////////////////////////////////////////////////////// ;// ;// Check NASM Version ;// %define __nxerrmsg "NASM v2.09.08 or later required" %ifdef __NASM_VERSION_ID__ %if __NASM_VERSION_ID__ < 0x02090800 %fatal __nxerrmsg %endif %else %fatal __nxerrmsg %endif %undef __nxerrmsg ;////////////////////////////////////////////////////////////// ;// ;// Set a NASMX Definition ;// %macro NASMX_DEFINE 1-2 %if %0 > 1 %ixdefine __NASMX_%[%1]__ %[2] %else %ixdefine __NASMX_%[%1]__ %endif %endmacro ;////////////////////////////////////////////////////////////// ;// ;// Get a NASMX Definition ;// %macro NASMX_GET_DEFINE 2 %ifdef __NASMX_%[%1]__ %xdefine %[%2] __NASMX_%[%1]__ %elifdef %2 %undef %[%2] %endif %endmacro ;////////////////////////////////////////////////////////////// ;// ;// Undefine a NASMX Definition ;// %macro NASMX_UNDEF 1 %ifdef __NASMX_%[%1]__ %undef __NASMX_%[%1]__ %else %warning NASMX Definition %[1] is not defined %endif %endmacro ;////////////////////////////////////////////////////////////// ;// ;// Define NASMX Version ;// NASMX_DEFINE VERSION,"1.2" NASMX_DEFINE VERSION_MAJOR, 1 NASMX_DEFINE VERSION_MINOR, 2 NASMX_DEFINE VERSION_REV, 12 NASMX_DEFINE VERSION_ID, 0x0102000C ;////////////////////////////////////////////////////////////// ;// ;// init NASMX context stack ;// ;%push __NASMX_CTX__ ;////////////////////////////////////////////////////////////// ;// ;// Set a Context Stack Value ;// %macro NASMX_SET_CONTEXT_VALUE 2 %xdefine %$$%1 %2 %endmacro ;////////////////////////////////////////////////////////////// ;// ;// native data sizes ;// Must be defined here due to struc_size! %ixdefine byte_size 1 %ixdefine word_size 2 %ixdefine dword_size 4 %ixdefine qword_size 8 %ixdefine tword_size 10 %ixdefine oword_size 16 %ixdefine __m64_size 8 %ixdefine __m128_size 16 %ixdefine __m256_size 32 %ixdefine __int64_size 8 %ixdefine __int128_size 16 %ixdefine __nxfloat_size 4 %ixdefine __nxdouble_size 8 %ixdefine __nxfloat32_size 4 %ixdefine __nxfloat64_size 8 %ixdefine __nxfloat80_size 10 %ixdefine __nxfloat128_size 16 ;// native register sizes %idefine al_size 1 %idefine bl_size 1 %idefine cl_size 1 %idefine dl_size 1 %idefine ah_size 1 %idefine bh_size 1 %idefine ch_size 1 %idefine dh_size 1 %idefine ax_size 2 %idefine bx_size 2 %idefine cx_size 2 %idefine dx_size 2 %idefine di_size 2 %idefine si_size 2 %idefine sp_size 2 %idefine bp_size 2 %idefine bpl_size 1 %idefine dil_size 1 %idefine sil_size 1 %idefine spl_size 1 %idefine eax_size 4 %idefine ebx_size 4 %idefine ecx_size 4 %idefine edx_size 4 %idefine edi_size 4 %idefine esi_size 4 %idefine esp_size 4 %idefine ebp_size 4 %idefine rax_size 8 %idefine rbx_size 8 %idefine rcx_size 8 %idefine rdx_size 8 %idefine rdi_size 8 %idefine rsi_size 8 %idefine rsp_size 8 %idefine rbp_size 8 %idefine r8d_size 4 %idefine r9d_size 4 %idefine r10d_size 4 %idefine r11d_size 4 %idefine r12d_size 4 %idefine r13d_size 4 %idefine r14d_size 4 %idefine r15d_size 4 %idefine r8_size 8 %idefine r9_size 8 %idefine r10_size 8 %idefine r11_size 8 %idefine r12_size 8 %idefine r13_size 8 %idefine r14_size 8 %idefine r15_size 8 ;// register aliases used to help with portability %ifidn __BITS__,64 %ixdefine __AX rax %ixdefine __BX rbx %ixdefine __CX rcx %ixdefine __DX rdx %ixdefine __DI rdi %ixdefine __SI rsi %ixdefine __BP rbp %ixdefine __SP rsp %else %ixdefine __AX eax %ixdefine __BX ebx %ixdefine __CX ecx %ixdefine __DX edx %ixdefine __DI edi %ixdefine __SI esi %ixdefine __BP ebp %ixdefine __SP esp %endif ;// register names used to help with macros invoke and uses %ixdefine __nx_reg_eax eax %ixdefine __nx_reg_ebx ebx %ixdefine __nx_reg_ecx ecx %ixdefine __nx_reg_edx edx %ixdefine __nx_reg_edi edi %ixdefine __nx_reg_esi esi %ixdefine __nx_reg_ebp ebp %ixdefine __nx_reg_esp esp %ixdefine __nx_reg_rax rax %ixdefine __nx_reg_rbx rbx %ixdefine __nx_reg_rcx rcx %ixdefine __nx_reg_rdx rdx %ixdefine __nx_reg_rdi rdi %ixdefine __nx_reg_rsi rsi %ixdefine __nx_reg_rbp rbp %ixdefine __nx_reg_rsp rsp %ixdefine __nx_reg_r8 r8 %ixdefine __nx_reg_r9 r9 %ixdefine __nx_reg_r10 r10 %ixdefine __nx_reg_r11 r11 %ixdefine __nx_reg_r12 r12 %ixdefine __nx_reg_r13 r13 %ixdefine __nx_reg_r14 r14 %ixdefine __nx_reg_r15 r15 ;////////////////////////////////////////////////////////////// ;// ;// nasm storage types ;// %ixdefine byte_reserve RESB %ixdefine word_reserve RESW %ixdefine dword_reserve RESD %ixdefine qword_reserve RESQ %ixdefine tword_reserve REST %ixdefine oword_reserve RESO %ixdefine __m64_reserve RESQ %ixdefine __m128_reserve RESO %ixdefine __int64_reserve RESQ %ixdefine __int128_reserve RESO %ixdefine __nxfloat_reserve RESD %ixdefine __nxdouble_reserve RESQ %ixdefine __nxfloat32_reserve RESD %ixdefine __nxfloat64_reserve RESQ %ixdefine __nxfloat80_reserve RESO %ixdefine __nxfloat128_reserve RESO ;////////////////////////////////////////////////////////////// ;// ;// nasm storage types ;// %ixdefine byte_storage DB %ixdefine word_storage DW %ixdefine dword_storage DD %ixdefine qword_storage DQ %ixdefine tword_storage DT %ixdefine oword_storage DO %ixdefine __m64_storage DQ %ixdefine __m128_storage DO %ixdefine __int64_storage DQ %ixdefine __int128_storage DO %ixdefine __nxfloat_storage DD %ixdefine __nxdouble_storage DQ %ixdefine __nxfloat32_storage DD %ixdefine __nxfloat64_storage DQ %ixdefine __nxfloat80_storage DO %ixdefine __nxfloat128_storage DO ;////////////////////////////////////////////////////////////// ;// ;// nasmx classifcation of types ;// ;// Bits used to contain classification: ;// 0-10 : size of type in bytes ;// 11 : reserved (0) ;// 12-15 : type ( TODO: struc/union/class ) ;// 0 = int type ;// 8 = (bit 15 set if float type, otherwise clear) ;// %ixdefine byte_type 0x0001 %ixdefine word_type 0x0002 %ixdefine dword_type 0x0004 %ixdefine qword_type 0x0008 %ixdefine tword_type 0x000A %ixdefine oword_type 0x0010 %ixdefine __m64_type 0x8008 %ixdefine __m128_type 0x8010 %ixdefine __m256_type 0x8020 %ixdefine __int64_type 0x8008 %ixdefine __int128_type 0x8010 %ixdefine __nxfloat_type 0x8004 %ixdefine __nxdouble_type 0x8008 %ixdefine __nxfloat32_type 0x8004 %ixdefine __nxfloat64_type 0x8008 %ixdefine __nxfloat80_type 0x800A %ixdefine __nxfloat128_type 0x8010 ;// NASMX int types %ixdefine int8_t byte %ixdefine uint8_t byte %ixdefine int16_t word %ixdefine uint16_t word %ixdefine int32_t dword %ixdefine uint32_t dword %ixdefine long32_t dword %ixdefine ulong32_t dword %ixdefine int64_t qword %ixdefine uint64_t qword %ixdefine int80_t tword %ixdefine uint80_t tword %ixdefine int128_t oword %ixdefine uint128_t oword %ixdefine long64_t qword %ixdefine ulong64_t qword %ixdefine long128_t oword %ixdefine ulong128_t oword ;// NASMX Unicode Transformation Format types %ixdefine utf8_t uint8_t %ixdefine utf16_t uint16_t %ixdefine utf32_t uint32_t ;// C types ;// The classification of long_t type must be performed ;// during __OUTPUT_FORMAT__ check as the actual sizes ;// are different among operating systems. %ixdefine char_t int8_t %ixdefine uchar_t uint8_t %ixdefine short_t int16_t %ixdefine ushort_t uint16_t %ixdefine int_t int32_t %ixdefine uint_t uint32_t ;// float types require special handling due to ;// nasm FLOAT directives! %ixdefine float_t __nxfloat %ixdefine double_t __nxdouble %ixdefine float32_t __nxfloat32 %ixdefine float64_t __nxfloat64 %ixdefine float80_t __nxfloat80 %ixdefine float128_t __nxfloat128 %idefine __float(v) dword __float32__(v) %idefine __double(v) qword __float64__(v) ;// Map between native size and token. ;// The define name was chosen as it will ;// be displayed to the user if the macro ;// nx_token_from_size() is called with ;// an illegal value during assembly %ixdefine __nx_error_token_size_1 byte %ixdefine __nx_error_token_size_2 word %ixdefine __nx_error_token_size_4 dword %ixdefine __nx_error_token_size_8 qword %ixdefine __nx_error_token_size_10 tword %ixdefine __nx_error_token_size_16 xmm %ixdefine __nx_error_token_size_32 xmm %define typeof(x) ((x %+ _type >> 12) & 0x000F) %define sizeof(x) x %+ _size %define reserve(x) x %+ _reserve %define declare(x) x %+ _storage %define nx_token_from_size(x) __nx_error_token_size_ %+ x %idefine is_typeof_float(x) ((x %+ _type >> 15) & 0x0001) ;////////////////////////////////////////////////////////////// ;// ;// NASMX ABI size and pointer types ;// ;// Windows Linux BSD ;// type 32 64 32 64 32 64 ;// sizeof(int) 4 4 4 4 4 4 ;// sizeof(long) 4 4 4 8 4 8 ;// sizeof(ptr) 4 8 4 8 4 8 ;// sizeof(size_t) 4 8 4 8 4 8 %ixdefine size32_t dword %ixdefine size64_t qword %ixdefine size_t size%[__BITS__]_t %assign __NASMX_ABI_BITS__ sizeof(size_t) * 8 %ifnidn __BITS__,__NASMX_ABI_BITS__ %fatal unknown size_t: __BITS__ %endif %ixdefine ptr32_t dword %ixdefine ptr64_t qword ;// use for 32->64 bit expansion of either int or ptr %ixdefine ptrdiff_t ptr%[__BITS__]_t %ixdefine NASMX_PTR ptr%[__BITS__]_t ;// remember: intptr's can be confusing when going ;// from 32-bit to 64-bit as sizeof(ptr) is increased ;// to 8 but sizeof(int) remains 4 potential allowing ;// very large (long) ints when using intptrs as ints. %ixdefine intptr_t ptrdiff_t %ixdefine uintptr_t ptrdiff_t ;////////////////////////////////////////////////////////////// ;// ;// Calling Convention Enumerations ;// Used within IMPORT, PROTO, PROC, & INVOKE ;// ;// BIT ;// 0-3: PREFIX - index into decorations (i.e. '_', '@', or '?' ) ;// all bits clear if no prefix ;// 4-7: SUFFIX - index into decorations (i.e. '@', '?', '$' ) ;// all bits clear if no suffix ;// 8-11: CALLCONV - calling convention enum ;// 12: ARGROTATE - rotate direction of args pushed to stack ;// set if left rotation ( PASCAL = %rotate 1 ), clear if right rotation ( CDECL = %rotate -1) ;// 13: RETPOPSARGS - stack adjustment responsibility ;// set if callee pops args ( PASCAL/STDCALL ), clear if caller adjusts stack ( CDECL ) ;// ;// Notes: ;// You may create your own calling convention for your operating ;// system of choice by modifying the flags and macros. However, ;// the standard calling conventions should continue to exist to ;// permit interfacing with system calls ( unless you're writing ;// an OS with a new ABI/API ;) ;// %define __NASMX_DECLSPEC_CC_PREFIX_MASK__ 0x0007 %define __NASMX_DECLSPEC_CC_SUFFIX_MASK__ 0x0070 %define __NASMX_DECLSPEC_CC_ENUM_MASK__ 0x0F00 %define __NASMX_DECLSPEC_CC_ARGROTATE_MASK__ 0x1000 %define __NASMX_DECLSPEC_CC_RETPOPSARGS_MASK__ 0x2000 ;// universal calling conventions %idefine __NASMX_DECLSPEC_CALLCONV_NAKED__ 0 %idefine __NASMX_DECLSPEC_CALLCONV_PASCAL__ 0x3100 ;// although currently specific to win32, the ;// STDCALL calling convention can be useful %idefine __NASMX_DECLSPEC_CALLCONV_STDCALL__ 0x2321 ;// The following 3 calling conventions are highly ;// platform dependent and are defined within the ;// OUTPUT_FORMAT check ;// %idefine __NASMX_DECLSPEC_CALLCONV_CDECL__ 0x???? ;// %idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x???? ;// %idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x???? ;// CALLCONV Enums ;// coincidentally compatible with DotGNU ;// System.Runtime.InteropServices.CallingConvention Enum %idefine __NASMX_DECLSPEC_CC_ENUM_NAKED__ 0 %idefine __NASMX_DECLSPEC_CC_ENUM_PASCAL__ 1 %idefine __NASMX_DECLSPEC_CC_ENUM_CDECL__ 2 %idefine __NASMX_DECLSPEC_CC_ENUM_STDCALL__ 3 %idefine __NASMX_DECLSPEC_CC_ENUM_THISCALL__ 4 %idefine __NASMX_DECLSPEC_CC_ENUM_FASTCALL__ 5 ;// %idefine __NASMX_DECLSPEC_CALLCONV_CC_ENUM_RDFCALL__ 6 ;// internal CALLCONV macros %define nx_declspec_cc_prefix(x) (x & 0x0007) %define nx_declspec_cc_suffix(x) ((x >> 4) & 0x0007) %define nx_declspec_cc_enum(x) ((x >> 8) & 0x000F) %define nx_declspec_cc_argrotate(x) ((x >> 12) & 0x0001) %define nx_declspec_cc_retpopsargs(x) ((x >> 13) & 0x0001) ;// String containing chars that the prefix/suffix bits index into. ;// If you are adding __thiscall convention for your compiler of ;// choice make sure that the initial suffix char is present in ;// the decorations string. %define __NASMX_DECLSPEC_CC_DECORATIONS__ '_@?$' ;// The following formatted string is used by the nx_is* functions %define __NASMX_NUMALPHATOKEN__ '.+-0123456789EeABCDFabcdfGHIJKLMNOPQRSTUVWXYZghijklmnopqrstuvwxyz$@_' ;////////////////////////////////////////////////////////////// ;// internal macro call ;// used by IMPORT, PROC, & INVOKE ;// usage: ;// nx_callconv_decorate callconv, funcname, suffix ;// examples: ;// nx_callconv_decorate __NASMX_DECLSPEC_CALLCONV_STDCALL__, WinProc, 16 ;// nx_callconv_decorate __NASMX_DECLSPEC_CALLCONV_CDECL__, printf ;// nx_callconv_decorate __NASMX_DECLSPEC_CALLCONV_THISCALL__, ClassName.MethodName, 'Z1yi4p8aue' %macro nx_callconv_decorate 2-3.nolist 0 %ifnum %1 %assign %%__pidx nx_declspec_cc_prefix(%1) %assign %%__sidx nx_declspec_cc_suffix(%1) %else %fatal 'CALLCONV undefined:' %1 %endif %ifnum %2 %fatal 'internal error' %endif %if %%__pidx > 0 %substr %%__sig __NASMX_DECLSPEC_CC_DECORATIONS__ %%__pidx %ifnum %2 %fatal 'internal error' %elifid %2 %defstr %%__func %2 %eliftoken %2 %defstr %%__func %2 %else %define %%__func %2 %endif %strcat %%__sig %%__sig,%%__func %else %ifstr %2 %define %%__func %2 %else %defstr %%__sig %2 %endif %endif %if %%__sidx > 0 %ifnum %3 %defstr %%__suffix %3 %elifid %3 %defstr %%__suffix %3 %else %ifstr %3 %define %%__suffix %3 %else %defstr %%__suffix %3 %endif %endif %substr %%__stok __NASMX_DECLSPEC_CC_DECORATIONS__ %%__sidx %strcat %%__sig %%__sig,%%__stok,%%__suffix %endif %deftok %$__nxtok_decorated_name %%__sig %endmacro ;////////////////////////////////////////////////////////////// ;// ;// Target Operating System Type definitions ;// %define __NASMX_DECLSPEC_SYSTYPE_LINUX__ 1 %define __NASMX_DECLSPEC_SYSTYPE_MACHOS__ 2 %define __NASMX_DECLSPEC_SYSTYPE_BSD__ 3 %define __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ 4 ;////////////////////////////////////////////////////////////////// ;// Macro to control NASMX default behavior ;// example usage: ;// NASMX_PRAGMA CALLSTACK, 32 ; Enable callstack optimization ;// NASMX_PRAGMA CALLSTACK, 0 ; Disable callstack optimization ;// NASMX_PRAGMA WARNING, DISABLE, ALL ;// NASMX_PRAGMA WARNING, DISABLE, 8001[, 8002, 8003] ;// NASMX_PRAGMA WARNING, ENABLE, ALL ;// The macro will eventually allow us to enable/disable ;// warnings generated by the NASMX macro type system %imacro NASMX_PRAGMA 1-*.nolist %ifidni WARNING,%1 %warning actual pragma warnings currently unimplemented %ifidni ENABLE, %2 ;// assert: warnings are enabled if undefined %ifidni ALL,%3 %ifdef __NASMX_PRAGMA_WARNING_8001__ %undef __NASMX_PRAGMA_WARNING_8001__ %endif %ifdef __NASMX_PRAGMA_WARNING_8002__ %undef __NASMX_PRAGMA_WARNING_8002__ %endif %else %rep %0-2 %rotate 1 %ifdef __NASMX_PRAGMA_WARNING_%1__ %undef __NASMX_PRAGMA_WARNING_%1__ %endif %endrep %endif %elifidni DISABLE, %2 ;// assert: warnings are disabled if defined %ifidni ALL,%3 %ifndef __NASMX_PRAGMA_WARNING_8001__ %define __NASMX_PRAGMA_WARNING_8001__ %endif %ifndef __NASMX_PRAGMA_WARNING_8002__ %define __NASMX_PRAGMA_WARNING_8002__ %endif %else %rep %0-2 %rotate 1 %ifndef __NASMX_PRAGMA_WARNING_%3__ %define __NASMX_PRAGMA_WARNING_%3__ %endif %endrep %endif %else %error 'syntax: nasmx_pragma warning, [enable | disable], ...' %endif %elifidni CALLSTACK, %1 ;// This option is very useful with fastcall %ifdef NASMX_ENDPROC %error %1 pragma cannot be defined within procedure definition %endif %ifnum %2 %assign %%__nx_stack_adjust %2 %if %%__nx_stack_adjust > 0 ;// assert: turning on call stack feature %ifidni __OUTPUT_FORMAT__, win64 ;// assert: Win64 calling convention requires ;// that the call stack be at least 32 %if %%__nx_stack_adjust < 32 %assign %%__nx_stack_adjust 32 %endif %endif ;// Note: x64 calling convention requires that ;// the call stack be aligned to 16 bytes. ;// Use 8 bytes for x86 %assign %%__nx_align __NASMX_ABI_BITS__ / 4 %assign %%__off (((%%__nx_stack_adjust + %%__nx_align) / %%__nx_align) * %%__nx_align) %assign %%__tmp (%%__nx_stack_adjust + %%__nx_align) %if (%%__off != %%__tmp) %assign %%__nx_stack_adjust %%__off %endif %endif ;// This must be a global define since it is used within the procedure ;// and during invoke and thus could be hidden by one or more user contexts %ifdef __NX_PROLOGUE_CALLSTACK_ADJUST__ %undef __NX_PROLOGUE_CALLSTACK_ADJUST__ %endif %if %%__nx_stack_adjust > 0 %xdefine __NX_PROLOGUE_CALLSTACK_ADJUST__ %%__nx_stack_adjust %endif %else %error %1 pragma requires valid byte count %endif %else %error 'unknown nasmx_pragma:' %1 %endif %endmacro ;////////////////////////////////////////////////////////////////// ;// Macro to override default ABI behavior (Declare Specialization) ;// example usage: ;// NASMX_DECLSPEC CALLCONV, PASCAL ;// NASMX_DECLSPEC CALLCONV, STDCALL, DEFAULT ;// NASMX_DECLSPEC SYSTYPE, LINUX ;// ;// notes: ;// Make sure you understand the effects of using this command ;// before making a global declaration! Unresolved linker errors ;// may haunt you! %imacro NASMX_DECLSPEC 1-8.nolist %ifidni %1,CALLCONV %if %0 < 2 %error 'nasmx_declspec syntax' %endif %ifndef __NASMX_DECLSPEC_CALLCONV_%[%2]__ %error 'unknown declspec calltype:' %2 %endif %if %0 == 2 %ixdefine __NASMX_DECLSPEC_CALLCONV_DEFAULT__ __NASMX_DECLSPEC_CALLCONV_%[%2]__ %else %ifdef __NASMX_DECLSPEC_CALLCONV_%[%3]__ %warning 'declspec redefining' %1 %2 %3 %endif %ixdefine __NASMX_DECLSPEC_CALLCONV_%[%3]__ __NASMX_DECLSPEC_CALLCONV_%[%2]__ %endif %else %ifidni %1,SYSTYPE %ifndef __NASMX_DECLSPEC_SYSTYPE_%[%2]__ %error 'unknown declspec systype:' %2 %endif %if %0 == 2 %ixdefine __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ __NASMX_DECLSPEC_SYSTYPE_%[%2]__ %else %ifdef __NASMX_DECLSPEC_SYSTYPE_%[%3]__ %warning 'declspec redefining' %1 %2 %3 %endif %ixdefine __NASMX_DECLSPEC_SYSTYPE_%[%3]__ __NASMX_DECLSPEC_SYSTYPE_%[%2]__ %endif %else %error 'unknown declspec:' %1 %endif %endif %endmacro ;////////////////////////////////////////////////////////////////// ;// OUTPUT_FORMAT check ;// ;// All system specific defines are made here ;// %ifidn __OUTPUT_FORMAT__,elf %idefine __NASMX_DECLSPEC_CALLCONV_CDECL__ 0x0200 %idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0410 %idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0500 %define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ 2 %define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__ 0 %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'ECXEDX' %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'CX DX ' %ifdef FREEBSD NASMX_DECLSPEC SYSTYPE, BSD %elifdef NETBSD NASMX_DECLSPEC SYSTYPE, BSD %elifdef OPENBSD NASMX_DECLSPEC SYSTYPE, BSD %else NASMX_DECLSPEC SYSTYPE, LINUX %endif NASMX_DECLSPEC CALLCONV, CDECL, DEFAULT %idefine long_t long32_t %idefine ulong_t ulong32_t %idefine wchar_t dword %ifdef UNICODE %idefine NASMX_TCHAR wchar_t %idefine NASMX_TEXT(x) __utf32__(x) %else %idefine NASMX_TCHAR char_t %idefine NASMX_TEXT(x) x %endif %elifidn __OUTPUT_FORMAT__,elf32 ;// gcc does NOT prepend underscores to functions ;// declared using cdecl %idefine __NASMX_DECLSPEC_CALLCONV_CDECL__ 0x0200 %idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0410 %idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0500 %define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ 2 %define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__ 0 %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'ECXEDX' %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'CX DX ' %ifdef FREEBSD NASMX_DECLSPEC SYSTYPE, BSD %elifdef NETBSD NASMX_DECLSPEC SYSTYPE, BSD %elifdef OPENBSD NASMX_DECLSPEC SYSTYPE, BSD %else NASMX_DECLSPEC SYSTYPE, LINUX %endif NASMX_DECLSPEC CALLCONV, CDECL, DEFAULT %idefine long_t long32_t %idefine ulong_t ulong32_t %idefine wchar_t dword %ifdef UNICODE %idefine NASMX_TCHAR wchar_t %idefine NASMX_TEXT(x) __utf32__(x) %else %idefine NASMX_TCHAR char_t %idefine NASMX_TEXT(x) x %endif %elifidn __OUTPUT_FORMAT__,elf64 %idefine __NASMX_DECLSPEC_CALLCONV_CDECL__ 0x0200 %idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0410 %idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0500 %define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ 6 %define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__ 8 %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_8__ 'RDIRSIRDXRCXR8 R9 ' %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'EDIESIEDXECXR8DR9D' %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'DI SI DX CX R8WR9W' %ifdef FREEBSD NASMX_DECLSPEC SYSTYPE, BSD %elifdef NETBSD NASMX_DECLSPEC SYSTYPE, BSD %elifdef OPENBSD NASMX_DECLSPEC SYSTYPE, BSD %else NASMX_DECLSPEC SYSTYPE, LINUX %endif NASMX_DECLSPEC CALLCONV, FASTCALL, DEFAULT %idefine long_t long64_t %idefine ulong_t ulong64_t %idefine wchar_t dword %ifdef UNICODE %idefine NASMX_TCHAR wchar_t %idefine NASMX_TEXT(x) __utf32__(x) %else %idefine NASMX_TCHAR char_t %idefine NASMX_TEXT(x) x %endif %elifidn __OUTPUT_FORMAT__,macho %idefine __NASMX_DECLSPEC_CALLCONV_CDECL__ 0x0201 %idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0411 %idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0501 %define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ 0 %define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__ 0 NASMX_DECLSPEC SYSTYPE, MACHOS NASMX_DECLSPEC CALLCONV, CDECL, DEFAULT %idefine long_t long32_t %idefine ulong_t ulong32_t %idefine wchar_t dword %ifdef UNICODE %idefine NASMX_TCHAR wchar_t %idefine NASMX_TEXT(x) __utf32__(x) %else %idefine NASMX_TCHAR char_t %idefine NASMX_TEXT(x) x %endif %elifidn __OUTPUT_FORMAT__,macho32 %idefine __NASMX_DECLSPEC_CALLCONV_CDECL__ 0x0201 %idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0411 %idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0501 %define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ 0 %define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__ 0 NASMX_DECLSPEC SYSTYPE, MACHOS NASMX_DECLSPEC CALLCONV, CDECL, DEFAULT %idefine long_t long32_t %idefine ulong_t ulong32_t %idefine wchar_t dword %ifdef UNICODE %idefine NASMX_TCHAR wchar_t %idefine NASMX_TEXT(x) __utf32__(x) %else %idefine NASMX_TCHAR char_t %idefine NASMX_TEXT(x) x %endif %elifidn __OUTPUT_FORAMT__,macho64 %idefine __NASMX_DECLSPEC_CALLCONV_CDECL__ 0x0201 %idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0411 %idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0501 %define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ 6 %define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__ 8 %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_8__ 'RDIRSIRDXRCXR8 R9 ' %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'EDIESIEDXECXR8dR9d' %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'DI SI DX CX R8wR9w' NASMX_DECLSPEC SYSTYPE, MACHOS NASMX_DECLSPEC CALLCONV, FASTCALL, DEFAULT %idefine long_t long64_t %idefine ulong_t ulong64_t %idefine wchar_t dword %ifdef UNICODE %idefine NASMX_TCHAR wchar_t %idefine NASMX_TEXT(x) __utf32__(x) %else %idefine NASMX_TCHAR char_t %idefine NASMX_TEXT(x) x %endif %elifidn __OUTPUT_FORMAT__,win32 %idefine __NASMX_DECLSPEC_CALLCONV_CDECL__ 0x0201 %idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x2423 %idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x2522 %define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ 2 %define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__ 0 %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'ECXEDX' %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'CX DX ' NASMX_DECLSPEC SYSTYPE, WINDOWS NASMX_DECLSPEC CALLCONV, STDCALL, DEFAULT %idefine long_t long32_t %idefine ulong_t ulong32_t %idefine wchar_t word %ifdef UNICODE %idefine NASMX_TCHAR wchar_t %idefine NASMX_TEXT(x) __utf16__(x) %else %idefine NASMX_TCHAR char_t %idefine NASMX_TEXT(x) x %endif %elifidn __OUTPUT_FORMAT__,win64 %idefine __NASMX_DECLSPEC_CALLCONV_CDECL__ 0x0201 %idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x2423 %idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0500 %define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ 4 %define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__ 4 %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_8__ 'RCXRDXR8 R9 ' %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'ECXEDXR8DR9D' %define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'CX DX R8WR9W' NASMX_DECLSPEC SYSTYPE, WINDOWS NASMX_DECLSPEC CALLCONV, FASTCALL, DEFAULT %idefine long_t long32_t %idefine ulong_t ulong32_t %idefine wchar_t word %ifdef UNICODE %idefine NASMX_TCHAR wchar_t %idefine NASMX_TEXT(x) __utf16__(x) %else %idefine NASMX_TCHAR char_t %idefine NASMX_TEXT(x) x %endif %else %idefine __NASMX_DECLSPEC_CALLCONV_CDECL__ 0x0200 %idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0410 %idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0500 %define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ 0 %define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__ 0 NASMX_DECLSPEC SYSTYPE, LINUX NASMX_DECLSPEC CALLCONV, CDECL, DEFAULT %if sizeof(size_t) == 32 %idefine long_t long32_t %idefine ulong_t ulong32_t %else %idefine long_t long64_t %idefine ulong_t ulong64_t %endif %idefine wchar_t dword %ifdef UNICODE %idefine NASMX_TCHAR wchar_t %idefine NASMX_TEXT(x) __utf32__(x) %else %idefine NASMX_TCHAR char_t %idefine NASMX_TEXT(x) x %endif %endif ;// pull in appropriate syscalls %if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_BSD__ %ifdef FREEBSD %include 'bsd/syscalls.freebsd.inc' %elifdef NETBSD %include 'bsd/syscalls.netbsd.inc' %elifdef OPENBSD %include 'bsd/syscalls.openbsd.inc' %endif %elif __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_LINUX__ %include 'linux/syscall.inc' %endif ;////////////////////////////////////////////////////////////// ;// ;// NASMX_STRUC ;// %imacro NASMX_STRUC 0-*.nolist __NX_ROOT, __NX_ROOT, __NX_CTX_STRUC %ifnidni %3,__NX_CTX_STRUC %ifnidni %3,__NX_CTX_UNION %fatal unknown arg: %{3} %endif %endif %ifctx __NX_CTX_STRUC %define %%__is_nested 1 %elifctx __NX_CTX_UNION %define %%__is_nested 1 %else %define %%__is_nested 0 %endif %ifidni %1, __NX_ROOT %define %%__is_named 0 %else %define %%__is_named 1 %endif %if (%%__is_nested == 0) %if (%%__is_named == 0) %fatal root structure or union requires name %endif %push %3 %xdefine %$__nx_name %1 %assign %$__nx_size 0 %else %if (%%__is_named == 0) %xdefine %%__tname %{$__nx_name} %else %xdefine %%__tname %{$__nx_name}.%1 %endif ;// the following 5 line sequence fails on 2.08.02 %assign %%__tsize %$__nx_size %push %3 %xdefine %$__nx_name %%__tname %assign %$__nx_size %%__tsize %if (%%__is_named == 1) %{$__nx_name} equ %$__nx_size %endif %endif %assign %$__nx_osize %$__nx_size %assign %$__nx_usize 0 %define %$__nx_isnamed %%__is_named %if (%%__is_named == 1) %ifidni %3,__NX_CTX_STRUC %xdefine %{$__nx_name}_type struc_type %elifidni %3,__NX_CTX_UNION %xdefine %{$__nx_name}_type union_type %else %fatal unknown arg: %{3} %endif %xdefine %{$__nx_name}_reserve byte_reserve %xdefine %{$__nx_name}_storage byte_storage %endif %endmacro %imacro NASMX_UNION 0-*.nolist __NX_ROOT, __NX_ROOT, __NX_CTX_UNION NASMX_STRUC %1, __NX_ROOT, __NX_CTX_UNION %endmacro %imacro NASMX_ALIGN 1.nolist %ifnctx __NX_CTX_STRUC %ifnctx __NX_CTX_UNION %fatal corrupt context %endif %endif %if (%1 > 0) %assign %%__off (((%$__nx_size + %1) / %1) * %1) %assign %%__tmp (%$__nx_size + %1) %if (%%__off != %%__tmp) %assign %$__nx_size %%__off %endif %endif %endmacro ;// usage: ;// NASMX_RESERVE hWnd, NASMX_PTR, 1 %imacro NASMX_RESERVE 2-3.nolist 1 %ifnctx __NX_CTX_STRUC %ifnctx __NX_CTX_UNION %fatal corrupt context %endif %endif %ifndef %{2}_size %fatal unknown size for %{$__nx_name} %{1}: %{2} %endif %assign %%__argsize %{2}_size %if (%%__argsize < 1) %fatal invalid arg size for %{$__nx_name} %{1}: %{2} %endif %ifndef %{2}_storage %fatal unknown storage tag for %{$__nx_name} %{1} %endif %assign %%__qty %{3} %if (%%__qty < 1) %fatal invalid arg qty for %{$__nx_name} %{1}: %{3} %endif %assign %%__amt (%%__argsize * %%__qty) %xdefine %[%{$__nx_name}.%{1}]_size %%__amt %xdefine %[%{$__nx_name}.%{1}]_type %[%{2}]_type %xdefine %[%{$__nx_name}.%{1}]_reserve %[%{2}]_reserve %xdefine %[%{$__nx_name}.%{1}]_storage %[%{2}]_storage %[%{$__nx_name}.%{1}] equ %[%{$__nx_size}] %ifctx __NX_CTX_UNION ;// update current union size %if (%%__amt > %$__nx_usize) %assign %$__nx_usize %%__amt %endif %else ;// update running size %assign %$__nx_size (%$__nx_size + %%__amt) %endif %endmacro %imacro NASMX_ENDSTRUC 0.nolist %ifnctx __NX_CTX_STRUC %ifnctx __NX_CTX_UNION %fatal corrupt context %endif %endif %if ((%$__nx_size-%$__nx_osize) > %$__nx_usize) %assign %$__nx_usize %$__nx_size-%$__nx_osize %endif %if (%$__nx_isnamed == 1) %{$__nx_name}_size equ %$__nx_usize %endif %assign %%__usize %$__nx_usize %pop %ifctx __NX_CTX_STRUC %assign %$__nx_size (%$__nx_size + %%__usize) %elifctx __NX_CTX_UNION %assign %$__nx_size (%$__nx_size + %%__usize) %if ((%$__nx_size-%$__nx_osize) > %$__nx_usize) %assign %$__nx_usize %$__nx_size-%$__nx_osize %endif %assign %$__nx_size %$__nx_osize %endif %endmacro %idefine NASMX_ENDUNION NASMX_ENDSTRUC %imacro NASMX_ISTRUC 0-*.nolist __NX_ROOT, __NX_ROOT, __NX_CTX_ISTRUC %ifnidni %{3},__NX_CTX_ISTRUC %ifnidni %{3},__NX_CTX_IUNION %fatal unknown arg: %{3} %endif %endif %ifctx __NX_CTX_ISTRUC %define %%__is_nested 1 %elifctx __NX_CTX_IUNION %define %%__is_nested 1 %else %define %%__is_nested 0 %endif %ifnidni %{1},__NX_ROOT %define %%__is_named 1 %else %define %%__is_named 0 %endif %if (%%__is_nested == 0) %if (%%__is_named == 0) %fatal root structure or union requires name %endif %ifidni %2, __NX_ROOT %fatal root structure or union requires base type %endif %push %3 %xdefine %$__nx_istrucstart %{1} %xdefine %$__nx_name %{2} %[%$__nx_istrucstart]: %else %if (%%__is_named == 0) %xdefine %%__tname %{$__nx_name} %else %xdefine %%__tname %{$__nx_name}.%{1} %assign %%__off %%__tname %assign %%__times %%__off-($-%[%$__nx_istrucstart]) %if (%%__times > 0) times %%__times db 0 %endif %endif %push %3 %xdefine %$__nx_istrucstart %[%$$__nx_istrucstart] %xdefine %$__nx_name %%__tname %endif %define %$__nx_isnamed %%__is_named %endmacro %idefine NASMX_IUNION NASMX_ISTRUC %imacro NASMX_AT 1-2+.nolist %assign %%__ofs %{$__nx_name}.%{1} %assign %%__count %%__ofs-($-%$__nx_istrucstart) %if (%%__count > 0) times %%__count db 0 %endif %{$__nx_name}.%{1}_storage %2 %endmacro %imacro NASMX_IENDSTRUC 0.nolist ;// assert: finish up struc if needed %if (%$__nx_isnamed == 1) %assign %%__times %{$__nx_name}_size-($-%$__nx_istrucstart) %if (%%__times > 0) times %%__times db 0 %endif %endif %pop %endmacro %idefine NASMX_IENDUNION NASMX_IENDSTRUC ;////////////////////////////////////////////////////////////// ;// MACRO nx_isalnum ;// ;// Purpose ;// This macro is designed to return in the current context ;// stack variable %$__nx_isalnum_bool if the parameter is ;// alphanumeric. ;// ;// Usage: ;// nx_isalnum chr ;// nx_isalnum 'x' ;// %macro nx_isalnum 1 %ifstr %1 %define %%__arg_chr %1 %else %defstr %%__arg_chr %1 %endif %assign %%__count 62 %assign %%__idx 3 %assign %$__nx_isalnum_bool 0 %rep %%__count %assign %%__idx %%__idx + 1 %substr %%__chr __NASMX_NUMALPHATOKEN__ %%__idx, 1 %ifidn %%__chr, %%__arg_chr %assign %$__nx_isalnum_bool %%__idx %exitrep %endif %endrep %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO nx_ishexchr ;// ;// Purpose ;// This macro is designed to return in the current context ;// stack variable %$__nx_ishexnum_bool if the parameter is ;// hexadecimal. ;// ;// Usage: ;// nx_ishexchr chr ;// nx_ishexchr 'f' ;// %macro nx_ishexchr 1 %ifstr %1 %define %%__arg_chr %1 %else %defstr %%__arg_chr %1 %endif %assign %%__count 22 %assign %%__idx 3 %assign %$__nx_ishexchr_bool 0 %rep %%__count %assign %%__idx %%__idx + 1 %substr %%__chr __NASMX_NUMALPHATOKEN__ %%__idx, 1 %ifidn %%__chr, %%__arg_chr %assign %$__nx_ishexchr_bool %%__idx %exitrep %endif %endrep %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO nx_isfloattok ;// ;// Purpose ;// This macro is designed to return in the current context ;// stack variable %$__nx_isfloattok_bool if the parameter is ;// a float token. ;// ;// Usage: ;// %define PI 3.14159 ;// nx_isfloattok PI ;// nx_isfloattok string ;// %macro nx_isfloattok 1 %ifstr %1 %define %%__arg_str %1 %else %defstr %%__arg_str %1 %endif %strlen %%__arg_len %%__arg_str %assign %$__nx_isfloattok 0 %assign %%__found 0 %assign %%__arg_idx 0 %rep %%__arg_len %assign %%__arg_idx %%__arg_idx + 1 %substr %%__arg_chr %%__arg_str %%__arg_idx, 1 %assign %%__found 0 %assign %%__idx 0 %rep 15 %assign %%__idx %%__idx + 1 %substr %%__chr __NASMX_NUMALPHATOKEN__ %%__idx, 1 %ifidn %%__chr, %%__arg_chr %assign %%__found %%__idx %exitrep %endif %endrep %if %%__found == 0 %exitrep %endif %endrep %assign %$__nx_isfloattok_bool %%__found %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO nx_ishextok ;// ;// Purpose ;// This macro is designed to return in the current context ;// stack variable %$__nx_ishextok_bool if the parameter is ;// a hex token. Note that this macro also returns true if ;// arg is an integer making it rather useful when we need ;// to move the number to a register ;// ;// Usage: ;// nx_ishextok token ;// nx_ishextok 0xFFF0 ;// %macro nx_ishextok 1 %ifstr %1 %define %%__arg_str %1 %else %defstr %%__arg_str %1 %endif %strlen %%__arg_len %%__arg_str %assign %%__arg_idx 0 %assign %%__has_x 0 %rep %%__arg_len %assign %%__arg_idx %%__arg_idx + 1 %substr %%__arg_chr %%__arg_str %%__arg_idx, 1 %assign %%__found 0 %ifidni %%__arg_chr, 'x' %if %%__has_x == 0 %if %%__arg_idx < %%__arg_len %assign %%__has_x 1 %assign %%__found 1 %else %exitrep %endif %else %exitrep %endif %else %assign %%__idx 1 %rep 24 %assign %%__idx %%__idx + 1 %substr %%__chr __NASMX_NUMALPHATOKEN__ %%__idx, 1 %ifidn %%__chr, %%__arg_chr %assign %%__found %%__idx %exitrep %endif %endrep %endif %if %%__found == 0 %exitrep %endif %endrep %assign %$__nx_ishextok_bool %%__found %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO nx_strtok ;// ;// Purpose ;// To parse a string and return delimited tokens ;// Functionality is similar to the C strtok function ;// ;// Usage: ; After call: ;// nx_strtok two tokens, ' ' ; %$__nx_token = two , %$__nx_token_len = 3 ;// nx_strtok NULL, ' :?;' ; %$__nx_token = tokens, %$__nx_token_len = 6 ;// nx_strtok NULL, ' :?;' ; %$__nx_token = '' , %$__nx_token_len = 0 ;// ;// Notes: ;// The return value is stored on the context stack as ;// %$__nx_token thus it must only be called within a valid context. ;// The length is also returned as %$__nx_token_len. Check this value ;// for 0 after call this macro before processing the return value. ;// ;// Call more than once to get the next token in the sequence, if any. ;// This function must be called at least once with a valid string ;// or token to parse before passing in NULL (0) in subsequent calls. ;// ;// Unfortunately, a side effect of using macros is that a comma which ;// appears in a token actually causes the single token to split into 2 ;// tokens making it impossible to use this macro like: ;// %define mytoken $32,000 ;// nx_strtok mytoken, ',' %imacro nx_strtok 2.nolist %ifnum %1 %assign %%__nx_null %1 %if %%__nx_null == 0 %define %%__arg_str %$__nxtok_next %assign %%__arg_len %$__nxtok_len %else %defstr %%__arg_str %1 %strlen %%__arg_len %%__arg_str %endif %else %ifstr %1 %define %%__arg_str %1 %else %defstr %%__arg_str %1 %endif %strlen %%__arg_len %%__arg_str %endif %if %%__arg_len == 0 %define %$__nxtok_next '' %assign %$__nxtok_len 0 %define %$__nx_token '' %assign %$__nx_token_len 0 %else %ifstr %2 %define %%__sep_str %2 %else %defstr %%__sep_str %2 %endif %strlen %%__sep_len %%__sep_str %assign %$__nx_token_len 0 %assign %%__arg_idx 1 %rep %%__arg_len %substr %%__arg_chr %%__arg_str %%__arg_idx %assign %%__sep_idx 1 %rep %%__sep_len %substr %%__sep_chr %%__sep_str %%__sep_idx %ifidn %%__arg_chr, %%__sep_chr %assign %$__nx_token_len %%__arg_idx-1 %exitrep %else %assign %%__sep_idx 1+%%__sep_idx %endif %endrep %if %$__nx_token_len != 0 %exitrep %else %assign %%__arg_idx 1+%%__arg_idx %endif %endrep %if %$__nx_token_len == 0 %deftok %$__nx_token %%__arg_str %assign %$__nx_token_len %%__arg_len %define %$__nxtok_next '' %assign %$__nxtok_len 0 %else %substr %%__tokstr %%__arg_str 1,%$__nx_token_len %deftok %$__nx_token %%__tokstr %if %$__nx_token_len < %%__arg_len %rep %%__arg_len - %$__nx_token_len %substr %%__arg_chr %%__arg_str %%__arg_idx %assign %%__nx_found 0 %assign %%__sep_idx 1 %rep %%__sep_len %substr %%__sep_chr %%__sep_str %%__sep_idx %ifidn %%__arg_chr, %%__sep_chr %assign %%__nx_found 1 %exitrep %else %assign %%__sep_idx 1+%%__sep_idx %endif %endrep %if %%__nx_found == 0 %exitrep %else %assign %%__arg_idx 1+%%__arg_idx %endif %endrep %if %%__arg_idx <= %%__arg_len %assign %$__nxtok_len %%__arg_len-%%__arg_idx+1 %substr %$__nxtok_next %%__arg_str %%__arg_idx,%$__nxtok_len %else %define %$__nxtok_next '' %assign %$__nxtok_len 0 %endif %else %define %$__nxtok_next '' %assign %$__nxtok_len 0 %endif %endif %endif %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO nx_strchr ;// ;// Purpose ;// This macro is designed to find position of char within string. ;// It will update the current context stack variable %$__nx_strchr_pos ;// with the index position of the chr or 0 if chr not found ;// Usage: ;// nx_strchr string, chr ;// nx_strchr [wc + hInstance], 'x' ;// %macro nx_strchr 2 %ifdef %$__nx_strchr_string %undef %$__nx_strchr_string %endif %ifstr %1 %xdefine %$__nx_strchr_string %{1} %else %defstr %$__nx_strchr_string %{1} %endif %strlen %%__count %[%$__nx_strchr_string] %assign %%__idx 0 %assign %%__found 0 %rep %%__count %assign %%__idx %%__idx + 1 %substr %%__chr %[%$__nx_strchr_string] %%__idx %ifidn %%__chr,%{2} %assign %%__found %%__idx %exitrep %endif %endrep %assign %$__nx_strchr_pos %%__found %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO nx_strstr ;// ;// Purpose ;// This macro is designed to find position of substr within string. ;// It will update the current context stack variable %$__nx_strstr_pos ;// with the index position of the substr or 0 if not found ;// Usage: ;// nx_strstr string, substr ;// nx_strstr [rpb + hInstance], rbp ;// %macro nx_strstr 2 %ifdef %$__nx_strstr_string %undef %$__nx_strstr_string %endif %ifstr %1 %xdefine %$__nx_strstr_string %{1} %else %defstr %$__nx_strstr_string %{1} %endif %ifstr %2 %xdefine %$__nx_strstr_substring %{2} %else %defstr %$__nx_strstr_substring %{2} %endif %strlen %%__count %[%$__nx_strstr_string] %substr %%__subchr %[%$__nx_strstr_substring] 1 %strlen %%__sublen %[%$__nx_strstr_substring] %assign %%__idx 0 %assign %%__found 0 %rep %%__count %assign %%__idx %%__idx + 1 %if ((%%__count - %%__idx + 1) < %%__sublen) %exitrep %endif %substr %%__chr %[%$__nx_strstr_string] %%__idx %ifidni %%__chr,%%__subchr %substr %%__tmpstr %$__nx_strstr_string %%__idx, %%__sublen %ifidni %%__tmpstr, %$__nx_strstr_substring %assign %%__found %%__idx %exitrep %endif %endif %endrep %assign %$__nx_strstr_pos %%__found %undef %$__nx_strstr_string %undef %$__nx_strstr_substring %endmacro ;// small helper macro used to parse __nxsig@@ defines %macro nx_parse_tokens 1-100.nolist %ifdef __nx_token_0 %undef __nx_token_0 %endif %xdefine __nx_token_0 %0 %assign %%__ctr 1 %rep %0 %ifdef __nx_token_%[%%__ctr] %undef __nx_token_%[%%__ctr] %endif %xdefine __nx_token_%[%%__ctr] %1 %assign %%__ctr 1 + %%__ctr %rotate 1 %endrep %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO IMPORT ;// ;// Purpose ;// To define the signature and required syntax for ;// an external function ;// ;// usage: ;// IMPORT printf ;// IMPORT GetSystemWindowsDirectoryA, 8 ;// IMPORT cdecl, myfunc, ptrdiff_t, dword, float_t ;// %imacro IMPORT 1-100.nolist %push __NX_CTX_IMPORT__ %assign %$__bytecount 0 %ifndef __NASMX_DECLSPEC_CALLCONV_%[%1]__ %assign %$__callconv __NASMX_DECLSPEC_CALLCONV_DEFAULT__ %define %$__nx_proc %1 %if %0 > 1 %ifnum %2 %ifidn __OUTPUT_FORMAT__,win32 %assign %$__bytecount %2 %endif %assign %$__repargs 0 %else %assign %$__repargs %0-1 %endif %else %assign %%__cc_enum nx_declspec_cc_enum(__NASMX_DECLSPEC_CALLCONV_DEFAULT__) %if %%__cc_enum == __NASMX_DECLSPEC_CC_ENUM_STDCALL__ ;// assert: no bytecount in import implies cdecl for win32 %assign %$__callconv __NASMX_DECLSPEC_CALLCONV_CDECL__ ; %elif %%__cc_enum == __NASMX_DECLSPEC_CC_ENUM_FASTCALL__ ; ;// assert: no bytecount in import implies cdecl for win32/win64 fastcall ; %assign %$__callconv __NASMX_DECLSPEC_CALLCONV_CDECL__ %endif %assign %$__repargs 0 %endif %else %if %0 < 2 %fatal usage: IMPORT [CALLCONV, ] FUNCNAME [,ARG1,ARG2,...] %endif %assign %$__callconv __NASMX_DECLSPEC_CALLCONV_%[%1]__ %define %$__nx_proc %2 %assign %$__repargs %0-2 %endif %ifdef __nx_import_param_list %undef __nx_import_param_list %endif %assign %%__cc_enum nx_declspec_cc_enum(%[%$__callconv]) %if %%__cc_enum != __NASMX_DECLSPEC_CC_ENUM_NAKED__ ;// assert: calc byte count for sig check %rep %$__repargs %rotate -1 %ifnum %1 %assign %$__bytecount %1 %exitrep %else nx_strtok %1, ' ' %assign %%__param_size sizeof(%$__nx_token) %if %%__param_size < sizeof(size_t) %assign %%__param_size sizeof(size_t) %endif %if %%__param_size > (sizeof(size_t) * 2) %error %1 exceeds allowable parameter size %endif %assign %$__bytecount %$__bytecount + %%__param_size %xdefine __nx_import_argtype %$__nx_token %+ _type %ifndef __nx_import_param_list %defstr __nx_import_param_list __nx_import_argtype %else %defstr __nx_import_argstr __nx_import_argtype %strcat __nx_import_param_list __nx_import_argstr,',',__nx_import_param_list %undef __nx_import_argstr %endif %undef __nx_import_argtype %endif %endrep %endif nx_callconv_decorate %$__callconv,%$__nx_proc,%$__bytecount %ifdef __nxsig@@%[%$__nxtok_decorated_name] %warning redefining import symbol %$__nx_proc as %[%$__nxtok_decorated_name] %endif %ifndef __nx_import_param_list %xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__callconv],%[%$__bytecount] %else %deftok __nx_import_params __nx_import_param_list %xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__callconv],%[%$__bytecount],__nx_import_params %undef __nx_import_params %undef __nx_import_param_list %endif %ifnidn %$__nx_proc,%$__nxtok_decorated_name %xdefine %[%$__nx_proc] %[%$__nxtok_decorated_name] %endif %pop %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO PROTO ;// ;// usage: ;// PROTO [CALLCONV,] FUNCNAME [,ARGS...] ;// ;// examples: ;// Using default calling convention: ;// PROTO WndProc, ptrdiff_t, dword, size_t, size_t ;// Specifying a calling convention ;// PROTO cdecl, myfunc, ptrdiff_t, dword, float_t ;// ;// notes: ;// This macro must be used when defining procedures ;// that will be callable from other modules via ;// the import macro as the function name is made ;// global here. ;// %imacro PROTO 1-100.nolist %push __NX_CTX_PROTO__ %ifndef __NASMX_DECLSPEC_CALLCONV_%[%1]__ %assign %$__callconv __NASMX_DECLSPEC_CALLCONV_DEFAULT__ %define %$__proc %1 %assign %$__repcnt %0-1 %else %if %0 < 2 %fatal usage: PROTO [CALLCONV, ] FUNCNAME [,ARG1,ARG2,...] %endif %assign %$__callconv __NASMX_DECLSPEC_CALLCONV_%[%1]__ %define %$__proc %2 %assign %$__repcnt %0-2 %endif %ifdef __nx_proto_param_list %undef __nx_proto_param_list %endif %assign %$__bytecount 0 %assign %%__cc_enum nx_declspec_cc_enum(%$__callconv) %if %%__cc_enum != __NASMX_DECLSPEC_CC_ENUM_NAKED__ ;// assert: calc byte count for sig check during invoke %rep %$__repcnt %rotate -1 %ifnum %1 %assign %$__bytecount %1 %exitrep %else nx_strtok %1, ' ' %assign %%__param_size %[%$__nx_token]_size %if %%__param_size < sizeof(size_t) %assign %%__param_size sizeof(size_t) %endif %if %%__param_size > (sizeof(size_t) * 2) %error %1 exceeds allowable parameter size %endif %assign %$__bytecount %$__bytecount + %%__param_size %xdefine __nx_proto_argtype %$__nx_token %+ _type %ifndef __nx_proto_param_list %defstr __nx_proto_param_list __nx_proto_argtype %else %defstr __nx_proto_argstr __nx_proto_argtype %strcat __nx_proto_param_list __nx_proto_argstr,',',__nx_proto_param_list %undef __nx_proto_argstr %endif %undef __nx_proto_argtype %endif %endrep %endif %ifndef %[%$__proc] %ifdef __nxsig@@%[%$__proc] %fatal global symbol %[%$__proc] already defined %endif nx_callconv_decorate %$__callconv,%$__proc,%$__bytecount %ifndef __nx_proto_param_list %xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__callconv],%[%$__bytecount] %else %deftok __nx_proto_params __nx_proto_param_list %xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__callconv],%[%$__bytecount],__nx_proto_params %undef __nx_proto_params %undef __nx_proto_param_list %endif %ifnidn %$__proc,%$__nxtok_decorated_name %xdefine %[%$__proc] %[%$__nxtok_decorated_name] %endif %endif %ifndef __nxsig_declared_%[%$__proc] global %[%$__proc] %xdefine __nxsig_declared_%[%$__proc] global %endif %pop %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO ENTRY ;// ;// usage: ;// ENTRY progname ;// ;// examples: ;// ENTRY Demo1 ;// ;// notes: ;// program entry is assumed to be cdecl unless system default ;// callconv specification is pascal. ;// When building on Win64 or using pascal callconv you must ;// change the makefile by removing the leading underscore ;// from the linker /entry line %imacro ENTRY 1.nolist %assign %%__cc_enum nx_declspec_cc_enum(__NASMX_DECLSPEC_CALLCONV_DEFAULT__) %if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ ;// main(argc, argv) %assign %%__bytecount __NASMX_ABI_BITS__ / 4 %else ;// main(argc, argv, envp) %assign %%__bytecount (( __NASMX_ABI_BITS__ / 8 ) * 3) %endif %if %%__cc_enum > __NASMX_DECLSPEC_CC_ENUM_PASCAL__ %assign %%__cc_prefix nx_declspec_cc_prefix(__NASMX_DECLSPEC_CALLCONV_DEFAULT__) %if %%__cc_prefix > 0 %xdefine %[%1] _main %xdefine __nxsig@@_main __NASMX_DECLSPEC_CALLCONV_CDECL__, %%__bytecount %else %xdefine %[%1] main %xdefine __nxsig@@main __NASMX_DECLSPEC_CALLCONV_DEFAULT__, %%__bytecount %endif %else %xdefine %[%1] main %xdefine __nxsig@@main __NASMX_DECLSPEC_CALLCONV_DEFAULT__, %%__bytecount %endif %xdefine __nxsig_declared_%[%1] global global %[%1] %endmacro ;//////////////////////////////////////////////////////////////////////// ;// ;// Internal macro used by invoke to detect argv addressing mode ;// The context variable %$__nx_argv_mode_indirect will be set to ;// the string index where '[' is found and is also used as a flag ;// indicating retrieve the variable contents, not it's address. ;// The context variable %$__nx_argv_mode_bp will be set to the ;// the string index where the sign ( + or - ) is found and will ;// be used as a flag indicating that argv mode is used. ;// The context variables %$__nx_argv_mode_param_type, %$__nx_argv_mode_param_isfloat, ;// %$__nx_argv_mode_param_size, and %$__nx_argv_mode_param_castsize are set according ;// to the parameter list index supplied as the second argument to this macro. %xdefine __NX_ARGV_MODE_SIGN_ADD__ 1 %xdefine __NX_ARGV_MODE_SIGN_SUB__ 2 %macro nx_analyze_argv_mode 2 %ifnum %2 %ifdef __nx_token_%[%2] %assign %$__nx_argv_mode_param_type __nx_token_%[%2] %assign %$__nx_argv_mode_param_isfloat ((%$__nx_argv_mode_param_type >> 15) & 0x01) %assign %$__nx_argv_mode_param_size %$__nx_argv_mode_param_type & 0x7F %else %assign %$__nx_argv_mode_param_type sizeof(size_t) %assign %$__nx_argv_mode_param_isfloat 0 %assign %$__nx_argv_mode_param_size sizeof(size_t) %endif %else %fatal internal error - unknown parameter %endif %assign %$__nx_argv_mode_bp 0 %assign %$__nx_argv_mode_sign 0 %assign %$__nx_argv_mode_castsize sizeof(size_t) %assign %$__nx_argv_mode_fp_isnum 0 %assign %$__nx_argv_mode_fp_num 0 nx_strchr %{1}, '[' %assign %$__nx_argv_mode_indirect %$__nx_strchr_pos %if %$__nx_argv_mode_indirect == 0 nx_strstr %{1}, __BP %if %$__nx_strstr_pos > 0 ;// assert: potentially loading variable address offset from reg bp ;// quick check to help ensure that bp is a token %assign %$__nx_isalnum_bool 0 %defstr %%__str %[%1] %if %$__nx_strstr_pos > 1 %substr %%__sub %%__str %$__nx_strstr_pos-1, 1 nx_isalnum %%__sub %endif %if %$__nx_isalnum_bool == 0 %strlen %%__len %%__str %if %%__len > %$__nx_strchr_pos + 2 %substr %%__sub %%__str %$__nx_strstr_pos+3, 1 nx_isalnum %%__sub %endif %endif %if %$__nx_isalnum_bool == 0 ;// we must be given a positive or negative offset in order to ;// generate code for local variable addressing nx_strchr %{1}, '+' %if %$__nx_strchr_pos == 0 nx_strchr %{1}, '-' %if %$__nx_strchr_pos > 0 %assign %$__nx_argv_mode_sign __NX_ARGV_MODE_SIGN_SUB__ %endif %else %assign %$__nx_argv_mode_sign __NX_ARGV_MODE_SIGN_ADD__ %endif %assign %$__nx_argv_mode_bp %$__nx_strchr_pos %endif %substr %%__off %%__str %$__nx_argv_mode_bp+1, -1 %deftok %$__nx_argv_mode_bp_offset %%__off %elif %$__nx_argv_mode_param_isfloat > 0 ;// assert: check for float type and process nx_isfloattok %1 %if %$__nx_isfloattok_bool != 0 %assign %$__nx_argv_mode_fp_isnum 1 %if %$__nx_argv_mode_param_size == 4 %assign %$__nx_argv_mode_fp_num __float32__(%1) %else %assign %$__nx_argv_mode_fp_num __float64__(%1) %endif %else nx_strtok %1, ' ' %ifndef __nx_reg_%[%$__nx_token] %iftoken %1 %fatal expected floating point at arg %1 %endif ;// must check for casts which indicate ;// __float() or __double() may have been used %ifdef %[%$__nx_token]_size %assign %%__size %[%$__nx_token]_size nx_strtok 0, ';' %else %assign %%__size %$__nx_argv_mode_param_size nx_strtok %1, ';' %endif %if %%__size > %$__nx_argv_mode_param_size %warning potential loss of precision from double to float for arg %1 %endif %assign %$__nx_argv_mode_fp_isnum 1 %assign %$__nx_argv_mode_fp_num %$__nx_token %endif %endif %endif %elif %$__nx_argv_mode_indirect > 3 ;// check for cast ( eg: dword[rbp+4] ) %defstr %%__str %[%1] %substr %%__sub %%__str 1, %$__nx_argv_mode_indirect-1 %deftok %%__tok %%__sub %ifdef %[%%__tok]_size %assign %$__nx_argv_mode_castsize %[%%__tok]_size %endif %endif %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO INVOKE ;// ;// usage: ;// INVOKE func [, arg1] [,arg2] ;// ;// examples: ;// invoke malloc, 64 ;// ;// notes: ;// when using bp offsets you should use qualifiers to ensure ;// they are passed properly, ie: invoke malloc, dword [argv(.x)] ;// %imacro INVOKE 1-100.nolist %ifndef NASMX_ENDPROC ;// assert: we cannot check for context in case we are in a switch ;// so we use nasmx_endproc %fatal 'invoke must be contained within proc/endproc directives.' %endif %ifndef __NX_LOCALS_PRESENT__ ;// require locals directive to ensure stack ;// frame initialized properly prior to invoke. %fatal 'missing locals directive' %endif %push _NX_CTX_INVOKE %assign %$args 0 %assign %$__nx_intargs 0 ;// init int args counter %assign %$__nx_floatargs 0 ;// init float args counter ;// Fix for v1.0rc2: an imported definition may be zero (0) ;// for CDECL varargs or not properly defined, thus we must ;// calculate a valid bytecount based upon given parameters ;// in order to get a proper stack frame built if callstack ;// not defined. %ifdef __nxsig@@%[%1] nx_parse_tokens __nxsig@@%[%1] %assign %$__nx_callconv __nx_token_1 %assign %$__nx_protobytecount __nx_token_2 %ifndef __nxsig_declared_%[%1] %ifndef __nxsig_defined_%[%1] EXTERN %[%1] %xdefine __nxsig_declared_%[%1] extern %endif %endif %else %assign %$__nx_callconv __NASMX_DECLSPEC_CALLCONV_DEFAULT__ %assign %$__nx_protobytecount 0 %endif %assign %%__repcnt %0 - 1 %assign %$__nx_bytecount (( __NASMX_ABI_BITS__ / 8 ) * %%__repcnt) %if %$__nx_bytecount < %$__nx_protobytecount ;// assert: possibly due to double param in ;// 32bit mode or int128 in 64bit mode %assign %$__nx_bytecount %$__nx_protobytecount %endif %assign %%__nx_argrotate nx_declspec_cc_argrotate(%$__nx_callconv) %if %%__nx_argrotate > 0 %assign %$__nx_argrotate 1 %else %assign %$__nx_argrotate -1 %endif %assign %$__nx_retpopsargs nx_declspec_cc_retpopsargs(%$__nx_callconv) %assign %%__cc_enum nx_declspec_cc_enum(%$__nx_callconv) %xdefine %$__nx_proc %1 %if %%__cc_enum == __NASMX_DECLSPEC_CC_ENUM_FASTCALL__ ;// for fastcall, whenever CALLSTACK optimization is enabled, ;// we use the stack built previously during locals/endlocals directive. %assign %$__nx_callstack_adjust 0 %assign %$__nx_invoke_callstack_adjust %$__nx_bytecount %ifdef __NX_PROLOGUE_CALLSTACK_ADJUST__ ;// Verify that the CALLSTACK is sufficient for the ;// number of parameter arguments we have been given. %assign %$__nx_callstack_adjust __NX_PROLOGUE_CALLSTACK_ADJUST__ %if __NASMX_ABI_BITS__ < 64 %if %$__nx_callstack_adjust < %$__nx_bytecount %assign %$__nx_callstack_adjust 0 %warning insufficient callstack size for procedure %[%$__nx_proc], generating inefficient code... %endif %else %if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ %if %$__nx_callstack_adjust < %$__nx_bytecount ;// Windows: always requires a stack adjustment %assign %$__nx_callstack_adjust 0 %warning insufficient callstack size for procedure %[%$__nx_proc], generating inefficient code... %else ;// A callstack defined for Win64 must be at least 32 bytes %if %$__nx_callstack_adjust < 32 %assign %$__nx_callstack_adjust 0 %warning insufficient callstack size for procedure %[%$__nx_proc], generating inefficient code... %else %assign %$__nx_invoke_callstack_adjust 0 %endif %endif %else ;// Linux: required when register allocation exhausted %if %%__repcnt > 6 %assign %$__nx_invoke_callstack_adjust (( %%__repcnt - 6 ) * ( __NASMX_ABI_BITS__ / 8 )) %if %$__nx_invoke_callstack_adjust > %$__nx_callstack_adjust %assign %$__nx_callstack_adjust 0 %warning insufficient callstack size for procedure %[%$__nx_proc], generating inefficient code... %else %assign %$__nx_invoke_callstack_adjust 0 %endif %else %assign %$__nx_invoke_callstack_adjust 0 %endif %endif %endif %else %if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ != __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ %if __NASMX_ABI_BITS__ > 32 ;// Make space for x64 args that could possibly get placed onto the stack %if %%__repcnt > 6 ;// TODO: Make more efficient by examining param types ( non-trivial ). %assign %$__nx_invoke_callstack_adjust (( %%__repcnt - 6 ) * ( __NASMX_ABI_BITS__ / 8 )) %else %assign %$__nx_invoke_callstack_adjust 0 %endif %endif %endif %endif %assign %$__align 0 %if %$__nx_invoke_callstack_adjust > 0 ;// assert: callstack not defined or insufficient, build it here %if __NASMX_ABI_BITS__ > 32 %if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ ;// Windows requires at least 32 bytes of shadow storage %if %$__nx_invoke_callstack_adjust < 32 %assign %$__nx_invoke_callstack_adjust 32 %endif %endif %endif ;// first determine if an alignment adjustment is needed %assign %$__align __NASMX_ABI_BITS__ / 4 %assign %%__off (((%$__nx_invoke_callstack_adjust + %$__align) / %$__align) * %$__align) %assign %%__tmp (%$__nx_invoke_callstack_adjust + %$__align) %if (%%__off != %%__tmp) ;// for fastcalls that retpopsargs we need to account ;// for the extra space when stack restored later on %assign %$__align __NASMX_ABI_BITS__ / 8 %assign %$__nx_invoke_callstack_adjust %%__off %else %assign %$__align 0 %endif sub __SP, %$__nx_invoke_callstack_adjust %endif ;// the following variable is used as a flag to catch a very bad logic state ;// in 64 bit code when using RAX as a paramater since RAX is used to spill ;// parameters to the stack, potentially causing a very tough bug to find! %assign %%__reg_ax_used 0 %assign %$__param_type_ctr 2 ; arg types follow cconv,bytecount %assign %$args 0 %rep %%__repcnt %rotate 1 ;// set up internal vars used to determine if argv address mode used %assign %$__param_type_ctr %$__param_type_ctr + 1 nx_analyze_argv_mode %1, %$__param_type_ctr %assign %%__argtostack 1 ;// assume we need to store on stack %if %$__nx_argv_mode_param_isfloat == 0 %if %$__nx_intargs < __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ %assign %%__argtostack 0 %substr %%__regstr __NASMX_DECLSPEC_FASTCALL_REGINTARGS_%[%$__nx_argv_mode_castsize]__ (%$__nx_intargs * 3 + 1), 3 %deftok %$arg_cur %%__regstr %undef %%__regstr %ifnum %1 %if %1 == -1 or %$arg_cur, %1 %elif %1 == 0 xor %$arg_cur, %$arg_cur %else mov %$arg_cur, %1 %endif %elifstr %1 jmp %%endstr_%$args %%str_%$args: declare(NASMX_TCHAR) NASMX_TEXT(%1), 0 %%endstr_%$args: lea %$arg_cur,[rel %%str_%$args] %else %if %$__nx_argv_mode_indirect > 0 mov %$arg_cur, %1 %elif %$__nx_argv_mode_bp > 0 mov %$arg_cur, __BP %if %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_ADD__ add %$arg_cur, %$__nx_argv_mode_bp_offset %elif %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_SUB__ sub %$arg_cur, %$__nx_argv_mode_bp_offset %else %fatal Unknown addressing mode for %{1} %endif %elifnidni %$arg_cur, %1 ;// if register parameter then guard against ;// invalid register to register moves %ifdef __nx_reg_%[%1] %if %[%1]_size != __NASMX_ABI_BITS__ / 8 %fatal %1 cannot be used as parameter for __NASMX_ABI_BITS__ bit mode %endif %endif mov %$arg_cur, %1 %endif %endif %if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ ;// Windows fastcall uses one index for param count which ;// indexes either int or float for purpose of preloading regs %assign %$__nx_floatargs 1 + %$__nx_floatargs ;// TODO: optimize register spill for when required only mov [__SP + %$args], %$arg_cur ;// Unlike Linux/BSD x64 all current 32-bit and 64-bit versions ;// of Windows increase arg stack offset. %assign %$args %$args + sizeof(size_t) %else ;// increase arg stack offset only for 32-bit non-Windows systems. %if __NASMX_ABI_BITS__ < 64 %assign %$args %$args + sizeof(size_t) %endif %endif %assign %$__nx_intargs 1 + %$__nx_intargs %undef %$arg_cur %endif %elif %$__nx_floatargs < __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__ %assign %%__argtostack 0 %if __NASMX_ABI_BITS__ > 32 ;// assert: use 64-bit registers %if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ %if %$args == 0 %xdefine %$arg_cur xmm0 %elif %$args == 8 %xdefine %$arg_cur xmm1 %elif %$args == 16 %xdefine %$arg_cur xmm2 %elif %$args == 24 %xdefine %$arg_cur xmm3 %endif %else %if %$__nx_floatargs == 0 %xdefine %$arg_cur xmm0 %elif %$__nx_floatargs == 1 %xdefine %$arg_cur xmm1 %elif %$__nx_floatargs == 2 %xdefine %$arg_cur xmm2 %elif %$__nx_floatargs == 3 %xdefine %$arg_cur xmm3 %elif %$__nx_floatargs == 4 %xdefine %$arg_cur xmm4 %elif %$__nx_floatargs == 5 %xdefine %$arg_cur xmm5 %elif %$__nx_floatargs == 6 %xdefine %$arg_cur xmm6 %elif %$__nx_floatargs == 7 %xdefine %$arg_cur xmm7 %endif %endif %if %$__nx_argv_mode_indirect > 0 nx_strtok %1, ' ' %ifdef %[%$__nx_token]_size nx_strtok 0, ';' movsd %$arg_cur, %$__nx_token %else movsd %$arg_cur, %1 %endif movsd [__SP + %$args], %$arg_cur %elif %$__nx_argv_mode_bp > 0 nx_strtok %1, ' ' %ifdef __nx_reg_%[%$__nx_token] movsd %$arg_cur, [%1] %elifdef %[%$__nx_token]_size nx_strtok 0, ';' movsd %$arg_cur, [ %[%$__nx_token] ] %else movsd %$arg_cur, [%1] %endif movsd [__SP + %$args], %$arg_cur %else %if %$__nx_argv_mode_fp_isnum != 0 mov rax, %$__nx_argv_mode_fp_num mov qword [__SP + %$args], rax %assign %%__reg_ax_used 1 %else mov qword [__SP + %$args], %1 %endif movsd %$arg_cur, [__SP + %$args] %endif %else ;// 32-bit fastcall float param %if %$__nx_argv_mode_param_size > 4 ;// assert: callee expecting double type which ;// is always maintained on the stack %if %$__nx_argv_mode_fp_isnum != 0 %assign %%__tmp (%$__nx_argv_mode_fp_num & 0x00000000FFFFFFFF) mov dword [__SP + %$args], %%__tmp %assign %%__tmp ((%$__nx_argv_mode_fp_num >> 32) & 0x00000000FFFFFFFF) mov dword [__SP+%$args+4], %%__tmp %else fld %1 fstp qword [esp] %endif %assign %$args %$args + 8 %else %if %$args == 0 %xdefine %$arg_cur ecx %elif %$args == 4 %xdefine %$arg_cur edx %else %xdefine %$arg_cur __AX %assign %%__reg_ax_used 1 %endif %if %$__nx_argv_mode_fp_isnum != 0 mov %$arg_cur, %$__nx_argv_mode_fp_num %else mov %$arg_cur, %1 %endif mov [__SP + %$args], %$arg_cur %assign %$args %$args + 4 %endif %endif %if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ ;// Windows fastcall uses one index for either ;// int or float params for purpose of preloading regs %assign %$__nx_intargs 1 + %$__nx_intargs %endif %assign %$__nx_floatargs 1 + %$__nx_floatargs %undef %$arg_cur %endif %if %%__argtostack != 0 ;// assert: no available registers %if %$__nx_argv_mode_param_isfloat == 0 %ifnum %1 %if __NASMX_ABI_BITS__ > 32 %assign %%__reg_ax_used 1 mov __AX, %{1} mov size_t [__SP + %$args], __AX %else mov size_t [__SP + %$args], %{1} %endif %elifstr %1 jmp %%endstr_%$args %%str_%$args: declare(NASMX_TCHAR) NASMX_TEXT(%1), 0 %%endstr_%$args: lea __AX,[rel %%str_%$args] mov [__SP + %$args], __AX %assign %%__reg_ax_used 1 %else %if %$__nx_argv_mode_indirect > 0 %if %$__nx_argv_mode_castsize < 4 %xdefine %$arg_cur AX %elif %$__nx_argv_mode_castsize < 8 %xdefine %$arg_cur EAX %else %xdefine %$arg_cur RAX %endif %assign %%__reg_ax_used 1 mov %$arg_cur, %{1} mov [__SP + %$args], __AX %undef %$arg_cur %elif %$__nx_argv_mode_bp > 0 %assign %%__reg_ax_used 1 mov __AX, __BP %if %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_ADD__ add __AX, %$__nx_argv_mode_bp_offset %elif %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_SUB__ sub __AX, %$__nx_argv_mode_bp_offset %else %fatal Unknown addressing mode for %{1} %endif mov [__SP + %$args], __AX %else %ifidni %1, __AX %if %%__reg_ax_used > 0 %warning use of _AX as arg resulted in inconsistent logic state %endif %endif mov size_t [__SP + %$args], %{1} %endif %endif %else ;// assert: processing float param %if %$__nx_argv_mode_indirect > 0 %if %$__nx_argv_mode_castsize > %$__nx_argv_mode_param_size %warning potential loss of precision during conversion of double to float for %[%1] %endif fld __nx_error_token_size_%[%$__nx_argv_mode_castsize] %1 fstp __nx_error_token_size_%[%$__nx_argv_mode_param_size] [__SP + %$args] %elif %$__nx_argv_mode_bp > 0 fld __nx_error_token_size_%[%$__nx_argv_mode_param_size] [%1] fstp __nx_error_token_size_%[%$__nx_argv_mode_param_size] [__SP + %$args] %else %if %$__nx_argv_mode_fp_isnum != 0 ;// assert: arg is floating point constant %if %$__nx_argv_mode_param_size == 4 ;// assert: callee expecting float type mov dword [__SP + %$args], %$__nx_argv_mode_fp_num %else ;// assert: callee expecting double type %assign %%__tmp (%$__nx_argv_mode_fp_num & 0x00000000FFFFFFFF) mov dword [__SP + %$args], %%__tmp %assign %%__tmp ((%$__nx_argv_mode_fp_num >> 32) & 0x00000000FFFFFFFF) mov dword [__SP+%$args+4], %%__tmp %endif %else mov __nx_error_token_size_%[%$__nx_argv_mode_param_size] [__SP + %$args], %1 %endif %endif %endif %if %$__nx_argv_mode_param_size < sizeof(size_t) %assign %$args %$args + sizeof(size_t) %else %assign %$args %$args + %$__nx_argv_mode_param_size %endif %endif %endrep ;// stack is set up, call the proc call %$__nx_proc %if %$__nx_bytecount > 0 %if %$__nx_callstack_adjust == 0 %if %$__nx_retpopsargs == 0 %if %$__nx_invoke_callstack_adjust > 0 add __SP, %$__nx_invoke_callstack_adjust %endif %elif %$__align > 0 add __SP, %$__align %endif %endif %endif %else ;// arg types follow cconv,bytecount when defined %if %$__nx_argrotate > 0 %assign %$__param_type_ctr 2 %else %assign %$__param_type_ctr %0+2 %endif ;// the following variable is used as a flag to catch a very bad logic state ;// when using __AX as a paramater since __AX is used internally to spill certain ;// parameters to the stack, potentially causing a very tough bug to find! %assign %%__reg_ax_used 0 %rep %%__repcnt %rotate %$__nx_argrotate ;// set up internal vars used to determine if argv address mode used %assign %$__param_type_ctr %$__param_type_ctr + %$__nx_argrotate nx_analyze_argv_mode %{1}, %$__param_type_ctr %if %$__nx_argv_mode_param_isfloat == 0 %ifstr %1 jmp %%endstr_%$args %%str_%$args: declare(NASMX_TCHAR) NASMX_TEXT(%{1}), 0 %%endstr_%$args: push size_t %%str_%$args %elifnum %1 push size_t %1 %elif %$__nx_argv_mode_indirect > 0 push size_t %1 %elif %$__nx_argv_mode_bp > 0 %assign %%__reg_ax_used 1 mov __AX, __BP %if %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_ADD__ add __AX, %$__nx_argv_mode_bp_offset %elif %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_SUB__ sub __AX, %$__nx_argv_mode_bp_offset %else %fatal Unknown addressing mode for %{1} %endif push __AX %else %ifidni %1, __AX %if %%__reg_ax_used > 0 %warning use of _AX as arg resulted in inconsistent logic state %endif %endif push size_t %1 %endif %assign %$args %$args + __BITS__ / 8 %else ;// process float param %if %$__nx_argv_mode_param_size < sizeof(size_t) ;// if passing a float in 64-bit mode sub __SP, sizeof(size_t) %assign %$args %$args + sizeof(size_t) %else ;// may be passing double in 32-bit mode sub __SP, %$__nx_argv_mode_param_size %assign %$args %$args + %$__nx_argv_mode_param_size %endif %if %$__nx_argv_mode_indirect > 0 %if %$__nx_argv_mode_castsize > %$__nx_argv_mode_param_size %warning potential loss of precision during conversion of double to float for %[%1] %endif fld __nx_error_token_size_%[%$__nx_argv_mode_castsize] %1 fstp __nx_error_token_size_%[%$__nx_argv_mode_param_size] [__SP] %elif %$__nx_argv_mode_bp > 0 fld __nx_error_token_size_%[%$__nx_argv_mode_param_size] [%1] fstp __nx_error_token_size_%[%$__nx_argv_mode_param_size] [__SP] %else %if %$__nx_argv_mode_fp_isnum != 0 %if %$__nx_argv_mode_param_size == 4 ;// assert: callee expecting float type mov dword [__SP], %$__nx_argv_mode_fp_num %else ;// assert: callee expecting double type %assign %%__tmp (%$__nx_argv_mode_fp_num & 0x00000000FFFFFFFF) mov dword [__SP], %%__tmp %assign %%__tmp ((%$__nx_argv_mode_fp_num >> 32) & 0x00000000FFFFFFFF) mov dword [__SP+4], %%__tmp %endif %else mov [__SP], %1 %endif %endif %endif %endrep call %$__nx_proc %if %$args > 0 %if %$__nx_retpopsargs == 0 add __SP, %$args %endif %endif %endif ;// cleanup global arg token defs %assign %%__ctr 1 %rep 16 %ifdef __nx_token_%[%%__ctr] %undef __nx_token_%[%%__ctr] %endif %assign %%__ctr %%__ctr + 1 %endrep ;// restore context stack %pop %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO PROC ;// ;// usage: ;// PROC [CALLCONV,] funcname [ arg, arg, ...] ;// ;// examples: ;// Using default calling convention: ;// proc funcname, arg1, arg2 ;// Specifying calling convention: ;// proc cdecl, fprintf ;// ;// notes: ;// The calling convention, if specified, must match either ;// the prototype or import specification. ;// Also remember that, when invoked during a fastcall, the ;// register parameters are not automatically spilled, only ;// the space assigned on the stack is allocated. ;// This allows the user to determine whether or not to use ;// the spill area if needed. ;// %imacro PROC 1-100.nolist %ifdef NASMX_ENDPROC %fatal 'missing endproc directive.' %endif %push __NX_CTX_PROC__ %assign %$__nx_locnt 0 ;// init locals offset %assign %$__nx_arg_bias 0 ;// init 64-bit bias %assign %$__nx_uses_stack_adjust 0 ;// init regs used save area %assign %$__nx_intargs 0 ;// init int args counter %assign %$__nx_floatargs 0 ;// init float args counter %assign %$__nx_uses_count 0 ;// init regs used counter %assign %$__nx_argcount 0 ;// init proc args counter %assign %$__nx_bytecount 0 ;// init total args byte count %assign %$__nx_protobytecount -1 ;// >= 0 if defined %ifndef __NASMX_DECLSPEC_CALLCONV_%[%1]__ ;// check for prototyped func %ifdef __nxsig@@%[%1] nx_parse_tokens __nxsig@@%[%1] %assign %$__nx_callconv __nx_token_1 %assign %$__nx_protobytecount __nx_token_2 %else %assign %$__nx_callconv __NASMX_DECLSPEC_CALLCONV_DEFAULT__ %endif %define %$__nx_proc %1 %assign %$__nx_repcnt %0-1 %else %if %0 < 2 %fatal 'usage: PROC [CALLCONV, ] FUNCNAME [,ARG1,ARG2,...]' %endif %assign %$__nx_callconv __NASMX_DECLSPEC_CALLCONV_%[%1]__ %define %$__nx_proc %2 %assign %$__nx_repcnt %0-2 ;// check for prototyped func %ifdef __nxsig@@%[%2] nx_parse_tokens __nxsig@@%[%2] %if %$__nx_callconv != __nx_token_1 %fatal calling convention mismatch for %$__nx_proc %endif %assign %$__nx_protobytecount __nx_token_2 %endif %endif %assign %$__nx_cc_enum nx_declspec_cc_enum(%[%$__nx_callconv]) ;// v1.0rc2 - we must always calculate a true bytecount such that ;// the implementation of main(), or imported functions that are ;// defined with a 0 bytecount, are defined properly %ifdef __nx_proto_param_list %undef __nx_proto_param_list %endif %rep %0-%$__nx_repcnt %rotate 1 %endrep ;// The signature must be defined in full before use because once the ;// procedure has been defined we are not able to easily redefine it. ;// Due to dependency on the X64_SPILL_OFFSET we cannot simply use one ;// rep loop to generate equate offsets ;// Thus the rep loop is required twice: ;// First, to build the parameter type list and x64 spill area size ;// Then, later on, to build the parameter offset equates. %rep %$__nx_repcnt nx_strtok %1, ' ' ;// assert: calculate bytecount in this loop to account ;// for param types double/int128 rather than the simple logic of ;// %assign %$__nx_bytecount %$__nx_repcnt * sizeof(size_t) ;// Also build the parameter type list here in case the procedure ;// has not been prototyped or imported. %xdefine __nx_proto_argtype %$__nx_token %+ _type %assign %%__param_type __nx_proto_argtype %assign %%__param_size (%%__param_type & 0x7F) %if %%__param_size < sizeof(size_t) %assign %$__nx_bytecount %$__nx_bytecount + sizeof(size_t) %elif %%__param_size <= __NASMX_ABI_BITS__ / 4 %assign %$__nx_bytecount %$__nx_bytecount + %%__param_size %else %error parameter exceeds allowable size: %1 %endif %ifndef __nx_proto_param_list %defstr __nx_proto_param_list __nx_proto_argtype %else %defstr __nx_proto_argstr __nx_proto_argtype %strcat __nx_proto_param_list __nx_proto_param_list,',',__nx_proto_argstr %undef __nx_proto_argstr %endif %undef __nx_proto_argtype %rotate 1 %endrep %ifndef __nxsig@@%[%$__nx_proc] ;// assert: we must generate an appropriate label for the function call ;// here in order for the parameters to be equated properly nx_callconv_decorate %$__nx_callconv,%$__nx_proc,%$__nx_bytecount %ifdef __nx_proto_param_list %deftok __nx_proto_params __nx_proto_param_list %xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__nx_callconv],%[%$__nx_bytecount],__nx_proto_params %else %xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__nx_callconv],%[%$__nx_bytecount] %endif %ifnidn %$__nx_proc,%$__nxtok_decorated_name %xdefine %[%$__nx_proc] %[%$__nxtok_decorated_name] %endif %endif %ifdef __nxsig_defined_%[%$__nx_proc] %fatal procedure %[%$__nx_proc] already defined %else %xdefine __nxsig_defined_%[%$__nx_proc] %endif ;// emit the procedure entry point %[%$__nx_proc]: ;// The following define can/should be used by the user to properly ;// return from a function ( ie: jmp NASMX_ENDPROC ) or via use of ;// the RETURN macro %xdefine NASMX_ENDPROC __nx_endproc@@%[%$__nx_proc] %if %$__nx_cc_enum != __NASMX_DECLSPEC_CC_ENUM_NAKED__ %assign %$__nx_argv __NASMX_ABI_BITS__ / 4 %if __NASMX_ABI_BITS__ > 32 %ifdef __NX_PROLOGUE_X64_SPILL_OFFSET__ %undef __NX_PROLOGUE_X64_SPILL_OFFSET__ %endif %if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ != __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ %if %$__nx_cc_enum == __NASMX_DECLSPEC_CC_ENUM_FASTCALL__ ;// assert: create Linux spill area based on param byte count. ;// This may result in slightly wasted stack space but is ;// required to avoid alignment issues for params that ;// exceed allocated registers and are located on the ;// stack above RBP. %assign %$__nx_arg_bias %$__nx_bytecount ;// keep stack aligned %assign %%__align __NASMX_ABI_BITS__ / 4 %assign %%__off (((%$__nx_arg_bias + %%__align) / %%__align) * %%__align) %assign %%__tmp (%$__nx_arg_bias + %%__align) %if (%%__off != %%__tmp) %assign %$__nx_arg_bias %%__off %endif %xdefine __NX_PROLOGUE_X64_SPILL_OFFSET__ %[%$__nx_arg_bias] %endif %endif %ifndef __NX_PROLOGUE_X64_SPILL_OFFSET__ ;// assert: must always be defined for x64 %xdefine __NX_PROLOGUE_X64_SPILL_OFFSET__ 0 %endif %endif ;// assert: calc byte count for sig check and argv() offsets ;// we must reverse arg push logic to get correct results %assign %$__nx_bytecount 0 %assign %$__cc_argrotate nx_declspec_cc_argrotate(%[%$__nx_callconv]) %if %$__cc_argrotate != 0 %assign %$__nx_argrotate -1 %rotate -1 %else %assign %$__nx_argrotate 1 %rep %0-%$__nx_repcnt %rotate 1 %endrep %endif %rep %$__nx_repcnt ;// obtain param type and size and validate against current ABI nx_strtok %1, ' ' %assign %%__isfloat is_typeof_float(%[%$__nx_token]) %assign %%__param_size sizeof(%[%$__nx_token]) ; _size nx_strtok 0, ' ' ;// only allow exceeding of size_t for type double ;// in 32-bit mode and 128-bit params in 64-bit mode %if %%__param_size > (sizeof(size_t) * 2) %fatal %[%$__nx_token] invalid parameter size: %%__param_size %endif %if %%__param_size < sizeof(size_t) %assign %%__param_size sizeof(size_t) %endif %assign %$__nx_bytecount %$__nx_bytecount + %%__param_size %if __NASMX_ABI_BITS__ > 32 %if %$__nx_cc_enum == __NASMX_DECLSPEC_CC_ENUM_FASTCALL__ %if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ ;// assert: Windows 64-bit register spill area ;// located above return address, thus bias ;// not affected %assign %$__nx_intargs 1 + %$__nx_intargs %if %%__isfloat == 0 %if %%__param_size > sizeof(size_t) %if %$__nx_intargs == __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ %error in procedure %$__nx_proc %$__nx_token exceeds available registers %endif %endif %endif .%[%$__nx_token] EQU %[%$__nx_argv] %assign %$__nx_argv %%__param_size + %$__nx_argv %else ;// assert: Linux 64-bit register spill area ;// located below frame pointer thus we must ;// account for bias of args from frame while ;// accounting for param types supplied %if %%__isfloat == 0 %assign %$__nx_intargs 1 + %$__nx_intargs %if %$__nx_intargs > __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ .%[%$__nx_token] EQU __NX_PROLOGUE_X64_SPILL_OFFSET__ + %[%$__nx_argv] %assign %$__nx_argv %%__param_size + %$__nx_argv %else %if %$__nx_intargs == __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__ %if %%__param_size > sizeof(size_t) %error in procedure %$__nx_proc %$__nx_token exceeds available register size %endif %endif .%[%$__nx_token] EQU %[%$__nx_locnt] %assign %$__nx_locnt %%__param_size + %$__nx_locnt %endif %else %assign %$__nx_floatargs 1 + %$__nx_floatargs %if %$__nx_floatargs > __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__ .%[%$__nx_token] EQU __NX_PROLOGUE_X64_SPILL_OFFSET__ + %$__nx_argv %assign %$__nx_argv %%__param_size + %$__nx_argv %else .%[%$__nx_token] EQU %[%$__nx_locnt] %assign %$__nx_locnt %%__param_size + %$__nx_locnt %endif %endif %endif %else .%[%$__nx_token] EQU %[%$__nx_argv] %assign %$__nx_argv %$__nx_argv + %%__param_size %endif %else .%[%$__nx_token] EQU %[%$__nx_argv] %assign %$__nx_argv %$__nx_argv + %%__param_size %endif %rotate %$__nx_argrotate %endrep %if %$__nx_protobytecount > 0 ;// assert: we can only validate against prototypes that ;// have a byte count since vararg functions can only be ;// defined with zero (0) bytecount %if %$__nx_bytecount != %$__nx_protobytecount ;// In the program entry main procedure the user may, or may not, ;// be using command line or environment params. %ifnidni %$__nx_proc, main ;// unfortunately we must check callconv for cdecl on win32 ;// and fastcall on win64 as currently the import files do ;// not contain bytecounts to verify against. ;// TODO: When import files are updated in the future we can ;// revisit this code. %ifidni __OUTPUT_FORMAT__,win32 %if %$__nx_cc_enum != __NASMX_DECLSPEC_CC_ENUM_CDECL__ %warning prototype arg mismatch for %$__nx_proc %endif %elifidni __OUTPUT_FORMAT__,win64 %if %$__nx_cc_enum != __NASMX_DECLSPEC_CC_ENUM_FASTCALL__ %warning prototype arg mismatch for %$__nx_proc %endif %else %warning prototype arg mismatch for %$__nx_proc %endif %endif %endif %endif ;// assert: always push __BP to get an aligned stack %define __NX_PROLOGUE_PRESENT__ push __BP mov __BP, __SP %ifidni %$__nx_proc, main ;// assert: ensure we start out with an aligned stack %assign %%__nx_align ((__NASMX_ABI_BITS__ / 4 ) - 1) mov __AX, __SP and __AX, %%__nx_align jz .nx_main_aligned sub __SP, (__NASMX_ABI_BITS__ / 4 ) %if __NASMX_ABI_BITS__ > 32 and spl,BYTE 0xF0 %else and __SP, -8 %endif .nx_main_aligned: %endif %endif %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO USES ;// ;// usage: ;// USES reg [,reg ,reg, ...] ;// ;// examples: ;// USES rbx, r15 ;// ;// notes: ;// This macro can only be used within the proc prologue ;// Fatals are used rather than errors as this macro is ;// extremely critical to proper function definition and ;// stack alignment if used. ;// %imacro USES 1-8.nolist %ifndef NASMX_ENDPROC %fatal 'missing proc directive.' %endif %ifnctx __NX_CTX_PROC__ %fatal 'current context unknown.' %endif %ifdef __NX_LOCALS_PRESENT__ %fatal 'uses directive must come before locals directive.' %endif %ifdef __NX_USES_PRESENT__ %fatal 'uses directive previously set for this procedure.' %endif %define __NX_USES_PRESENT__ %ifndef __NX_PROLOGUE_PRESENT__ ;// assert: at this point we have absolutely no way of knowing whether ;// the function will contain locals or not; thus, using this macro ;// forces our hand and requires us to set up the function prologue. ;// The good news is that this aligns our stack properly. %define __NX_PROLOGUE_PRESENT__ push __BP mov __BP, __SP %endif %assign %%__size __NASMX_ABI_BITS__ / 8 %assign %%__sys_size __NASMX_ABI_BITS__ %assign %$__nx_uses_count 0 %rep %0 %ifndef %[%1]_size %fatal unknown register: %1 %endif %assign %%__reg_size %[%1]_size %if %%__reg_size < %%__size %fatal extended version of register %1 required for %%__sys_size bit mode %elif %%__reg_size > %%__size %fatal %1 not available in %%__sys_size bit mode %endif %assign %$__nx_locnt %$__nx_locnt + %%__size %assign %$__nx_uses_count 1 + %$__nx_uses_count %xdefine __nx_uses_reg_%[%$__nx_uses_count] %[%1] mov [__BP - %$__nx_locnt ], %[%1] %rotate 1 %endrep ;// during endproc stack adjustment to include difference ;// between locnt and uses_adjust %assign %$__nx_uses_stack_adjust %%__size * %$__nx_uses_count %xdefine __NX_PROLOGUE_USES_ADJUST__ %[%$__nx_uses_stack_adjust] %endmacro ;////////////////////////////////////////////////////////////// ;// MACRO LOCALS ;// ;// usage: ;// locals [none] ;// where ;// none - allows us to avoid using stackframe if user ;// writing a small leaf function or will handle ;// function prologue separately. Also indicates ;// that endlocals directive not required. ;// ;// notes: ;// This macro can only be used within the proc prologue ;// and must precede any assembly code. Invoke checks to ;// verify that this macro was called to ensure that the ;// prologue was initialized properly. ;// %imacro LOCALS 0-1.nolist %ifndef NASMX_ENDPROC %error 'missing proc directive.' %endif %ifndef __NX_LOCALS_PRESENT__ %define __NX_LOCALS_PRESENT__ %endif %if %0 == 1 %ifidni %1,none %define __NX_LOCALS_NONE__ %else %warning unknown locals directive: %1 %endif %endif %ifndef __NX_PROLOGUE_USES_ADJUST__ %xdefine __NX_PROLOGUE_USES_ADJUST__ 0 %endif %ifdef __NX_LOCALS_NONE__ %ifdef __NX_PROLOGUE_CALLSTACK_ADJUST__ %assign %$__nx_locnt %$__nx_locnt + __NX_PROLOGUE_CALLSTACK_ADJUST__ %endif %if %$__nx_locnt > 0 ;// assert: the following block of code added for NASMX 1.0rc2 ;// to ensure that stack is aligned properly for functions ;// which do not define any locals, save odd count registers, ;// or linux x64 procs with unaligned spill area %assign %%__align __NASMX_ABI_BITS__ / 4 %assign %%__off (((%$__nx_locnt + %%__align) / %%__align) * %%__align) %assign %%__tmp (%$__nx_locnt + %%__align) %if (%%__off != %%__tmp) %assign %$__nx_locnt (%$__nx_locnt + (__NASMX_ABI_BITS__ / 8)) %endif sub __SP, %$__nx_locnt %endif %endif %endmacro %imacro LOCAL 2-3.nolist 1 %ifndef __NX_LOCALS_PRESENT__ %error 'missing locals directive.' %endif %ifdef __NX_LOCALS_NONE__ %error 'conflicts with directive: locals none' %endif %ifndef %[%2]_size %error %1 unknown size: %2 %endif %assign %%__size %[%2]_size %assign %$__nx_locnt %$__nx_locnt + %%__size * %3 ;// ensure natural alignment of stack local variables ;// TODO: A nice, but not trivial, optimization to reduce ;// stack usage even further would be to reorganize equate ;// offsets of local variables similar to a real compiler. %if %%__size <= 4 %assign %%__align 4 %elif %%__size <= 8 %assign %%__align 8 %elif %%__size > 16 %assign %%__align __NASMX_ABI_BITS__ / 8 %else %assign %%__align __NASMX_ABI_BITS__ / 4 %endif %assign %%__off (((%$__nx_locnt + %%__align) / %%__align) * %%__align) %assign %%__tmp (%$__nx_locnt + %%__align) %if (%%__off != %%__tmp) %assign %$__nx_locnt %%__off %endif .%[%1] EQU %$__nx_locnt %endmacro %imacro ENDLOCALS 0.nolist %ifndef __NX_LOCALS_PRESENT__ %error 'missing locals directive.' %endif %ifndef __NX_LOCALS_NONE__ %ifdef __NX_PROLOGUE_CALLSTACK_ADJUST__ %assign %$__nx_locnt %$__nx_locnt + __NX_PROLOGUE_CALLSTACK_ADJUST__ %endif %assign %%__align __NASMX_ABI_BITS__ / 4 %if %$__nx_locnt > 0 ;// keep stack aligned %assign %%__off (((%$__nx_locnt + %%__align) / %%__align) * %%__align) %assign %%__tmp (%$__nx_locnt + %%__align) %if (%%__off != %%__tmp) %assign %$__nx_locnt %%__off %endif sub __SP, %$__nx_locnt %endif %endif %endmacro ;// the following provide accessor macros to the procedure ;// parameter arguments and local variables %if __NASMX_ABI_BITS__ > 32 %if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ != __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ ;// Linux x64 argv offsets defined as positive offsets from spill area %idefine argv(v) rbp + ( v - __NX_PROLOGUE_X64_SPILL_OFFSET__ ) %else %idefine argv(v) rbp + v %endif %idefine var(v) rbp - v %else %idefine argv(v) ebp + v %idefine var(v) ebp - v %endif %idefine OFFSET %imacro RETURN 0-1.nolist %if %0 > 0 %ifnum %1 %if %1 == -1 or __AX, %1 %elif %1 == 0 xor __AX, __AX %else mov __AX, %1 %endif %else %ifnidni %1, __AX mov __AX, %[%1] %endif %endif %endif jmp NASMX_ENDPROC %endmacro %imacro LEAVE 0.nolist %ifndef __NX_LEAVE_PRESENT__ %define __NX_LEAVE_PRESENT__ %ifdef NASMX_ENDPROC ;// reset __SP to end of saved registers, if any %if __NASMX_ABI_BITS__ > 32 %ifdef __NX_PROLOGUE_X64_SPILL_OFFSET__ %assign %$__nx_locnt %$__nx_locnt - __NX_PROLOGUE_X64_SPILL_OFFSET__ %endif %endif %ifdef __NX_PROLOGUE_USES_ADJUST__ %if %$__nx_locnt > __NX_PROLOGUE_USES_ADJUST__ %assign %$__nx_locnt %$__nx_locnt - __NX_PROLOGUE_USES_ADJUST__ %endif %endif %ifdef __NX_LOCALS_PRESENT__ %if %$__nx_locnt > 0 add __SP, %$__nx_locnt %endif %endif ;// restore any non-volatile registers %ifdef __NX_USES_PRESENT__ %assign %%__nx_reg %$__nx_uses_count %rep %$__nx_uses_count pop __nx_uses_reg_%[%%__nx_reg] %undef __nx_uses_reg_%[%%__nx_reg] %assign %%__nx_reg %%__nx_reg - 1 %endrep %endif %endif %ifdef __NX_PROLOGUE_PRESENT__ mov __SP, __BP pop __BP %endif %endif %endmacro %imacro RET 0-1.nolist %ifdef NASMX_ENDPROC %ifndef __NX_LEAVE_PRESENT__ leave %endif %define __NX_RETURN_PRESENT__ %endif %if %0 == 1 %ifnum %1 %if %1 > 0 ret %1 %else ret %endif %elifid %1 %if %[%1] > 0 ret %[%1] %else ret %endif %else %warning 'invalid operand supplied to ret opcode' ret %endif %else ret %endif %endmacro %imacro ENDPROC 0.nolist %ifndef NASMX_ENDPROC %fatal 'missing proc directive.' %endif ;// provide a proc end jmp label %[NASMX_ENDPROC]: ;// assert: we can not be certain at what context level we are at, ;// thus we pop all contexts until we get to __NX_CTX_PROC__ %rep 32 ;// Bugfix: ;// Avoid problem with exitrep not exiting ;// the loop immediately. %ifctx __NX_CTX_PROC__ %exitrep %else %pop %endif %endrep %ifndef __NX_RETURN_PRESENT__ %assign %%__cc_retpopsargs nx_declspec_cc_retpopsargs(%$__nx_callconv) %if %%__cc_retpopsargs == 0 ret %else ;// x64 retpopcnt may be different than bytecount %assign %$__nx_retpopcnt (%$__nx_argv - (__NASMX_ABI_BITS__ / 4)) %if %$__nx_retpopcnt > 0 ret %[%$__nx_retpopcnt] %else ret %endif %endif %endif %pop %undef NASMX_ENDPROC %ifdef __NX_LEAVE_PRESENT__ %undef __NX_LEAVE_PRESENT__ %endif %ifdef __NX_RETURN_PRESENT__ %undef __NX_RETURN_PRESENT__ %endif %ifdef __NX_USES_PRESENT__ %undef __NX_USES_PRESENT__ %endif %ifdef __NX_LOCALS_PRESENT__ %undef __NX_LOCALS_PRESENT__ %endif %ifdef __NX_LOCALS_NONE__ %undef __NX_LOCALS_NONE__ %endif %ifdef __NX_PROLOGUE_PRESENT__ %undef __NX_PROLOGUE_PRESENT__ %endif %ifdef __NX_PROLOGUE_USES_ADJUST__ %undef __NX_PROLOGUE_USES_ADJUST__ %endif %ifdef __NX_PROLOGUE_X64_SPILL_OFFSET__ %undef __NX_PROLOGUE_X64_SPILL_OFFSET__ %endif %endmacro %imacro RJMP 2.nolist ; This macro preforms the opposite conditional jump ; than what the value suggests, it's used internally ; by other macros %ifidni %1, == jne %2 %elifidni %1, > jle %2 %elifidni %1, < jge %2 %elifidni %1, >= jl %2 %elifidni %1, <= jg %2 %elifidni %1, != je %2 %elifidni %1, !> jg %2 %elifidni %1, !< jl %2 %elifidni %1, CARRY jnc %2 %elifidni %1, BELOW jnb %2 %elifidni %1, ABOVE jna %2 %elifidni %1, PARITY jnp %2 %elifidni %1, SIGNED jns %2 %elifidni %1, OVERFLOW jno %2 %elifidni %1, !CARRY jc %2 %elifidni %1, !BELOW jb %2 %elifidni %1, !ABOVE ja %2 %elifidni %1, !PARITY jp %2 %elifidni %1, !SIGNED js %2 %elifidni %1, !OVERFLOW jo %2 %endif %endmacro %imacro SJMP 2.nolist %ifidni %1, == je %2 %elifidni %1, > jg %2 %elifidni %1, < jl %2 %elifidni %1, >= jge %2 %elifidni %1, <= jle %2 %elifidni %1, != jne %2 %elifidni %1, !> jng %2 %elifidni %1, !< jnl %2 %elifidni %1, CARRY jc %2 %elifidni %1, BELOW jb %2 %elifidni %1, ABOVE ja %2 %elifidni %1, PARITY jp %2 %elifidni %1, SIGNED js %2 %elifidni %1, OVERFLOW jo %2 %elifidni %1, !CARRY jnc %2 %elifidni %1, !BELOW jnb %2 %elifidni %1, !ABOVE jna %2 %elifidni %1, !PARITY jnp %2 %elifidni %1, !SIGNED jns %2 %elifidni %1, !OVERFLOW jno %2 %endif %endmacro ;////////////////////////////////////////////////////////////////////////////// ;// ;// The following macros provide a convenient way ;// to simulate high level constructs. They allow ;// nesting of statements of arbitrary depth. ;// Note that the address labels generated are dot- ;// prepended to not break NASMX locals! %imacro IF 3.nolist %push __NX_CTX_IF__ ; we must obtain any outer context label sequence ; to enable the break macro to succeed. %ifndef __NX_OPER_LABEL_SEQ__ %xdefine __NX_OPER_LABEL_SEQ__ 0 %endif %assign %$__nx_oper_label_seq %[__NX_OPER_LABEL_SEQ__] ; sequence label numbers for the IF macro must be ; separate from looping sequence label numbers. %ifndef __NX_OPER_IF_LABEL_SEQ__ %xdefine __NX_OPER_IF_LABEL_SEQ__ 0 %endif %assign %$__nx_oper_if_label_seq %[__NX_OPER_IF_LABEL_SEQ__] + 1 %undef __NX_OPER_IF_LABEL_SEQ__ %xdefine __NX_OPER_IF_LABEL_SEQ__ %[%$__nx_oper_if_label_seq] %assign %$__nx_oper_else 0 %assign %$__nx_oper_if_label_next 1 cmp %1, %3 RJMP %2, .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]_%[%$__nx_oper_if_label_next] %endmacro %imacro ELSIF 3.nolist %ifctx __NX_CTX_IF__ %if %$__nx_oper_else > 0 %error "ELSIF cannot follow ELSE block." %endif jmp .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq] .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]_%[%$__nx_oper_if_label_next]: %assign %$__nx_oper_if_label_next 1+%$__nx_oper_if_label_next cmp %1, %3 RJMP %2, .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]_%[%$__nx_oper_if_label_next] %else %error "ELSIF directive must be within an IF block." %endif %endmacro %imacro ELSE 0.nolist %ifctx __NX_CTX_IF__ %if %$__nx_oper_else > 0 %error "There can only be one ELSE per IF block." %else %assign %$__nx_oper_else 1 jmp .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq] .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]_%[%$__nx_oper_if_label_next]: %assign %$__nx_oper_if_label_next 1+%$__nx_oper_if_label_next %endif %else %error "ELSE directive must be within an IF block." %endif %endmacro %imacro ENDIF 0.nolist %ifctx __NX_CTX_IF__ ; must have a forward label in case elsif/else macros used. .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]_%[%$__nx_oper_if_label_next]: .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]: %pop %else %error "ENDIF directive must be within an IF block." %endif %endmacro %imacro BREAK 0.nolist jmp .__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq] %endmacro %imacro CONTINUE 0.nolist jmp .__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq] %endmacro %imacro SWITCH 1.nolist %push __NX_CTX_SWITCH__ %ifndef __NX_OPER_LABEL_SEQ__ %xdefine __NX_OPER_LABEL_SEQ__ 0 %endif %assign %$__nx_oper_label_seq %[__NX_OPER_LABEL_SEQ__] + 1 %undef __NX_OPER_LABEL_SEQ__ %xdefine __NX_OPER_LABEL_SEQ__ %[%$__nx_oper_label_seq] %ifnidni __AX, %1 mov __AX, %1 %endif %assign %$__nx_oper_label_next 1 %assign %$__nx_oper_default 0 %endmacro %imacro CASE 1.nolist %ifctx __NX_CTX_SWITCH__ %if %$__nx_oper_default > 0 %error "CASE must appear before DEFAULT in SWITCH block." %endif .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]: %assign %$__nx_oper_label_next 1+%$__nx_oper_label_next cmp __AX, %1 jnz near .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next] %else %error "CASE directive must be within a SWITCH block." %endif %endmacro %imacro DEFAULT 0.nolist %ifctx __NX_CTX_SWITCH__ %if %$__nx_oper_default > 0 %error "There can only be one DEFAULT per SWITCH block." %endif %assign %$__nx_oper_default 1 .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]: %assign %$__nx_oper_label_next 1+%$__nx_oper_label_next %else %error "DEFAULT directive must be within a SWITCH block." %endif %endmacro %imacro ENDSWITCH 0.nolist %ifctx __NX_CTX_SWITCH__ .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]: .__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]: %pop %else %error "Missing SWITCH directive." %endif %endmacro %imacro REPEAT 0.nolist %push __NX_CTX_REPEAT__ %ifndef __NX_OPER_LABEL_SEQ__ %xdefine __NX_OPER_LABEL_SEQ__ 0 %endif %assign %$__nx_oper_label_seq %[__NX_OPER_LABEL_SEQ__] + 1 %undef __NX_OPER_LABEL_SEQ__ %xdefine __NX_OPER_LABEL_SEQ__ %[%$__nx_oper_label_seq] %assign %$__nx_oper_label_next 1 .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]: %endmacro %imacro UNTIL 3.nolist %ifctx __NX_CTX_REPEAT__ .__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq]: cmp %1, %3 RJMP %2, .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next] .__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]: %pop %elifctx __NX_CTX_DO__ %warning "DO/UNTIL combination is deprecated. Use REPEAT/UNTIL." .__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq]: cmp %1, %3 RJMP %2, .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next] .__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]: %pop %else %error "Missing REPEAT directive." %endif %endmacro %imacro DO 0.nolist %push __NX_CTX_DO__ %ifndef __NX_OPER_LABEL_SEQ__ %xdefine __NX_OPER_LABEL_SEQ__ 0 %endif %assign %$__nx_oper_label_seq %[__NX_OPER_LABEL_SEQ__] + 1 %undef __NX_OPER_LABEL_SEQ__ %xdefine __NX_OPER_LABEL_SEQ__ %[%$__nx_oper_label_seq] %assign %$__nx_oper_label_next 1 .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]: %endmacro ; There is some trickery with this macro: If the DO context exists we assume ; that this is a finishing while statement; If no DO context is found we assume ; that the user is beginning a while loop. This implies that you cannot use a ; WHILE loop directly inside a DO loop without some other intervening context. ; If your code requires this then you must use REPEAT/UNTIL for the outer loop. %imacro WHILE 3.nolist %ifctx __NX_CTX_DO__ .__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq]: cmp %1, %3 SJMP %2, .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next] .__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]: %pop %else %push __NX_CTX_WHILE__ %ifndef __NX_OPER_LABEL_SEQ__ %xdefine __NX_OPER_LABEL_SEQ__ 0 %endif %assign %$__nx_oper_label_seq %[__NX_OPER_LABEL_SEQ__] + 1 %undef __NX_OPER_LABEL_SEQ__ %xdefine __NX_OPER_LABEL_SEQ__ %[%$__nx_oper_label_seq] %assign %$__nx_oper_label_next 1 .__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq]: cmp %1, %3 RJMP %2, .__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq] %endif %endmacro %imacro ENDWHILE 0.nolist %ifctx __NX_CTX_WHILE__ jmp .__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq] .__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]: %pop %else %error "Missing WHILE directive." %endif %endmacro ;// The following is used to wrap test code when debugging ;%define __NX_DEBUG__ ;;//// * * * BEGIN NASMX DEBUG FRAME * * * /////////////// %ifdef __NX_DEBUG__ %xdefine __NX_DEBUG_SOURCE_LINE_START__ __LINE__ ;;// * * PLACE TEST CODE HERE * * %xdefine __NX_DEBUG_SOURCE_LINE_END__ __LINE__ %ifndef __NX_DEBUG_SOURCE_LINE_START__ %fatal NXDEBUG: BREAK line: __LINE__ section(????,__NX_DEBUG_SOURCE_LINE_END__) __NX_DEBUG_SOURCE_LINE_START__ undefined! %endif %assign __NX_DEBUG_SOURCE_LINE_COUNT__ __NX_DEBUG_SOURCE_LINE_END__ - __NX_DEBUG_SOURCE_LINE_START__ %fatal NXDEBUG: BREAK line: __LINE__ section(__NX_DEBUG_SOURCE_LINE_START__,__NX_DEBUG_SOURCE_LINE_END__) __NX_DEBUG_SOURCE_LINE_COUNT__ lines %endif ;;///////////////// * * * END NASMX DEBUG FRAME * * * ///////////////// %endif ; ifndef __NASMX_INCLUDED__ ;// To speed up assembly we simply copy the values we use in our source ;// from the nasmx/inc/win32 include directory rather than including the ;// entire fileset as this really strains the preprocessor... ;// %include 'win32\windows.inc' ;// %include 'win32\kernel32.inc' ;// %include 'win32\user32.inc' ;// %include 'win32\msvcrt.inc' ;// ;// If you will be using additional Windows defines and structures for ;// your programs we recommend that you create your own include header ;// or simply include the above mentioned files in your source code. ;///////////////////////////////////////////////////// ;// WINDOWS.INC DEFINITIONS ;///////////////////////////////////////////////////// %define MB_OK 0h %define NULL 0 %define FALSE 0 %define TRUE 1 %define COLOR_BTNFACE 15 %define CS_HREDRAW 2h %define CS_VREDRAW 1h %define IDOK 1 %define IDCANCEL 2 %define IDI_APPLICATION 32512 %define IDC_ARROW 32512 %define IDC_IBEAM 32513 %define IDC_WAIT 32514 %define IDC_CROSS 32515 %define IDC_UPARROW 32516 %define IDC_SIZE 32640 %define IDC_ICON 32641 %define CBS_DROPDOWN 2h %define CBS_SORT 100h %define LBS_SORT 2h %define LBS_HASSTRINGS 40h %define SS_CENTER 1h %define SS_NOPREFIX 80h %define MB_ICONHAND 10h %define MB_ICONQUESTION 20h %define MB_ICONEXCLAMATION 30h %define MB_ICONASTERISK 40h %define MB_ICONERROR MB_ICONHAND %define MB_ICONINFORMATION MB_ICONASTERISK %define MB_ICONSTOP MB_ICONHAND %define MB_ICONWARNING MB_ICONEXCLAMATION %define STD_INPUT_HANDLE -10 %define STD_OUTPUT_HANDLE -11 %define STD_ERROR_HANDLE -12 %define SW_SHOWNORMAL 1 %define WS_OVERLAPPED 0h %define WS_EX_TOOLWINDOW 00000080h %define WS_CHILD 40000000h %define WS_CAPTION 0C00000h %define WS_SYSMENU 80000h %define WS_VISIBLE 10000000h %define WS_THICKFRAME 40000h %define WS_GROUP 20000h %define WS_TABSTOP 10000h %define WS_MINIMIZEBOX 20000h %define WS_MAXIMIZEBOX 10000h %define WS_OVERLAPPEDWINDOW WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX %define WS_EX_WINDOWEDGE 00000100h %define WS_EX_CLIENTEDGE 00000200h %define WS_EX_OVERLAPPEDWINDOW WS_EX_WINDOWEDGE|WS_EX_CLIENTEDGE %define WM_CREATE 1h %define WM_DESTROY 2h %define WM_SETTEXT 0Ch %define WM_GETTEXT 0Dh %define WM_GETTEXTLENGTH 0Eh %define WM_CLOSE 10h %define WM_INITDIALOG 110h %define WM_COMMAND 111h %define WM_ERASEBKGND 14h %define WM_PAINT 0Fh %define WM_TIMER 113h %define WM_KEYDOWN 100h %define VK_ESCAPE 1Bh %define SRCCOPY 0CC0020h ;///////////////////////////////////////////////////// ;// WINDOWS.INC STRUCTURES ;///////////////////////////////////////////////////// NASMX_STRUC WNDCLASSEX NASMX_RESERVE cbSize, uint32_t, 1 NASMX_RESERVE style, uint32_t, 1 NASMX_RESERVE lpfnWndProc, ptrdiff_t, 1 NASMX_RESERVE cbClsExtra, int32_t, 1 NASMX_RESERVE cbWndExtra, int32_t, 1 NASMX_RESERVE hInstance, ptrdiff_t, 1 NASMX_RESERVE hIcon, ptrdiff_t, 1 NASMX_RESERVE hCursor, ptrdiff_t, 1 NASMX_RESERVE hbrBackground, ptrdiff_t, 1 NASMX_RESERVE lpszMenuName, ptrdiff_t, 1 NASMX_RESERVE lpszClassName, ptrdiff_t, 1 NASMX_RESERVE hIconSm, ptrdiff_t, 1 NASMX_ENDSTRUC NASMX_STRUC MSG NASMX_RESERVE hwnd, ptrdiff_t, 1 NASMX_RESERVE message, uint32_t, 1 NASMX_RESERVE wParam, size_t, 1 NASMX_RESERVE lParam, size_t, 1 NASMX_RESERVE time, uint32_t, 1 NASMX_STRUC pt, POINT NASMX_RESERVE x, int32_t, 1 NASMX_RESERVE y, int32_t, 1 NASMX_ENDSTRUC %ifidn __OUTPUT_FORMAT__,macho NASMX_RESERVE lPrivate, int32_t, 1 %elifidn __OUTPUT_FORMAT__,macho32 NASMX_RESERVE lPrivate, int32_t, 1 %elifidn __OUTPUT_FORMAT__,macho64 NASMX_RESERVE lPrivate, int64_t, 1 %endif NASMX_ENDSTRUC NASMX_STRUC RECT NASMX_RESERVE left, int32_t, 1 NASMX_RESERVE top, int32_t, 1 NASMX_RESERVE right, int32_t, 1 NASMX_RESERVE bottom, int32_t, 1 NASMX_ENDSTRUC NASMX_STRUC BITMAPINFOHEADER NASMX_RESERVE biSize, int32_t, 1 NASMX_RESERVE biWidth, int32_t, 1 NASMX_RESERVE biHeight, int32_t, 1 NASMX_RESERVE biPlanes, short_t, 1 NASMX_RESERVE biBitCount, short_t, 1 NASMX_RESERVE biCompression, int32_t, 1 NASMX_RESERVE biSizeImage, int32_t, 1 NASMX_RESERVE biXPelsPerMeter, int32_t, 1 NASMX_RESERVE biYPelsPerMeter, int32_t, 1 NASMX_RESERVE biClrUsed, int32_t, 1 NASMX_RESERVE biClrImportant, int32_t, 1 NASMX_ENDSTRUC NASMX_STRUC PAINTSTRUCT NASMX_RESERVE hdc, ptrdiff_t, 1 NASMX_RESERVE fErase, int32_t, 1 NASMX_STRUC rcPaint, RECT NASMX_RESERVE left, int32_t, 1 NASMX_RESERVE top, int32_t, 1 NASMX_RESERVE right, int32_t, 1 NASMX_RESERVE bottom, int32_t, 1 NASMX_ENDSTRUC NASMX_RESERVE fRestore, int32_t, 1 NASMX_RESERVE fIncUpdate, int32_t, 1 NASMX_RESERVE rgbReserved, int8_t, 32 NASMX_ENDSTRUC NASMX_STRUC PALETTEENTRY NASMX_RESERVE peRed, int8_t, 1 NASMX_RESERVE peGreen, int8_t, 1 NASMX_RESERVE peBlue, int8_t, 1 NASMX_RESERVE peFlags, int8_t, 1 NASMX_ENDSTRUC ;///////////////////////////////////////////////////// ;// KERNEL32.INC PROTOTYPES ;///////////////////////////////////////////////////// IMPORT ExitProcess, 4 IMPORT GetConsoleMode, 8 IMPORT GetLastError, 0 IMPORT GetProcessHeap, 0 IMPORT GetStdHandle, 4 IMPORT HeapAlloc, 12 IMPORT HeapFree, 12 IMPORT ReadFile, 20 IMPORT SetConsoleMode, 8 IMPORT WaitForSingleObject, 8 IMPORT WriteFile, 20 ;///////////////////////////////////////////////////// ;// USER32.INC PROTOTYPES ;///////////////////////////////////////////////////// IMPORT DestroyWindow, ptrdiff_t hWnd IMPORT EndDialog, ptrdiff_t hDlg, size_t nResult IMPORT GetClientRect, ptrdiff_t hWnd, ptrdiff_t lpRect IMPORT PostQuitMessage, dword nExitCode IMPORT ShowWindow, ptrdiff_t hWnd, dword nCmdShow IMPORT TranslateMessage, ptrdiff_t lpMsg IMPORT UpdateWindow, ptrdiff_t hWnd IMPORT InvalidateRect, ptrdiff_t hWnd, ptrdiff_t lpRect, dword bErase IMPORT SetTimer, ptrdiff_t hWnd, size_t nIDEvent, dword uElapse, ptrdiff_t lpTimerFunc IMPORT KillTimer, ptrdiff_t hWnd, size_t nIDEvent IMPORT CreateDCA, 16 IMPORT CreateDIBSection, 24 IMPORT SelectObject, 8 IMPORT DeleteObject, 4 IMPORT DeleteDC, 4 IMPORT CreateCompatibleDC, 4 IMPORT BeginPaint, 8 IMPORT BitBlt, 36 IMPORT EndPaint, 8 IMPORT CreateCompatibleBitmap, 12 ;///////////////////////////////////////////////////// ;// MSVCRT.INC PROTOTYPES ;///////////////////////////////////////////////////// ;// ;// C runtime functions must be handled with care when ;// switching between 32 and 64 bit mode since in 32 bit ;// mode they are defined as cdecl while in 64 bit mode ;// they are defined as default ( fastcall ). ;// VarArg functions such as printf should never be defined ;// ( prototyped ) to include a bytecount %ifidn __BITS__,64 IMPORT printf IMPORT scanf %else IMPORT cdecl, printf IMPORT cdecl, scanf IMPORT cdecl, _getch %endif %ifdef UNICODE ;///////////////////////////////////////////////////// ;// KERNEL32.INC UNICODE PROTOTYPES ;///////////////////////////////////////////////////// IMPORT GetModuleHandleW, 4 %define GetModuleHandle GetModuleHandleW ;///////////////////////////////////////////////////// ;// USER32.INC UNICODE PROTOTYPES ;///////////////////////////////////////////////////// ;// ;// The following shows how to properly prototype an imported ;// windows function using NASMX syntax. ;// TODO: This will eventually be done for all imported functions. IMPORT MessageBoxW, ptrdiff_t hWnd, ptrdiff_t lpText, ptrdiff_t lpCaption, uint32_t uType %define MessageBox MessageBoxW IMPORT CreateWindowExW, uint_t dwExStyle, ptrdiff_t lpClassName, ptrdiff_t lpWindowName, uint_t dwStyle,\ int_t x, int_t y, int_t nWidth, int_t nHeight,\ ptrdiff_t hWndParent, ptrdiff_t hMenu, ptrdiff_t hInstance, ptrdiff_t lpParam %define CreateWindowEx CreateWindowExW IMPORT DefWindowProcW, ptrdiff_t hWnd, uint_t Msg, ptrdiff_t wParam, ptrdiff_t lParam %define DefWindowProc DefWindowProcW IMPORT DialogBoxParamW, 20 %define DialogBoxParam DialogBoxParamW IMPORT DispatchMessageW, 4 %define DispatchMessage DispatchMessageW IMPORT GetMessageW, 16 %define GetMessage GetMessageW IMPORT LoadIconW, 8 %define LoadIcon LoadIconW IMPORT PostMessageW, ptrdiff_t hWnd, dword Msg, size_t wParam, size_t lParam %define PostMessage PostMessageW IMPORT RegisterClassExW, 4 %define RegisterClassEx RegisterClassExW IMPORT SendDlgItemMessageW, 20 %define SendDlgItemMessage SendDlgItemMessageW %ifidni __OUTPUT_FORMAT__,win64 IMPORT wsprintfW %else IMPORT cdecl, wsprintfW %endif %define wsprintf wsprintfW %else ;// ANSI ;///////////////////////////////////////////////////// ;// KERNEL32.INC ANSI PROTOTYPES ;///////////////////////////////////////////////////// IMPORT GetModuleHandleA, 4 %define GetModuleHandle GetModuleHandleA ;///////////////////////////////////////////////////// ;// USER32.INC ANSI PROTOTYPES ;///////////////////////////////////////////////////// IMPORT CreateWindowExA, uint_t dwExStyle, ptrdiff_t lpClassName, ptrdiff_t lpWindowName, uint_t dwStyle,\ int_t x, int_t y, int_t nWidth, int_t nHeight,\ ptrdiff_t hWndParent, ptrdiff_t hMenu, ptrdiff_t hInstance, ptrdiff_t lpParam %define CreateWindowEx CreateWindowExA IMPORT DefWindowProcA, ptrdiff_t hWnd, uint_t Msg, ptrdiff_t wParam, ptrdiff_t lParam %define DefWindowProc DefWindowProcA IMPORT DialogBoxParamA, 20 %define DialogBoxParam DialogBoxParamA IMPORT DispatchMessageA, 4 %define DispatchMessage DispatchMessageA IMPORT GetMessageA, 16 %define GetMessage GetMessageA IMPORT LoadIconA, 8 %define LoadIcon LoadIconA IMPORT MessageBoxA, ptrdiff_t hWnd, ptrdiff_t lpText, ptrdiff_t lpCaption, uint32_t uType %define MessageBox MessageBoxA IMPORT PostMessageA, ptrdiff_t hWnd, dword Msg, size_t wParam, size_t lParam %define PostMessage PostMessageA IMPORT RegisterClassExA, 4 %define RegisterClassEx RegisterClassExA IMPORT SendDlgItemMessageA, 20 %define SendDlgItemMessage SendDlgItemMessageA %ifidni __OUTPUT_FORMAT__,win64 IMPORT wsprintfA %else IMPORT cdecl, wsprintfA %endif %define wsprintf wsprintfA %endif ;// UNICODE %endif ;// __NASMX_DEMOS_INC__ ================================================ FILE: bin/open_cmd.bat ================================================ cmd.exe ================================================ FILE: bin/rcheck.bat ================================================ @echo off cd /d %~dp0 rpp.exe example\run.h %1 -check ================================================ FILE: bin/rinf/conf.txt ================================================ c_export_rbin, 1 c_export_rasm, 0 c_export_rp, 1 c_display_inf, 0 c_warning, 0 c_auto_addinit, 1 c_auto_addfunc, 1 c_auto_import, 1 c_auto_bbk, 1 c_op_empty_func, 1 c_op_nop, 1 c_op_zero, 1 c_op_merge, 1 c_op_ebp, 1 c_op_base_calc, 1 c_op_pass, 1 c_op_const_eval, 1 c_op_match, 1 c_run, 1 c_pause, 0 c_stack_size, 2*1024*1024 ================================================ FILE: bin/rinf/key.txt ================================================ rjit calle call retn reti push pop jmp jebxz jebxnz halt nop lea mov mov1 mov8 add sub imul idiv imod cesb cnesb cgsb cgesb clsb clesb add8 sub8 imul8 idiv8 imod8 cgsb8 clsb8 _fadd8 _fsub8 _fmul8 _fdiv8 _fcgsb8 _fclsb8 band bor bnot bxor bshl bshr bsar _udiv _umod _ucgsb _ucgesb _uclsb _uclesb rn rd1 rd2 rd4 rd8 rdp eip esp ebp eax ebx ecx edx esi edi eflags void char int uint int8 double rp var rbuf rstr rcs function _js_obj _js_findf if ifn else break continue continued return class template this sizeof main include import endif ifdef ifndef define enum for to in case friend cfunc dynamic private protected public switch typename typeof s_ret s_off s_param s_local mac export lambda self _BTEMP _PCALL _LAMBDA _SELF _RVM _RVARA _RVARB _TEMP _LAMBDA_C_P _PMAIN _PENV ================================================ FILE: bin/rinf/match.txt ================================================ sub esp , 4 push @n push [ @@ + @n ] call [ & , int , "<=(int,int)" ] mov ebx , [ esp ] add esp , 4 clesb [ @1 + @2 ] , @0 push @n lea esi,[@@+@n] push esi call [ & , int , "=(int&,int)" ] mov [@1+@2],@0 push [@@+@n] lea esi,[@@+@n] push esi call [ & , int , "+=(int&,int)" ] add [@2+@3],[@0+@1] lea esi,[@@+@n] push esi call [ & , int , "++(int&)"] add [@0+@1],1 push [ @@ + @n ] push [ @@ + @n ] call [ & , int , "+(int,int)" ] mov [esp],[@2+@3] add [esp],[@0+@1] ================================================ FILE: bin/rjit.bat ================================================ @echo off rem cd /d %~dp0 %~dp0\rpp.exe -jit %1 ================================================ FILE: bin/rjit_win.bat ================================================ @echo off cd /d %~dp0 rpp_win.exe -jit %1 ================================================ FILE: bin/rpack.bat ================================================ @echo off cd /d %~dp0 rpp.exe -pack %1 ================================================ FILE: bin/rpack_win.bat ================================================ @echo off cd /d %~dp0 rpp_win.exe -pack %1 ================================================ FILE: bin/rsrc/carray.h ================================================  class carray { T m_buf[N] carray() { } carray(carray& v) { this=v } T& [](int num) { return (&m_buf)[num] } void =(carray& v) { for i=0;i& v) { for i=0;i* vstr,tfunc* ptfi,int vebp) { push vebp push ptfi push vstr calle "eval_vstr" mov s_ret,eax add esp,12 } define get_up_func get_up_func_in(ebp,sizeof(s_local)) define get_cur_ebp ebp define get_up_ebp (*ebp.to) tfunc* get_up_func_in(int v_ebp,int local_size) { return get_cur_func_in(*(v_ebp+local_size+4).to); } tfunc* get_cur_func() { mov ecx,[ebp+4] return get_cur_func_in(ecx) } tfunc* get_cur_func_in(int pasm) { push pasm calle "get_cur_func" mov s_ret,eax add esp,4 } dynamic bool and(rbuf>* p,tfunc* ptfi,int vebp) { for i=0;icount;i++ rbuf v v.push('return') v+=(*p)[i] ifn eval_vstr(&v,ptfi,vebp) return false return true } dynamic bool or(rbuf>* p,tfunc* ptfi,int vebp) { for i=0;icount;i++ rbuf v v.push('return') v+=(*p)[i] if eval_vstr(&v,ptfi,vebp) return true return false } ================================================ FILE: bin/rsrc/int8_n.h ================================================  class int8 { rd8 m_in; ~int8() { } int8() { } friend int8 operator*(int8 a,int8 b) { mov eax,[ebp+(s_off b+4)] push eax mov ecx,b push ecx mov edx,[ebp+(s_off a+4)] push edx mov eax,a push eax rn call long_mul mov s_ret,eax mov [ebp+(s_off s_ret+4)],edx pop ebp reti 16 long_mul: mov eax,[esp+8] mov ecx,[esp+0x10] rn or ecx,eax mov ecx,[esp+0xc] rn jne hard mov eax,[esp+4] rn db 0xf7,0xe1//mul eax,ecx reti 0x10 hard: push ebx rn db 0xf7,0xe1//mul eax,ecx mov ebx,eax mov eax,[esp+8] rn db 0xf7,0x64,0x24,0x14//mul eax,[esp+0x14] add ebx,eax mov eax,[esp+8] rn db 0xf7,0xe1//mul eax,ecx add edx,ebx pop ebx reti 0x10 } friend int8 operator/(int8 a,int8 b) { mov eax,[ebp+(s_off b+4)] push eax mov ecx,b push ecx mov edx,[ebp+(s_off a+4)] push edx mov eax,a push eax rn call long_div mov s_ret,eax mov [ebp+(s_off s_ret+4)],edx pop ebp reti 16 long_div: push edi push esi push ebx rn xor edi,edi mov eax,[esp+0x14] rn or eax,eax rn jge L1 rn inc edi mov edx,[esp+0x10] rn neg eax rn neg edx rn sbb eax,0 mov [esp+0x14],eax mov [esp+0x10],edx L1: mov eax,[esp+0x1c] rn or eax,eax rn jge L2 rn inc edi mov edx,[esp+0x18] rn neg eax rn neg edx rn sbb eax,0 mov [esp+0x1c],eax mov [esp+0x18],edx L2: rn or eax,eax rn jne L3 mov ecx,[esp+0x18] mov eax,[esp+0x14] rn xor edx,edx rn db 0xf7,0xf1//div eax,ecx mov ebx,eax mov eax,[esp+0x10] rn db 0xf7,0xf1//div eax,ecx mov edx,ebx jmp L4 L3: mov ebx,eax mov ecx,[esp+0x18] mov edx,[esp+0x14] mov eax,[esp+0x10] L5: rn shr ebx,1 rn rcr ecx,1 rn shr edx,1 rn rcr eax,1 rn or ebx,ebx rn jne L5 rn db 0xf7,0xf1//div eax,ecx mov esi,eax rn db 0xf7,0x64,0x24,0x1c//mul eax,[esp+0x1c] mov ecx,eax mov eax,[esp+0x18] rn db 0xf7,0xe6//mul eax,esi add edx,ecx rn jb L6 rn cmp edx,[esp+0x14] rn ja L6 rn jb L7 rn cmp eax,[esp+0x10] rn jbe L7 L6: rn dec esi L7: rn xor edx,edx mov eax,esi L4: rn dec edi rn jne L8 rn neg edx rn neg eax rn sbb edx,0 L8: pop ebx pop esi pop edi reti 16 } friend bool operator<(int8 a,int8 b) { mov eax,[ebp+(s_off a+4)] rn cmp eax,[ebp+(s_off b+4)] rn jg tag_zero rn jl tag_one mov ecx,a rn cmp ecx,b rn jae tag_zero tag_one: mov s_ret,1 return tag_zero: mov s_ret,0 } int8(int8 a) { mov esi,this mov [esi],[ebp+s_off a] mov [esi+4],[ebp+(s_off a+4)] } int8(int8& a) { mov edi,this mov esi,a mov [edi],[esi] mov [edi+4],[esi+4] } int8(int a) { mov esi,this mov [esi],a mov [esi+4],0 mov edi,a if(a<0) { mov esi,this mov [esi+4],uint::c_max } } int8(uint a) { mov esi,this mov [esi],a mov [esi+4],0 } int toint() { mov esi,this mov s_ret,[esi] } rstr torstr() { rstr ret(this) return ret } operator=(int8 a) { mov esi,this mov [esi],[ebp+s_off a] mov [esi+4],[ebp+(s_off a+4)] } operator=(int8& a) { mov edi,this mov esi,a mov [edi],[esi] mov [edi+4],[esi+4] } friend operator<->(int8& a,int8& b) { c=a a=b b=c } operator+=(int8 a) { mov esi,this mov eax,[esi] add eax,a mov ecx,[esi+4] rn adc ecx,[ebp+(s_off a+4)] mov [esi],eax mov [esi+4],ecx } operator-=(int8 a) { mov esi,this mov eax,[esi] sub eax,a mov ecx,[esi+4] rn sbb ecx,[ebp+(s_off a+4)] mov [esi],eax mov [esi+4],ecx } operator*=(int8 a) { this=this*a } operator/=(int8 a) { this=this/a } operator%=(int8 a) { this=this%a } operator++() { this+=1 } operator--() { this-=1 } friend int8 operator+(int8 a,int8 b) { a+=b return a } friend int8 operator-(int8 a,int8 b) { a-=b return a } //todo friend int8 operator%(int8 a,int8 b) { return a-a/b*b } friend bool operator<=(int8 a,int8 b) { return a(int8 a,int8 b) { return b=(int8 a,int8 b) { return b<=a; } friend int8 operator neg(int8 a) { return 0-a; } clear() { this=0 } bool empty() { return 0==this } print() { rf.print this } printl() { rf.printl this } }; ================================================ FILE: bin/rsrc/math.h ================================================  namespace math { double sin(double a) { p=&s_ret push p push [ebp+(s_off a+4)] push a calle "sin" add esp,12 } double cos(double a) { p=&s_ret push p push [ebp+(s_off a+4)] push a calle "cos" add esp,12 } double sqrt(double a) { p=&s_ret push p push [ebp+(s_off a+4)] push a calle "sqrt" add esp,12 } } ================================================ FILE: bin/rsrc/rcc.h ================================================ class xpoint { double x double y } namespace cc { enum { c_cc_set_effect_volume=1000, c_cc_set_music_volume, c_cc_play_effect, c_cc_play_music, c_cc_add_animations, c_cc_get_animation, c_cc_animate_create, c_cc_get_key, c_cc_set_key, c_cc_add_cache, c_cc_rand, c_cc_set_design_size, c_cc_set_display_state, c_cc_jump_scene, c_cc_touch_call, c_cc_sprite_create, c_cc_bmf_create, c_cc_bmf_set, c_cc_get_size, c_cc_set_tag, c_cc_get_tag, c_cc_add_child, c_cc_remove_from_parent, c_cc_set_pos, c_cc_get_pos, c_cc_set_scale, c_cc_run_ac, c_cc_stop_ac, c_cc_schedule, c_cc_ac_move_to, c_cc_ac_move_by, c_cc_ac_rotate_to, c_cc_ac_rotate_by, c_cc_ac_scale_to, c_cc_ac_scale_by, c_cc_ac_delay, c_cc_ac_repeat, c_cc_ac_repeat_times, c_cc_ac_sequence, c_cc_ac_spawn, c_cc_ac_call, c_cc_ac_ease_in, c_cc_ac_ease_out, c_cc_ac_elastic_in, c_cc_ac_elastic_out, c_cc_phy_apply_impulse, c_cc_phy_get_body, c_cc_phy_set_body, c_cc_phy_box, c_cc_phy_box_edge, c_cc_phy_call, c_cc_label_create, c_cc_set_color, } set_effect_volume(double val) { sub esp,8 mov8 [esp],val calle c_cc_set_effect_volume } set_music_volume(double val) { sub esp,8 mov8 [esp],val calle c_cc_set_music_volume } play_effect(char* name) { push name calle c_cc_play_effect } play_effect(rstr name) { play_effect(name.cstr) } play_music(char* name) { push name calle c_cc_play_music } play_music(rstr name) { play_music(name.cstr) } add_animations(char* file) { push file calle c_cc_add_animations } add_animations(rstr file) { add_animations(file.cstr) } void* get_animation(char* name) { sub esp,4 push name calle c_cc_get_animation mov s_ret,[esp] add esp,4 } void* get_animation(rstr name) { return get_animation(name.cstr) } void* animate_create(void* animation) { sub esp,4 push animation calle c_cc_animate_create mov s_ret,[esp] add esp,4 } rstr get_key(char* name) { rbuf buf(1024) void* begin=buf.begin push begin push name calle c_cc_get_key return rstr(begin) } rstr get_key(rstr name) { return get_key(name.cstr) } set_key(char* name,char* str) { push str push name calle c_cc_set_key } set_key(rstr name,rstr str) { set_key(name.cstr,str.cstr) } add_cache(char* name) { push name calle c_cc_add_cache } add_cache(rstr name) { add_cache(name.cstr) } int rand(int n) { sub esp,4 push n calle c_cc_rand mov s_ret,[esp] add esp,4 } set_design_size(double width,double height) { sub esp,8 mov8 [esp],height sub esp,8 mov8 [esp],width calle c_cc_set_design_size } set_display_state(bool b) { push b calle c_cc_set_display_state } jump_scene(void* scene) { push scene calle c_cc_jump_scene } touch_call(void* node,void* call_back) { push call_back push node calle c_cc_touch_call } void* sprite_create(char* name) { sub esp,4 push name calle c_cc_sprite_create mov s_ret,[esp] add esp,4 } void* sprite_create(rstr name) { return sprite_create(name.cstr) } void* bmf_create(char* name,char* str) { sub esp,4 push str push name calle c_cc_bmf_create mov s_ret,[esp] add esp,4 } void* bmf_create(rstr name,rstr str) { return bmf_create(name.cstr,str.cstr) } bmf_set(void* bmf,char* str) { push str push bmf calle c_cc_bmf_set } bmf_set(void* bmf,rstr str) { bmf_set(bmf,str.cstr) } xpoint get_size(void* sprite) { sub esp,16 push sprite calle c_cc_get_size mov8 s_ret,[esp] mov8 [ebp+(s_off s_ret+8)],[esp+8] add esp,16 } set_tag(void* node,int tag) { push tag push node calle c_cc_set_tag } int get_tag(void* node) { sub esp,4 push node calle c_cc_get_tag mov s_ret,[esp] add esp,4 } add_child(void* parent,void* node,int z) { push z push node push parent calle c_cc_add_child } remove_from_parent(void* node) { push node calle c_cc_remove_from_parent } add_child(void* parent,void* node) { add_child(parent,node,0) } set_pos(void* node,double x,double y) { sub esp,8 mov8 [esp],y sub esp,8 mov8 [esp],x push node calle c_cc_set_pos } set_pos(void* node,xpoint pt) { set_pos(node,pt.x,pt.y) } xpoint get_pos(void* node) { sub esp,16 push node calle c_cc_get_pos mov8 s_ret,[esp] mov8 [ebp+(s_off s_ret+8)],[esp+8] add esp,16 } set_scale(void* node,double x,double y) { sub esp,8 mov8 [esp],y sub esp,8 mov8 [esp],x push node calle c_cc_set_scale } set_scale(void* node,double scale) { set_scale(node,scale,scale) } run_ac(void* node,void* action) { push action push node calle c_cc_run_ac } stop_ac(void* node) { push node calle c_cc_stop_ac } schedule(void* node,double time) { sub esp,8 mov8 [esp],time push node calle c_cc_schedule } bool rect_hit(void* a,void* b) { x1=cc.get_pos(a).x-cc.get_size(a).x/2.0 x2=cc.get_pos(a).x+cc.get_size(a).x/2.0 x3=cc.get_pos(b).x-cc.get_size(b).x/2.0 x4=cc.get_pos(b).x+cc.get_size(b).x/2.0 y1=cc.get_pos(a).y-cc.get_size(a).y/2.0 y2=cc.get_pos(a).y+cc.get_size(a).y/2.0 y3=cc.get_pos(b).y-cc.get_size(b).y/2.0 y4=cc.get_pos(b).y+cc.get_size(b).y/2.0 return rect_hit(x1,x2,x3,x4)&&rect_hit(y1,y2,y3,y4) } bool rect_hit(double a,double b,double c,double d) { return b>c&&a struct rdic_i { T val; rstr key; friend rbool operator<(const rdic_i& a,const rdic_i& b) { return a.key& a,const rdic_i& b) { return a.key!=b.key; } }; template struct rdic { rset > m_set; rbool exist(const rstr& key) { rdic_i item; item.key=key; return m_set.exist(item); } T& operator[](const rstr& key) { rdic_i item; item.key=key; m_set.insert_c(item); rdic_i* p=m_set.find(item); return p->val; } }; ================================================ FILE: bin/rsrc/rstr.h ================================================ class rstr { public: rbuf m_buf; ~rstr() { } rstr() { } rstr(const char* p) { set(p); } rstr(void* p,int len) { m_buf.alloc(len); rf.memcpy(begin(),p,len); } rstr(const char* p,const char* q) { if(p>=q) { rf::error(""); } int len=q-p; m_buf.alloc(len); rf.memcpy(begin(),p,len); } rstr(char ch) { m_buf+=ch; } rstr(int i) { rbuf tmp(20); rf.sprintf(tmp.begin,"%d",i); set(tmp.m_p); } rstr(uint i) { rbuf tmp(20); rf.sprintf(tmp.begin,"%u",i); set(tmp.m_p); } rstr(int8 i) { rbuf tmp(128); rf.sprintf8(tmp.begin,"%I64d",i); set(tmp.m_p); } rstr(double i) { rbuf tmp(1024); rf.sprintf8(tmp.begin,"%f",i); set(tmp.m_p); } rstr(float i) { //sprintf用%f时以8字节打印 set(rstr(double(i)).cstr) } rstr(rstr& s) { m_buf.alloc_not_change(s.m_buf.m_cmax); m_buf.m_count=s.count(); rf::memcpy(begin(),s.begin(),s.count()); } int toint() { int ret; rf.sscanf(cstr(),"%d",&ret); return ret; } uint touint() { uint ret; rf.sscanf(cstr(),"%u",&ret); return ret; } int8 toint8() { int8 ret; rf.sscanf(cstr(),"%I64d",&ret); return ret; } double todouble() { double ret; rf.sscanf8(cstr(),"%lf",&ret); return ret; } rstr torstr() { return this } rstrw torstrw() { rstr temp=rcode::utf8_to_utf16(this); s_ret.rstrw() s_ret.set_size(temp.size) rf.memcpy(s_ret.begin,temp.begin,temp.size); } void operator=(rstr& a) { m_buf=a.m_buf; } char& operator[](int num) { return m_buf[num]; } friend bool operator==(rstr& a,rstr& b) { return a.m_buf==b.m_buf; } friend bool operator!=(rstr& a,rstr& b) { return a.m_buf!=b.m_buf; } friend rstr operator+(rstr& a,rstr& b) { int total=a.count()+b.count(); int max=rf::max(a.m_buf.m_cmax,b.m_buf.m_cmax); rstr ret; if(total>max) { ret.m_buf.alloc_not_change(rbuf.extend_num(total)); } else { ret.m_buf.alloc_not_change(max); } ret.m_buf.m_count=total; rf::memcpy(ret.begin(),a.begin(),a.m_buf.m_count); rf::memcpy(ret.begin()+a.m_buf.m_count,b.begin(),b.m_buf.m_count); return ret; } void operator+=(rstr& a) { m_buf+=a.m_buf; } friend bool operator<(rstr& a,rstr& b) { return rf::strcmp(a.cstr(),b.cstr())<0; } friend bool operator>(rstr& a,rstr& b) { return rf::strcmp(a.cstr(),b.cstr())>0; } friend bool operator<=(rstr& a,rstr& b) { return rf::strcmp(a.cstr(),b.cstr())<=0; } friend bool operator>=(rstr& a,rstr& b) { return rf::strcmp(a.cstr(),b.cstr())>=0; } char* set_size(int size) { m_buf.realloc_n(size); return begin(); } void set(char* p) { int len=rf::strlen(p); m_buf.realloc_n_not_change(rbuf.extend_num(len)); m_buf.m_count=len; rf::memcpy(m_buf.begin(),p,len); } void push(char ch) { m_buf.push(ch); } char pop() { return m_buf.pop(); } int count() { return m_buf.count(); } int size() { return m_buf.count(); } char* cstr() { char temp=0; m_buf.push(temp); m_buf.pop(); return m_buf.begin(); } wchar* cstrw() { char temp=0; m_buf.push(temp); m_buf.push(temp); m_buf.pop(); m_buf.pop(); return m_buf.begin(); } char* begin() { return m_buf.begin(); } char* end() { return m_buf.end(); } bool empty() { return m_buf.empty(); } void clear() { m_buf.clear(); } char* pos(int num) { return begin()+num; } int pos(char* p) { return p-begin(); } rstr sub(int begin,int end=count) { rstr ret; ret.m_buf=m_buf.sub(begin,end); return ret; } bool erase(int begin,int end) { return m_buf.erase(begin,end); } bool erase(int i) { return erase(i,i+1); } bool insert(int pos,rstr& a) { return m_buf.insert(pos,a.m_buf); } char get(int i) { return m_buf.get(i); } char get_top() { char ret=0; if(count()>0) { ret=m_buf.m_p[count()-1]; } return ret; } char get_bottom() { char ret=0; if(count()>0) { ret=m_buf.m_p[0]; } return ret; } bool is_number() { if(empty()) { return false; } for(int i=0;i(this,m,begin) } rstr replace(rstr src,rstr dst) { rstr ret for i=0;i split(rstr m) { return r_split_r(this,m) } void reverse() { m_buf.reverse } void print() { rf.print(this) } void printl() { rf.printl(this) } static rstr format(rstr f,int a) { rbuf temp(1024) rf.sprintf(temp.begin,f.cstr,a); s_ret.rstr() s_ret.set(temp.begin) } }; ================================================ FILE: bin/rsrc/rstrw.h ================================================  #include "rstr.h" struct rstrw { rbuf m_buf; ~rstrw() { } rstrw() { } rstrw(const ushort* p) { set(p); } rstrw(const uchar* p,int len) { set_size(len); rf.memcpy(m_buf.begin(),p,len); } rstrw(const rstrw& s) { m_buf.alloc_not_change(s.m_buf.m_cmax); m_buf.m_count=s.count(); rf.memcpy(begin(),s.begin(),s.size()); } rstrw(const rstr& s) { rstr tmp=rcode::utf8_to_utf16(s); set_size(tmp.size()); rf.memcpy(begin(),tmp.begin(),tmp.size()); } rstr torstr() { return rcode::utf16_to_utf8(rstr(begin(),size())); } ushort* cstrw() { m_buf.push(0.toushort); m_buf.pop(); return begin(); } void operator=(const rstrw& a) { m_buf=a.m_buf; } ushort& operator[](int num) const { return m_buf[num]; } friend rbool operator==(const rstrw& a,const rstrw& b) { return a.m_buf==b.m_buf; } friend rbool operator!=(const rstrw& a,const rstrw& b) { return a.m_buf!=b.m_buf; } friend rstrw operator+(const rstrw& a,const rstrw& b) { rstrw ret; ret.m_buf=a.m_buf+b.m_buf; return ret; } void operator+=(const rstrw& a) { m_buf+=a.m_buf; } void operator+=(ushort ch) { m_buf+=ch; } friend rbool operator<(const rstrw& a,const rstrw& b) { for(int i=0;i(const rstrw& a,const rstrw& b) { return bb); } friend rbool operator>=(const rstrw& a,const rstrw& b) { return !(a::extend_num(len)); m_buf.m_count=len; rf.memcpy(m_buf.begin(),p,len*2); } void push(ushort ch) { m_buf.push(ch); } void push_front(ushort ch) { m_buf.push_front(ch); } ushort pop() { return m_buf.pop(); } ushort pop_front() { return m_buf.pop_front(); } int count() const { return m_buf.count(); } int size() const { return count()*2; } ushort* begin() const { return m_buf.begin(); } ushort* end() const { return m_buf.end(); } rbool empty() const { return m_buf.empty(); } void clear() { m_buf.clear(); } static ushort* next(ushort* p) { return p+1; } static ushort* prev(ushort* p) { return p-1; } ushort* pos(int num) const { return begin()+num; } int pos(ushort* p) const { return p-begin(); } rstrw sub(int begin) const { return sub(begin,count()); } rstrw sub(int begin,int end) const { rstrw ret; ret.m_buf=m_buf.sub(begin,end); return ret; } rbool erase(int begin,int end) { return m_buf.erase(begin,end); } rbool erase(int i) { return erase(i,i+1); } rbool insert(int pos,const rstrw& a) { return m_buf.insert(pos,a.m_buf); } ushort get(int i) const { if(i>=count()) return 0.toushort; else return m_buf[i]; } ushort get_top() const { ushort ret=0; if(count()>0) { ret=m_buf.m_p[count()-1]; } return ret; } ushort get_bottom() const { ushort ret=0; if(count()>0) { ret=m_buf.m_p[0]; } return ret; } int find(rstrw s,int begin=0) { return r_find_pos(*this,s,begin); } int find_last(ushort ch) { return m_buf.find_last(ch); } printl() { this.torstr.printl } }; ================================================ FILE: bin/rsrc/short.h ================================================ class short { rd2 m_in ~short() { } short() { } short(short& a) { mov esi,this mov edi,a mov1 [esi],[edi] mov1 [esi+1],[edi+1] } short(short a) { mov esi,this mov1 [esi],a mov1 [esi+1],[ebp+(s_off a+1)] } ushort toushort() { mov esi,this mov1 s_ret,[esi] mov1 [ebp+(s_off s_ret+1)],[esi+1] } int toint() { temp=this.toushort if temp>32767 return temp.toint-65536 else return temp } rstr torstr() { rstr ret(this.toint) return ret } operator=(short& a) { mov esi,this mov edi,a mov1 [esi],[edi] mov1 [esi+1],[edi+1] } operator=(short a) { mov esi,this mov1 [esi],a mov1 [esi+1],[ebp+(s_off a+1)] } clear() { this=0 } bool empty() { return this.toint==0 } print() { rf.print this.torstr } printl() { rf.printl this.torstr } } ================================================ FILE: bin/rsrc/varf.h ================================================  namespace varf { void* new() { sub esp,4 calle c_new mov s_ret,[esp] add esp,4 } void* new_copy(void* p) { sub esp,4 push p calle c_new_copy mov s_ret,[esp] add esp,4 } void delete(void* p) { push p calle c_delete } void set_int(void* p,int a) { push a push p calle c_set_int } void set_double(void* p,double a) { sub esp,8 mov8 [esp],a push p calle c_set_double } void set_rstr(void* p,char* s,int size) { push size push s push p calle c_set_rstr } void set_var(void* p,void* a) { push a push p calle c_set_var } void set_func(void* p,void* a) { push a push p calle c_set_func } void* add(void* a,void* b) { sub esp,4 push b push a calle c_add mov s_ret,[esp] add esp,4 } void* minus(void* a,void* b) { sub esp,4 push b push a calle c_minus mov s_ret,[esp] add esp,4 } void* star(void* a,void* b) { sub esp,4 push b push a calle c_star mov s_ret,[esp] add esp,4 } void* divide(void* a,void* b) { sub esp,4 push b push a calle c_divide mov s_ret,[esp] add esp,4 } void* modulo(void* a,void* b) { sub esp,4 push b push a calle c_modulo mov s_ret,[esp] add esp,4 } void* sub(void* a,int begin,int end) { sub esp,4 push end push begin push a calle c_sub mov s_ret,[esp] add esp,4 } bool equal(void* a,void* b) { sub esp,4 push b push a calle c_equal mov s_ret,[esp] add esp,4 } bool less(void* a,void* b) { sub esp,4 push b push a calle c_less mov s_ret,[esp] add esp,4 } int toint(void* p) { sub esp,4 push p calle c_toint mov s_ret,[esp] add esp,4 } int get_rstr(void* p,char* buf) { sub esp,4 push buf push p calle c_get_rstr mov s_ret,[esp] add esp,4 } void* findf(void* p,char* name) { sub esp,4 push name push p calle c_findf mov s_ret,[esp] add esp,4 } var& quote_attr(void* p,char* name) { sub esp,4 push name push p calle c_quote_attr mov s_ret,[esp] add esp,4 } bool have(void* p,char* name) { sub esp,4 push name push p calle c_have mov s_ret,[esp] add esp,4 } void insert_pair(void* p,void* name,void* val) { push val push name push p calle c_insert_pair } int count(void* p) { sub esp,4 push p calle c_count mov s_ret,[esp] add esp,4 } void* stringify(void* p) { sub esp,4 push p calle c_stringify mov s_ret,[esp] add esp,4 } enum { c_void, c_int, c_double, c_rstr, c_dic, c_func, }; enum { c_new=2000, c_new_copy, c_delete, c_set_int, c_set_double, c_set_rstr, c_set_var, c_set_func, c_add, c_minus, c_star, c_divide, c_modulo, c_sub,//求子串或者子数组 c_equal, c_less, c_toint, c_get_rstr, c_findf, c_quote_attr, c_have, c_insert_pair, c_count, c_stringify, }; } void* _js_findf(var* p,char* name) { return varf.findf(p->m_p,name) } var _js_obj(int count) { var* p=&count+1 var* pret=p+count pret->var pret->set_int(0) for i=0;im_p,p->m_p,(p+1)->m_p) p->~var (p+1)->~var p+=2 mov ecx,4 imul ecx,count add ecx,4 pop ebp add esp,sizeof(s_local) reti ecx } ================================================ FILE: bin/run.bat ================================================ @echo off %~dp0\rpp.exe example\run.h %1 -del ================================================ FILE: del.bat ================================================ del /F /Q .\bin\*.ilk del /F /Q .\bin\*.pdb del /F /Q .\*.ncb attrib -R -S -A -H .\*.suo del /F /Q .\*.suo del /F /Q .\*.user rd /S /Q .\debug rd /S /Q .\Release del /F /Q .\2005\*.ncb attrib -R -S -A -H .\2005\*.suo del /F /Q .\2005\*.suo del /F /Q .\2005\*.user rd /S /Q .\2005\debug rd /S /Q .\2005\Release del /F /Q .\2008\*.ncb attrib -R -S -A -H .\2008\*.suo del /F /Q .\2008\*.suo del /F /Q .\2008\*.user rd /S /Q .\2008\debug rd /S /Q .\2008\Release attrib -R -S -A -H .\2010\*.suo del /F /Q .\2010\*.suo del /F /Q .\2010\*.user rd /S /Q .\2010\debug rd /S /Q .\2010\Release del /F /Q .\proj\rpp_win\*.vsp rem del /F /Q .\proj\rpp_win\*.filters del /F /Q .\proj\rpp_win\*.psess del /F /Q .\proj\rpp_win\*.sdf del /F /Q .\proj\rpp_win\*.ncb attrib -R -S -A -H .\proj\rpp_win\*.suo del /F /Q .\proj\rpp_win\*.suo del /F /Q .\proj\rpp_win\*.user rd /S /Q .\proj\rpp_win\debug rd /S /Q .\proj\rpp_win\Release del /F /Q .\proj\*.vsp rem del /F /Q .\proj\*.filters del /F /Q .\proj\*.psess del /F /Q .\proj\*.sdf del /F /Q .\proj\*.ncb attrib -R -S -A -H .\proj\*.suo del /F /Q .\proj\*.suo del /F /Q .\proj\*.user rd /S /Q .\proj\debug rd /S /Q .\proj\Release pause ================================================ FILE: proj/rpp.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rpp", "rpp.vcxproj", "{E00D615C-3C55-4D01-B2EB-0064CFBAA91E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Debug|Win32.ActiveCfg = Debug|Win32 {E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Debug|Win32.Build.0 = Debug|Win32 {E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Debug|x64.ActiveCfg = Debug|x64 {E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Debug|x64.Build.0 = Debug|x64 {E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Release|Win32.ActiveCfg = Release|Win32 {E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Release|Win32.Build.0 = Release|Win32 {E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Release|x64.ActiveCfg = Release|x64 {E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: proj/rpp.vcxproj ================================================  Debug Win32 Debug x64 Release Win32 Release x64 {E00D615C-3C55-4D01-B2EB-0064CFBAA91E} rpp Win32Proj Application v110_xp MultiByte true Application v110 MultiByte true Application v110 MultiByte Application v110 MultiByte <_ProjectFileVersion>11.0.50727.1 $(SolutionDir)$(Configuration)\ $(Configuration)\ true true $(SolutionDir)$(Configuration)\ $(Configuration)\ false false Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue $(OutDir)..\..\bin\$(ProjectName).exe true Console MachineX86 2097152 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL EnableAllWarnings ProgramDatabase $(OutDir)..\..\bin\$(ProjectName).exe true Console MaxSpeed true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded Default true Level3 ProgramDatabase Cdecl Neither false $(OutDir)..\..\bin\$(ProjectName).exe true Console true true MachineX86 2097152 MaxSpeed true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded Default true Level3 ProgramDatabase Cdecl $(OutDir)..\..\..\bin\rpp64.exe true Console true true ================================================ FILE: proj/rpp.vcxproj.filters ================================================  {215fd1b1-6a2b-4c78-8b15-c31646a41608} {ab428ca6-6677-43d4-9996-7a8908450db1} rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rlib rlib rlib rlib rlib rlib rlib rlib rlib rlib rlib rlib rlib rlib rlib rlib rlib rlib rlib rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp rpp ================================================ FILE: proj/rpp_win/rpp_win.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rpp_win", "rpp_win.vcxproj", "{D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C}.Debug|Win32.ActiveCfg = Debug|Win32 {D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C}.Debug|Win32.Build.0 = Debug|Win32 {D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C}.Release|Win32.ActiveCfg = Release|Win32 {D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: proj/rpp_win/rpp_win.vcxproj ================================================  Debug Win32 Release Win32 {D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C} Win32Proj rpp_win Application true v110_xp MultiByte Application false v110_xp true MultiByte true $(SolutionDir)$(Configuration)\ $(Configuration)\ false $(SolutionDir)$(Configuration)\ $(Configuration)\ Level3 Disabled WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) MultiThreadedDebug Windows true $(OutDir)..\..\..\bin\$(ProjectName).exe 2097152 Level3 MaxSpeed true true WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) MultiThreaded Windows true true true $(OutDir)..\..\..\bin\$(ProjectName).exe 2097152 ================================================ FILE: proj/rpp_win/rpp_win.vcxproj.filters ================================================  {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 源文件 ================================================ FILE: rlib/gbk.txt ================================================ uchar g_unicode[65536*2]={0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,233,161,234,161,232,163,164,124,0,161,236,161,167,0,0,97,0,0,0,0,0,45,0,0,0,161,165,161,227,161,192,50,0,51,0,161,228,166,204,0,0,161,164,0,0,49,0,111,0,0,0,0,0,0,0,0,0,0,0,168,164,168,162,0,0,0,0,0,0,0,0,0,0,0,0,168,168,168,166,168,186,0,0,168,172,168,170,0,0,0,0,68,0,0,0,168,176,168,174,0,0,0,0,0,0,161,193,0,0,168,180,168,178,0,0,168,185,89,0,84,0,0,0,168,164,168,162,97,0,0,0,0,0,0,0,0,0,0,0,168,168,168,166,168,186,0,0,168,172,168,170,0,0,0,0,101,0,0,0,168,176,168,174,0,0,0,0,0,0,161,194,0,0,168,180,168,178,0,0,168,185,121,0,116,0,0,0,168,161,168,161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,165,168,165,0,0,0,0,0,0,0,0,0,0,0,0,168,167,168,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,169,168,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,189,0,0,0,0,0,0,168,190,0,0,0,0,0,0,168,173,168,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,177,168,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,163,168,163,168,171,168,171,168,175,168,175,168,179,168,179,168,181,168,181,168,182,168,182,168,183,168,183,168,184,168,184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,166,0,0,161,165,168,64,168,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,161,166,162,166,163,166,164,166,165,166,166,166,167,166,168,166,169,166,170,166,171,166,172,166,173,166,174,166,175,166,176,166,177,0,0,166,178,166,179,166,180,166,181,166,182,166,183,166,184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,193,166,194,166,195,166,196,166,197,166,198,166,199,166,200,166,201,166,202,166,203,166,204,166,205,166,206,166,207,166,208,166,209,0,0,166,210,166,211,166,212,166,213,166,214,166,215,166,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,161,167,162,167,163,167,164,167,165,167,166,167,168,167,169,167,170,167,171,167,172,167,173,167,174,167,175,167,176,167,177,167,178,167,179,167,180,167,181,167,182,167,183,167,184,167,185,167,186,167,187,167,188,167,189,167,190,167,191,167,192,167,193,167,209,167,210,167,211,167,212,167,213,167,214,167,216,167,217,167,218,167,219,167,220,167,221,167,222,167,223,167,224,167,225,167,226,167,227,167,228,167,229,167,230,167,231,167,232,167,233,167,234,167,235,167,236,167,237,167,238,167,239,167,240,167,241,0,0,167,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,92,0,0,0,0,168,67,161,170,168,68,161,172,0,0,161,174,161,175,0,0,0,0,161,176,161,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,69,161,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,235,0,0,161,228,161,229,0,0,168,70,0,0,0,0,0,0,0,0,0,0,161,249,0,0,0,0,163,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,230,0,0,168,71,0,0,0,0,0,0,168,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,162,241,162,242,162,243,162,244,162,245,162,246,162,247,162,248,162,249,162,250,162,251,162,252,0,0,0,0,0,0,0,0,162,161,162,162,162,163,162,164,162,165,162,166,162,167,162,168,162,169,162,170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,251,161,252,161,250,161,253,0,0,0,0,168,73,168,74,168,75,168,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,202,0,0,0,0,0,0,0,0,0,0,0,0,161,199,0,0,161,198,0,0,0,0,0,0,168,77,0,0,0,0,161,227,0,0,161,204,0,0,0,0,161,216,161,222,168,78,161,207,0,0,0,0,168,79,0,0,161,206,0,0,161,196,161,197,161,201,161,200,161,210,0,0,0,0,161,211,0,0,0,0,0,0,0,0,0,0,161,224,161,223,161,195,161,203,0,0,0,0,0,0,0,0,161,171,161,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,214,0,0,0,0,0,0,161,213,0,0,0,0,0,0,0,0,0,0,168,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,217,161,212,0,0,0,0,161,220,161,221,168,81,168,82,0,0,0,0,0,0,0,0,0,0,0,0,161,218,161,219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,146,0,0,0,0,0,0,161,209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,162,217,162,218,162,219,162,220,162,221,162,222,162,223,162,224,162,225,162,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,162,197,162,198,162,199,162,200,162,201,162,202,162,203,162,204,162,205,162,206,162,207,162,208,162,209,162,210,162,211,162,212,162,213,162,214,162,215,162,216,162,177,162,178,162,179,162,180,162,181,162,182,162,183,162,184,162,185,162,186,162,187,162,188,162,189,162,190,162,191,162,192,162,193,162,194,162,195,162,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,164,169,165,169,166,169,167,169,168,169,169,169,170,169,171,169,172,169,173,169,174,169,175,169,176,169,177,169,178,169,179,169,180,169,181,169,182,169,183,169,184,169,185,169,186,169,187,169,188,169,189,169,190,169,191,169,192,169,193,169,194,169,195,169,196,169,197,169,198,169,199,169,200,169,201,169,202,169,203,169,204,169,205,169,206,169,207,169,208,169,209,169,210,169,211,169,212,169,213,169,214,169,215,169,216,169,217,169,218,169,219,169,220,169,221,169,222,169,223,169,224,169,225,169,226,169,227,169,228,169,229,169,230,169,231,169,232,169,233,169,234,169,235,169,236,169,237,169,238,169,239,0,0,0,0,0,0,0,0,168,84,168,85,168,86,168,87,168,88,168,89,168,90,168,91,168,92,168,93,168,94,168,95,168,96,168,97,168,98,168,99,168,100,168,101,168,102,168,103,168,104,168,105,168,106,168,107,168,108,168,109,168,110,168,111,168,112,168,113,168,114,168,115,168,116,168,117,168,118,168,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,120,168,121,168,122,168,123,168,124,168,125,168,126,168,128,168,129,168,130,168,131,168,132,168,133,168,134,168,135,0,0,0,0,0,0,168,136,168,137,168,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,246,161,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,248,161,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,139,168,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,244,161,243,0,0,0,0,0,0,161,240,0,0,0,0,161,242,161,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,141,168,142,168,143,168,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,239,161,238,0,0,0,0,168,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,226,0,0,161,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,161,161,162,161,163,161,168,0,0,161,169,169,101,169,150,161,180,161,181,161,182,161,183,161,184,161,185,161,186,161,187,161,190,161,191,168,147,161,254,161,178,161,179,161,188,161,189,0,0,0,0,0,0,0,0,0,0,168,148,168,149,0,0,0,0,169,64,169,65,169,66,169,67,169,68,169,69,169,70,169,71,169,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,161,164,162,164,163,164,164,164,165,164,166,164,167,164,168,164,169,164,170,164,171,164,172,164,173,164,174,164,175,164,176,164,177,164,178,164,179,164,180,164,181,164,182,164,183,164,184,164,185,164,186,164,187,164,188,164,189,164,190,164,191,164,192,164,193,164,194,164,195,164,196,164,197,164,198,164,199,164,200,164,201,164,202,164,203,164,204,164,205,164,206,164,207,164,208,164,209,164,210,164,211,164,212,164,213,164,214,164,215,164,216,164,217,164,218,164,219,164,220,164,221,164,222,164,223,164,224,164,225,164,226,164,227,164,228,164,229,164,230,164,231,164,232,164,233,164,234,164,235,164,236,164,237,164,238,164,239,164,240,164,241,164,242,164,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,97,169,98,169,102,169,103,0,0,0,0,165,161,165,162,165,163,165,164,165,165,165,166,165,167,165,168,165,169,165,170,165,171,165,172,165,173,165,174,165,175,165,176,165,177,165,178,165,179,165,180,165,181,165,182,165,183,165,184,165,185,165,186,165,187,165,188,165,189,165,190,165,191,165,192,165,193,165,194,165,195,165,196,165,197,165,198,165,199,165,200,165,201,165,202,165,203,165,204,165,205,165,206,165,207,165,208,165,209,165,210,165,211,165,212,165,213,165,214,165,215,165,216,165,217,165,218,165,219,165,220,165,221,165,222,165,223,165,224,165,225,165,226,165,227,165,228,165,229,165,230,165,231,165,232,165,233,165,234,165,235,165,236,165,237,165,238,165,239,165,240,165,241,165,242,165,243,165,244,165,245,165,246,0,0,0,0,0,0,0,0,0,0,169,96,169,99,169,100,0,0,0,0,0,0,0,0,0,0,0,0,168,197,168,198,168,199,168,200,168,201,168,202,168,203,168,204,168,205,168,206,168,207,168,208,168,209,168,210,168,211,168,212,168,213,168,214,168,215,168,216,168,217,168,218,168,219,168,220,168,221,168,222,168,223,168,224,168,225,168,226,168,227,168,228,168,229,168,230,168,231,168,232,168,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,187,182,254,200,253,203,196,201,207,214,208,207,194,188,215,210,210,177,251,182,161,204,236,181,216,200,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,162,229,162,230,162,231,162,232,162,233,162,234,162,235,162,236,162,237,162,238,212,194,187,240,203,174,196,190,189,240,205,193,200,213,169,90,211,208,201,231,195,251,204,216,178,198,215,163,192,205,180,250,186,244,209,167,188,224,198,243,215,202,208,173,188,192,208,221,215,212,214,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,187,182,254,200,253,203,196,206,229,193,249,198,223,176,203,190,197,202,174,212,194,187,240,203,174,196,190,189,240,205,193,200,213,214,234,211,208,201,231,195,251,204,216,178,198,215,163,192,205,195,216,196,208,197,174,202,202,211,197,0,0,215,162,207,238,208,221,208,180,169,73,0,0,0,0,0,0,0,0,0,0,210,189,215,218,209,167,188,224,198,243,215,202,208,173,210,185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,74,169,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,76,169,77,169,78,0,0,0,0,169,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,81,0,0,0,0,169,82,169,83,0,0,0,0,169,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,187,182,161,129,64,198,223,129,65,129,66,129,67,205,242,213,201,200,253,201,207,207,194,216,162,178,187,211,235,129,68,216,164,179,243,129,69,215,168,199,210,216,167,202,192,129,70,199,240,177,251,210,181,180,212,182,171,203,191,216,169,129,71,129,72,129,73,182,170,129,74,193,189,209,207,129,75,201,165,216,173,129,76,184,246,209,190,227,220,214,208,129,77,129,78,183,225,129,79,180,174,129,80,193,217,129,81,216,188,129,82,205,232,181,164,206,170,214,247,129,83,192,246,190,217,216,175,129,84,129,85,129,86,196,203,129,87,190,195,129,88,216,177,195,180,210,229,129,89,214,174,206,218,213,167,186,245,183,166,192,214,129,90,198,185,197,210,199,199,129,91,185,212,129,92,179,203,210,210,129,93,129,94,216,191,190,197,198,242,210,178,207,176,207,231,129,95,129,96,129,97,129,98,202,233,129,99,129,100,216,192,129,101,129,102,129,103,129,104,129,105,129,106,194,242,194,210,129,107,200,233,129,108,129,109,129,110,129,111,129,112,129,113,129,114,129,115,129,116,129,117,199,172,129,118,129,119,129,120,129,121,129,122,129,123,129,124,193,203,129,125,211,232,213,249,129,126,202,194,182,254,216,161,211,218,191,247,129,128,212,198,187,165,216,193,206,229,190,174,129,129,129,130,216,168,129,131,209,199,208,169,129,132,129,133,129,134,216,189,217,239,205,246,191,186,129,135,189,187,186,165,210,224,178,250,186,224,196,182,129,136,207,237,190,169,205,164,193,193,129,137,129,138,129,139,199,215,217,241,129,140,217,244,129,141,129,142,129,143,129,144,200,203,216,233,129,145,129,146,129,147,210,218,202,178,200,202,216,236,216,234,216,198,189,246,198,205,179,240,129,148,216,235,189,241,189,233,129,149,200,212,180,211,129,150,129,151,194,216,129,152,178,214,215,208,202,203,203,251,213,204,184,182,207,201,129,153,129,154,129,155,217,218,216,240,199,170,129,156,216,238,129,157,180,250,193,238,210,212,129,158,129,159,216,237,129,160,210,199,216,239,195,199,129,161,129,162,129,163,209,246,129,164,214,217,216,242,129,165,216,245,188,254,188,219,129,166,129,167,129,168,200,206,129,169,183,221,129,170,183,194,129,171,198,243,129,172,129,173,129,174,129,175,129,176,129,177,129,178,216,248,210,193,129,179,129,180,206,233,188,191,183,252,183,165,208,221,129,181,129,182,129,183,129,184,129,185,214,218,211,197,187,239,187,225,216,241,129,186,129,187,201,161,206,176,180,171,129,188,216,243,129,189,201,203,216,246,194,215,216,247,129,190,129,191,206,177,216,249,129,192,129,193,129,194,178,174,185,192,129,195,217,163,129,196,176,233,129,197,193,230,129,198,201,236,129,199,203,197,129,200,203,198,217,164,129,201,129,202,129,203,129,204,129,205,181,232,129,206,129,207,181,171,129,208,129,209,129,210,129,211,129,212,129,213,206,187,181,205,215,161,215,244,211,211,129,214,204,229,129,215,186,206,129,216,217,162,217,220,211,224,216,253,183,240,215,247,216,254,216,250,217,161,196,227,129,217,129,218,211,182,216,244,217,221,129,219,216,251,129,220,197,229,129,221,129,222,192,208,129,223,129,224,209,240,176,219,129,225,129,226,188,209,217,166,129,227,217,165,129,228,129,229,129,230,129,231,217,172,217,174,129,232,217,171,202,185,129,233,129,234,129,235,217,169,214,182,129,236,129,237,129,238,179,222,217,168,129,239,192,253,129,240,202,204,129,241,217,170,129,242,217,167,129,243,129,244,217,176,129,245,129,246,182,177,129,247,129,248,129,249,185,169,129,250,210,192,129,251,129,252,207,192,129,253,129,254,194,194,130,64,189,196,213,236,178,224,199,200,191,235,217,173,130,65,217,175,130,66,206,234,186,238,130,67,130,68,130,69,130,70,130,71,199,214,130,72,130,73,130,74,130,75,130,76,130,77,130,78,130,79,130,80,177,227,130,81,130,82,130,83,180,217,182,237,217,180,130,84,130,85,130,86,130,87,191,161,130,88,130,89,130,90,217,222,199,206,192,254,217,184,130,91,130,92,130,93,130,94,130,95,203,215,183,253,130,96,217,181,130,97,217,183,177,163,211,225,217,185,130,98,208,197,130,99,217,182,130,100,130,101,217,177,130,102,217,178,193,169,217,179,130,103,130,104,188,243,208,222,184,169,130,105,190,227,130,106,217,189,130,107,130,108,130,109,130,110,217,186,130,111,176,179,130,112,130,113,130,114,217,194,130,115,130,116,130,117,130,118,130,119,130,120,130,121,130,122,130,123,130,124,130,125,130,126,130,128,217,196,177,182,130,129,217,191,130,130,130,131,181,185,130,132,190,243,130,133,130,134,130,135,204,200,186,242,210,208,130,136,217,195,130,137,130,138,189,232,130,139,179,171,130,140,130,141,130,142,217,197,190,235,130,143,217,198,217,187,196,223,130,144,217,190,217,193,217,192,130,145,130,146,130,147,130,148,130,149,130,150,130,151,130,152,130,153,130,154,130,155,213,174,130,156,214,181,130,157,199,227,130,158,130,159,130,160,130,161,217,200,130,162,130,163,130,164,188,217,217,202,130,165,130,166,130,167,217,188,130,168,217,203,198,171,130,169,130,170,130,171,130,172,130,173,217,201,130,174,130,175,130,176,130,177,215,246,130,178,205,163,130,179,130,180,130,181,130,182,130,183,130,184,130,185,130,186,189,161,130,187,130,188,130,189,130,190,130,191,130,192,217,204,130,193,130,194,130,195,130,196,130,197,130,198,130,199,130,200,130,201,197,188,205,181,130,202,130,203,130,204,217,205,130,205,130,206,217,199,179,165,191,254,130,207,130,208,130,209,130,210,184,181,130,211,130,212,192,252,130,213,130,214,130,215,130,216,176,248,130,217,130,218,130,219,130,220,130,221,130,222,130,223,130,224,130,225,130,226,130,227,130,228,130,229,130,230,130,231,130,232,130,233,130,234,130,235,130,236,130,237,180,246,130,238,217,206,130,239,217,207,180,162,217,208,130,240,130,241,180,223,130,242,130,243,130,244,130,245,130,246,176,193,130,247,130,248,130,249,130,250,130,251,130,252,130,253,217,209,201,181,130,254,131,64,131,65,131,66,131,67,131,68,131,69,131,70,131,71,131,72,131,73,131,74,131,75,131,76,131,77,131,78,131,79,131,80,131,81,207,241,131,82,131,83,131,84,131,85,131,86,131,87,217,210,131,88,131,89,131,90,193,197,131,91,131,92,131,93,131,94,131,95,131,96,131,97,131,98,131,99,131,100,131,101,217,214,201,174,131,102,131,103,131,104,131,105,217,213,217,212,217,215,131,106,131,107,131,108,131,109,203,219,131,110,189,169,131,111,131,112,131,113,131,114,131,115,198,167,131,116,131,117,131,118,131,119,131,120,131,121,131,122,131,123,131,124,131,125,217,211,217,216,131,126,131,128,131,129,217,217,131,130,131,131,131,132,131,133,131,134,131,135,200,229,131,136,131,137,131,138,131,139,131,140,131,141,131,142,131,143,131,144,131,145,131,146,131,147,131,148,131,149,192,220,131,150,131,151,131,152,131,153,131,154,131,155,131,156,131,157,131,158,131,159,131,160,131,161,131,162,131,163,131,164,131,165,131,166,131,167,131,168,131,169,131,170,131,171,131,172,131,173,131,174,131,175,131,176,131,177,131,178,182,249,216,163,212,202,131,179,212,170,208,214,179,228,213,215,131,180,207,200,185,226,131,181,191,203,131,182,195,226,131,183,131,184,131,185,182,210,131,186,131,187,205,195,217,238,217,240,131,188,131,189,131,190,181,179,131,191,182,181,131,192,131,193,131,194,131,195,131,196,190,164,131,197,131,198,200,235,131,199,131,200,200,171,131,201,131,202,176,203,185,171,193,249,217,226,131,203,192,188,185,178,131,204,185,216,208,203,177,248,198,228,190,223,181,228,215,200,131,205,209,248,188,230,202,222,131,206,131,207,188,189,217,230,216,231,131,208,131,209,196,218,131,210,131,211,184,212,200,189,131,212,131,213,178,225,212,217,131,214,131,215,131,216,131,217,195,176,131,218,131,219,195,225,218,162,200,223,131,220,208,180,131,221,190,252,197,169,131,222,131,223,131,224,185,218,131,225,218,163,131,226,212,169,218,164,131,227,131,228,131,229,131,230,131,231,217,251,182,172,131,232,131,233,183,235,177,249,217,252,179,229,190,246,131,234,191,246,210,177,192,228,131,235,131,236,131,237,182,179,217,254,217,253,131,238,131,239,190,187,131,240,131,241,131,242,198,224,131,243,215,188,218,161,131,244,193,185,131,245,181,242,193,232,131,246,131,247,188,245,131,248,180,213,131,249,131,250,131,251,131,252,131,253,131,254,132,64,132,65,132,66,193,221,132,67,196,253,132,68,132,69,188,184,183,178,132,70,132,71,183,239,132,72,132,73,132,74,132,75,132,76,132,77,217,236,132,78,198,190,132,79,191,173,187,203,132,80,132,81,181,202,132,82,219,201,208,215,132,83,205,185,176,188,179,246,187,247,219,202,186,175,132,84,212,228,181,182,181,243,216,214,200,208,132,85,132,86,183,214,199,208,216,215,132,87,191,175,132,88,132,89,219,187,216,216,132,90,132,91,208,204,187,174,132,92,132,93,132,94,235,190,193,208,193,245,212,242,184,213,180,180,132,95,179,245,132,96,132,97,201,190,132,98,132,99,132,100,197,208,132,101,132,102,132,103,197,217,192,251,132,104,177,240,132,105,216,217,185,206,132,106,181,189,132,107,132,108,216,218,132,109,132,110,214,198,203,162,200,175,201,178,180,204,191,204,132,111,185,244,132,112,216,219,216,220,182,231,188,193,204,234,132,113,132,114,132,115,132,116,132,117,132,118,207,247,132,119,216,221,199,176,132,120,132,121,185,208,189,163,132,122,132,123,204,222,132,124,198,202,132,125,132,126,132,128,132,129,132,130,216,224,132,131,216,222,132,132,132,133,216,223,132,134,132,135,132,136,176,254,132,137,190,231,132,138,202,163,188,244,132,139,132,140,132,141,132,142,184,177,132,143,132,144,184,238,132,145,132,146,132,147,132,148,132,149,132,150,132,151,132,152,132,153,132,154,216,226,132,155,189,203,132,156,216,228,216,227,132,157,132,158,132,159,132,160,132,161,197,252,132,162,132,163,132,164,132,165,132,166,132,167,132,168,216,229,132,169,132,170,216,230,132,171,132,172,132,173,132,174,132,175,132,176,132,177,193,166,132,178,200,176,176,236,185,166,188,211,206,241,219,189,193,211,132,179,132,180,132,181,132,182,182,175,214,250,197,172,189,217,219,190,219,191,132,183,132,184,132,185,192,248,190,162,192,205,132,186,132,187,132,188,132,189,132,190,132,191,132,192,132,193,132,194,132,195,219,192,202,198,132,196,132,197,132,198,178,170,132,199,132,200,132,201,211,194,132,202,195,227,132,203,209,171,132,204,132,205,132,206,132,207,219,194,132,208,192,213,132,209,132,210,132,211,219,195,132,212,191,177,132,213,132,214,132,215,132,216,132,217,132,218,196,188,132,219,132,220,132,221,132,222,199,218,132,223,132,224,132,225,132,226,132,227,132,228,132,229,132,230,132,231,132,232,132,233,219,196,132,234,132,235,132,236,132,237,132,238,132,239,132,240,132,241,217,232,201,215,132,242,132,243,132,244,185,180,206,240,212,200,132,245,132,246,132,247,132,248,176,252,180,210,132,249,208,217,132,250,132,251,132,252,132,253,217,233,132,254,222,203,217,235,133,64,133,65,133,66,133,67,216,176,187,175,177,177,133,68,179,215,216,206,133,69,133,70,212,209,133,71,133,72,189,179,191,239,133,73,207,187,133,74,133,75,216,208,133,76,133,77,133,78,183,203,133,79,133,80,133,81,216,209,133,82,133,83,133,84,133,85,133,86,133,87,133,88,133,89,133,90,133,91,198,165,199,248,210,189,133,92,133,93,216,210,196,228,133,94,202,174,133,95,199,167,133,96,216,166,133,97,201,253,206,231,187,220,176,235,133,98,133,99,133,100,187,170,208,173,133,101,177,176,215,228,215,191,133,102,181,165,194,244,196,207,133,103,133,104,178,169,133,105,178,183,133,106,177,229,223,178,213,188,191,168,194,172,216,213,194,177,133,107,216,212,206,212,133,108,218,224,133,109,206,192,133,110,133,111,216,180,195,174,211,161,206,163,133,112,188,180,200,180,194,209,133,113,190,237,208,182,133,114,218,225,133,115,133,116,133,117,133,118,199,228,133,119,133,120,179,167,133,121,182,242,204,252,192,250,133,122,133,123,192,247,133,124,209,185,209,225,216,199,133,125,133,126,133,128,133,129,133,130,133,131,133,132,178,222,133,133,133,134,192,229,133,135,186,241,133,136,133,137,216,200,133,138,212,173,133,139,133,140,207,225,216,201,133,141,216,202,207,195,133,142,179,248,190,199,133,143,133,144,133,145,133,146,216,203,133,147,133,148,133,149,133,150,133,151,133,152,133,153,219,204,133,154,133,155,133,156,133,157,200,165,133,158,133,159,133,160,207,216,133,161,200,254,178,206,133,162,133,163,133,164,133,165,133,166,211,214,178,230,188,176,211,209,203,171,183,180,133,167,133,168,133,169,183,162,133,170,133,171,202,229,133,172,200,161,202,220,177,228,208,240,133,173,197,209,133,174,133,175,133,176,219,197,181,254,133,177,133,178,191,218,185,197,190,228,193,237,133,179,223,182,223,181,214,187,189,208,213,217,176,200,182,163,191,201,204,168,223,179,202,183,211,210,133,180,216,207,210,182,186,197,203,190,204,190,133,181,223,183,181,240,223,180,133,182,133,183,133,184,211,245,133,185,179,212,184,247,133,186,223,186,133,187,186,207,188,170,181,245,133,188,205,172,195,251,186,243,192,244,205,194,207,242,223,184,207,197,133,189,194,192,223,185,194,240,133,190,133,191,133,192,190,253,133,193,193,223,205,204,210,247,183,205,223,193,133,194,223,196,133,195,133,196,183,241,176,201,182,214,183,212,133,197,186,172,204,253,191,212,203,177,198,244,133,198,214,168,223,197,133,199,206,226,179,179,133,200,133,201,206,252,180,181,133,202,206,199,186,240,133,203,206,225,133,204,209,189,133,205,133,206,223,192,133,207,133,208,180,244,133,209,179,202,133,210,184,230,223,187,133,211,133,212,133,213,133,214,196,197,133,215,223,188,223,189,223,190,197,187,223,191,223,194,212,177,223,195,133,216,199,186,206,216,133,217,133,218,133,219,133,220,133,221,196,216,133,222,223,202,133,223,223,207,133,224,214,220,133,225,133,226,133,227,133,228,133,229,133,230,133,231,133,232,223,201,223,218,206,182,133,233,186,199,223,206,223,200,197,222,133,234,133,235,201,235,186,244,195,252,133,236,133,237,190,215,133,238,223,198,133,239,223,205,133,240,197,216,133,241,133,242,133,243,133,244,213,166,186,205,133,245,190,204,211,189,184,192,133,246,214,228,133,247,223,199,185,190,191,167,133,248,133,249,193,252,223,203,223,204,133,250,223,208,133,251,133,252,133,253,133,254,134,64,223,219,223,229,134,65,223,215,223,214,215,201,223,227,223,228,229,235,210,167,223,210,134,66,191,169,134,67,212,219,134,68,191,200,223,212,134,69,134,70,134,71,207,204,134,72,134,73,223,221,134,74,209,202,134,75,223,222,176,167,198,183,223,211,134,76,186,229,134,77,182,223,205,219,185,254,212,213,134,78,134,79,223,223,207,236,176,165,223,231,223,209,209,198,223,213,223,216,223,217,223,220,134,80,187,169,134,81,223,224,223,225,134,82,223,226,223,230,223,232,211,180,134,83,134,84,134,85,134,86,134,87,184,231,197,182,223,234,201,218,193,168,196,196,134,88,134,89,191,222,207,248,134,90,134,91,134,92,213,220,223,238,134,93,134,94,134,95,134,96,134,97,134,98,178,184,134,99,186,223,223,236,134,100,219,193,134,101,209,228,134,102,134,103,134,104,134,105,203,244,180,189,134,106,176,166,134,107,134,108,134,109,134,110,134,111,223,241,204,198,223,242,134,112,134,113,223,237,134,114,134,115,134,116,134,117,134,118,134,119,223,233,134,120,134,121,134,122,134,123,223,235,134,124,223,239,223,240,187,189,134,125,134,126,223,243,134,128,134,129,223,244,134,130,187,163,134,131,202,219,206,168,224,167,179,170,134,132,224,166,134,133,134,134,134,135,224,161,134,136,134,137,134,138,134,139,223,254,134,140,205,217,223,252,134,141,223,250,134,142,191,208,215,196,134,143,201,204,134,144,134,145,223,248,176,161,134,146,134,147,134,148,134,149,134,150,223,253,134,151,134,152,134,153,134,154,223,251,224,162,134,155,134,156,134,157,134,158,134,159,224,168,134,160,134,161,134,162,134,163,183,200,134,164,134,165,198,161,201,182,192,178,223,245,134,166,134,167,197,190,134,168,216,196,223,249,196,246,134,169,134,170,134,171,134,172,134,173,134,174,224,163,224,164,224,165,208,165,134,175,134,176,224,180,204,228,134,177,224,177,134,178,191,166,224,175,206,185,224,171,201,198,134,179,134,180,192,174,224,174,186,237,186,176,224,169,134,181,134,182,134,183,223,246,134,184,224,179,134,185,134,186,224,184,134,187,134,188,134,189,180,173,224,185,134,190,134,191,207,178,186,200,134,192,224,176,134,193,134,194,134,195,134,196,134,197,134,198,134,199,208,250,134,200,134,201,134,202,134,203,134,204,134,205,134,206,134,207,134,208,224,172,134,209,212,251,134,210,223,247,134,211,197,231,134,212,224,173,134,213,211,247,134,214,224,182,224,183,134,215,134,216,134,217,134,218,134,219,224,196,208,225,134,220,134,221,134,222,224,188,134,223,134,224,224,201,224,202,134,225,134,226,134,227,224,190,224,170,201,164,224,193,134,228,224,178,134,229,134,230,134,231,134,232,134,233,202,200,224,195,134,234,224,181,134,235,206,203,134,236,203,195,224,205,224,198,224,194,134,237,224,203,134,238,224,186,224,191,224,192,134,239,134,240,224,197,134,241,134,242,224,199,224,200,134,243,224,204,134,244,224,187,134,245,134,246,134,247,134,248,134,249,203,212,224,213,134,250,224,214,224,210,134,251,134,252,134,253,134,254,135,64,135,65,224,208,188,206,135,66,135,67,224,209,135,68,184,194,216,197,135,69,135,70,135,71,135,72,135,73,135,74,135,75,135,76,208,234,135,77,135,78,194,239,135,79,135,80,224,207,224,189,135,81,135,82,135,83,224,212,224,211,135,84,135,85,224,215,135,86,135,87,135,88,135,89,224,220,224,216,135,90,135,91,135,92,214,246,179,176,135,93,215,236,135,94,203,187,135,95,135,96,224,218,135,97,206,251,135,98,135,99,135,100,186,217,135,101,135,102,135,103,135,104,135,105,135,106,135,107,135,108,135,109,135,110,135,111,135,112,224,225,224,221,210,173,135,113,135,114,135,115,135,116,135,117,224,226,135,118,135,119,224,219,224,217,224,223,135,120,135,121,224,224,135,122,135,123,135,124,135,125,135,126,224,222,135,128,224,228,135,129,135,130,135,131,198,247,216,172,212,235,224,230,202,201,135,132,135,133,135,134,135,135,224,229,135,136,135,137,135,138,135,139,184,193,135,140,135,141,135,142,135,143,224,231,224,232,135,144,135,145,135,146,135,147,135,148,135,149,135,150,135,151,224,233,224,227,135,152,135,153,135,154,135,155,135,156,135,157,135,158,186,191,204,231,135,159,135,160,135,161,224,234,135,162,135,163,135,164,135,165,135,166,135,167,135,168,135,169,135,170,135,171,135,172,135,173,135,174,135,175,135,176,207,249,135,177,135,178,135,179,135,180,135,181,135,182,135,183,135,184,135,185,135,186,135,187,224,235,135,188,135,189,135,190,135,191,135,192,135,193,135,194,200,194,135,195,135,196,135,197,135,198,189,192,135,199,135,200,135,201,135,202,135,203,135,204,135,205,135,206,135,207,135,208,135,209,135,210,135,211,196,210,135,212,135,213,135,214,135,215,135,216,135,217,135,218,135,219,135,220,224,236,135,221,135,222,224,237,135,223,135,224,199,244,203,196,135,225,224,238,187,216,216,182,210,242,224,239,205,197,135,226,182,218,135,227,135,228,135,229,135,230,135,231,135,232,224,241,135,233,212,176,135,234,135,235,192,167,180,209,135,236,135,237,206,167,224,240,135,238,135,239,135,240,224,242,185,204,135,241,135,242,185,250,205,188,224,243,135,243,135,244,135,245,198,212,224,244,135,246,212,178,135,247,200,166,224,246,224,245,135,248,135,249,135,250,135,251,135,252,135,253,135,254,136,64,136,65,136,66,136,67,136,68,136,69,136,70,136,71,136,72,136,73,224,247,136,74,136,75,205,193,136,76,136,77,136,78,202,165,136,79,136,80,136,81,136,82,212,218,219,215,219,217,136,83,219,216,185,231,219,220,219,221,181,216,136,84,136,85,219,218,136,86,136,87,136,88,136,89,136,90,219,219,179,161,219,223,136,91,136,92,187,248,136,93,214,183,136,94,219,224,136,95,136,96,136,97,136,98,190,249,136,99,136,100,183,187,136,101,219,208,204,174,191,178,187,181,215,248,191,211,136,102,136,103,136,104,136,105,136,106,191,233,136,107,136,108,188,225,204,179,219,222,176,211,206,235,183,216,215,185,198,194,136,109,136,110,192,164,136,111,204,185,136,112,219,231,219,225,198,186,219,227,136,113,219,232,136,114,197,247,136,115,136,116,136,117,219,234,136,118,136,119,219,233,191,192,136,120,136,121,136,122,219,230,219,229,136,123,136,124,136,125,136,126,136,128,180,185,192,172,194,162,219,226,219,228,136,129,136,130,136,131,136,132,208,205,219,237,136,133,136,134,136,135,136,136,136,137,192,221,219,242,136,138,136,139,136,140,136,141,136,142,136,143,136,144,182,226,136,145,136,146,136,147,136,148,219,243,219,210,185,184,212,171,219,236,136,149,191,209,219,240,136,150,219,209,136,151,181,230,136,152,219,235,191,229,136,153,136,154,136,155,219,238,136,156,219,241,136,157,136,158,136,159,219,249,136,160,136,161,136,162,136,163,136,164,136,165,136,166,136,167,136,168,185,161,176,163,136,169,136,170,136,171,136,172,136,173,136,174,136,175,194,241,136,176,136,177,179,199,219,239,136,178,136,179,219,248,136,180,198,210,219,244,136,181,136,182,219,245,219,247,219,246,136,183,136,184,219,254,136,185,211,242,178,186,136,186,136,187,136,188,219,253,136,189,136,190,136,191,136,192,136,193,136,194,136,195,136,196,220,164,136,197,219,251,136,198,136,199,136,200,136,201,219,250,136,202,136,203,136,204,219,252,197,224,187,249,136,205,136,206,220,163,136,207,136,208,220,165,136,209,204,195,136,210,136,211,136,212,182,209,221,192,136,213,136,214,136,215,220,161,136,216,220,162,136,217,136,218,136,219,199,181,136,220,136,221,136,222,182,233,136,223,136,224,136,225,220,167,136,226,136,227,136,228,136,229,220,166,136,230,220,169,177,164,136,231,136,232,181,204,136,233,136,234,136,235,136,236,136,237,191,176,136,238,136,239,136,240,136,241,136,242,209,223,136,243,136,244,136,245,136,246,182,194,136,247,136,248,136,249,136,250,136,251,136,252,136,253,136,254,137,64,137,65,137,66,137,67,137,68,137,69,220,168,137,70,137,71,137,72,137,73,137,74,137,75,137,76,203,250,235,243,137,77,137,78,137,79,203,220,137,80,137,81,203,254,137,82,137,83,137,84,204,193,137,85,137,86,137,87,137,88,137,89,200,251,137,90,137,91,137,92,137,93,137,94,137,95,220,170,137,96,137,97,137,98,137,99,137,100,204,238,220,171,137,101,137,102,137,103,137,104,137,105,137,106,137,107,137,108,137,109,137,110,137,111,137,112,137,113,137,114,137,115,137,116,137,117,219,211,137,118,220,175,220,172,137,119,190,179,137,120,202,251,137,121,137,122,137,123,220,173,137,124,137,125,137,126,137,128,137,129,137,130,137,131,137,132,201,202,196,185,137,133,137,134,137,135,137,136,137,137,199,189,220,174,137,138,137,139,137,140,212,246,208,230,137,141,137,142,137,143,137,144,137,145,137,146,137,147,137,148,196,171,182,213,137,149,137,150,137,151,137,152,137,153,137,154,137,155,137,156,137,157,137,158,137,159,137,160,137,161,137,162,137,163,137,164,137,165,137,166,219,212,137,167,137,168,137,169,137,170,177,218,137,171,137,172,137,173,219,213,137,174,137,175,137,176,137,177,137,178,137,179,137,180,137,181,137,182,137,183,137,184,219,214,137,185,137,186,137,187,186,190,137,188,137,189,137,190,137,191,137,192,137,193,137,194,137,195,137,196,137,197,137,198,137,199,137,200,137,201,200,192,137,202,137,203,137,204,137,205,137,206,137,207,202,191,200,201,137,208,215,179,137,209,201,249,137,210,137,211,191,199,137,212,137,213,186,248,137,214,137,215,210,188,137,216,137,217,137,218,137,219,137,220,137,221,137,222,137,223,226,186,137,224,180,166,137,225,137,226,177,184,137,227,137,228,137,229,137,230,137,231,184,180,137,232,207,196,137,233,137,234,137,235,137,236,217,231,207,166,205,226,137,237,137,238,217,237,182,224,137,239,210,185,137,240,137,241,185,187,137,242,137,243,137,244,137,245,226,185,226,183,137,246,180,243,137,247,204,236,204,171,183,242,137,248,216,178,209,235,186,187,137,249,202,167,137,250,137,251,205,183,137,252,137,253,210,196,191,228,188,208,182,225,137,254,222,197,138,64,138,65,138,66,138,67,222,198,219,188,138,68,209,217,138,69,138,70,198,230,196,206,183,238,138,71,183,220,138,72,138,73,191,252,215,224,138,74,198,245,138,75,138,76,177,188,222,200,189,177,204,215,222,202,138,77,222,201,138,78,138,79,138,80,138,81,138,82,181,236,138,83,201,221,138,84,138,85,176,194,138,86,138,87,138,88,138,89,138,90,138,91,138,92,138,93,138,94,138,95,138,96,138,97,138,98,197,174,197,171,138,99,196,204,138,100,188,233,203,253,138,101,138,102,138,103,186,195,138,104,138,105,138,106,229,249,200,231,229,250,205,253,138,107,215,177,184,190,194,232,138,108,200,209,138,109,138,110,229,251,138,111,138,112,138,113,138,114,182,202,188,203,138,115,138,116,209,253,230,161,138,117,195,238,138,118,138,119,138,120,138,121,230,164,138,122,138,123,138,124,138,125,229,254,230,165,205,215,138,126,138,128,183,193,229,252,229,253,230,163,138,129,138,130,196,221,230,168,138,131,138,132,230,167,138,133,138,134,138,135,138,136,138,137,138,138,195,195,138,139,198,222,138,140,138,141,230,170,138,142,138,143,138,144,138,145,138,146,138,147,138,148,196,183,138,149,138,150,138,151,230,162,202,188,138,152,138,153,138,154,138,155,189,227,185,195,230,166,208,213,206,175,138,156,138,157,230,169,230,176,138,158,210,166,138,159,189,170,230,173,138,160,138,161,138,162,138,163,138,164,230,175,138,165,192,209,138,166,138,167,210,204,138,168,138,169,138,170,188,167,138,171,138,172,138,173,138,174,138,175,138,176,138,177,138,178,138,179,138,180,138,181,138,182,230,177,138,183,210,246,138,184,138,185,138,186,215,203,138,187,205,254,138,188,205,222,194,166,230,171,230,172,189,191,230,174,230,179,138,189,138,190,230,178,138,191,138,192,138,193,138,194,230,182,138,195,230,184,138,196,138,197,138,198,138,199,196,239,138,200,138,201,138,202,196,200,138,203,138,204,190,234,201,239,138,205,138,206,230,183,138,207,182,240,138,208,138,209,138,210,195,228,138,211,138,212,138,213,138,214,138,215,138,216,138,217,211,233,230,180,138,218,230,181,138,219,200,162,138,220,138,221,138,222,138,223,138,224,230,189,138,225,138,226,138,227,230,185,138,228,138,229,138,230,138,231,138,232,198,197,138,233,138,234,205,241,230,187,138,235,138,236,138,237,138,238,138,239,138,240,138,241,138,242,138,243,138,244,230,188,138,245,138,246,138,247,138,248,187,233,138,249,138,250,138,251,138,252,138,253,138,254,139,64,230,190,139,65,139,66,139,67,139,68,230,186,139,69,139,70,192,183,139,71,139,72,139,73,139,74,139,75,139,76,139,77,139,78,139,79,211,164,230,191,201,244,230,195,139,80,139,81,230,196,139,82,139,83,139,84,139,85,208,246,139,86,139,87,139,88,139,89,139,90,139,91,139,92,139,93,139,94,139,95,139,96,139,97,139,98,139,99,139,100,139,101,139,102,139,103,195,189,139,104,139,105,139,106,139,107,139,108,139,109,139,110,195,196,230,194,139,111,139,112,139,113,139,114,139,115,139,116,139,117,139,118,139,119,139,120,139,121,139,122,139,123,139,124,230,193,139,125,139,126,139,128,139,129,139,130,139,131,139,132,230,199,207,177,139,133,235,244,139,134,139,135,230,202,139,136,139,137,139,138,139,139,139,140,230,197,139,141,139,142,188,222,201,169,139,143,139,144,139,145,139,146,139,147,139,148,188,181,139,149,139,150,207,211,139,151,139,152,139,153,139,154,139,155,230,200,139,156,230,201,139,157,230,206,139,158,230,208,139,159,139,160,139,161,230,209,139,162,139,163,139,164,230,203,181,213,139,165,230,204,139,166,139,167,230,207,139,168,139,169,196,219,139,170,230,198,139,171,139,172,139,173,139,174,139,175,230,205,139,176,139,177,139,178,139,179,139,180,139,181,139,182,139,183,139,184,139,185,139,186,139,187,139,188,139,189,139,190,139,191,139,192,139,193,139,194,139,195,139,196,139,197,139,198,230,210,139,199,139,200,139,201,139,202,139,203,139,204,139,205,139,206,139,207,139,208,139,209,139,210,230,212,230,211,139,211,139,212,139,213,139,214,139,215,139,216,139,217,139,218,139,219,139,220,139,221,139,222,139,223,139,224,139,225,139,226,139,227,139,228,139,229,139,230,139,231,139,232,139,233,139,234,139,235,139,236,230,213,139,237,217,248,139,238,139,239,230,214,139,240,139,241,139,242,139,243,139,244,139,245,139,246,139,247,230,215,139,248,139,249,139,250,139,251,139,252,139,253,139,254,140,64,140,65,140,66,140,67,140,68,140,69,140,70,140,71,215,211,230,221,140,72,230,222,191,215,212,208,140,73,215,214,180,230,203,239,230,218,216,195,215,206,208,162,140,74,195,207,140,75,140,76,230,223,188,190,185,194,230,219,209,167,140,77,140,78,186,162,194,207,140,79,216,171,140,80,140,81,140,82,202,235,229,238,140,83,230,220,140,84,183,245,140,85,140,86,140,87,140,88,200,230,140,89,140,90,196,245,140,91,140,92,229,178,196,254,140,93,203,252,229,179,213,172,140,94,211,238,202,216,176,178,140,95,203,206,205,234,140,96,140,97,186,234,140,98,140,99,140,100,229,181,140,101,229,180,140,102,215,218,185,217,214,230,182,168,205,240,210,203,177,166,202,181,140,103,179,232,201,243,191,205,208,251,202,210,229,182,187,194,140,104,140,105,140,106,207,220,185,172,140,107,140,108,140,109,140,110,212,215,140,111,140,112,186,166,209,231,207,252,188,210,140,113,229,183,200,221,140,114,140,115,140,116,191,237,177,246,203,222,140,117,140,118,188,197,140,119,188,196,210,250,195,220,191,220,140,120,140,121,140,122,140,123,184,187,140,124,140,125,140,126,195,194,140,128,186,174,212,162,140,129,140,130,140,131,140,132,140,133,140,134,140,135,140,136,140,137,199,222,196,175,178,236,140,138,185,209,140,139,140,140,229,187,193,200,140,141,140,142,213,175,140,143,140,144,140,145,140,146,140,147,229,188,140,148,229,190,140,149,140,150,140,151,140,152,140,153,140,154,140,155,180,231,182,212,203,194,209,176,181,188,140,156,140,157,202,217,140,158,183,226,140,159,140,160,201,228,140,161,189,171,140,162,140,163,206,190,215,240,140,164,140,165,140,166,140,167,208,161,140,168,201,217,140,169,140,170,182,251,230,216,188,226,140,171,179,190,140,172,201,208,140,173,230,217,179,162,140,174,140,175,140,176,140,177,222,204,140,178,211,200,222,205,140,179,210,162,140,180,140,181,140,182,140,183,222,206,140,184,140,185,140,186,140,187,190,205,140,188,140,189,222,207,140,190,140,191,140,192,202,172,210,252,179,223,229,234,196,225,190,161,206,178,196,242,190,214,198,168,178,227,140,193,140,194,190,211,140,195,140,196,199,252,204,235,189,236,206,221,140,197,140,198,202,186,198,193,229,236,208,188,140,199,140,200,140,201,213,185,140,202,140,203,140,204,229,237,140,205,140,206,140,207,140,208,202,244,140,209,205,192,194,197,140,210,229,239,140,211,194,196,229,240,140,212,140,213,140,214,140,215,140,216,140,217,140,218,229,248,205,205,140,219,201,189,140,220,140,221,140,222,140,223,140,224,140,225,140,226,210,217,225,168,140,227,140,228,140,229,140,230,211,236,140,231,203,234,198,241,140,232,140,233,140,234,140,235,140,236,225,172,140,237,140,238,140,239,225,167,225,169,140,240,140,241,225,170,225,175,140,242,140,243,178,237,140,244,225,171,184,218,225,173,225,174,225,176,181,186,225,177,140,245,140,246,140,247,140,248,140,249,225,179,225,184,140,250,140,251,140,252,140,253,140,254,209,210,141,64,225,182,225,181,193,235,141,65,141,66,141,67,225,183,141,68,212,192,141,69,225,178,141,70,225,186,176,182,141,71,141,72,141,73,141,74,225,180,141,75,191,249,141,76,225,185,141,77,141,78,225,187,141,79,141,80,141,81,141,82,141,83,141,84,225,190,141,85,141,86,141,87,141,88,141,89,141,90,225,188,141,91,141,92,141,93,141,94,141,95,141,96,214,197,141,97,141,98,141,99,141,100,141,101,141,102,141,103,207,191,141,104,141,105,225,189,225,191,194,205,141,106,182,235,141,107,211,248,141,108,141,109,199,205,141,110,141,111,183,229,141,112,141,113,141,114,141,115,141,116,141,117,141,118,141,119,141,120,141,121,190,254,141,122,141,123,141,124,141,125,141,126,141,128,225,192,225,193,141,129,141,130,225,199,179,231,141,131,141,132,141,133,141,134,141,135,141,136,198,233,141,137,141,138,141,139,141,140,141,141,180,222,141,142,209,194,141,143,141,144,141,145,141,146,225,200,141,147,141,148,225,198,141,149,141,150,141,151,141,152,141,153,225,197,141,154,225,195,225,194,141,155,177,192,141,156,141,157,141,158,213,184,225,196,141,159,141,160,141,161,141,162,141,163,225,203,141,164,141,165,141,166,141,167,141,168,141,169,141,170,141,171,225,204,225,202,141,172,141,173,141,174,141,175,141,176,141,177,141,178,141,179,239,250,141,180,141,181,225,211,225,210,199,182,141,182,141,183,141,184,141,185,141,186,141,187,141,188,141,189,141,190,141,191,141,192,225,201,141,193,141,194,225,206,141,195,225,208,141,196,141,197,141,198,141,199,141,200,141,201,141,202,141,203,141,204,141,205,141,206,225,212,141,207,225,209,225,205,141,208,141,209,225,207,141,210,141,211,141,212,141,213,225,213,141,214,141,215,141,216,141,217,141,218,141,219,141,220,141,221,141,222,141,223,141,224,141,225,141,226,225,214,141,227,141,228,141,229,141,230,141,231,141,232,141,233,141,234,141,235,141,236,141,237,141,238,141,239,141,240,141,241,141,242,141,243,141,244,141,245,141,246,141,247,141,248,225,215,141,249,141,250,141,251,225,216,141,252,141,253,141,254,142,64,142,65,142,66,142,67,142,68,142,69,142,70,142,71,142,72,142,73,142,74,142,75,142,76,142,77,142,78,142,79,142,80,142,81,142,82,142,83,142,84,142,85,225,218,142,86,142,87,142,88,142,89,142,90,142,91,142,92,142,93,142,94,142,95,142,96,142,97,142,98,225,219,142,99,142,100,142,101,142,102,142,103,142,104,142,105,206,161,142,106,142,107,142,108,142,109,142,110,142,111,142,112,142,113,142,114,142,115,142,116,142,117,142,118,231,221,142,119,180,168,214,221,142,120,142,121,209,178,179,178,142,122,142,123,185,164,215,243,199,201,190,222,185,174,142,124,206,215,142,125,142,126,178,238,219,207,142,128,188,186,210,209,203,200,176,205,142,129,142,130,207,239,142,131,142,132,142,133,142,134,142,135,217,227,189,237,142,136,142,137,177,210,202,208,178,188,142,138,203,167,183,171,142,139,202,166,142,140,142,141,142,142,207,163,142,143,142,144,224,248,213,202,224,251,142,145,142,146,224,250,197,193,204,251,142,147,193,177,224,249,214,227,178,175,214,196,181,219,142,148,142,149,142,150,142,151,142,152,142,153,142,154,142,155,180,248,214,161,142,156,142,157,142,158,142,159,142,160,207,175,176,239,142,161,142,162,224,252,142,163,142,164,142,165,142,166,142,167,225,161,179,163,142,168,142,169,224,253,224,254,195,177,142,170,142,171,142,172,142,173,195,221,142,174,225,162,183,249,142,175,142,176,142,177,142,178,142,179,142,180,187,207,142,181,142,182,142,183,142,184,142,185,142,186,142,187,225,163,196,187,142,188,142,189,142,190,142,191,142,192,225,164,142,193,142,194,225,165,142,195,142,196,225,166,180,177,142,197,142,198,142,199,142,200,142,201,142,202,142,203,142,204,142,205,142,206,142,207,142,208,142,209,142,210,142,211,184,201,198,189,196,234,142,212,178,162,142,213,208,210,142,214,231,219,187,195,211,215,211,196,142,215,185,227,226,207,142,216,142,217,142,218,215,175,142,219,199,236,177,211,142,220,142,221,180,178,226,209,142,222,142,223,142,224,208,242,194,174,226,208,142,225,191,226,211,166,181,215,226,210,181,234,142,226,195,237,184,253,142,227,184,174,142,228,197,211,183,207,226,212,142,229,142,230,142,231,142,232,226,211,182,200,215,249,142,233,142,234,142,235,142,236,142,237,205,165,142,238,142,239,142,240,142,241,142,242,226,216,142,243,226,214,202,252,191,181,211,185,226,213,142,244,142,245,142,246,142,247,226,215,142,248,142,249,142,250,142,251,142,252,142,253,142,254,143,64,143,65,143,66,193,174,192,200,143,67,143,68,143,69,143,70,143,71,143,72,226,219,226,218,192,170,143,73,143,74,193,206,143,75,143,76,143,77,143,78,226,220,143,79,143,80,143,81,143,82,143,83,143,84,143,85,143,86,143,87,143,88,143,89,143,90,226,221,143,91,226,222,143,92,143,93,143,94,143,95,143,96,143,97,143,98,143,99,143,100,219,200,143,101,209,211,205,162,143,102,143,103,189,168,143,104,143,105,143,106,222,195,216,165,191,170,219,205,210,236,198,250,197,170,143,107,143,108,143,109,222,196,143,110,177,215,223,174,143,111,143,112,143,113,202,189,143,114,223,177,143,115,185,173,143,116,210,253,143,117,184,165,186,235,143,118,143,119,179,218,143,120,143,121,143,122,181,220,213,197,143,123,143,124,143,125,143,126,195,214,207,210,187,161,143,128,229,243,229,242,143,129,143,130,229,244,143,131,205,228,143,132,200,245,143,133,143,134,143,135,143,136,143,137,143,138,143,139,181,175,199,191,143,140,229,246,143,141,143,142,143,143,236,176,143,144,143,145,143,146,143,147,143,148,143,149,143,150,143,151,143,152,143,153,143,154,143,155,143,156,143,157,143,158,229,230,143,159,185,233,181,177,143,160,194,188,229,232,229,231,229,233,143,161,143,162,143,163,143,164,210,205,143,165,143,166,143,167,225,234,208,206,143,168,205,174,143,169,209,229,143,170,143,171,178,202,177,235,143,172,177,242,197,237,143,173,143,174,213,195,211,176,143,175,225,220,143,176,143,177,143,178,225,221,143,179,210,219,143,180,179,185,177,203,143,181,143,182,143,183,205,249,213,247,225,222,143,184,190,182,180,253,143,185,225,223,186,220,225,224,187,178,194,201,225,225,143,186,143,187,143,188,208,236,143,189,205,189,143,190,143,191,225,226,143,192,181,195,197,199,225,227,143,193,143,194,225,228,143,195,143,196,143,197,143,198,211,249,143,199,143,200,143,201,143,202,143,203,143,204,225,229,143,205,209,173,143,206,143,207,225,230,206,162,143,208,143,209,143,210,143,211,143,212,143,213,225,231,143,214,181,194,143,215,143,216,143,217,143,218,225,232,187,213,143,219,143,220,143,221,143,222,143,223,208,196,226,224,177,216,210,228,143,224,143,225,226,225,143,226,143,227,188,201,200,204,143,228,226,227,236,254,236,253,223,175,143,229,143,230,143,231,226,226,214,190,205,252,195,166,143,232,143,233,143,234,227,195,143,235,143,236,214,210,226,231,143,237,143,238,226,232,143,239,143,240,211,199,143,241,143,242,226,236,191,236,143,243,226,237,226,229,143,244,143,245,179,192,143,246,143,247,143,248,196,238,143,249,143,250,226,238,143,251,143,252,208,195,143,253,186,246,226,233,183,222,187,179,204,172,203,203,226,228,226,230,226,234,226,235,143,254,144,64,144,65,226,247,144,66,144,67,226,244,212,245,226,243,144,68,144,69,197,173,144,70,213,250,197,194,178,192,144,71,144,72,226,239,144,73,226,242,193,175,203,188,144,74,144,75,181,161,226,249,144,76,144,77,144,78,188,177,226,241,208,212,212,185,226,245,185,214,226,246,144,79,144,80,144,81,199,211,144,82,144,83,144,84,144,85,144,86,226,240,144,87,144,88,144,89,144,90,144,91,215,220,237,161,144,92,144,93,226,248,144,94,237,165,226,254,202,209,144,95,144,96,144,97,144,98,144,99,144,100,144,101,193,181,144,102,187,208,144,103,144,104,191,214,144,105,186,227,144,106,144,107,203,161,144,108,144,109,144,110,237,166,237,163,144,111,144,112,237,162,144,113,144,114,144,115,144,116,187,214,237,167,208,244,144,117,144,118,237,164,186,222,182,247,227,161,182,178,204,241,185,167,144,119,207,162,199,161,144,120,144,121,191,210,144,122,144,123,182,241,144,124,226,250,226,251,226,253,226,252,196,213,227,162,144,125,211,193,144,126,144,128,144,129,227,167,199,196,144,130,144,131,144,132,144,133,207,164,144,134,144,135,227,169,186,183,144,136,144,137,144,138,144,139,227,168,144,140,187,218,144,141,227,163,144,142,144,143,144,144,227,164,227,170,144,145,227,166,144,146,206,242,211,198,144,147,144,148,187,188,144,149,144,150,212,195,144,151,196,250,144,152,144,153,237,168,208,252,227,165,144,154,195,245,144,155,227,173,177,175,144,156,227,178,144,157,144,158,144,159,188,194,144,160,144,161,227,172,181,191,144,162,144,163,144,164,144,165,144,166,144,167,144,168,144,169,199,233,227,176,144,170,144,171,144,172,190,170,205,239,144,173,144,174,144,175,144,176,144,177,187,243,144,178,144,179,144,180,204,232,144,181,144,182,227,175,144,183,227,177,144,184,207,167,227,174,144,185,206,169,187,221,144,186,144,187,144,188,144,189,144,190,181,235,190,229,178,210,179,205,144,191,177,185,227,171,178,209,181,172,185,223,182,232,144,192,144,193,207,235,227,183,144,194,187,204,144,195,144,196,200,199,208,202,144,197,144,198,144,199,144,200,144,201,227,184,179,238,144,202,144,203,144,204,144,205,237,169,144,206,211,250,211,228,144,207,144,208,144,209,237,170,227,185,210,226,144,210,144,211,144,212,144,213,144,214,227,181,144,215,144,216,144,217,144,218,211,222,144,219,144,220,144,221,144,222,184,208,227,179,144,223,144,224,227,182,183,223,144,225,227,180,192,162,144,226,144,227,144,228,227,186,144,229,144,230,144,231,144,232,144,233,144,234,144,235,144,236,144,237,144,238,144,239,144,240,144,241,144,242,144,243,144,244,144,245,144,246,144,247,212,184,144,248,144,249,144,250,144,251,144,252,144,253,144,254,145,64,180,200,145,65,227,187,145,66,187,197,145,67,201,247,145,68,145,69,201,229,145,70,145,71,145,72,196,189,145,73,145,74,145,75,145,76,145,77,145,78,145,79,237,171,145,80,145,81,145,82,145,83,194,253,145,84,145,85,145,86,145,87,187,219,191,174,145,88,145,89,145,90,145,91,145,92,145,93,145,94,206,191,145,95,145,96,145,97,145,98,227,188,145,99,191,182,145,100,145,101,145,102,145,103,145,104,145,105,145,106,145,107,145,108,145,109,145,110,145,111,145,112,145,113,145,114,145,115,145,116,145,117,145,118,177,239,145,119,145,120,212,247,145,121,145,122,145,123,145,124,145,125,227,190,145,126,145,128,145,129,145,130,145,131,145,132,145,133,145,134,237,173,145,135,145,136,145,137,145,138,145,139,145,140,145,141,145,142,145,143,227,191,186,169,237,172,145,144,145,145,227,189,145,146,145,147,145,148,145,149,145,150,145,151,145,152,145,153,145,154,145,155,227,192,145,156,145,157,145,158,145,159,145,160,145,161,186,182,145,162,145,163,145,164,182,174,145,165,145,166,145,167,145,168,145,169,208,184,145,170,176,195,237,174,145,171,145,172,145,173,145,174,145,175,237,175,192,193,145,176,227,193,145,177,145,178,145,179,145,180,145,181,145,182,145,183,145,184,145,185,145,186,145,187,145,188,145,189,145,190,145,191,145,192,145,193,197,179,145,194,145,195,145,196,145,197,145,198,145,199,145,200,145,201,145,202,145,203,145,204,145,205,145,206,145,207,227,194,145,208,145,209,145,210,145,211,145,212,145,213,145,214,145,215,145,216,220,178,145,217,145,218,145,219,145,220,145,221,145,222,237,176,145,223,184,234,145,224,206,236,234,167,208,231,202,249,200,214,207,183,179,201,206,210,189,228,145,225,145,226,227,222,187,242,234,168,213,189,145,227,198,221,234,169,145,228,145,229,145,230,234,170,145,231,234,172,234,171,145,232,234,174,234,173,145,233,145,234,145,235,145,236,189,216,145,237,234,175,145,238,194,190,145,239,145,240,145,241,145,242,180,193,180,247,145,243,145,244,187,167,145,245,145,246,145,247,145,248,145,249,236,230,236,229,183,191,203,249,177,226,145,250,236,231,145,251,145,252,145,253,201,200,236,232,236,233,145,254,202,214,222,208,178,197,212,250,146,64,146,65,198,203,176,199,180,242,200,211,146,66,146,67,146,68,205,208,146,69,146,70,191,184,146,71,146,72,146,73,146,74,146,75,146,76,146,77,191,219,146,78,146,79,199,164,214,180,146,80,192,169,222,209,201,168,209,239,197,164,176,231,179,182,200,197,146,81,146,82,176,226,146,83,146,84,183,246,146,85,146,86,197,250,146,87,146,88,182,243,146,89,213,210,179,208,188,188,146,90,146,91,146,92,179,173,146,93,146,94,146,95,146,96,190,241,176,209,146,97,146,98,146,99,146,100,146,101,146,102,210,214,202,227,215,165,146,103,205,182,182,182,191,185,213,219,146,104,184,167,197,215,146,105,146,106,146,107,222,210,191,217,194,213,199,192,146,108,187,164,177,168,146,109,146,110,197,234,146,111,146,112,197,251,204,167,146,113,146,114,146,115,146,116,177,167,146,117,146,118,146,119,181,214,146,120,146,121,146,122,196,168,146,123,222,211,209,186,179,233,146,124,195,242,146,125,146,126,183,247,146,128,214,244,181,163,178,240,196,180,196,233,192,173,222,212,146,129,176,232,197,196,193,224,146,130,185,213,146,131,190,220,205,216,176,206,146,132,205,207,222,214,190,208,215,190,222,213,213,208,176,221,146,133,146,134,196,226,146,135,146,136,194,163,188,240,146,137,211,181,192,185,197,161,178,166,212,241,146,138,146,139,192,168,202,195,222,215,213,252,146,140,185,176,146,141,200,173,203,169,146,142,222,217,191,189,146,143,146,144,146,145,146,146,198,180,215,167,202,176,196,195,146,147,179,214,185,210,146,148,146,149,146,150,146,151,214,184,234,252,176,180,146,152,146,153,146,154,146,155,191,230,146,156,146,157,204,244,146,158,146,159,146,160,146,161,205,218,146,162,146,163,146,164,214,191,194,206,146,165,206,206,204,162,208,174,196,211,181,178,222,216,213,245,188,183,187,211,146,166,146,167,176,164,146,168,197,178,180,236,146,169,146,170,146,171,213,241,146,172,146,173,234,253,146,174,146,175,146,176,146,177,146,178,146,179,222,218,205,166,146,180,146,181,205,236,146,182,146,183,146,184,146,185,206,230,222,220,146,186,205,177,192,166,146,187,146,188,215,189,146,189,222,219,176,198,186,180,201,211,196,243,190,232,146,190,146,191,146,192,146,193,178,182,146,194,146,195,146,196,146,197,146,198,146,199,146,200,146,201,192,204,203,240,146,202,188,241,187,187,181,183,146,203,146,204,146,205,197,245,146,206,222,230,146,207,146,208,146,209,222,227,190,221,146,210,146,211,222,223,146,212,146,213,146,214,146,215,180,183,189,221,146,216,146,217,222,224,196,237,146,218,146,219,146,220,146,221,207,198,146,222,181,224,146,223,146,224,146,225,146,226,182,222,202,218,181,244,222,229,146,227,213,198,146,228,222,225,204,205,198,254,146,229,197,197,146,230,146,231,146,232,210,180,146,233,190,242,146,234,146,235,146,236,146,237,146,238,146,239,146,240,194,211,146,241,204,189,179,184,146,242,189,211,146,243,191,216,205,198,209,218,180,235,146,244,222,228,222,221,222,231,146,245,234,254,146,246,146,247,194,176,222,226,146,248,146,249,214,192,181,167,146,250,178,244,146,251,222,232,146,252,222,242,146,253,146,254,147,64,147,65,147,66,222,237,147,67,222,241,147,68,147,69,200,224,147,70,147,71,147,72,215,225,222,239,195,232,204,225,147,73,178,229,147,74,147,75,147,76,210,190,147,77,147,78,147,79,147,80,147,81,147,82,147,83,222,238,147,84,222,235,206,213,147,85,180,167,147,86,147,87,147,88,147,89,147,90,191,171,190,190,147,91,147,92,189,210,147,93,147,94,147,95,147,96,222,233,147,97,212,174,147,98,222,222,147,99,222,234,147,100,147,101,147,102,147,103,192,191,147,104,222,236,178,243,184,233,194,167,147,105,147,106,189,193,147,107,147,108,147,109,147,110,147,111,222,245,222,248,147,112,147,113,178,171,180,164,147,114,147,115,180,234,201,166,147,116,147,117,147,118,147,119,147,120,147,121,222,246,203,209,147,122,184,227,147,123,222,247,222,250,147,124,147,125,147,126,147,128,222,249,147,129,147,130,147,131,204,194,147,132,176,225,180,238,147,133,147,134,147,135,147,136,147,137,147,138,229,186,147,139,147,140,147,141,147,142,147,143,208,175,147,144,147,145,178,235,147,146,235,161,147,147,222,244,147,148,147,149,201,227,222,243,176,218,210,161,177,247,147,150,204,175,147,151,147,152,147,153,147,154,147,155,147,156,147,157,222,240,147,158,203,164,147,159,147,160,147,161,213,170,147,162,147,163,147,164,147,165,147,166,222,251,147,167,147,168,147,169,147,170,147,171,147,172,147,173,147,174,180,221,147,175,196,166,147,176,147,177,147,178,222,253,147,179,147,180,147,181,147,182,147,183,147,184,147,185,147,186,147,187,147,188,195,254,196,161,223,161,147,189,147,190,147,191,147,192,147,193,147,194,147,195,193,204,147,196,222,252,190,239,147,197,198,178,147,198,147,199,147,200,147,201,147,202,147,203,147,204,147,205,147,206,179,197,200,246,147,207,147,208,203,186,222,254,147,209,147,210,223,164,147,211,147,212,147,213,147,214,215,178,147,215,147,216,147,217,147,218,147,219,179,183,147,220,147,221,147,222,147,223,193,195,147,224,147,225,199,203,178,165,180,233,147,226,215,171,147,227,147,228,147,229,147,230,196,236,147,231,223,162,223,163,147,232,223,165,147,233,186,179,147,234,147,235,147,236,223,166,147,237,192,222,147,238,147,239,201,195,147,240,147,241,147,242,147,243,147,244,147,245,147,246,178,217,199,230,147,247,223,167,147,248,199,220,147,249,147,250,147,251,147,252,223,168,235,162,147,253,147,254,148,64,148,65,148,66,203,211,148,67,148,68,148,69,223,170,148,70,223,169,148,71,178,193,148,72,148,73,148,74,148,75,148,76,148,77,148,78,148,79,148,80,148,81,148,82,148,83,148,84,148,85,148,86,148,87,148,88,148,89,148,90,148,91,148,92,148,93,148,94,148,95,148,96,197,202,148,97,148,98,148,99,148,100,148,101,148,102,148,103,148,104,223,171,148,105,148,106,148,107,148,108,148,109,148,110,148,111,148,112,212,220,148,113,148,114,148,115,148,116,148,117,200,193,148,118,148,119,148,120,148,121,148,122,148,123,148,124,148,125,148,126,148,128,148,129,148,130,223,172,148,131,148,132,148,133,148,134,148,135,190,240,148,136,148,137,223,173,214,167,148,138,148,139,148,140,148,141,234,183,235,182,202,213,148,142,216,252,184,196,148,143,185,165,148,144,148,145,183,197,213,254,148,146,148,147,148,148,148,149,148,150,185,202,148,151,148,152,208,167,244,205,148,153,148,154,181,208,148,155,148,156,195,244,148,157,190,200,148,158,148,159,148,160,235,183,176,189,148,161,148,162,189,204,148,163,193,178,148,164,177,214,179,168,148,165,148,166,148,167,184,210,201,162,148,168,148,169,182,216,148,170,148,171,148,172,148,173,235,184,190,180,148,174,148,175,148,176,202,253,148,177,199,195,148,178,213,251,148,179,148,180,183,243,148,181,148,182,148,183,148,184,148,185,148,186,148,187,148,188,148,189,148,190,148,191,148,192,148,193,148,194,148,195,206,196,148,196,148,197,148,198,213,171,177,243,148,199,148,200,148,201,236,179,176,223,148,202,236,181,148,203,148,204,148,205,182,183,148,206,193,207,148,207,245,250,208,177,148,208,148,209,213,229,148,210,206,211,148,211,148,212,189,239,179,226,148,213,184,171,148,214,213,182,148,215,237,189,148,216,182,207,148,217,203,185,208,194,148,218,148,219,148,220,148,221,148,222,148,223,148,224,148,225,183,189,148,226,148,227,236,182,202,169,148,228,148,229,148,230,197,212,148,231,236,185,236,184,194,195,236,183,148,232,148,233,148,234,148,235,208,253,236,186,148,236,236,187,215,229,148,237,148,238,236,188,148,239,148,240,148,241,236,189,198,236,148,242,148,243,148,244,148,245,148,246,148,247,148,248,148,249,206,222,148,250,188,200,148,251,148,252,200,213,181,169,190,201,214,188,212,231,148,253,148,254,209,174,208,241,234,184,234,185,234,186,186,181,149,64,149,65,149,66,149,67,202,177,191,245,149,68,149,69,205,250,149,70,149,71,149,72,149,73,149,74,234,192,149,75,176,186,234,190,149,76,149,77,192,165,149,78,149,79,149,80,234,187,149,81,178,253,149,82,195,247,187,232,149,83,149,84,149,85,210,215,206,244,234,191,149,86,149,87,149,88,234,188,149,89,149,90,149,91,234,195,149,92,208,199,211,179,149,93,149,94,149,95,149,96,180,186,149,97,195,193,215,242,149,98,149,99,149,100,149,101,213,209,149,102,202,199,149,103,234,197,149,104,149,105,234,196,234,199,234,198,149,106,149,107,149,108,149,109,149,110,214,231,149,111,207,212,149,112,149,113,234,203,149,114,187,206,149,115,149,116,149,117,149,118,149,119,149,120,149,121,189,250,201,206,149,122,149,123,234,204,149,124,149,125,201,185,207,254,234,202,212,206,234,205,234,207,149,126,149,128,205,237,149,129,149,130,149,131,149,132,234,201,149,133,234,206,149,134,149,135,206,238,149,136,187,222,149,137,179,191,149,138,149,139,149,140,149,141,149,142,198,213,190,176,206,250,149,143,149,144,149,145,199,231,149,146,190,167,234,208,149,147,149,148,214,199,149,149,149,150,149,151,193,192,149,152,149,153,149,154,212,221,149,155,234,209,149,156,149,157,207,190,149,158,149,159,149,160,149,161,234,210,149,162,149,163,149,164,149,165,202,238,149,166,149,167,149,168,149,169,197,175,176,181,149,170,149,171,149,172,149,173,149,174,234,212,149,175,149,176,149,177,149,178,149,179,149,180,149,181,149,182,149,183,234,211,244,223,149,184,149,185,149,186,149,187,149,188,196,186,149,189,149,190,149,191,149,192,149,193,177,169,149,194,149,195,149,196,149,197,229,223,149,198,149,199,149,200,149,201,234,213,149,202,149,203,149,204,149,205,149,206,149,207,149,208,149,209,149,210,149,211,149,212,149,213,149,214,149,215,149,216,149,217,149,218,149,219,149,220,149,221,149,222,149,223,149,224,149,225,149,226,149,227,202,239,149,228,234,214,234,215,198,216,149,229,149,230,149,231,149,232,149,233,149,234,149,235,149,236,234,216,149,237,149,238,234,217,149,239,149,240,149,241,149,242,149,243,149,244,212,187,149,245,199,250,210,183,184,252,149,246,149,247,234,194,149,248,178,220,149,249,149,250,194,252,149,251,212,248,204,230,215,238,149,252,149,253,149,254,150,64,150,65,150,66,150,67,212,194,211,208,235,195,197,243,150,68,183,254,150,69,150,70,235,212,150,71,150,72,150,73,203,183,235,222,150,74,192,202,150,75,150,76,150,77,205,251,150,78,179,175,150,79,198,218,150,80,150,81,150,82,150,83,150,84,150,85,235,252,150,86,196,190,150,87,206,180,196,169,177,190,212,253,150,88,202,245,150,89,214,236,150,90,150,91,198,211,182,228,150,92,150,93,150,94,150,95,187,250,150,96,150,97,208,224,150,98,150,99,201,177,150,100,212,211,200,168,150,101,150,102,184,203,150,103,232,190,201,188,150,104,150,105,232,187,150,106,192,238,208,211,178,196,180,229,150,107,232,188,150,108,150,109,213,200,150,110,150,111,150,112,150,113,150,114,182,197,150,115,232,189,202,248,184,220,204,245,150,116,150,117,150,118,192,180,150,119,150,120,209,238,232,191,232,194,150,121,150,122,186,188,150,123,177,173,189,220,150,124,234,189,232,195,150,125,232,198,150,126,232,203,150,128,150,129,150,130,150,131,232,204,150,132,203,201,176,229,150,133,188,171,150,134,150,135,185,185,150,136,150,137,232,193,150,138,205,247,150,139,232,202,150,140,150,141,150,142,150,143,206,246,150,144,150,145,150,146,150,147,213,237,150,148,193,214,232,196,150,149,195,182,150,150,185,251,214,166,232,200,150,151,150,152,150,153,202,224,212,230,150,154,232,192,150,155,232,197,232,199,150,156,199,185,183,227,150,157,232,201,150,158,191,221,232,210,150,159,150,160,232,215,150,161,232,213,188,220,188,207,232,219,150,162,150,163,150,164,150,165,150,166,150,167,150,168,150,169,232,222,150,170,232,218,177,250,150,171,150,172,150,173,150,174,150,175,150,176,150,177,150,178,150,179,150,180,176,216,196,179,184,204,198,226,200,190,200,225,150,181,150,182,150,183,232,207,232,212,232,214,150,184,185,241,232,216,215,245,150,185,196,251,150,186,232,220,150,187,150,188,178,233,150,189,150,190,150,191,232,209,150,192,150,193,188,237,150,194,150,195,191,194,232,205,214,249,150,196,193,248,178,241,150,197,150,198,150,199,150,200,150,201,150,202,150,203,150,204,232,223,150,205,202,193,232,217,150,206,150,207,150,208,150,209,213,164,150,210,177,234,213,187,232,206,232,208,182,176,232,211,150,211,232,221,192,184,150,212,202,247,150,213,203,168,150,214,150,215,198,220,192,245,150,216,150,217,150,218,150,219,150,220,232,233,150,221,150,222,150,223,208,163,150,224,150,225,150,226,150,227,150,228,150,229,150,230,232,242,214,234,150,231,150,232,150,233,150,234,150,235,150,236,150,237,232,224,232,225,150,238,150,239,150,240,209,249,186,203,184,249,150,241,150,242,184,241,212,212,232,239,150,243,232,238,232,236,185,240,204,210,232,230,206,166,191,242,150,244,176,184,232,241,232,240,150,245,215,192,150,246,232,228,150,247,205,169,201,163,150,248,187,184,189,219,232,234,150,249,150,250,150,251,150,252,150,253,150,254,151,64,151,65,151,66,151,67,232,226,232,227,232,229,181,181,232,231,199,197,232,235,232,237,189,176,215,174,151,68,232,248,151,69,151,70,151,71,151,72,151,73,151,74,151,75,151,76,232,245,151,77,205,176,232,246,151,78,151,79,151,80,151,81,151,82,151,83,151,84,151,85,151,86,193,186,151,87,232,232,151,88,195,183,176,240,151,89,151,90,151,91,151,92,151,93,151,94,151,95,151,96,232,244,151,97,151,98,151,99,232,247,151,100,151,101,151,102,185,163,151,103,151,104,151,105,151,106,151,107,151,108,151,109,151,110,151,111,151,112,201,210,151,113,151,114,151,115,195,206,206,224,192,230,151,116,151,117,151,118,151,119,203,243,151,120,204,221,208,181,151,121,151,122,202,225,151,123,232,243,151,124,151,125,151,126,151,128,151,129,151,130,151,131,151,132,151,133,151,134,188,236,151,135,232,249,151,136,151,137,151,138,151,139,151,140,151,141,195,222,151,142,198,229,151,143,185,247,151,144,151,145,151,146,151,147,176,244,151,148,151,149,215,216,151,150,151,151,188,172,151,152,197,239,151,153,151,154,151,155,151,156,151,157,204,196,151,158,151,159,233,166,151,160,151,161,151,162,151,163,151,164,151,165,151,166,151,167,151,168,151,169,201,173,151,170,233,162,192,226,151,171,151,172,151,173,191,195,151,174,151,175,151,176,232,254,185,215,151,177,232,251,151,178,151,179,151,180,151,181,233,164,151,182,151,183,151,184,210,206,151,185,151,186,151,187,151,188,151,189,233,163,151,190,214,178,215,181,151,191,233,167,151,192,189,183,151,193,151,194,151,195,151,196,151,197,151,198,151,199,151,200,151,201,151,202,151,203,151,204,232,252,232,253,151,205,151,206,151,207,233,161,151,208,151,209,151,210,151,211,151,212,151,213,151,214,151,215,205,214,151,216,151,217,210,172,151,218,151,219,151,220,233,178,151,221,151,222,151,223,151,224,233,169,151,225,151,226,151,227,180,170,151,228,180,187,151,229,151,230,233,171,151,231,151,232,151,233,151,234,151,235,151,236,151,237,151,238,151,239,151,240,151,241,151,242,151,243,151,244,151,245,151,246,151,247,208,168,151,248,151,249,233,165,151,250,151,251,179,254,151,252,151,253,233,172,192,227,151,254,233,170,152,64,152,65,233,185,152,66,152,67,233,184,152,68,152,69,152,70,152,71,233,174,152,72,152,73,232,250,152,74,152,75,233,168,152,76,152,77,152,78,152,79,152,80,191,172,233,177,233,186,152,81,152,82,194,165,152,83,152,84,152,85,233,175,152,86,184,197,152,87,233,173,152,88,211,220,233,180,233,181,233,183,152,89,152,90,152,91,233,199,152,92,152,93,152,94,152,95,152,96,152,97,192,198,233,197,152,98,152,99,233,176,152,100,152,101,233,187,176,241,152,102,152,103,152,104,152,105,152,106,152,107,152,108,152,109,152,110,152,111,233,188,213,165,152,112,152,113,233,190,152,114,233,191,152,115,152,116,152,117,233,193,152,118,152,119,193,241,152,120,152,121,200,182,152,122,152,123,152,124,233,189,152,125,152,126,152,128,152,129,152,130,233,194,152,131,152,132,152,133,152,134,152,135,152,136,152,137,152,138,233,195,152,139,233,179,152,140,233,182,152,141,187,177,152,142,152,143,152,144,233,192,152,145,152,146,152,147,152,148,152,149,152,150,188,247,152,151,152,152,152,153,233,196,233,198,152,154,152,155,152,156,152,157,152,158,152,159,152,160,152,161,152,162,152,163,152,164,152,165,233,202,152,166,152,167,152,168,152,169,233,206,152,170,152,171,152,172,152,173,152,174,152,175,152,176,152,177,152,178,152,179,178,219,152,180,233,200,152,181,152,182,152,183,152,184,152,185,152,186,152,187,152,188,152,189,152,190,183,174,152,191,152,192,152,193,152,194,152,195,152,196,152,197,152,198,152,199,152,200,152,201,152,202,233,203,233,204,152,203,152,204,152,205,152,206,152,207,152,208,213,193,152,209,196,163,152,210,152,211,152,212,152,213,152,214,152,215,233,216,152,216,186,225,152,217,152,218,152,219,152,220,233,201,152,221,211,163,152,222,152,223,152,224,233,212,152,225,152,226,152,227,152,228,152,229,152,230,152,231,233,215,233,208,152,232,152,233,152,234,152,235,152,236,233,207,152,237,152,238,199,193,152,239,152,240,152,241,152,242,152,243,152,244,152,245,152,246,233,210,152,247,152,248,152,249,152,250,152,251,152,252,152,253,233,217,179,200,152,254,233,211,153,64,153,65,153,66,153,67,153,68,207,240,153,69,153,70,153,71,233,205,153,72,153,73,153,74,153,75,153,76,153,77,153,78,153,79,153,80,153,81,153,82,179,247,153,83,153,84,153,85,153,86,153,87,153,88,153,89,233,214,153,90,153,91,233,218,153,92,153,93,153,94,204,180,153,95,153,96,153,97,207,173,153,98,153,99,153,100,153,101,153,102,153,103,153,104,153,105,153,106,233,213,153,107,233,220,233,219,153,108,153,109,153,110,153,111,153,112,233,222,153,113,153,114,153,115,153,116,153,117,153,118,153,119,153,120,233,209,153,121,153,122,153,123,153,124,153,125,153,126,153,128,153,129,233,221,153,130,233,223,195,202,153,131,153,132,153,133,153,134,153,135,153,136,153,137,153,138,153,139,153,140,153,141,153,142,153,143,153,144,153,145,153,146,153,147,153,148,153,149,153,150,153,151,153,152,153,153,153,154,153,155,153,156,153,157,153,158,153,159,153,160,153,161,153,162,153,163,153,164,153,165,153,166,153,167,153,168,153,169,153,170,153,171,153,172,153,173,153,174,153,175,153,176,153,177,153,178,153,179,153,180,153,181,153,182,153,183,153,184,153,185,153,186,153,187,153,188,153,189,153,190,153,191,153,192,153,193,153,194,153,195,153,196,153,197,153,198,153,199,153,200,153,201,153,202,153,203,153,204,153,205,153,206,153,207,153,208,153,209,153,210,153,211,153,212,153,213,153,214,153,215,153,216,153,217,153,218,153,219,153,220,153,221,153,222,153,223,153,224,153,225,153,226,153,227,153,228,153,229,153,230,153,231,153,232,153,233,153,234,153,235,153,236,153,237,153,238,153,239,153,240,153,241,153,242,153,243,153,244,153,245,199,183,180,206,187,182,208,192,236,163,153,246,153,247,197,183,153,248,153,249,153,250,153,251,153,252,153,253,153,254,154,64,154,65,154,66,211,251,154,67,154,68,154,69,154,70,236,164,154,71,236,165,198,219,154,72,154,73,154,74,191,238,154,75,154,76,154,77,154,78,236,166,154,79,154,80,236,167,208,170,154,81,199,184,154,82,154,83,184,232,154,84,154,85,154,86,154,87,154,88,154,89,154,90,154,91,154,92,154,93,154,94,154,95,236,168,154,96,154,97,154,98,154,99,154,100,154,101,154,102,154,103,214,185,213,253,180,203,178,189,206,228,198,231,154,104,154,105,205,225,154,106,154,107,154,108,154,109,154,110,154,111,154,112,154,113,154,114,154,115,154,116,154,117,154,118,154,119,180,245,154,120,203,192,188,223,154,121,154,122,154,123,154,124,233,226,233,227,209,234,233,229,154,125,180,249,233,228,154,126,209,179,202,226,178,208,154,128,233,232,154,129,154,130,154,131,154,132,233,230,233,231,154,133,154,134,214,179,154,135,154,136,154,137,233,233,233,234,154,138,154,139,154,140,154,141,154,142,233,235,154,143,154,144,154,145,154,146,154,147,154,148,154,149,154,150,233,236,154,151,154,152,154,153,154,154,154,155,154,156,154,157,154,158,236,175,197,185,182,206,154,159,210,243,154,160,154,161,154,162,154,163,154,164,154,165,154,166,181,238,154,167,187,217,236,177,154,168,154,169,210,227,154,170,154,171,154,172,154,173,154,174,206,227,154,175,196,184,154,176,195,191,154,177,154,178,182,190,216,185,177,200,177,207,177,209,197,254,154,179,177,208,154,180,195,171,154,181,154,182,154,183,154,184,154,185,213,177,154,186,154,187,154,188,154,189,154,190,154,191,154,192,154,193,235,164,186,193,154,194,154,195,154,196,204,186,154,197,154,198,154,199,235,165,154,200,235,167,154,201,154,202,154,203,235,168,154,204,154,205,154,206,235,166,154,207,154,208,154,209,154,210,154,211,154,212,154,213,235,169,235,171,235,170,154,214,154,215,154,216,154,217,154,218,235,172,154,219,202,207,216,181,195,241,154,220,195,165,198,248,235,173,196,202,154,221,235,174,235,175,235,176,183,213,154,222,154,223,154,224,183,250,154,225,235,177,199,226,154,226,235,179,154,227,186,164,209,245,176,177,235,178,235,180,154,228,154,229,154,230,181,170,194,200,199,232,154,231,235,181,154,232,203,174,227,223,154,233,154,234,211,192,154,235,154,236,154,237,154,238,217,219,154,239,154,240,205,161,214,173,199,243,154,241,154,242,154,243,217,224,187,227,154,244,186,186,227,226,154,245,154,246,154,247,154,248,154,249,207,171,154,250,154,251,154,252,227,224,201,199,154,253,186,185,154,254,155,64,155,65,209,180,227,225,200,234,185,175,189,173,179,216,206,219,155,66,155,67,204,192,155,68,155,69,155,70,227,232,227,233,205,244,155,71,155,72,155,73,155,74,155,75,204,173,155,76,188,179,155,77,227,234,155,78,227,235,155,79,155,80,208,218,155,81,155,82,155,83,198,251,183,218,155,84,155,85,199,223,210,202,206,214,155,86,227,228,227,236,155,87,201,242,179,193,155,88,155,89,227,231,155,90,155,91,198,227,227,229,155,92,155,93,237,179,227,230,155,94,155,95,155,96,155,97,201,179,155,98,197,230,155,99,155,100,155,101,185,181,155,102,195,187,155,103,227,227,197,189,193,164,194,217,178,215,155,104,227,237,187,166,196,173,155,105,227,240,190,218,155,106,155,107,227,251,227,245,186,211,155,108,155,109,155,110,155,111,183,208,211,205,155,112,214,206,213,211,185,193,213,180,209,216,155,113,155,114,155,115,155,116,208,185,199,246,155,117,155,118,155,119,200,170,178,180,155,120,195,218,155,121,155,122,155,123,227,238,155,124,155,125,227,252,227,239,183,168,227,247,227,244,155,126,155,128,155,129,183,186,155,130,155,131,197,162,155,132,227,246,197,221,178,168,198,252,155,133,196,224,155,134,155,135,215,162,155,136,192,225,227,249,155,137,155,138,227,250,227,253,204,169,227,243,155,139,211,190,155,140,177,195,237,180,227,241,227,242,155,141,227,248,208,186,198,195,212,243,227,254,155,142,155,143,189,224,155,144,155,145,228,167,155,146,155,147,228,166,155,148,155,149,155,150,209,243,228,163,155,151,228,169,155,152,155,153,155,154,200,247,155,155,155,156,155,157,155,158,207,180,155,159,228,168,228,174,194,229,155,160,155,161,182,180,155,162,155,163,155,164,155,165,155,166,155,167,189,242,155,168,228,162,155,169,155,170,186,233,228,170,155,171,155,172,228,172,155,173,155,174,182,253,214,222,228,178,155,175,228,173,155,176,155,177,155,178,228,161,155,179,187,238,205,221,199,162,197,201,155,180,155,181,193,247,155,182,228,164,155,183,199,179,189,172,189,189,228,165,155,184,215,199,178,226,155,185,228,171,188,195,228,175,155,186,187,235,228,176,197,168,228,177,155,187,155,188,155,189,155,190,213,227,191,163,155,191,228,186,155,192,228,183,155,193,228,187,155,194,155,195,228,189,155,196,155,197,198,214,155,198,155,199,186,198,192,203,155,200,155,201,155,202,184,161,228,180,155,203,155,204,155,205,155,206,212,161,155,207,155,208,186,163,189,254,155,209,155,210,155,211,228,188,155,212,155,213,155,214,155,215,155,216,205,191,155,217,155,218,196,249,155,219,155,220,207,251,201,230,155,221,155,222,211,191,155,223,207,209,155,224,155,225,228,179,155,226,228,184,228,185,204,233,155,227,155,228,155,229,155,230,155,231,204,206,155,232,192,212,228,181,193,176,228,182,206,208,155,233,187,193,181,211,155,234,200,243,189,167,213,199,201,172,184,162,228,202,155,235,155,236,228,204,209,196,155,237,155,238,210,186,155,239,155,240,186,173,155,241,155,242,186,212,155,243,155,244,155,245,155,246,155,247,155,248,228,195,181,237,155,249,155,250,155,251,215,205,228,192,207,253,228,191,155,252,155,253,155,254,193,220,204,202,156,64,156,65,156,66,156,67,202,231,156,68,156,69,156,70,156,71,196,215,156,72,204,212,228,200,156,73,156,74,156,75,228,199,228,193,156,76,228,196,181,173,156,77,156,78,211,217,156,79,228,198,156,80,156,81,156,82,156,83,210,249,180,227,156,84,187,180,156,85,156,86,201,238,156,87,180,190,156,88,156,89,156,90,187,236,156,91,209,205,156,92,204,237,237,181,156,93,156,94,156,95,156,96,156,97,156,98,156,99,156,100,199,229,156,101,156,102,156,103,156,104,212,168,156,105,228,203,215,213,228,194,156,106,189,165,228,197,156,107,156,108,211,230,156,109,228,201,201,248,156,110,156,111,228,190,156,112,156,113,211,229,156,114,156,115,199,254,182,201,156,116,212,252,178,179,228,215,156,117,156,118,156,119,206,194,156,120,228,205,156,121,206,188,156,122,184,219,156,123,156,124,228,214,156,125,191,202,156,126,156,128,156,129,211,206,156,130,195,236,156,131,156,132,156,133,156,134,156,135,156,136,156,137,156,138,197,200,228,216,156,139,156,140,156,141,156,142,156,143,156,144,156,145,156,146,205,196,228,207,156,147,156,148,156,149,156,150,228,212,228,213,156,151,186,254,156,152,207,230,156,153,156,154,213,191,156,155,156,156,156,157,228,210,156,158,156,159,156,160,156,161,156,162,156,163,156,164,156,165,156,166,156,167,156,168,228,208,156,169,156,170,228,206,156,171,156,172,156,173,156,174,156,175,156,176,156,177,156,178,156,179,156,180,156,181,156,182,156,183,156,184,156,185,205,229,202,170,156,186,156,187,156,188,192,163,156,189,189,166,228,211,156,190,156,191,184,200,156,192,156,193,156,194,156,195,156,196,228,231,212,180,156,197,156,198,156,199,156,200,156,201,156,202,156,203,228,219,156,204,156,205,156,206,193,239,156,207,156,208,228,233,156,209,156,210,210,231,156,211,156,212,228,223,156,213,228,224,156,214,156,215,207,170,156,216,156,217,156,218,156,219,203,221,156,220,228,218,228,209,156,221,228,229,156,222,200,220,228,227,156,223,156,224,196,231,228,226,156,225,228,225,156,226,156,227,156,228,179,252,228,232,156,229,156,230,156,231,156,232,181,225,156,233,156,234,156,235,215,204,156,236,156,237,156,238,228,230,156,239,187,172,156,240,215,210,204,207,235,248,156,241,228,228,156,242,156,243,185,246,156,244,156,245,156,246,214,205,228,217,228,220,194,250,228,222,156,247,194,203,192,196,194,208,156,248,177,245,204,178,156,249,156,250,156,251,156,252,156,253,156,254,157,64,157,65,157,66,157,67,181,206,157,68,157,69,157,70,157,71,228,239,157,72,157,73,157,74,157,75,157,76,157,77,157,78,157,79,198,175,157,80,157,81,157,82,198,225,157,83,157,84,228,245,157,85,157,86,157,87,157,88,157,89,194,169,157,90,157,91,157,92,192,236,209,221,228,238,157,93,157,94,157,95,157,96,157,97,157,98,157,99,157,100,157,101,157,102,196,174,157,103,157,104,157,105,228,237,157,106,157,107,157,108,157,109,228,246,228,244,194,254,157,110,228,221,157,111,228,240,157,112,202,254,157,113,213,196,157,114,157,115,228,241,157,116,157,117,157,118,157,119,157,120,157,121,157,122,209,250,157,123,157,124,157,125,157,126,157,128,157,129,157,130,228,235,228,236,157,131,157,132,157,133,228,242,157,134,206,171,157,135,157,136,157,137,157,138,157,139,157,140,157,141,157,142,157,143,157,144,197,203,157,145,157,146,157,147,199,177,157,148,194,186,157,149,157,150,157,151,228,234,157,152,157,153,157,154,193,202,157,155,157,156,157,157,157,158,157,159,157,160,204,182,179,177,157,161,157,162,157,163,228,251,157,164,228,243,157,165,157,166,157,167,228,250,157,168,228,253,157,169,228,252,157,170,157,171,157,172,157,173,157,174,157,175,157,176,179,206,157,177,157,178,157,179,179,186,228,247,157,180,157,181,228,249,228,248,197,236,157,182,157,183,157,184,157,185,157,186,157,187,157,188,157,189,157,190,157,191,157,192,157,193,157,194,192,189,157,195,157,196,157,197,157,198,212,232,157,199,157,200,157,201,157,202,157,203,229,162,157,204,157,205,157,206,157,207,157,208,157,209,157,210,157,211,157,212,157,213,157,214,176,196,157,215,157,216,229,164,157,217,157,218,229,163,157,219,157,220,157,221,157,222,157,223,157,224,188,164,157,225,229,165,157,226,157,227,157,228,157,229,157,230,157,231,229,161,157,232,157,233,157,234,157,235,157,236,157,237,157,238,228,254,177,244,157,239,157,240,157,241,157,242,157,243,157,244,157,245,157,246,157,247,157,248,157,249,229,168,157,250,229,169,229,166,157,251,157,252,157,253,157,254,158,64,158,65,158,66,158,67,158,68,158,69,158,70,158,71,229,167,229,170,158,72,158,73,158,74,158,75,158,76,158,77,158,78,158,79,158,80,158,81,158,82,158,83,158,84,158,85,158,86,158,87,158,88,158,89,158,90,158,91,158,92,158,93,158,94,158,95,158,96,158,97,158,98,158,99,158,100,158,101,158,102,158,103,158,104,198,217,158,105,158,106,158,107,158,108,158,109,158,110,158,111,158,112,229,171,229,173,158,113,158,114,158,115,158,116,158,117,158,118,158,119,229,172,158,120,158,121,158,122,158,123,158,124,158,125,158,126,158,128,158,129,158,130,158,131,158,132,158,133,158,134,158,135,158,136,158,137,229,175,158,138,158,139,158,140,229,174,158,141,158,142,158,143,158,144,158,145,158,146,158,147,158,148,158,149,158,150,158,151,158,152,158,153,158,154,158,155,158,156,158,157,158,158,185,224,158,159,158,160,229,176,158,161,158,162,158,163,158,164,158,165,158,166,158,167,158,168,158,169,158,170,158,171,158,172,158,173,158,174,229,177,158,175,158,176,158,177,158,178,158,179,158,180,158,181,158,182,158,183,158,184,158,185,158,186,187,240,236,225,195,240,158,187,181,198,187,210,158,188,158,189,158,190,158,191,193,233,212,238,158,192,190,196,158,193,158,194,158,195,215,198,158,196,212,214,178,211,236,190,158,197,158,198,158,199,158,200,234,193,158,201,158,202,158,203,194,175,180,182,158,204,158,205,158,206,209,215,158,207,158,208,158,209,179,180,158,210,200,178,191,187,236,192,158,211,158,212,214,203,158,213,158,214,236,191,236,193,158,215,158,216,158,217,158,218,158,219,158,220,158,221,158,222,158,223,158,224,158,225,158,226,158,227,236,197,190,230,204,191,197,218,190,188,158,228,236,198,158,229,177,254,158,230,158,231,158,232,236,196,213,168,181,227,158,233,236,194,193,182,179,227,158,234,158,235,236,195,203,184,192,195,204,254,158,236,158,237,158,238,158,239,193,210,158,240,236,200,158,241,158,242,158,243,158,244,158,245,158,246,158,247,158,248,158,249,158,250,158,251,158,252,158,253,186,230,192,211,158,254,214,242,159,64,159,65,159,66,209,204,159,67,159,68,159,69,159,70,191,190,159,71,183,179,201,213,236,199,187,226,159,72,204,204,189,253,200,200,159,73,207,169,159,74,159,75,159,76,159,77,159,78,159,79,159,80,205,233,159,81,197,235,159,82,159,83,159,84,183,233,159,85,159,86,159,87,159,88,159,89,159,90,159,91,159,92,159,93,159,94,159,95,209,201,186,184,159,96,159,97,159,98,159,99,159,100,236,201,159,101,159,102,236,202,159,103,187,192,236,203,159,104,236,226,177,186,183,217,159,105,159,106,159,107,159,108,159,109,159,110,159,111,159,112,159,113,159,114,159,115,189,185,159,116,159,117,159,118,159,119,159,120,159,121,159,122,159,123,236,204,209,230,236,205,159,124,159,125,159,126,159,128,200,187,159,129,159,130,159,131,159,132,159,133,159,134,159,135,159,136,159,137,159,138,159,139,159,140,159,141,159,142,236,209,159,143,159,144,159,145,159,146,236,211,159,147,187,205,159,148,188,229,159,149,159,150,159,151,159,152,159,153,159,154,159,155,159,156,159,157,159,158,159,159,159,160,159,161,236,207,159,162,201,183,159,163,159,164,159,165,159,166,159,167,195,186,159,168,236,227,213,213,236,208,159,169,159,170,159,171,159,172,159,173,214,243,159,174,159,175,159,176,236,210,236,206,159,177,159,178,159,179,159,180,236,212,159,181,236,213,159,182,159,183,201,191,159,184,159,185,159,186,159,187,159,188,159,189,207,168,159,190,159,191,159,192,159,193,159,194,208,220,159,195,159,196,159,197,159,198,209,172,159,199,159,200,159,201,159,202,200,219,159,203,159,204,159,205,236,214,206,245,159,206,159,207,159,208,159,209,159,210,202,236,236,218,159,211,159,212,159,213,159,214,159,215,159,216,159,217,236,217,159,218,159,219,159,220,176,190,159,221,159,222,159,223,159,224,159,225,159,226,236,215,159,227,236,216,159,228,159,229,159,230,236,228,159,231,159,232,159,233,159,234,159,235,159,236,159,237,159,238,159,239,200,188,159,240,159,241,159,242,159,243,159,244,159,245,159,246,159,247,159,248,159,249,193,199,159,250,159,251,159,252,159,253,159,254,236,220,209,224,160,64,160,65,160,66,160,67,160,68,160,69,160,70,160,71,160,72,160,73,236,219,160,74,160,75,160,76,160,77,212,239,160,78,236,221,160,79,160,80,160,81,160,82,160,83,160,84,219,198,160,85,160,86,160,87,160,88,160,89,160,90,160,91,160,92,160,93,160,94,236,222,160,95,160,96,160,97,160,98,160,99,160,100,160,101,160,102,160,103,160,104,160,105,160,106,177,172,160,107,160,108,160,109,160,110,160,111,160,112,160,113,160,114,160,115,160,116,160,117,160,118,160,119,160,120,160,121,160,122,160,123,160,124,160,125,160,126,160,128,160,129,236,223,160,130,160,131,160,132,160,133,160,134,160,135,160,136,160,137,160,138,160,139,236,224,160,140,215,166,160,141,197,192,160,142,160,143,160,144,235,188,176,174,160,145,160,146,160,147,190,244,184,184,210,175,176,214,181,249,160,148,216,179,160,149,203,172,160,150,227,221,160,151,160,152,160,153,160,154,160,155,160,156,160,157,198,172,176,230,160,158,160,159,160,160,197,198,235,185,160,161,160,162,160,163,160,164,235,186,160,165,160,166,160,167,235,187,160,168,160,169,209,192,160,170,197,163,160,171,234,242,160,172,196,178,160,173,196,181,192,206,160,174,160,175,160,176,234,243,196,193,160,177,206,239,160,178,160,179,160,180,160,181,234,240,234,244,160,182,160,183,201,252,160,184,160,185,199,163,160,186,160,187,160,188,204,216,206,254,160,189,160,190,160,191,234,245,234,246,207,172,192,231,160,192,160,193,234,247,160,194,160,195,160,196,160,197,160,198,182,191,234,248,160,199,234,249,160,200,234,250,160,201,160,202,234,251,160,203,160,204,160,205,160,206,160,207,160,208,160,209,160,210,160,211,160,212,160,213,160,214,234,241,160,215,160,216,160,217,160,218,160,219,160,220,160,221,160,222,160,223,160,224,160,225,160,226,200,174,225,235,160,227,183,184,225,236,160,228,160,229,160,230,225,237,160,231,215,180,225,238,225,239,211,204,160,232,160,233,160,234,160,235,160,236,160,237,160,238,225,241,191,241,225,240,181,210,160,239,160,240,160,241,177,183,160,242,160,243,160,244,160,245,225,243,225,242,160,246,186,252,160,247,225,244,160,248,160,249,160,250,160,251,185,183,160,252,190,209,160,253,160,254,170,64,170,65,196,252,170,66,186,221,189,198,170,67,170,68,170,69,170,70,170,71,170,72,225,245,225,247,170,73,170,74,182,192,207,193,202,168,225,246,213,248,211,252,225,248,225,252,225,249,170,75,170,76,225,250,192,234,170,77,225,254,226,161,192,199,170,78,170,79,170,80,170,81,225,251,170,82,225,253,170,83,170,84,170,85,170,86,170,87,170,88,226,165,170,89,170,90,170,91,193,212,170,92,170,93,170,94,170,95,226,163,170,96,226,168,178,254,226,162,170,97,170,98,170,99,195,205,178,194,226,167,226,166,170,100,170,101,226,164,226,169,170,102,170,103,226,171,170,104,170,105,170,106,208,201,214,237,195,168,226,172,170,107,207,215,170,108,170,109,226,174,170,110,170,111,186,239,170,112,170,113,233,224,226,173,226,170,170,114,170,115,170,116,170,117,187,171,212,179,170,118,170,119,170,120,170,121,170,122,170,123,170,124,170,125,170,126,170,128,170,129,170,130,170,131,226,176,170,132,170,133,226,175,170,134,233,225,170,135,170,136,170,137,170,138,226,177,170,139,170,140,170,141,170,142,170,143,170,144,170,145,170,146,226,178,170,147,170,148,170,149,170,150,170,151,170,152,170,153,170,154,170,155,170,156,170,157,226,179,204,161,170,158,226,180,170,159,170,160,171,64,171,65,171,66,171,67,171,68,171,69,171,70,171,71,171,72,171,73,171,74,171,75,226,181,171,76,171,77,171,78,171,79,171,80,208,254,171,81,171,82,194,202,171,83,211,241,171,84,205,245,171,85,171,86,231,224,171,87,171,88,231,225,171,89,171,90,171,91,171,92,190,193,171,93,171,94,171,95,171,96,194,234,171,97,171,98,171,99,231,228,171,100,171,101,231,227,171,102,171,103,171,104,171,105,171,106,171,107,205,230,171,108,195,181,171,109,171,110,231,226,187,183,207,214,171,111,193,225,231,233,171,112,171,113,171,114,231,232,171,115,171,116,231,244,178,163,171,117,171,118,171,119,171,120,231,234,171,121,231,230,171,122,171,123,171,124,171,125,171,126,231,236,231,235,201,186,171,128,171,129,213,228,171,130,231,229,183,169,231,231,171,131,171,132,171,133,171,134,171,135,171,136,171,137,231,238,171,138,171,139,171,140,171,141,231,243,171,142,214,233,171,143,171,144,171,145,171,146,231,237,171,147,231,242,171,148,231,241,171,149,171,150,171,151,176,224,171,152,171,153,171,154,171,155,231,245,171,156,171,157,171,158,171,159,171,160,172,64,172,65,172,66,172,67,172,68,172,69,172,70,172,71,172,72,172,73,172,74,199,242,172,75,192,197,192,237,172,76,172,77,193,240,231,240,172,78,172,79,172,80,172,81,231,246,203,246,172,82,172,83,172,84,172,85,172,86,172,87,172,88,172,89,172,90,232,162,232,161,172,91,172,92,172,93,172,94,172,95,172,96,215,193,172,97,172,98,231,250,231,249,172,99,231,251,172,100,231,247,172,101,231,254,172,102,231,253,172,103,231,252,172,104,172,105,193,213,199,217,197,253,197,195,172,106,172,107,172,108,172,109,172,110,199,237,172,111,172,112,172,113,172,114,232,163,172,115,172,116,172,117,172,118,172,119,172,120,172,121,172,122,172,123,172,124,172,125,172,126,172,128,172,129,172,130,172,131,172,132,172,133,172,134,232,166,172,135,232,165,172,136,232,167,186,247,231,248,232,164,172,137,200,240,201,170,172,138,172,139,172,140,172,141,172,142,172,143,172,144,172,145,172,146,172,147,172,148,172,149,172,150,232,169,172,151,172,152,185,229,172,153,172,154,172,155,172,156,172,157,209,254,232,168,172,158,172,159,172,160,173,64,173,65,173,66,232,170,173,67,232,173,232,174,173,68,193,167,173,69,173,70,173,71,232,175,173,72,173,73,173,74,232,176,173,75,173,76,232,172,173,77,232,180,173,78,173,79,173,80,173,81,173,82,173,83,173,84,173,85,173,86,173,87,173,88,232,171,173,89,232,177,173,90,173,91,173,92,173,93,173,94,173,95,173,96,173,97,232,181,232,178,232,179,173,98,173,99,173,100,173,101,173,102,173,103,173,104,173,105,173,106,173,107,173,108,173,109,173,110,173,111,173,112,173,113,232,183,173,114,173,115,173,116,173,117,173,118,173,119,173,120,173,121,173,122,173,123,173,124,173,125,173,126,173,128,173,129,173,130,173,131,173,132,173,133,173,134,173,135,173,136,173,137,232,182,173,138,173,139,173,140,173,141,173,142,173,143,173,144,173,145,173,146,185,207,173,147,240,172,173,148,240,173,173,149,198,176,176,234,200,191,173,150,205,223,173,151,173,152,173,153,173,154,173,155,173,156,173,157,206,205,234,177,173,158,173,159,173,160,174,64,234,178,174,65,198,191,180,201,174,66,174,67,174,68,174,69,174,70,174,71,174,72,234,179,174,73,174,74,174,75,174,76,213,231,174,77,174,78,174,79,174,80,174,81,174,82,174,83,174,84,221,249,174,85,234,180,174,86,234,181,174,87,234,182,174,88,174,89,174,90,174,91,184,202,223,176,201,245,174,92,204,240,174,93,174,94,201,250,174,95,174,96,174,97,174,98,174,99,201,251,174,100,174,101,211,195,203,166,174,102,184,166,240,174,177,194,174,103,229,184,204,239,211,201,188,215,201,234,174,104,181,231,174,105,196,208,181,233,174,106,238,174,187,173,174,107,174,108,231,222,174,109,238,175,174,110,174,111,174,112,174,113,179,169,174,114,174,115,238,178,174,116,174,117,238,177,189,231,174,118,238,176,206,183,174,119,174,120,174,121,174,122,197,207,174,123,174,124,174,125,174,126,193,244,219,206,238,179,208,243,174,128,174,129,174,130,174,131,174,132,174,133,174,134,174,135,194,212,198,232,174,136,174,137,174,138,183,172,174,139,174,140,174,141,174,142,174,143,174,144,174,145,238,180,174,146,179,235,174,147,174,148,174,149,187,251,238,181,174,150,174,151,174,152,174,153,174,154,231,220,174,155,174,156,174,157,238,182,174,158,174,159,189,174,174,160,175,64,175,65,175,66,241,226,175,67,175,68,175,69,202,232,175,70,210,201,240,218,175,71,240,219,175,72,240,220,193,198,175,73,184,237,190,206,175,74,175,75,240,222,175,76,197,177,240,221,209,241,175,77,240,224,176,204,189,234,175,78,175,79,175,80,175,81,175,82,210,223,240,223,175,83,180,175,183,232,240,230,240,229,198,163,240,225,240,226,180,195,175,84,175,85,240,227,213,238,175,86,175,87,204,219,190,210,188,178,175,88,175,89,175,90,240,232,240,231,240,228,178,161,175,91,214,162,211,184,190,183,200,172,175,92,175,93,240,234,175,94,175,95,175,96,175,97,209,247,175,98,214,204,186,219,240,233,175,99,182,187,175,100,175,101,205,180,175,102,175,103,198,166,175,104,175,105,175,106,193,161,240,235,240,238,175,107,240,237,240,240,240,236,175,108,187,190,240,239,175,109,175,110,175,111,175,112,204,181,240,242,175,113,175,114,179,213,175,115,175,116,175,117,175,118,177,212,175,119,175,120,240,243,175,121,175,122,240,244,240,246,180,225,175,123,240,241,175,124,240,247,175,125,175,126,175,128,175,129,240,250,175,130,240,248,175,131,175,132,175,133,240,245,175,134,175,135,175,136,175,137,240,253,175,138,240,249,240,252,240,254,175,139,241,161,175,140,175,141,175,142,206,193,241,164,175,143,241,163,175,144,193,246,240,251,202,221,175,145,175,146,180,241,177,241,204,177,175,147,241,166,175,148,175,149,241,167,175,150,175,151,241,172,213,206,241,169,175,152,175,153,200,179,175,154,175,155,175,156,241,162,175,157,241,171,241,168,241,165,175,158,175,159,241,170,175,160,176,64,176,65,176,66,176,67,176,68,176,69,176,70,176,169,241,173,176,71,176,72,176,73,176,74,176,75,176,76,241,175,176,77,241,177,176,78,176,79,176,80,176,81,176,82,241,176,176,83,241,174,176,84,176,85,176,86,176,87,209,162,176,88,176,89,176,90,176,91,176,92,176,93,176,94,241,178,176,95,176,96,176,97,241,179,176,98,176,99,176,100,176,101,176,102,176,103,176,104,176,105,185,239,176,106,176,107,181,199,176,108,176,215,176,217,176,109,176,110,176,111,212,237,176,112,181,196,176,113,189,212,187,202,240,167,176,114,176,115,184,222,176,116,176,117,240,168,176,118,176,119,176,168,176,120,240,169,176,121,176,122,205,238,176,123,176,124,240,170,176,125,176,126,176,128,176,129,176,130,176,131,176,132,176,133,176,134,176,135,240,171,176,136,176,137,176,138,176,139,176,140,176,141,176,142,176,143,176,144,198,164,176,145,176,146,214,229,241,228,176,147,241,229,176,148,176,149,176,150,176,151,176,152,176,153,176,154,176,155,176,156,176,157,195,243,176,158,176,159,211,219,176,160,177,64,214,209,197,232,177,65,211,175,177,66,210,230,177,67,177,68,238,193,176,187,213,181,209,206,188,224,186,208,177,69,191,248,177,70,184,199,181,193,197,204,177,71,177,72,202,162,177,73,177,74,177,75,195,203,177,76,177,77,177,78,177,79,177,80,238,194,177,81,177,82,177,83,177,84,177,85,177,86,177,87,177,88,196,191,182,162,177,89,237,236,195,164,177,90,214,177,177,91,177,92,177,93,207,224,237,239,177,94,177,95,197,206,177,96,182,220,177,97,177,98,202,161,177,99,177,100,237,237,177,101,177,102,237,240,237,241,195,188,177,103,191,180,177,104,237,238,177,105,177,106,177,107,177,108,177,109,177,110,177,111,177,112,177,113,177,114,177,115,237,244,237,242,177,116,177,117,177,118,177,119,213,230,195,223,177,120,237,243,177,121,177,122,177,123,237,246,177,124,213,163,209,163,177,125,177,126,177,128,237,245,177,129,195,208,177,130,177,131,177,132,177,133,177,134,237,247,191,244,190,236,237,248,177,135,204,247,177,136,209,219,177,137,177,138,177,139,215,197,213,246,177,140,237,252,177,141,177,142,177,143,237,251,177,144,177,145,177,146,177,147,177,148,177,149,177,150,177,151,237,249,237,250,177,152,177,153,177,154,177,155,177,156,177,157,177,158,177,159,237,253,190,166,177,160,178,64,178,65,178,66,178,67,203,175,238,161,182,189,178,68,238,162,196,192,178,69,237,254,178,70,178,71,189,222,178,199,178,72,178,73,178,74,178,75,178,76,178,77,178,78,178,79,178,80,178,81,178,82,178,83,182,195,178,84,178,85,178,86,238,165,216,186,238,163,238,166,178,87,178,88,178,89,195,233,179,242,178,90,178,91,178,92,178,93,178,94,178,95,238,167,238,164,207,185,178,96,178,97,238,168,194,247,178,98,178,99,178,100,178,101,178,102,178,103,178,104,178,105,178,106,178,107,178,108,178,109,238,169,238,170,178,110,222,171,178,111,178,112,198,179,178,113,199,198,178,114,214,245,181,201,178,115,203,178,178,116,178,117,178,118,238,171,178,119,178,120,205,171,178,121,238,172,178,122,178,123,178,124,178,125,178,126,213,176,178,128,238,173,178,129,246,196,178,130,178,131,178,132,178,133,178,134,178,135,178,136,178,137,178,138,178,139,178,140,178,141,178,142,219,199,178,143,178,144,178,145,178,146,178,147,178,148,178,149,178,150,178,151,180,163,178,152,178,153,178,154,195,172,241,230,178,155,178,156,178,157,178,158,178,159,202,184,210,211,178,160,214,170,179,64,239,242,179,65,190,216,179,66,189,195,239,243,182,204,176,171,179,67,179,68,179,69,179,70,202,175,179,71,179,72,237,182,179,73,237,183,179,74,179,75,179,76,179,77,206,249,183,175,191,243,237,184,194,235,201,176,179,78,179,79,179,80,179,81,179,82,179,83,237,185,179,84,179,85,198,246,191,179,179,86,179,87,179,88,237,188,197,248,179,89,209,208,179,90,215,169,237,186,237,187,179,91,209,226,179,92,237,191,237,192,179,93,237,196,179,94,179,95,179,96,237,200,179,97,237,198,237,206,213,232,179,98,237,201,179,99,179,100,237,199,237,190,179,101,179,102,197,233,179,103,179,104,179,105,198,198,179,106,179,107,201,233,212,210,237,193,237,194,237,195,237,197,179,108,192,249,179,109,180,161,179,110,179,111,179,112,179,113,185,232,179,114,237,208,179,115,179,116,179,117,179,118,237,209,179,119,237,202,179,120,237,207,179,121,206,248,179,122,179,123,203,182,237,204,237,205,179,124,179,125,179,126,179,128,179,129,207,245,179,130,179,131,179,132,179,133,179,134,179,135,179,136,179,137,179,138,179,139,179,140,179,141,237,210,193,242,211,178,237,203,200,183,179,142,179,143,179,144,179,145,179,146,179,147,179,148,179,149,188,239,179,150,179,151,179,152,179,153,197,240,179,154,179,155,179,156,179,157,179,158,179,159,179,160,180,64,180,65,180,66,237,214,180,67,181,239,180,68,180,69,194,181,176,173,203,233,180,70,180,71,177,174,180,72,237,212,180,73,180,74,180,75,205,235,181,226,180,76,237,213,237,211,237,215,180,77,180,78,181,250,180,79,237,216,180,80,237,217,180,81,237,220,180,82,177,204,180,83,180,84,180,85,180,86,180,87,180,88,180,89,180,90,197,246,188,238,237,218,204,188,178,234,180,91,180,92,180,93,180,94,237,219,180,95,180,96,180,97,180,98,196,235,180,99,180,100,180,197,180,101,180,102,180,103,176,245,180,104,180,105,180,106,237,223,192,218,180,232,180,107,180,108,180,109,180,110,197,205,180,111,180,112,180,113,237,221,191,196,180,114,180,115,180,116,237,222,180,117,180,118,180,119,180,120,180,121,180,122,180,123,180,124,180,125,180,126,180,128,180,129,180,130,180,131,196,165,180,132,180,133,180,134,237,224,180,135,180,136,180,137,180,138,180,139,237,225,180,140,237,227,180,141,180,142,193,215,180,143,180,144,187,199,180,145,180,146,180,147,180,148,180,149,180,150,189,184,180,151,180,152,180,153,237,226,180,154,180,155,180,156,180,157,180,158,180,159,180,160,181,64,181,65,181,66,181,67,181,68,181,69,237,228,181,70,181,71,181,72,181,73,181,74,181,75,181,76,181,77,181,78,181,79,237,230,181,80,181,81,181,82,181,83,181,84,237,229,181,85,181,86,181,87,181,88,181,89,181,90,181,91,181,92,181,93,181,94,181,95,181,96,181,97,181,98,181,99,237,231,181,100,181,101,181,102,181,103,181,104,202,190,236,234,192,241,181,105,201,231,181,106,236,235,198,238,181,107,181,108,181,109,181,110,236,236,181,111,198,237,236,237,181,112,181,113,181,114,181,115,181,116,181,117,181,118,181,119,181,120,236,240,181,121,181,122,215,230,236,243,181,123,181,124,236,241,236,238,236,239,215,163,201,241,203,238,236,244,181,125,236,242,181,126,181,128,207,233,181,129,236,246,198,177,181,130,181,131,181,132,181,133,188,192,181,134,236,245,181,135,181,136,181,137,181,138,181,139,181,140,181,141,181,187,187,246,181,142,236,247,181,143,181,144,181,145,181,146,181,147,217,247,189,251,181,148,181,149,194,187,236,248,181,150,181,151,181,152,181,153,236,249,181,154,181,155,181,156,181,157,184,163,181,158,181,159,181,160,182,64,182,65,182,66,182,67,182,68,182,69,182,70,236,250,182,71,182,72,182,73,182,74,182,75,182,76,182,77,182,78,182,79,182,80,182,81,182,82,236,251,182,83,182,84,182,85,182,86,182,87,182,88,182,89,182,90,182,91,182,92,182,93,236,252,182,94,182,95,182,96,182,97,182,98,211,237,216,174,192,235,182,99,199,221,186,204,182,100,208,227,203,189,182,101,205,186,182,102,182,103,184,209,182,104,182,105,177,252,182,106,199,239,182,107,214,214,182,108,182,109,182,110,191,198,195,235,182,111,182,112,239,245,182,113,182,114,195,216,182,115,182,116,182,117,182,118,182,119,182,120,215,226,182,121,182,122,182,123,239,247,179,211,182,124,199,216,209,237,182,125,214,200,182,126,239,248,182,128,239,246,182,129,187,253,179,198,182,130,182,131,182,132,182,133,182,134,182,135,182,136,189,213,182,137,182,138,210,198,182,139,187,224,182,140,182,141,207,161,182,142,239,252,239,251,182,143,182,144,239,249,182,145,182,146,182,147,182,148,179,204,182,149,201,212,203,176,182,150,182,151,182,152,182,153,182,154,239,254,182,155,182,156,176,222,182,157,182,158,214,201,182,159,182,160,183,64,239,253,183,65,179,237,183,66,183,67,246,213,183,68,183,69,183,70,183,71,183,72,183,73,183,74,183,75,183,76,183,77,183,78,183,79,183,80,183,81,183,82,206,200,183,83,183,84,183,85,240,162,183,86,240,161,183,87,181,190,188,218,187,252,183,88,184,229,183,89,183,90,183,91,183,92,183,93,183,94,196,194,183,95,183,96,183,97,183,98,183,99,183,100,183,101,183,102,183,103,183,104,240,163,183,105,183,106,183,107,183,108,183,109,203,235,183,110,183,111,183,112,183,113,183,114,183,115,183,116,183,117,183,118,183,119,183,120,183,121,183,122,183,123,183,124,183,125,183,126,183,128,183,129,183,130,183,131,183,132,183,133,183,134,240,166,183,135,183,136,183,137,209,168,183,138,190,191,199,238,241,182,241,183,191,213,183,139,183,140,183,141,183,142,180,169,241,184,205,187,183,143,199,212,213,173,183,144,241,185,183,145,241,186,183,146,183,147,183,148,183,149,199,207,183,150,183,151,183,152,210,164,214,207,183,153,183,154,241,187,189,209,180,176,190,189,183,155,183,156,183,157,180,220,206,209,183,158,191,223,241,189,183,159,183,160,184,64,184,65,191,250,241,188,184,66,241,191,184,67,184,68,184,69,241,190,241,192,184,70,184,71,184,72,184,73,184,74,241,193,184,75,184,76,184,77,184,78,184,79,184,80,184,81,184,82,184,83,184,84,184,85,193,254,184,86,184,87,184,88,184,89,184,90,184,91,184,92,184,93,184,94,184,95,184,96,193,162,184,97,184,98,184,99,184,100,184,101,184,102,184,103,184,104,184,105,184,106,202,250,184,107,184,108,213,190,184,109,184,110,184,111,184,112,190,186,190,185,213,194,184,113,184,114,191,162,184,115,205,175,241,181,184,116,184,117,184,118,184,119,184,120,184,121,189,223,184,122,182,203,184,123,184,124,184,125,184,126,184,128,184,129,184,130,184,131,184,132,214,241,243,195,184,133,184,134,243,196,184,135,184,205,184,136,184,137,184,138,243,198,243,199,184,139,176,202,184,140,243,197,184,141,243,201,203,241,184,142,184,143,184,144,243,203,184,145,208,166,184,146,184,147,177,202,243,200,184,148,184,149,184,150,243,207,184,151,181,209,184,152,184,153,243,215,184,154,243,210,184,155,184,156,184,157,243,212,243,211,183,251,184,158,177,191,184,159,243,206,243,202,181,218,184,160,243,208,185,64,185,65,243,209,185,66,243,213,185,67,185,68,185,69,185,70,243,205,185,71,188,227,185,72,193,253,185,73,243,214,185,74,185,75,185,76,185,77,185,78,185,79,243,218,185,80,243,204,185,81,181,200,185,82,189,238,243,220,185,83,185,84,183,164,191,240,214,254,205,178,185,85,180,240,185,86,178,223,185,87,243,216,185,88,243,217,201,184,185,89,243,221,185,90,185,91,243,222,185,92,243,225,185,93,185,94,185,95,185,96,185,97,185,98,185,99,185,100,185,101,185,102,185,103,243,223,185,104,185,105,243,227,243,226,185,106,185,107,243,219,185,108,191,234,185,109,179,239,185,110,243,224,185,111,185,112,199,169,185,113,188,242,185,114,185,115,185,116,185,117,243,235,185,118,185,119,185,120,185,121,185,122,185,123,185,124,185,191,185,125,185,126,243,228,185,128,185,129,185,130,178,173,187,254,185,131,203,227,185,132,185,133,185,134,185,135,243,237,243,233,185,136,185,137,185,138,185,220,243,238,185,139,185,140,185,141,243,229,243,230,243,234,194,225,243,236,243,239,243,232,188,253,185,142,185,143,185,144,207,228,185,145,185,146,243,240,185,147,185,148,185,149,243,231,185,150,185,151,185,152,185,153,185,154,185,155,185,156,185,157,243,242,185,158,185,159,185,160,186,64,215,173,198,170,186,65,186,66,186,67,186,68,243,243,186,69,186,70,186,71,186,72,243,241,186,73,194,168,186,74,186,75,186,76,186,77,186,78,184,221,243,245,186,79,186,80,243,244,186,81,186,82,186,83,180,219,186,84,186,85,186,86,243,246,243,247,186,87,186,88,186,89,243,248,186,90,186,91,186,92,192,186,186,93,186,94,192,233,186,95,186,96,186,97,186,98,186,99,197,241,186,100,186,101,186,102,186,103,243,251,186,104,243,250,186,105,186,106,186,107,186,108,186,109,186,110,186,111,186,112,180,216,186,113,186,114,186,115,243,254,243,249,186,116,186,117,243,252,186,118,186,119,186,120,186,121,186,122,186,123,243,253,186,124,186,125,186,126,186,128,186,129,186,130,186,131,186,132,244,161,186,133,186,134,186,135,186,136,186,137,186,138,244,163,187,201,186,139,186,140,244,162,186,141,186,142,186,143,186,144,186,145,186,146,186,147,186,148,186,149,186,150,186,151,186,152,186,153,244,164,186,154,186,155,186,156,186,157,186,158,186,159,178,190,244,166,244,165,186,160,187,64,187,65,187,66,187,67,187,68,187,69,187,70,187,71,187,72,187,73,188,174,187,74,187,75,187,76,187,77,187,78,187,79,187,80,187,81,187,82,187,83,187,84,187,85,187,86,187,87,187,88,187,89,187,90,187,91,187,92,187,93,187,94,187,95,187,96,187,97,187,98,187,99,187,100,187,101,187,102,187,103,187,104,187,105,187,106,187,107,187,108,187,109,187,110,195,215,217,225,187,111,187,112,187,113,187,114,187,115,187,116,192,224,244,204,215,209,187,117,187,118,187,119,187,120,187,121,187,122,187,123,187,124,187,125,187,126,187,128,183,219,187,129,187,130,187,131,187,132,187,133,187,134,187,135,244,206,193,163,187,136,187,137,198,201,187,138,180,214,213,179,187,139,187,140,187,141,244,208,244,207,244,209,203,218,187,142,187,143,244,210,187,144,212,193,214,224,187,145,187,146,187,147,187,148,183,224,187,149,187,150,187,151,193,184,187,152,187,153,193,187,244,211,190,172,187,154,187,155,187,156,187,157,187,158,180,226,187,159,187,160,244,212,244,213,190,171,188,64,188,65,244,214,188,66,188,67,188,68,244,219,188,69,244,215,244,218,188,70,186,253,188,71,244,216,244,217,188,72,188,73,188,74,188,75,188,76,188,77,188,78,184,226,204,199,244,220,188,79,178,218,188,80,188,81,195,211,188,82,188,83,212,227,191,183,188,84,188,85,188,86,188,87,188,88,188,89,188,90,244,221,188,91,188,92,188,93,188,94,188,95,188,96,197,180,188,97,188,98,188,99,188,100,188,101,188,102,188,103,188,104,244,233,188,105,188,106,207,181,188,107,188,108,188,109,188,110,188,111,188,112,188,113,188,114,188,115,188,116,188,117,188,118,188,119,188,120,206,201,188,121,188,122,188,123,188,124,188,125,188,126,188,128,188,129,188,130,188,131,188,132,188,133,188,134,188,135,188,136,188,137,188,138,188,139,188,140,188,141,188,142,203,216,188,143,203,247,188,144,188,145,188,146,188,147,189,244,188,148,188,149,188,150,215,207,188,151,188,152,188,153,192,219,188,154,188,155,188,156,188,157,188,158,188,159,188,160,189,64,189,65,189,66,189,67,189,68,189,69,189,70,189,71,189,72,189,73,189,74,189,75,189,76,189,77,189,78,189,79,189,80,189,81,189,82,189,83,189,84,189,85,189,86,189,87,189,88,189,89,189,90,189,91,189,92,189,93,189,94,189,95,189,96,189,97,189,98,189,99,189,100,189,101,189,102,189,103,189,104,189,105,189,106,189,107,189,108,189,109,189,110,189,111,189,112,189,113,189,114,189,115,189,116,189,117,189,118,208,245,189,119,189,120,189,121,189,122,189,123,189,124,189,125,189,126,244,234,189,128,189,129,189,130,189,131,189,132,189,133,189,134,189,135,189,136,189,137,189,138,189,139,189,140,189,141,189,142,189,143,189,144,189,145,189,146,189,147,189,148,189,149,189,150,189,151,189,152,189,153,189,154,189,155,189,156,189,157,189,158,189,159,189,160,190,64,190,65,190,66,190,67,190,68,190,69,190,70,190,71,190,72,190,73,190,74,190,75,190,76,244,235,190,77,190,78,190,79,190,80,190,81,190,82,190,83,244,236,190,84,190,85,190,86,190,87,190,88,190,89,190,90,190,91,190,92,190,93,190,94,190,95,190,96,190,97,190,98,190,99,190,100,190,101,190,102,190,103,190,104,190,105,190,106,190,107,190,108,190,109,190,110,190,111,190,112,190,113,190,114,190,115,190,116,190,117,190,118,190,119,190,120,190,121,190,122,190,123,190,124,190,125,190,126,190,128,190,129,190,130,190,131,190,132,190,133,190,134,190,135,190,136,190,137,190,138,190,139,190,140,190,141,190,142,190,143,190,144,190,145,190,146,190,147,190,148,190,149,190,150,190,151,190,152,190,153,190,154,190,155,190,156,190,157,190,158,190,159,190,160,191,64,191,65,191,66,191,67,191,68,191,69,191,70,191,71,191,72,191,73,191,74,191,75,191,76,191,77,191,78,191,79,191,80,191,81,191,82,191,83,191,84,191,85,191,86,191,87,191,88,191,89,191,90,191,91,191,92,191,93,191,94,191,95,191,96,191,97,191,98,191,99,191,100,191,101,191,102,191,103,191,104,191,105,191,106,191,107,191,108,191,109,191,110,191,111,191,112,191,113,191,114,191,115,191,116,191,117,191,118,191,119,191,120,191,121,191,122,191,123,191,124,191,125,191,126,191,128,247,227,191,129,191,130,191,131,191,132,191,133,183,177,191,134,191,135,191,136,191,137,191,138,244,237,191,139,191,140,191,141,191,142,191,143,191,144,191,145,191,146,191,147,191,148,191,149,191,150,191,151,191,152,191,153,191,154,191,155,191,156,191,157,191,158,191,159,191,160,192,64,192,65,192,66,192,67,192,68,192,69,192,70,192,71,192,72,192,73,192,74,192,75,192,76,192,77,192,78,192,79,192,80,192,81,192,82,192,83,192,84,192,85,192,86,192,87,192,88,192,89,192,90,192,91,192,92,192,93,192,94,192,95,192,96,192,97,192,98,192,99,215,235,192,100,192,101,192,102,192,103,192,104,192,105,192,106,192,107,192,108,192,109,192,110,192,111,192,112,192,113,192,114,192,115,192,116,192,117,192,118,192,119,192,120,192,121,192,122,192,123,244,238,192,124,192,125,192,126,230,249,190,192,230,250,186,236,230,251,207,203,230,252,212,188,188,182,230,253,230,254,188,205,200,210,206,179,231,161,192,128,180,191,231,162,201,180,184,217,196,201,192,129,215,221,194,218,183,215,214,189,206,198,183,196,192,130,192,131,197,166,231,163,207,223,231,164,231,165,231,166,193,183,215,233,201,240,207,184,214,175,214,213,231,167,176,237,231,168,231,169,201,220,210,239,190,173,231,170,176,243,200,222,189,225,231,171,200,198,192,132,231,172,187,230,184,248,209,164,231,173,194,231,190,248,189,202,205,179,231,174,231,175,190,238,208,229,192,133,203,231,204,208,188,204,231,176,188,168,208,247,231,177,192,134,208,248,231,178,231,179,180,194,231,180,231,181,201,254,206,172,195,224,231,183,177,193,179,241,192,135,231,184,231,185,215,219,213,192,231,186,194,204,215,186,231,187,231,188,231,189,188,234,195,229,192,194,231,190,231,191,188,169,192,136,231,192,231,193,231,182,182,208,231,194,192,137,231,195,231,196,187,186,181,222,194,198,177,224,231,197,212,181,231,198,184,191,231,200,231,199,183,236,192,138,231,201,178,248,231,202,231,203,231,204,231,205,231,206,231,207,231,208,211,167,203,245,231,209,231,210,231,211,231,212,201,201,231,213,231,214,231,215,231,216,231,217,189,201,231,218,243,190,192,139,184,215,192,140,200,177,192,141,192,142,192,143,192,144,192,145,192,146,192,147,243,191,192,148,243,192,243,193,192,149,192,150,192,151,192,152,192,153,192,154,192,155,192,156,192,157,192,158,185,222,205,248,192,159,192,160,216,232,186,177,193,64,194,222,238,183,193,65,183,163,193,66,193,67,193,68,193,69,238,185,193,70,238,184,176,213,193,71,193,72,193,73,193,74,193,75,238,187,213,214,215,239,193,76,193,77,193,78,214,195,193,79,193,80,238,189,202,240,193,81,238,188,193,82,193,83,193,84,193,85,238,190,193,86,193,87,193,88,193,89,238,192,193,90,193,91,238,191,193,92,193,93,193,94,193,95,193,96,193,97,193,98,193,99,209,242,193,100,199,188,193,101,195,192,193,102,193,103,193,104,193,105,193,106,184,225,193,107,193,108,193,109,193,110,193,111,193,231,193,112,193,113,244,198,208,223,244,199,193,114,207,219,193,115,193,116,200,186,193,117,193,118,244,200,193,119,193,120,193,121,193,122,193,123,193,124,193,125,244,201,244,202,193,126,244,203,193,128,193,129,193,130,193,131,193,132,217,250,184,254,193,133,193,134,229,241,211,240,193,135,244,224,193,136,206,204,193,137,193,138,193,139,179,225,193,140,193,141,193,142,193,143,241,180,193,144,210,238,193,145,244,225,193,146,193,147,193,148,193,149,193,150,207,232,244,226,193,151,193,152,199,204,193,153,193,154,193,155,193,156,193,157,193,158,181,212,180,228,244,228,193,159,193,160,194,64,244,227,244,229,194,65,194,66,244,230,194,67,194,68,194,69,194,70,244,231,194,71,186,178,176,191,194,72,244,232,194,73,194,74,194,75,194,76,194,77,194,78,194,79,183,173,210,237,194,80,194,81,194,82,210,171,192,207,194,83,191,188,235,163,213,223,234,200,194,84,194,85,194,86,194,87,241,243,182,248,203,163,194,88,194,89,196,205,194,90,241,231,194,91,241,232,184,251,241,233,186,196,212,197,176,210,194,92,194,93,241,234,194,94,194,95,194,96,241,235,194,97,241,236,194,98,194,99,241,237,241,238,241,239,241,241,241,240,197,213,194,100,194,101,194,102,194,103,194,104,194,105,241,242,194,106,182,250,194,107,241,244,210,174,222,199,203,202,194,108,194,109,179,220,194,110,181,162,194,111,185,162,194,112,194,113,196,244,241,245,194,114,194,115,241,246,194,116,194,117,194,118,193,196,193,251,214,176,241,247,194,119,194,120,194,121,194,122,241,248,194,123,193,170,194,124,194,125,194,126,198,184,194,128,190,219,194,129,194,130,194,131,194,132,194,133,194,134,194,135,194,136,194,137,194,138,194,139,194,140,194,141,194,142,241,249,180,207,194,143,194,144,194,145,194,146,194,147,194,148,241,250,194,149,194,150,194,151,194,152,194,153,194,154,194,155,194,156,194,157,194,158,194,159,194,160,195,64,237,178,237,177,195,65,195,66,203,224,210,222,195,67,203,193,213,216,195,68,200,226,195,69,192,223,188,161,195,70,195,71,195,72,195,73,195,74,195,75,235,193,195,76,195,77,208,164,195,78,214,226,195,79,182,199,184,216,235,192,184,206,195,80,235,191,179,166,185,201,214,171,195,81,183,244,183,202,195,82,195,83,195,84,188,231,183,190,235,198,195,85,235,199,176,185,191,207,195,86,235,197,211,253,195,87,235,200,195,88,195,89,235,201,195,90,195,91,183,206,195,92,235,194,235,196,201,246,214,215,213,205,208,178,235,207,206,184,235,208,195,93,181,168,195,94,195,95,195,96,195,97,195,98,177,179,235,210,204,165,195,99,195,100,195,101,195,102,195,103,195,104,195,105,197,214,235,211,195,106,235,209,197,223,235,206,202,164,235,213,176,251,195,107,195,108,186,250,195,109,195,110,216,183,241,227,195,111,235,202,235,203,235,204,235,205,235,214,230,192,235,217,195,112,191,232,210,200,235,215,235,220,184,236,235,216,195,113,189,186,195,114,208,216,195,115,176,183,195,116,235,221,196,220,195,117,195,118,195,119,195,120,214,172,195,121,195,122,195,123,180,224,195,124,195,125,194,246,188,185,195,126,195,128,235,218,235,219,212,224,198,234,196,212,235,223,197,167,217,245,195,129,178,177,195,130,235,228,195,131,189,197,195,132,195,133,195,134,235,226,195,135,195,136,195,137,195,138,195,139,195,140,195,141,195,142,195,143,195,144,195,145,195,146,195,147,235,227,195,148,195,149,184,172,195,150,205,209,235,229,195,151,195,152,195,153,235,225,195,154,193,179,195,155,195,156,195,157,195,158,195,159,198,162,195,160,196,64,196,65,196,66,196,67,196,68,196,69,204,243,196,70,235,230,196,71,192,176,210,184,235,231,196,72,196,73,196,74,184,175,184,173,196,75,235,232,199,187,205,243,196,76,196,77,196,78,235,234,235,235,196,79,196,80,196,81,196,82,196,83,235,237,196,84,196,85,196,86,196,87,208,200,196,88,235,242,196,89,235,238,196,90,196,91,196,92,235,241,200,249,196,93,209,252,235,236,196,94,196,95,235,233,196,96,196,97,196,98,196,99,184,185,207,217,196,229,235,239,235,240,204,218,205,200,176,242,196,100,235,246,196,101,196,102,196,103,196,104,196,105,235,245,196,106,178,178,196,107,196,108,196,109,196,110,184,224,196,111,235,247,196,112,196,113,196,114,196,115,196,116,196,117,177,236,196,118,196,119,204,197,196,164,207,165,196,120,196,121,196,122,196,123,196,124,235,249,196,125,196,126,236,162,196,128,197,242,196,129,235,250,196,130,196,131,196,132,196,133,196,134,196,135,196,136,196,137,201,197,196,138,196,139,196,140,196,141,196,142,196,143,226,223,235,254,196,144,196,145,196,146,196,147,205,206,236,161,177,219,211,183,196,148,196,149,210,220,196,150,196,151,196,152,235,253,196,153,235,251,196,154,196,155,196,156,196,157,196,158,196,159,196,160,197,64,197,65,197,66,197,67,197,68,197,69,197,70,197,71,197,72,197,73,197,74,197,75,197,76,197,77,197,78,179,188,197,79,197,80,197,81,234,176,197,82,197,83,215,212,197,84,244,171,179,244,197,85,197,86,197,87,197,88,197,89,214,193,214,194,197,90,197,91,197,92,197,93,197,94,197,95,213,233,190,202,197,96,244,167,197,97,210,168,244,168,244,169,197,98,244,170,190,203,211,223,197,99,197,100,197,101,197,102,197,103,201,224,201,225,197,104,197,105,243,194,197,106,202,230,197,107,204,242,197,108,197,109,197,110,197,111,197,112,197,113,226,182,203,180,197,114,206,232,214,219,197,115,244,173,244,174,244,175,197,116,197,117,197,118,197,119,244,178,197,120,186,189,244,179,176,227,244,176,197,121,244,177,189,162,178,213,197,122,244,182,244,183,182,230,178,176,207,207,244,180,180,172,197,123,244,181,197,124,197,125,244,184,197,126,197,128,197,129,197,130,197,131,244,185,197,132,197,133,205,167,197,134,244,186,197,135,244,187,197,136,197,137,197,138,244,188,197,139,197,140,197,141,197,142,197,143,197,144,197,145,197,146,203,210,197,147,244,189,197,148,197,149,197,150,197,151,244,190,197,152,197,153,197,154,197,155,197,156,197,157,197,158,197,159,244,191,197,160,198,64,198,65,198,66,198,67,244,222,193,188,188,232,198,68,201,171,209,222,229,245,198,69,198,70,198,71,198,72,220,179,210,213,198,73,198,74,220,180,176,172,220,181,198,75,198,76,189,218,198,77,220,185,198,78,198,79,198,80,216,194,198,81,220,183,211,243,198,82,201,214,220,186,220,182,198,83,220,187,195,162,198,84,198,85,198,86,198,87,220,188,220,197,220,189,198,88,198,89,206,223,214,165,198,90,220,207,198,91,220,205,198,92,198,93,220,210,189,230,194,171,198,94,220,184,220,203,220,206,220,190,183,210,176,197,220,199,208,190,220,193,187,168,198,95,183,188,220,204,198,96,198,97,220,198,220,191,199,219,198,98,198,99,198,100,209,191,220,192,198,101,198,102,220,202,198,103,198,104,220,208,198,105,198,106,206,173,220,194,198,107,220,195,220,200,220,201,178,212,220,209,203,213,198,108,212,183,220,219,220,223,204,166,220,230,198,109,195,231,220,220,198,110,198,111,191,193,220,217,198,112,176,250,185,182,220,229,220,211,198,113,220,196,220,214,200,244,191,224,198,114,198,115,198,116,198,117,201,187,198,118,198,119,198,120,177,189,198,121,211,162,198,122,198,123,220,218,198,124,198,125,220,213,198,126,198,187,198,128,220,222,198,129,198,130,198,131,198,132,198,133,215,194,195,175,183,182,199,209,195,169,220,226,220,216,220,235,220,212,198,134,198,135,220,221,198,136,190,165,220,215,198,137,220,224,198,138,198,139,220,227,220,228,198,140,220,248,198,141,198,142,220,225,221,162,220,231,198,143,198,144,198,145,198,146,198,147,198,148,198,149,198,150,198,151,198,152,188,235,180,196,198,153,198,154,195,163,178,231,220,250,198,155,220,242,198,156,220,239,198,157,220,252,220,238,210,240,178,232,198,158,200,215,200,227,220,251,198,159,220,237,198,160,199,64,199,65,220,247,199,66,199,67,220,245,199,68,199,69,190,163,220,244,199,70,178,221,199,71,199,72,199,73,199,74,199,75,220,243,188,246,220,232,187,196,199,76,192,243,199,77,199,78,199,79,199,80,199,81,188,212,220,233,220,234,199,82,220,241,220,246,220,249,181,180,199,83,200,217,187,231,220,254,220,253,211,171,221,161,221,163,221,165,210,241,221,164,221,166,221,167,210,169,199,84,199,85,199,86,199,87,199,88,199,89,199,90,186,201,221,169,199,91,199,92,221,182,221,177,221,180,199,93,199,94,199,95,199,96,199,97,199,98,199,99,221,176,198,206,199,100,199,101,192,242,199,102,199,103,199,104,199,105,201,175,199,106,199,107,199,108,220,236,221,174,199,109,199,110,199,111,199,112,221,183,199,113,199,114,220,240,221,175,199,115,221,184,199,116,221,172,199,117,199,118,199,119,199,120,199,121,199,122,199,123,221,185,221,179,221,173,196,170,199,124,199,125,199,126,199,128,221,168,192,179,193,171,221,170,221,171,199,129,221,178,187,241,221,181,211,168,221,186,199,130,221,187,195,167,199,131,199,132,221,210,221,188,199,133,199,134,199,135,221,209,199,136,185,189,199,137,199,138,190,213,199,139,190,250,199,140,199,141,186,202,199,142,199,143,199,144,199,145,221,202,199,146,221,197,199,147,221,191,199,148,199,149,199,150,178,203,221,195,199,151,221,203,178,164,221,213,199,152,199,153,199,154,221,190,199,155,199,156,199,157,198,208,221,208,199,158,199,159,199,160,200,64,200,65,221,212,193,226,183,198,200,66,200,67,200,68,200,69,200,70,221,206,221,207,200,71,200,72,200,73,221,196,200,74,200,75,200,76,221,189,200,77,221,205,204,209,200,78,221,201,200,79,200,80,200,81,200,82,221,194,195,200,198,188,206,174,221,204,200,83,221,200,200,84,200,85,200,86,200,87,200,88,200,89,221,193,200,90,200,91,200,92,221,198,194,220,200,93,200,94,200,95,200,96,200,97,200,98,211,169,211,170,221,211,207,244,200,248,200,99,200,100,200,101,200,102,200,103,200,104,200,105,200,106,221,230,200,107,200,108,200,109,200,110,200,111,200,112,221,199,200,113,200,114,200,115,221,224,194,228,200,116,200,117,200,118,200,119,200,120,200,121,200,122,200,123,221,225,200,124,200,125,200,126,200,128,200,129,200,130,200,131,200,132,200,133,200,134,221,215,200,135,200,136,200,137,200,138,200,139,214,248,200,140,221,217,221,216,184,240,221,214,200,141,200,142,200,143,200,144,198,207,200,145,182,173,200,146,200,147,200,148,200,149,200,150,221,226,200,151,186,249,212,225,221,231,200,152,200,153,200,154,180,208,200,155,221,218,200,156,191,251,221,227,200,157,221,223,200,158,221,221,200,159,200,160,201,64,201,65,201,66,201,67,201,68,181,217,201,69,201,70,201,71,201,72,221,219,221,220,221,222,201,73,189,175,221,228,201,74,221,229,201,75,201,76,201,77,201,78,201,79,201,80,201,81,201,82,221,245,201,83,195,201,201,84,201,85,203,226,201,86,201,87,201,88,201,89,221,242,201,90,201,91,201,92,201,93,201,94,201,95,201,96,201,97,201,98,201,99,201,100,201,101,201,102,216,225,201,103,201,104,198,209,201,105,221,244,201,106,201,107,201,108,213,244,221,243,221,240,201,109,201,110,221,236,201,111,221,239,201,112,221,232,201,113,201,114,208,238,201,115,201,116,201,117,201,118,200,216,221,238,201,119,201,120,221,233,201,121,201,122,221,234,203,242,201,123,221,237,201,124,201,125,177,205,201,126,201,128,201,129,201,130,201,131,201,132,192,182,201,133,188,187,221,241,201,134,201,135,221,247,201,136,221,246,221,235,201,137,201,138,201,139,201,140,201,141,197,238,201,142,201,143,201,144,221,251,201,145,201,146,201,147,201,148,201,149,201,150,201,151,201,152,201,153,201,154,201,155,222,164,201,156,201,157,222,163,201,158,201,159,201,160,202,64,202,65,202,66,202,67,202,68,202,69,202,70,202,71,202,72,221,248,202,73,202,74,202,75,202,76,195,239,202,77,194,251,202,78,202,79,202,80,213,225,202,81,202,82,206,181,202,83,202,84,202,85,202,86,221,253,202,87,178,204,202,88,202,89,202,90,202,91,202,92,202,93,202,94,202,95,202,96,196,232,202,223,202,97,202,98,202,99,202,100,202,101,202,102,202,103,202,104,202,105,202,106,199,190,221,250,221,252,221,254,222,162,176,170,177,206,202,107,202,108,202,109,202,110,202,111,222,172,202,112,202,113,202,114,202,115,222,166,189,182,200,239,202,116,202,117,202,118,202,119,202,120,202,121,202,122,202,123,202,124,202,125,202,126,222,161,202,128,202,129,222,165,202,130,202,131,202,132,202,133,222,169,202,134,202,135,202,136,202,137,202,138,222,168,202,139,202,140,202,141,222,167,202,142,202,143,202,144,202,145,202,146,202,147,202,148,202,149,202,150,222,173,202,151,212,204,202,152,202,153,202,154,202,155,222,179,222,170,222,174,202,156,202,157,192,217,202,158,202,159,202,160,203,64,203,65,177,161,222,182,203,66,222,177,203,67,203,68,203,69,203,70,203,71,203,72,203,73,222,178,203,74,203,75,203,76,203,77,203,78,203,79,203,80,203,81,203,82,203,83,203,84,209,166,222,181,203,85,203,86,203,87,203,88,203,89,203,90,203,91,222,175,203,92,203,93,203,94,222,176,203,95,208,189,203,96,203,97,203,98,222,180,202,237,222,185,203,99,203,100,203,101,203,102,203,103,203,104,222,184,203,105,222,183,203,106,203,107,203,108,203,109,203,110,203,111,203,112,222,187,203,113,203,114,203,115,203,116,203,117,203,118,203,119,189,229,203,120,203,121,203,122,203,123,203,124,178,216,195,234,203,125,203,126,222,186,203,128,197,186,203,129,203,130,203,131,203,132,203,133,203,134,222,188,203,135,203,136,203,137,203,138,203,139,203,140,203,141,204,217,203,142,203,143,203,144,203,145,183,170,203,146,203,147,203,148,203,149,203,150,203,151,203,152,203,153,203,154,203,155,203,156,203,157,203,158,203,159,203,160,204,64,204,65,212,229,204,66,204,67,204,68,222,189,204,69,204,70,204,71,204,72,204,73,222,191,204,74,204,75,204,76,204,77,204,78,204,79,204,80,204,81,204,82,204,83,204,84,196,162,204,85,204,86,204,87,204,88,222,193,204,89,204,90,204,91,204,92,204,93,204,94,204,95,204,96,204,97,204,98,204,99,204,100,204,101,204,102,204,103,204,104,222,190,204,105,222,192,204,106,204,107,204,108,204,109,204,110,204,111,204,112,204,113,204,114,204,115,204,116,204,117,204,118,204,119,213,186,204,120,204,121,204,122,222,194,204,123,204,124,204,125,204,126,204,128,204,129,204,130,204,131,204,132,204,133,204,134,204,135,204,136,204,137,204,138,204,139,242,174,187,162,194,178,197,176,194,199,204,140,204,141,242,175,204,142,204,143,204,144,204,145,204,146,208,233,204,147,204,148,204,149,211,221,204,150,204,151,204,152,235,189,204,153,204,154,204,155,204,156,204,157,204,158,204,159,204,160,179,230,242,176,205,64,242,177,205,65,205,66,202,173,205,67,205,68,205,69,205,70,205,71,205,72,205,73,186,231,242,179,242,181,242,180,203,228,207,186,242,178,202,180,210,207,194,236,205,74,205,75,205,76,205,77,205,78,205,79,205,80,206,195,242,184,176,246,242,183,205,81,205,82,205,83,205,84,205,85,242,190,205,86,178,207,205,87,205,88,205,89,205,90,205,91,205,92,209,193,242,186,205,93,205,94,205,95,205,96,205,97,242,188,212,233,205,98,205,99,242,187,242,182,242,191,242,189,205,100,242,185,205,101,205,102,242,199,242,196,242,198,205,103,205,104,242,202,242,194,242,192,205,105,205,106,205,107,242,197,205,108,205,109,205,110,205,111,205,112,214,251,205,113,205,114,205,115,242,193,205,116,199,249,201,223,205,117,242,200,185,198,181,176,205,118,205,119,242,195,242,201,242,208,242,214,205,120,205,121,187,215,205,122,205,123,205,124,242,213,205,220,205,125,214,235,205,126,205,128,242,210,242,212,205,129,205,130,205,131,205,132,184,242,205,133,205,134,205,135,205,136,242,203,205,137,205,138,205,139,242,206,194,249,205,140,213,221,242,204,242,205,242,207,242,211,205,141,205,142,205,143,242,217,211,188,205,144,205,145,205,146,205,147,182,234,205,148,202,241,205,149,183,228,242,215,205,150,205,151,205,152,242,216,242,218,242,221,242,219,205,153,205,154,242,220,205,155,205,156,205,157,205,158,209,209,242,209,205,159,205,201,205,160,206,207,214,169,206,64,242,227,206,65,195,219,206,66,242,224,206,67,206,68,192,175,242,236,242,222,206,69,242,225,206,70,206,71,206,72,242,232,206,73,206,74,206,75,206,76,242,226,206,77,206,78,242,231,206,79,206,80,242,230,206,81,206,82,242,233,206,83,206,84,206,85,242,223,206,86,206,87,242,228,242,234,206,88,206,89,206,90,206,91,206,92,206,93,206,94,211,172,242,229,178,245,206,95,206,96,242,242,206,97,208,171,206,98,206,99,206,100,206,101,242,245,206,102,206,103,206,104,187,200,206,105,242,249,206,106,206,107,206,108,206,109,206,110,206,111,242,240,206,112,206,113,242,246,242,248,242,250,206,114,206,115,206,116,206,117,206,118,206,119,206,120,206,121,242,243,206,122,242,241,206,123,206,124,206,125,186,251,206,126,181,251,206,128,206,129,206,130,206,131,242,239,242,247,242,237,242,238,206,132,206,133,206,134,242,235,243,166,206,135,243,163,206,136,206,137,243,162,206,138,206,139,242,244,206,140,200,218,206,141,206,142,206,143,206,144,206,145,242,251,206,146,206,147,206,148,243,165,206,149,206,150,206,151,206,152,206,153,206,154,206,155,195,248,206,156,206,157,206,158,206,159,206,160,207,64,207,65,207,66,242,253,207,67,207,68,243,167,243,169,243,164,207,69,242,252,207,70,207,71,207,72,243,171,207,73,243,170,207,74,207,75,207,76,207,77,194,221,207,78,207,79,243,174,207,80,207,81,243,176,207,82,207,83,207,84,207,85,207,86,243,161,207,87,207,88,207,89,243,177,243,172,207,90,207,91,207,92,207,93,207,94,243,175,242,254,243,173,207,95,207,96,207,97,207,98,207,99,207,100,207,101,243,178,207,102,207,103,207,104,207,105,243,180,207,106,207,107,207,108,207,109,243,168,207,110,207,111,207,112,207,113,243,179,207,114,207,115,207,116,243,181,207,117,207,118,207,119,207,120,207,121,207,122,207,123,207,124,207,125,207,126,208,183,207,128,207,129,207,130,207,131,243,184,207,132,207,133,207,134,207,135,217,249,207,136,207,137,207,138,207,139,207,140,207,141,243,185,207,142,207,143,207,144,207,145,207,146,207,147,207,148,207,149,243,183,207,150,200,228,243,182,207,151,207,152,207,153,207,154,243,186,207,155,207,156,207,157,207,158,207,159,243,187,180,192,207,160,208,64,208,65,208,66,208,67,208,68,208,69,208,70,208,71,208,72,208,73,208,74,208,75,208,76,208,77,238,195,208,78,208,79,208,80,208,81,208,82,208,83,243,188,208,84,208,85,243,189,208,86,208,87,208,88,209,170,208,89,208,90,208,91,244,172,208,198,208,92,208,93,208,94,208,95,208,96,208,97,208,208,209,220,208,98,208,99,208,100,208,101,208,102,208,103,207,206,208,104,208,105,189,214,208,106,209,195,208,107,208,108,208,109,208,110,208,111,208,112,208,113,186,226,225,233,210,194,241,194,178,185,208,114,208,115,177,237,241,195,208,116,201,192,179,196,208,117,217,242,208,118,203,165,208,119,241,196,208,120,208,121,208,122,208,123,214,212,208,124,208,125,208,126,208,128,208,129,241,197,244,192,241,198,208,130,212,172,241,199,208,131,176,192,244,193,208,132,208,133,244,194,208,134,208,135,180,252,208,136,197,219,208,137,208,138,208,139,208,140,204,187,208,141,208,142,208,143,208,228,208,144,208,145,208,146,208,147,208,148,205,224,208,149,208,150,208,151,208,152,208,153,241,200,208,154,217,243,208,155,208,156,208,157,208,158,208,159,208,160,177,187,209,64,207,174,209,65,209,66,209,67,184,164,209,68,209,69,209,70,209,71,209,72,241,202,209,73,209,74,209,75,209,76,241,203,209,77,209,78,209,79,209,80,178,195,193,209,209,81,209,82,215,176,241,201,209,83,209,84,241,204,209,85,209,86,209,87,209,88,241,206,209,89,209,90,209,91,217,246,209,92,210,225,212,163,209,93,209,94,244,195,200,185,209,95,209,96,209,97,209,98,209,99,244,196,209,100,209,101,241,205,241,207,191,227,241,208,209,102,209,103,241,212,209,104,209,105,209,106,209,107,209,108,209,109,209,110,241,214,241,209,209,111,201,209,197,225,209,112,209,113,209,114,194,227,185,252,209,115,209,116,241,211,209,117,241,213,209,118,209,119,209,120,185,211,209,121,209,122,209,123,209,124,209,125,209,126,209,128,241,219,209,129,209,130,209,131,209,132,209,133,186,214,209,134,176,253,241,217,209,135,209,136,209,137,209,138,209,139,241,216,241,210,241,218,209,140,209,141,209,142,209,143,209,144,241,215,209,145,209,146,209,147,200,236,209,148,209,149,209,150,209,151,205,202,241,221,209,152,209,153,209,154,209,155,229,189,209,156,209,157,209,158,241,220,209,159,241,222,209,160,210,64,210,65,210,66,210,67,210,68,210,69,210,70,210,71,210,72,241,223,210,73,210,74,207,229,210,75,210,76,210,77,210,78,210,79,210,80,210,81,210,82,210,83,210,84,210,85,210,86,210,87,210,88,210,89,210,90,210,91,210,92,210,93,210,94,210,95,210,96,210,97,210,98,210,99,244,197,189,243,210,100,210,101,210,102,210,103,210,104,210,105,241,224,210,106,210,107,210,108,210,109,210,110,210,111,210,112,210,113,210,114,210,115,210,116,210,117,210,118,210,119,210,120,210,121,210,122,210,123,210,124,210,125,241,225,210,126,210,128,210,129,206,247,210,130,210,170,210,131,241,251,210,132,210,133,184,178,210,134,210,135,210,136,210,137,210,138,210,139,210,140,210,141,210,142,210,143,210,144,210,145,210,146,210,147,210,148,210,149,210,150,210,151,210,152,210,153,210,154,210,155,210,156,210,157,210,158,210,159,210,160,211,64,211,65,211,66,211,67,211,68,211,69,211,70,211,71,211,72,211,73,211,74,211,75,211,76,211,77,211,78,211,79,211,80,211,81,211,82,211,83,211,84,211,85,211,86,211,87,211,88,211,89,211,90,211,91,211,92,211,93,211,94,188,251,185,219,211,95,185,230,195,217,202,211,234,232,192,192,190,245,234,233,234,234,234,235,211,96,234,236,234,237,234,238,234,239,189,199,211,97,211,98,211,99,245,251,211,100,211,101,211,102,245,253,211,103,245,254,211,104,245,252,211,105,211,106,211,107,211,108,189,226,211,109,246,161,180,165,211,110,211,111,211,112,211,113,246,162,211,114,211,115,211,116,246,163,211,117,211,118,211,119,236,178,211,120,211,121,211,122,211,123,211,124,211,125,211,126,211,128,211,129,211,130,211,131,211,132,209,212,211,133,211,134,211,135,211,136,211,137,211,138,217,234,211,139,211,140,211,141,211,142,211,143,211,144,211,145,211,146,211,147,211,148,211,149,211,150,211,151,211,152,211,153,211,154,211,155,211,156,211,157,211,158,211,159,211,160,212,64,212,65,212,66,212,67,212,68,212,69,212,70,212,71,212,72,212,73,212,74,212,75,212,76,212,77,212,78,212,79,212,80,212,81,212,82,212,83,212,84,212,85,212,86,212,87,212,88,212,89,212,90,212,91,212,92,212,93,212,94,212,95,246,164,212,96,212,97,212,98,212,99,212,100,212,101,212,102,212,103,212,104,238,186,212,105,212,106,212,107,212,108,212,109,212,110,212,111,212,112,212,113,212,114,212,115,212,116,212,117,212,118,212,119,212,120,212,121,212,122,212,123,212,124,212,125,212,126,212,128,212,129,212,130,212,131,212,132,212,133,212,134,212,135,212,136,212,137,212,138,212,139,212,140,212,141,212,142,212,143,212,144,212,145,212,146,212,147,212,148,212,149,212,150,212,151,212,152,212,153,213,178,212,154,212,155,212,156,212,157,212,158,212,159,212,160,213,64,213,65,213,66,213,67,213,68,213,69,213,70,213,71,211,254,204,220,213,72,213,73,213,74,213,75,213,76,213,77,213,78,213,79,202,196,213,80,213,81,213,82,213,83,213,84,213,85,213,86,213,87,213,88,213,89,213,90,213,91,213,92,213,93,213,94,213,95,213,96,213,97,213,98,213,99,213,100,213,101,213,102,213,103,213,104,213,105,213,106,213,107,213,108,213,109,213,110,213,111,213,112,213,113,213,114,213,115,213,116,213,117,213,118,213,119,213,120,213,121,213,122,213,123,213,124,213,125,213,126,213,128,213,129,213,130,213,131,213,132,213,133,213,134,213,135,213,136,213,137,213,138,213,139,213,140,213,141,213,142,213,143,213,144,213,145,213,146,213,147,213,148,213,149,213,150,213,151,213,152,213,153,213,154,213,155,213,156,213,157,213,158,213,159,213,160,214,64,214,65,214,66,214,67,214,68,214,69,214,70,214,71,214,72,214,73,214,74,214,75,214,76,214,77,214,78,214,79,214,80,214,81,214,82,214,83,214,84,214,85,214,86,214,87,214,88,214,89,214,90,214,91,214,92,214,93,214,94,214,95,214,96,214,97,214,98,229,192,214,99,214,100,214,101,214,102,214,103,214,104,214,105,214,106,214,107,214,108,214,109,214,110,214,111,214,112,214,113,214,114,214,115,214,116,214,117,214,118,214,119,214,120,214,121,214,122,214,123,214,124,214,125,214,126,214,128,214,129,246,165,214,130,214,131,214,132,214,133,214,134,214,135,214,136,214,137,214,138,214,139,214,140,214,141,214,142,214,143,214,144,214,145,214,146,214,147,214,148,214,149,214,150,214,151,214,152,214,153,214,154,214,155,214,156,214,157,214,158,214,159,214,160,215,64,215,65,215,66,215,67,215,68,215,69,215,70,215,71,215,72,215,73,215,74,215,75,215,76,215,77,215,78,215,79,215,80,215,81,215,82,215,83,215,84,215,85,215,86,215,87,215,88,215,89,215,90,215,91,215,92,215,93,215,94,215,95,190,175,215,96,215,97,215,98,215,99,215,100,198,169,215,101,215,102,215,103,215,104,215,105,215,106,215,107,215,108,215,109,215,110,215,111,215,112,215,113,215,114,215,115,215,116,215,117,215,118,215,119,215,120,215,121,215,122,215,123,215,124,215,125,215,126,215,128,215,129,215,130,215,131,215,132,215,133,215,134,215,135,215,136,215,137,215,138,215,139,215,140,215,141,215,142,215,143,215,144,215,145,215,146,215,147,215,148,215,149,215,150,215,151,215,152,218,165,188,198,182,169,184,188,200,207,188,165,218,166,218,167,204,214,200,195,218,168,198,253,215,153,209,181,210,233,209,182,188,199,215,154,189,178,187,228,218,169,218,170,209,200,218,171,208,237,182,239,194,219,215,155,203,207,183,237,201,232,183,195,190,247,214,164,218,172,218,173,198,192,215,231,202,182,215,156,213,169,203,223,213,239,218,174,214,223,180,202,218,176,218,175,215,157,210,235,218,177,218,178,218,179,202,212,218,180,202,171,218,181,218,182,179,207,214,239,218,183,187,176,181,174,218,184,218,185,185,238,209,175,210,232,218,186,184,195,207,234,178,239,218,187,218,188,215,158,189,235,206,220,211,239,218,189,206,243,218,190,211,213,187,229,218,191,203,181,203,208,218,192,199,235,214,238,218,193,197,181,182,193,218,194,183,204,191,206,218,195,218,196,203,173,218,197,181,247,218,198,193,194,215,187,218,199,204,184,215,159,210,234,196,177,218,200,181,253,187,209,218,201,208,179,218,202,218,203,206,189,218,204,218,205,218,206,178,247,218,209,218,207,209,232,218,208,195,213,218,210,215,160,218,211,218,212,218,213,208,187,210,165,176,249,218,214,199,171,218,215,189,247,195,161,218,216,218,217,195,253,204,183,218,218,218,219,192,190,198,215,218,220,218,221,199,180,218,222,218,223,185,200,216,64,216,65,216,66,216,67,216,68,216,69,216,70,216,71,216,72,187,237,216,73,216,74,216,75,216,76,182,185,244,248,216,77,244,249,216,78,216,79,205,227,216,80,216,81,216,82,216,83,216,84,216,85,216,86,216,87,245,185,216,88,216,89,216,90,216,91,235,224,216,92,216,93,216,94,216,95,216,96,216,97,207,243,187,191,216,98,216,99,216,100,216,101,216,102,216,103,216,104,186,192,212,165,216,105,216,106,216,107,216,108,216,109,216,110,216,111,225,217,216,112,216,113,216,114,216,115,245,244,177,170,178,242,216,116,216,117,216,118,216,119,216,120,216,121,216,122,245,245,216,123,216,124,245,247,216,125,216,126,216,128,186,209,245,246,216,129,195,178,216,130,216,131,216,132,216,133,216,134,216,135,216,136,245,249,216,137,216,138,216,139,245,248,216,140,216,141,216,142,216,143,216,144,216,145,216,146,216,147,216,148,216,149,216,150,216,151,216,152,216,153,216,154,216,155,216,156,216,157,216,158,216,159,216,160,217,64,217,65,217,66,217,67,217,68,217,69,217,70,217,71,217,72,217,73,217,74,217,75,217,76,217,77,217,78,217,79,217,80,217,81,217,82,217,83,217,84,217,85,217,86,217,87,217,88,217,89,217,90,217,91,217,92,217,93,217,94,217,95,217,96,217,97,217,98,217,99,217,100,217,101,217,102,217,103,217,104,217,105,217,106,217,107,217,108,217,109,217,110,217,111,217,112,217,113,217,114,217,115,217,116,217,117,217,118,217,119,217,120,217,121,217,122,217,123,217,124,217,125,217,126,217,128,217,129,217,130,217,131,217,132,217,133,217,134,217,135,217,136,217,137,217,138,217,139,217,140,217,141,217,142,217,143,217,144,217,145,217,146,217,147,217,148,217,149,217,150,217,151,217,152,217,153,217,154,217,155,217,156,217,157,217,158,217,159,217,160,218,64,218,65,218,66,218,67,218,68,218,69,218,70,218,71,218,72,218,73,218,74,218,75,218,76,218,77,218,78,177,180,213,234,184,186,218,79,185,177,178,198,212,240,207,205,176,220,213,203,187,245,214,202,183,183,204,176,198,182,177,225,185,186,214,252,185,225,183,161,188,250,234,218,234,219,204,249,185,243,234,220,180,251,195,179,183,209,186,216,234,221,212,244,234,222,188,214,187,223,234,223,193,222,194,184,212,223,215,202,234,224,234,225,234,228,234,226,234,227,201,222,184,179,182,196,234,229,202,234,201,205,180,205,218,80,218,81,226,217,197,226,234,230,192,181,218,82,215,184,234,231,215,172,200,252,216,211,216,205,212,222,218,83,212,249,201,196,211,174,184,211,179,224,218,84,201,226,244,246,218,85,218,86,218,87,186,213,218,88,244,247,218,89,218,90,215,223,218,91,218,92,244,241,184,176,213,212,184,207,198,240,218,93,218,94,218,95,218,96,218,97,218,98,218,99,218,100,218,101,179,195,218,102,218,103,244,242,179,172,218,104,218,105,218,106,218,107,212,189,199,247,218,108,218,109,218,110,218,111,218,112,244,244,218,113,218,114,244,243,218,115,218,116,218,117,218,118,218,119,218,120,218,121,218,122,218,123,218,124,204,203,218,125,218,126,218,128,200,164,218,129,218,130,218,131,218,132,218,133,218,134,218,135,218,136,218,137,218,138,218,139,218,140,218,141,244,245,218,142,215,227,197,191,245,192,218,143,218,144,245,187,218,145,245,195,218,146,245,194,218,147,214,186,245,193,218,148,218,149,218,150,212,190,245,196,218,151,245,204,218,152,218,153,218,154,218,155,176,207,181,248,218,156,245,201,245,202,218,157,197,220,218,158,218,159,218,160,219,64,245,197,245,198,219,65,219,66,245,199,245,203,219,67,190,224,245,200,184,250,219,68,219,69,219,70,245,208,245,211,219,71,219,72,219,73,191,231,219,74,185,242,245,188,245,205,219,75,219,76,194,183,219,77,219,78,219,79,204,248,219,80,188,249,219,81,245,206,245,207,245,209,182,229,245,210,219,82,245,213,219,83,219,84,219,85,219,86,219,87,219,88,219,89,245,189,219,90,219,91,219,92,245,212,211,187,219,93,179,236,219,94,219,95,204,164,219,96,219,97,219,98,219,99,245,214,219,100,219,101,219,102,219,103,219,104,219,105,219,106,219,107,245,215,190,225,245,216,219,108,219,109,204,223,245,219,219,110,219,111,219,112,219,113,219,114,178,200,215,217,219,115,245,217,219,116,245,218,245,220,219,117,245,226,219,118,219,119,219,120,245,224,219,121,219,122,219,123,245,223,245,221,219,124,219,125,245,225,219,126,219,128,245,222,245,228,245,229,219,129,204,227,219,130,219,131,229,191,181,184,245,227,245,232,204,163,219,132,219,133,219,134,219,135,219,136,245,230,245,231,219,137,219,138,219,139,219,140,219,141,219,142,245,190,219,143,219,144,219,145,219,146,219,147,219,148,219,149,219,150,219,151,219,152,219,153,219,154,177,196,219,155,219,156,245,191,219,157,219,158,181,197,178,228,219,159,245,236,245,233,219,160,182,215,220,64,245,237,220,65,245,234,220,66,220,67,220,68,220,69,220,70,245,235,220,71,220,72,180,218,220,73,212,234,220,74,220,75,220,76,245,238,220,77,179,249,220,78,220,79,220,80,220,81,220,82,220,83,220,84,245,239,245,241,220,85,220,86,220,87,245,240,220,88,220,89,220,90,220,91,220,92,220,93,220,94,245,242,220,95,245,243,220,96,220,97,220,98,220,99,220,100,220,101,220,102,220,103,220,104,220,105,220,106,220,107,201,237,185,170,220,108,220,109,199,251,220,110,220,111,182,227,220,112,220,113,220,114,220,115,220,116,220,117,220,118,204,201,220,119,220,120,220,121,220,122,220,123,220,124,220,125,220,126,220,128,220,129,220,130,220,131,220,132,220,133,220,134,220,135,220,136,220,137,220,138,234,166,220,139,220,140,220,141,220,142,220,143,220,144,220,145,220,146,220,147,220,148,220,149,220,150,220,151,220,152,220,153,220,154,220,155,220,156,220,157,220,158,220,159,220,160,221,64,221,65,221,66,221,67,221,68,221,69,221,70,221,71,221,72,221,73,221,74,221,75,221,76,221,77,221,78,221,79,221,80,221,81,221,82,221,83,221,84,221,85,221,86,221,87,221,88,221,89,221,90,221,91,221,92,221,93,221,94,221,95,221,96,221,97,221,98,221,99,221,100,221,101,221,102,221,103,221,104,221,105,221,106,221,107,221,108,221,109,221,110,221,111,221,112,221,113,221,114,221,115,221,116,221,117,221,118,221,119,221,120,221,121,221,122,221,123,221,124,221,125,221,126,221,128,221,129,221,130,221,131,221,132,221,133,221,134,221,135,221,136,221,137,221,138,221,139,221,140,221,141,221,142,221,143,221,144,221,145,221,146,221,147,221,148,221,149,221,150,221,151,221,152,221,153,221,154,221,155,221,156,221,157,221,158,221,159,221,160,222,64,222,65,222,66,222,67,222,68,222,69,222,70,222,71,222,72,222,73,222,74,222,75,222,76,222,77,222,78,222,79,222,80,222,81,222,82,222,83,222,84,222,85,222,86,222,87,222,88,222,89,222,90,222,91,222,92,222,93,222,94,222,95,222,96,179,181,212,254,185,236,208,249,222,97,233,237,215,170,233,238,194,214,200,237,186,228,233,239,233,240,233,241,214,225,233,242,233,243,233,245,233,244,233,246,233,247,199,225,233,248,212,216,233,249,189,206,222,98,233,250,233,251,189,207,233,252,184,168,193,190,233,253,177,178,187,212,185,245,233,254,222,99,234,161,234,162,234,163,183,248,188,173,222,100,202,228,224,206,212,175,207,189,213,183,234,164,213,222,234,165,208,193,185,188,222,101,180,199,177,217,222,102,222,103,222,104,192,177,222,105,222,106,222,107,222,108,177,230,177,231,222,109,177,232,222,110,222,111,222,112,222,113,179,189,200,232,222,114,222,115,222,116,222,117,229,193,222,118,222,119,177,223,222,120,222,121,222,122,193,201,180,239,222,123,222,124,199,168,211,216,222,125,198,249,209,184,222,126,185,253,194,245,222,128,222,129,222,130,222,131,222,132,211,173,222,133,212,203,189,252,222,134,229,194,183,181,229,195,222,135,222,136,187,185,213,226,222,137,189,248,212,182,206,165,193,172,179,217,222,138,222,139,204,246,222,140,229,198,229,196,229,200,222,141,229,202,229,199,181,207,198,200,222,142,181,252,229,197,222,143,202,246,222,144,222,145,229,201,222,146,222,147,222,148,195,212,177,197,188,163,222,149,222,150,222,151,215,183,222,152,222,153,205,203,203,205,202,202,204,211,229,204,229,203,196,230,222,154,222,155,209,161,209,183,229,205,222,156,229,208,222,157,205,184,214,240,229,207,181,221,222,158,205,190,222,159,229,209,182,186,222,160,223,64,205,168,185,228,223,65,202,197,179,209,203,217,212,236,229,210,183,234,223,66,223,67,223,68,229,206,223,69,223,70,223,71,223,72,223,73,223,74,229,213,180,254,229,214,223,75,223,76,223,77,223,78,223,79,229,211,229,212,223,80,210,221,223,81,223,82,194,223,177,198,223,83,211,226,223,84,223,85,182,221,203,236,223,86,229,215,223,87,223,88,211,246,223,89,223,90,223,91,223,92,223,93,177,233,223,94,182,244,229,218,229,216,229,217,181,192,223,95,223,96,223,97,210,197,229,220,223,98,223,99,229,222,223,100,223,101,223,102,223,103,223,104,223,105,229,221,199,178,223,106,210,163,223,107,223,108,229,219,223,109,223,110,223,111,223,112,212,226,213,218,223,113,223,114,223,115,223,116,223,117,229,224,215,241,223,118,223,119,223,120,223,121,223,122,223,123,223,124,229,225,223,125,177,220,209,251,223,126,229,226,229,228,223,128,223,129,223,130,223,131,229,227,223,132,223,133,229,229,223,134,223,135,223,136,223,137,223,138,210,216,223,139,181,203,223,140,231,223,223,141,218,245,223,142,218,248,223,143,218,246,223,144,218,247,223,145,223,146,223,147,218,250,208,207,196,199,223,148,223,149,176,238,223,150,223,151,223,152,208,176,223,153,218,249,223,154,211,202,186,170,219,162,199,241,223,155,218,252,218,251,201,219,218,253,223,156,219,161,215,222,218,254,193,218,223,157,223,158,219,165,223,159,223,160,211,244,224,64,224,65,219,167,219,164,224,66,219,168,224,67,224,68,189,188,224,69,224,70,224,71,192,201,219,163,219,166,214,163,224,72,219,169,224,73,224,74,224,75,219,173,224,76,224,77,224,78,219,174,219,172,186,194,224,79,224,80,224,81,191,164,219,171,224,82,224,83,224,84,219,170,212,199,178,191,224,85,224,86,219,175,224,87,185,249,224,88,219,176,224,89,224,90,224,91,224,92,179,187,224,93,224,94,224,95,181,166,224,96,224,97,224,98,224,99,182,188,219,177,224,100,224,101,224,102,182,245,224,103,219,178,224,104,224,105,224,106,224,107,224,108,224,109,224,110,224,111,224,112,224,113,224,114,224,115,224,116,224,117,224,118,224,119,224,120,224,121,224,122,224,123,177,201,224,124,224,125,224,126,224,128,219,180,224,129,224,130,224,131,219,179,219,181,224,132,224,133,224,134,224,135,224,136,224,137,224,138,224,139,224,140,224,141,224,142,219,183,224,143,219,182,224,144,224,145,224,146,224,147,224,148,224,149,224,150,219,184,224,151,224,152,224,153,224,154,224,155,224,156,224,157,224,158,224,159,219,185,224,160,225,64,219,186,225,65,225,66,211,207,244,250,199,245,215,195,197,228,244,252,244,253,244,251,225,67,190,198,225,68,225,69,225,70,225,71,208,239,225,72,225,73,183,211,225,74,225,75,212,205,204,170,225,76,225,77,245,162,245,161,186,168,244,254,203,214,225,78,225,79,225,80,245,164,192,210,225,81,179,234,225,82,205,170,245,165,245,163,189,180,245,168,225,83,245,169,189,205,195,184,191,225,203,225,245,170,225,84,225,85,225,86,245,166,245,167,196,240,225,87,225,88,225,89,225,90,225,91,245,172,225,92,180,188,225,93,215,237,225,94,180,215,245,171,245,174,225,95,225,96,245,173,245,175,208,209,225,97,225,98,225,99,225,100,225,101,225,102,225,103,195,209,200,169,225,104,225,105,225,106,225,107,225,108,225,109,245,176,245,177,225,110,225,111,225,112,225,113,225,114,225,115,245,178,225,116,225,117,245,179,245,180,245,181,225,118,225,119,225,120,225,121,245,183,245,182,225,122,225,123,225,124,225,125,245,184,225,126,225,128,225,129,225,130,225,131,225,132,225,133,225,134,225,135,225,136,225,137,225,138,178,201,225,139,211,212,202,205,225,140,192,239,214,216,210,176,193,191,225,141,189,240,225,142,225,143,225,144,225,145,225,146,225,147,225,148,225,149,225,150,225,151,184,170,225,152,225,153,225,154,225,155,225,156,225,157,225,158,225,159,225,160,226,64,226,65,226,66,226,67,226,68,226,69,226,70,226,71,226,72,226,73,226,74,226,75,226,76,226,77,226,78,226,79,226,80,226,81,226,82,226,83,226,84,226,85,226,86,226,87,226,88,226,89,226,90,226,91,226,92,226,93,226,94,226,95,226,96,226,97,226,98,226,99,226,100,226,101,226,102,226,103,226,104,226,105,226,106,226,107,226,108,226,109,226,110,226,111,226,112,226,113,226,114,226,115,226,116,226,117,226,118,226,119,226,120,226,121,226,122,226,123,226,124,226,125,226,126,226,128,226,129,226,130,226,131,226,132,226,133,226,134,226,135,226,136,226,137,226,138,226,139,226,140,226,141,226,142,226,143,226,144,226,145,226,146,226,147,226,148,226,149,226,150,226,151,226,152,226,153,226,154,226,155,226,156,226,157,226,158,226,159,226,160,227,64,227,65,227,66,227,67,227,68,227,69,227,70,227,71,227,72,227,73,227,74,227,75,227,76,227,77,227,78,227,79,227,80,227,81,227,82,227,83,227,84,227,85,227,86,227,87,227,88,227,89,227,90,227,91,227,92,227,93,227,94,227,95,227,96,227,97,227,98,227,99,227,100,227,101,227,102,227,103,227,104,227,105,227,106,227,107,227,108,227,109,188,248,227,110,227,111,227,112,227,113,227,114,227,115,227,116,227,117,227,118,227,119,227,120,227,121,227,122,227,123,227,124,227,125,227,126,227,128,227,129,227,130,227,131,227,132,227,133,227,134,227,135,246,198,227,136,227,137,227,138,227,139,227,140,227,141,227,142,227,143,227,144,227,145,227,146,227,147,227,148,227,149,227,150,227,151,227,152,227,153,227,154,227,155,227,156,227,157,227,158,227,159,227,160,228,64,228,65,228,66,228,67,228,68,228,69,246,199,228,70,228,71,228,72,228,73,228,74,228,75,228,76,228,77,228,78,228,79,228,80,228,81,228,82,228,83,228,84,228,85,228,86,228,87,228,88,228,89,228,90,228,91,228,92,228,93,228,94,246,200,228,95,228,96,228,97,228,98,228,99,228,100,228,101,228,102,228,103,228,104,228,105,228,106,228,107,228,108,228,109,228,110,228,111,228,112,228,113,228,114,228,115,228,116,228,117,228,118,228,119,228,120,228,121,228,122,228,123,228,124,228,125,228,126,228,128,228,129,228,130,228,131,228,132,228,133,228,134,228,135,228,136,228,137,228,138,228,139,228,140,228,141,228,142,228,143,228,144,228,145,228,146,228,147,228,148,228,149,228,150,228,151,228,152,228,153,228,154,228,155,228,156,228,157,228,158,228,159,228,160,229,64,229,65,229,66,229,67,229,68,229,69,229,70,229,71,229,72,229,73,229,74,229,75,229,76,229,77,229,78,229,79,229,80,229,81,229,82,229,83,229,84,229,85,229,86,229,87,229,88,229,89,229,90,229,91,229,92,229,93,229,94,229,95,229,96,229,97,229,98,229,99,229,100,229,101,229,102,229,103,229,104,229,105,229,106,229,107,229,108,229,109,229,110,229,111,229,112,229,113,229,114,229,115,246,201,229,116,229,117,229,118,229,119,229,120,229,121,229,122,229,123,229,124,229,125,229,126,229,128,229,129,229,130,229,131,229,132,229,133,229,134,229,135,229,136,229,137,229,138,229,139,229,140,229,141,229,142,229,143,229,144,229,145,229,146,229,147,229,148,229,149,229,150,229,151,229,152,229,153,229,154,229,155,229,156,229,157,229,158,229,159,246,202,229,160,230,64,230,65,230,66,230,67,230,68,230,69,230,70,230,71,230,72,230,73,230,74,230,75,230,76,230,77,230,78,230,79,230,80,230,81,230,82,230,83,230,84,230,85,230,86,230,87,230,88,230,89,230,90,230,91,230,92,230,93,230,94,230,95,230,96,230,97,230,98,246,204,230,99,230,100,230,101,230,102,230,103,230,104,230,105,230,106,230,107,230,108,230,109,230,110,230,111,230,112,230,113,230,114,230,115,230,116,230,117,230,118,230,119,230,120,230,121,230,122,230,123,230,124,230,125,230,126,230,128,230,129,230,130,230,131,230,132,230,133,230,134,230,135,230,136,230,137,230,138,230,139,230,140,230,141,230,142,230,143,230,144,230,145,230,146,230,147,230,148,230,149,230,150,230,151,230,152,230,153,230,154,230,155,230,156,230,157,246,203,230,158,230,159,230,160,231,64,231,65,231,66,231,67,231,68,231,69,231,70,231,71,247,233,231,72,231,73,231,74,231,75,231,76,231,77,231,78,231,79,231,80,231,81,231,82,231,83,231,84,231,85,231,86,231,87,231,88,231,89,231,90,231,91,231,92,231,93,231,94,231,95,231,96,231,97,231,98,231,99,231,100,231,101,231,102,231,103,231,104,231,105,231,106,231,107,231,108,231,109,231,110,231,111,231,112,231,113,231,114,231,115,231,116,231,117,231,118,231,119,231,120,231,121,231,122,231,123,231,124,231,125,231,126,231,128,231,129,231,130,231,131,231,132,231,133,231,134,231,135,231,136,231,137,231,138,231,139,231,140,231,141,231,142,231,143,231,144,231,145,231,146,231,147,231,148,231,149,231,150,231,151,231,152,231,153,231,154,231,155,231,156,231,157,231,158,231,159,231,160,232,64,232,65,232,66,232,67,232,68,232,69,232,70,232,71,232,72,232,73,232,74,232,75,232,76,232,77,232,78,246,205,232,79,232,80,232,81,232,82,232,83,232,84,232,85,232,86,232,87,232,88,232,89,232,90,232,91,232,92,232,93,232,94,232,95,232,96,232,97,232,98,232,99,232,100,232,101,232,102,232,103,232,104,232,105,232,106,232,107,232,108,232,109,232,110,232,111,232,112,232,113,232,114,232,115,232,116,232,117,232,118,232,119,232,120,232,121,232,122,246,206,232,123,232,124,232,125,232,126,232,128,232,129,232,130,232,131,232,132,232,133,232,134,232,135,232,136,232,137,232,138,232,139,232,140,232,141,232,142,232,143,232,144,232,145,232,146,232,147,232,148,238,196,238,197,238,198,213,235,182,164,238,200,238,199,238,201,238,202,199,165,238,203,238,204,232,149,183,176,181,246,238,205,238,207,232,150,238,206,232,151,184,198,238,208,238,209,238,210,182,219,179,174,214,211,196,198,177,181,184,214,238,211,238,212,212,191,199,213,190,251,206,217,185,179,238,214,238,213,238,216,238,215,197,165,238,217,238,218,199,174,238,219,199,175,238,220,178,167,238,221,238,222,238,223,238,224,238,225,215,234,238,226,238,227,188,216,238,228,211,203,204,250,178,172,193,229,238,229,199,166,195,173,232,152,238,230,238,231,238,232,238,233,238,234,238,235,238,236,232,153,238,237,238,238,238,239,232,154,232,155,238,240,238,241,238,242,238,244,238,243,232,156,238,245,205,173,194,193,238,246,238,247,238,248,213,161,238,249,207,179,238,250,238,251,232,157,238,252,238,253,239,161,238,254,239,162,184,245,195,250,239,163,239,164,189,194,210,191,178,249,239,165,239,166,239,167,210,248,239,168,214,253,239,169,198,204,232,158,239,170,239,171,193,180,239,172,207,250,203,248,239,174,239,173,179,250,185,248,239,175,239,176,208,226,239,177,239,178,183,230,208,191,239,179,239,180,239,181,200,241,204,224,239,182,239,183,239,184,239,185,239,186,213,224,239,187,180,237,195,170,239,188,232,159,239,189,239,190,239,191,232,160,206,253,239,192,194,224,180,184,215,182,189,245,233,64,207,199,239,195,239,193,239,194,239,196,182,167,188,252,190,226,195,204,239,197,239,198,233,65,239,199,239,207,239,200,239,201,239,202,199,194,239,241,182,205,239,203,233,66,239,204,239,205,182,198,195,190,239,206,233,67,239,208,239,209,239,210,213,242,233,68,239,211,196,247,233,69,239,212,196,248,239,213,239,214,184,228,176,247,239,215,239,216,239,217,233,70,239,218,239,219,239,220,239,221,233,71,239,222,190,181,239,225,239,223,239,224,233,72,239,226,239,227,193,205,239,228,239,229,239,230,239,231,239,232,239,233,239,234,239,235,239,236,192,216,233,73,239,237,193,173,239,238,239,239,239,240,233,74,233,75,207,226,233,76,233,77,233,78,233,79,233,80,233,81,233,82,233,83,179,164,233,84,233,85,233,86,233,87,233,88,233,89,233,90,233,91,233,92,233,93,233,94,233,95,233,96,233,97,233,98,233,99,233,100,233,101,233,102,233,103,233,104,233,105,233,106,233,107,233,108,233,109,233,110,233,111,233,112,233,113,233,114,233,115,233,116,233,117,233,118,233,119,233,120,233,121,233,122,233,123,233,124,233,125,233,126,233,128,233,129,233,130,233,131,233,132,233,133,233,134,233,135,233,136,233,137,233,138,233,139,233,140,233,141,233,142,233,143,233,144,233,145,233,146,233,147,233,148,233,149,233,150,233,151,233,152,233,153,233,154,233,155,233,156,233,157,233,158,233,159,233,160,234,64,234,65,234,66,234,67,234,68,234,69,234,70,234,71,234,72,234,73,234,74,234,75,234,76,234,77,234,78,234,79,234,80,234,81,234,82,234,83,234,84,234,85,234,86,234,87,234,88,234,89,234,90,234,91,195,197,227,197,201,193,227,198,234,92,177,213,206,202,180,179,200,242,227,199,207,208,227,200,188,228,227,201,227,202,195,198,213,162,196,214,185,235,206,197,227,203,195,246,227,204,234,93,183,167,184,243,186,210,227,205,227,206,212,196,227,207,234,94,227,208,209,203,227,209,227,210,227,211,227,212,209,214,227,213,178,251,192,187,227,214,234,95,192,171,227,215,227,216,227,217,234,96,227,218,227,219,234,97,184,183,218,226,234,98,182,211,234,99,218,228,218,227,234,100,234,101,234,102,234,103,234,104,234,105,234,106,218,230,234,107,234,108,234,109,200,238,234,110,234,111,218,229,183,192,209,244,210,245,213,243,189,215,234,112,234,113,234,114,234,115,215,232,218,232,218,231,234,116,176,162,205,211,234,117,218,233,234,118,184,189,188,202,194,189,194,164,179,194,218,234,234,119,194,170,196,176,189,181,234,120,234,121,207,222,234,122,234,123,234,124,218,235,201,194,234,125,234,126,234,128,234,129,234,130,177,221,234,131,234,132,234,133,218,236,234,134,182,184,212,186,234,135,179,253,234,136,234,137,218,237,212,201,207,213,197,227,234,138,218,238,234,139,234,140,234,141,234,142,234,143,218,239,234,144,218,240,193,234,204,213,207,221,234,145,234,146,234,147,234,148,234,149,234,150,234,151,234,152,234,153,234,154,234,155,234,156,234,157,211,231,194,161,234,158,218,241,234,159,234,160,203,229,235,64,218,242,235,65,203,230,210,254,235,66,235,67,235,68,184,244,235,69,235,70,218,243,176,175,207,182,235,71,235,72,213,207,235,73,235,74,235,75,235,76,235,77,235,78,235,79,235,80,235,81,235,82,203,237,235,83,235,84,235,85,235,86,235,87,235,88,235,89,235,90,218,244,235,91,235,92,227,196,235,93,235,94,193,165,235,95,235,96,246,191,235,97,235,98,246,192,246,193,196,209,235,99,200,184,209,227,235,100,235,101,208,219,209,197,188,175,185,205,235,102,239,244,235,103,235,104,180,198,211,186,246,194,179,251,235,105,235,106,246,195,235,107,235,108,181,241,235,109,235,110,235,111,235,112,235,113,235,114,235,115,235,116,235,117,235,118,246,197,235,119,235,120,235,121,235,122,235,123,235,124,235,125,211,234,246,167,209,169,235,126,235,128,235,129,235,130,246,169,235,131,235,132,235,133,246,168,235,134,235,135,193,227,192,215,235,136,177,162,235,137,235,138,235,139,235,140,206,237,235,141,208,232,246,171,235,142,235,143,207,246,235,144,246,170,213,240,246,172,195,185,235,145,235,146,235,147,187,244,246,174,246,173,235,148,235,149,235,150,196,222,235,151,235,152,193,216,235,153,235,154,235,155,235,156,235,157,203,170,235,158,207,188,235,159,235,160,236,64,236,65,236,66,236,67,236,68,236,69,236,70,236,71,236,72,246,175,236,73,236,74,246,176,236,75,236,76,246,177,236,77,194,182,236,78,236,79,236,80,236,81,236,82,176,212,197,249,236,83,236,84,236,85,236,86,246,178,236,87,236,88,236,89,236,90,236,91,236,92,236,93,236,94,236,95,236,96,236,97,236,98,236,99,236,100,236,101,236,102,236,103,236,104,236,105,199,224,246,166,236,106,236,107,190,184,236,108,236,109,190,178,236,110,181,229,236,111,236,112,183,199,236,113,191,191,195,210,195,230,236,114,236,115,216,204,236,116,236,117,236,118,184,239,236,119,236,120,236,121,236,122,236,123,236,124,236,125,236,126,236,128,189,249,209,165,236,129,176,208,236,130,236,131,236,132,236,133,236,134,247,176,236,135,236,136,236,137,236,138,236,139,236,140,236,141,236,142,247,177,236,143,236,144,236,145,236,146,236,147,208,172,236,148,176,176,236,149,236,150,236,151,247,178,247,179,236,152,247,180,236,153,236,154,236,155,199,202,236,156,236,157,236,158,236,159,236,160,237,64,237,65,190,207,237,66,237,67,247,183,237,68,237,69,237,70,237,71,237,72,237,73,237,74,247,182,237,75,177,222,237,76,247,181,237,77,237,78,247,184,237,79,247,185,237,80,237,81,237,82,237,83,237,84,237,85,237,86,237,87,237,88,237,89,237,90,237,91,237,92,237,93,237,94,237,95,237,96,237,97,237,98,237,99,237,100,237,101,237,102,237,103,237,104,237,105,237,106,237,107,237,108,237,109,237,110,237,111,237,112,237,113,237,114,237,115,237,116,237,117,237,118,237,119,237,120,237,121,237,122,237,123,237,124,237,125,237,126,237,128,237,129,206,164,200,205,237,130,186,171,232,184,232,185,232,186,190,194,237,131,237,132,237,133,237,134,237,135,210,244,237,136,212,207,201,216,237,137,237,138,237,139,237,140,237,141,237,142,237,143,237,144,237,145,237,146,237,147,237,148,237,149,237,150,237,151,237,152,237,153,237,154,237,155,237,156,237,157,237,158,237,159,237,160,238,64,238,65,238,66,238,67,238,68,238,69,238,70,238,71,238,72,238,73,238,74,238,75,238,76,238,77,238,78,238,79,238,80,238,81,238,82,238,83,238,84,238,85,238,86,238,87,238,88,238,89,238,90,238,91,238,92,238,93,238,94,238,95,238,96,238,97,238,98,238,99,238,100,238,101,238,102,238,103,238,104,238,105,238,106,238,107,238,108,238,109,238,110,238,111,238,112,238,113,238,114,238,115,238,116,238,117,238,118,238,119,238,120,238,121,238,122,238,123,238,124,238,125,238,126,238,128,238,129,238,130,238,131,238,132,238,133,238,134,238,135,238,136,238,137,238,138,238,139,238,140,238,141,238,142,238,143,238,144,238,145,238,146,238,147,238,148,238,149,238,150,238,151,238,152,238,153,238,154,238,155,238,156,238,157,238,158,238,159,238,160,239,64,239,65,239,66,239,67,239,68,239,69,210,179,182,165,199,234,241,252,207,238,203,179,208,235,231,239,205,231,185,203,182,217,241,253,176,228,203,204,241,254,212,164,194,173,193,236,198,196,190,177,242,161,188,213,239,70,242,162,242,163,239,71,242,164,210,195,198,181,239,72,205,199,242,165,239,73,211,177,191,197,204,226,239,74,242,166,242,167,209,213,182,238,242,168,242,169,181,223,242,170,242,171,239,75,178,252,242,172,242,173,200,167,239,76,239,77,239,78,239,79,239,80,239,81,239,82,239,83,239,84,239,85,239,86,239,87,239,88,239,89,239,90,239,91,239,92,239,93,239,94,239,95,239,96,239,97,239,98,239,99,239,100,239,101,239,102,239,103,239,104,239,105,239,106,239,107,239,108,239,109,239,110,239,111,239,112,239,113,183,231,239,114,239,115,236,169,236,170,236,171,239,116,236,172,239,117,239,118,198,174,236,173,236,174,239,119,239,120,239,121,183,201,202,179,239,122,239,123,239,124,239,125,239,126,239,128,239,129,226,184,247,207,239,130,239,131,239,132,239,133,239,134,239,135,239,136,239,137,239,138,239,139,239,140,239,141,239,142,239,143,239,144,239,145,239,146,239,147,239,148,239,149,239,150,239,151,239,152,239,153,239,154,239,155,239,156,239,157,239,158,239,159,239,160,240,64,240,65,240,66,240,67,240,68,247,208,240,69,240,70,178,205,240,71,240,72,240,73,240,74,240,75,240,76,240,77,240,78,240,79,240,80,240,81,240,82,240,83,240,84,240,85,240,86,240,87,240,88,240,89,240,90,240,91,240,92,240,93,240,94,240,95,240,96,240,97,240,98,240,99,247,209,240,100,240,101,240,102,240,103,240,104,240,105,240,106,240,107,240,108,240,109,240,110,240,111,240,112,240,113,240,114,240,115,240,116,240,117,240,118,240,119,240,120,240,121,240,122,240,123,240,124,240,125,240,126,240,128,240,129,240,130,240,131,240,132,240,133,240,134,240,135,240,136,240,137,247,211,247,210,240,138,240,139,240,140,240,141,240,142,240,143,240,144,240,145,240,146,240,147,240,148,240,149,240,150,226,187,240,151,188,162,240,152,226,188,226,189,226,190,226,191,226,192,226,193,183,185,210,251,189,164,202,206,177,165,203,199,240,153,226,194,182,252,200,196,226,195,240,154,240,155,189,200,240,156,177,253,226,196,240,157,182,246,226,197,196,217,240,158,240,159,226,198,207,218,185,221,226,199,192,161,240,160,226,200,178,246,241,64,226,201,241,65,193,243,226,202,226,203,194,248,226,204,226,205,226,206,202,215,216,184,217,229,207,227,241,66,241,67,241,68,241,69,241,70,241,71,241,72,241,73,241,74,241,75,241,76,240,165,241,77,241,78,220,176,241,79,241,80,241,81,241,82,241,83,241,84,241,85,241,86,241,87,241,88,241,89,241,90,241,91,241,92,241,93,241,94,241,95,241,96,241,97,241,98,241,99,241,100,241,101,241,102,241,103,241,104,241,105,241,106,241,107,241,108,241,109,241,110,241,111,241,112,241,113,241,114,241,115,241,116,241,117,241,118,241,119,241,120,241,121,241,122,241,123,241,124,241,125,241,126,241,128,241,129,241,130,241,131,241,132,241,133,241,134,241,135,241,136,241,137,241,138,241,139,241,140,241,141,241,142,241,143,241,144,241,145,241,146,241,147,241,148,241,149,241,150,241,151,241,152,241,153,241,154,241,155,241,156,241,157,241,158,241,159,241,160,242,64,242,65,242,66,242,67,242,68,242,69,242,70,242,71,242,72,242,73,242,74,242,75,242,76,242,77,242,78,242,79,242,80,242,81,242,82,242,83,242,84,242,85,242,86,242,87,242,88,242,89,242,90,242,91,242,92,242,93,242,94,242,95,242,96,242,97,242,98,242,99,242,100,242,101,242,102,242,103,242,104,242,105,242,106,242,107,242,108,242,109,242,110,242,111,242,112,242,113,242,114,242,115,242,116,242,117,242,118,242,119,242,120,242,121,242,122,242,123,242,124,242,125,242,126,242,128,242,129,242,130,242,131,242,132,242,133,242,134,242,135,242,136,242,137,242,138,242,139,242,140,242,141,242,142,242,143,242,144,242,145,242,146,242,147,242,148,242,149,242,150,242,151,242,152,242,153,242,154,242,155,242,156,242,157,242,158,242,159,242,160,243,64,243,65,243,66,243,67,243,68,243,69,243,70,243,71,243,72,243,73,243,74,243,75,243,76,243,77,243,78,243,79,243,80,243,81,194,237,212,166,205,212,209,177,179,219,199,253,243,82,178,181,194,191,230,224,202,187,230,225,230,226,190,212,230,227,215,164,205,213,230,229,188,221,230,228,230,230,230,231,194,238,243,83,189,190,230,232,194,230,186,167,230,233,243,84,230,234,179,210,209,233,243,85,243,86,191,165,230,235,198,239,230,236,230,237,243,87,243,88,230,238,198,173,230,239,243,89,201,167,230,240,230,241,230,242,229,185,230,243,230,244,194,226,230,245,230,246,214,232,230,247,243,90,230,248,185,199,243,91,243,92,243,93,243,94,243,95,243,96,243,97,247,187,247,186,243,98,243,99,243,100,243,101,247,190,247,188,186,161,243,102,247,191,243,103,247,192,243,104,243,105,243,106,247,194,247,193,247,196,243,107,243,108,247,195,243,109,243,110,243,111,243,112,243,113,247,197,247,198,243,114,243,115,243,116,243,117,247,199,243,118,203,232,243,119,243,120,243,121,243,122,184,223,243,123,243,124,243,125,243,126,243,128,243,129,247,212,243,130,247,213,243,131,243,132,243,133,243,134,247,214,243,135,243,136,243,137,243,138,247,216,243,139,247,218,243,140,247,215,243,141,243,142,243,143,243,144,243,145,243,146,243,147,243,148,243,149,247,219,243,150,247,217,243,151,243,152,243,153,243,154,243,155,243,156,243,157,215,215,243,158,243,159,243,160,244,64,247,220,244,65,244,66,244,67,244,68,244,69,244,70,247,221,244,71,244,72,244,73,247,222,244,74,244,75,244,76,244,77,244,78,244,79,244,80,244,81,244,82,244,83,244,84,247,223,244,85,244,86,244,87,247,224,244,88,244,89,244,90,244,91,244,92,244,93,244,94,244,95,244,96,244,97,244,98,219,203,244,99,244,100,216,170,244,101,244,102,244,103,244,104,244,105,244,106,244,107,244,108,229,247,185,237,244,109,244,110,244,111,244,112,191,253,187,234,247,201,198,199,247,200,244,113,247,202,247,204,247,203,244,114,244,115,244,116,247,205,244,117,206,186,244,118,247,206,244,119,244,120,196,167,244,121,244,122,244,123,244,124,244,125,244,126,244,128,244,129,244,130,244,131,244,132,244,133,244,134,244,135,244,136,244,137,244,138,244,139,244,140,244,141,244,142,244,143,244,144,244,145,244,146,244,147,244,148,244,149,244,150,244,151,244,152,244,153,244,154,244,155,244,156,244,157,244,158,244,159,244,160,245,64,245,65,245,66,245,67,245,68,245,69,245,70,245,71,245,72,245,73,245,74,245,75,245,76,245,77,245,78,245,79,245,80,245,81,245,82,245,83,245,84,245,85,245,86,245,87,245,88,245,89,245,90,245,91,245,92,245,93,245,94,245,95,245,96,245,97,245,98,245,99,245,100,245,101,245,102,245,103,245,104,245,105,245,106,245,107,245,108,245,109,245,110,245,111,245,112,245,113,245,114,245,115,245,116,245,117,245,118,245,119,245,120,245,121,245,122,245,123,245,124,245,125,245,126,245,128,245,129,245,130,245,131,245,132,245,133,245,134,245,135,245,136,245,137,245,138,245,139,245,140,245,141,245,142,245,143,245,144,245,145,245,146,245,147,245,148,245,149,245,150,245,151,245,152,245,153,245,154,245,155,245,156,245,157,245,158,245,159,245,160,246,64,246,65,246,66,246,67,246,68,246,69,246,70,246,71,246,72,246,73,246,74,246,75,246,76,246,77,246,78,246,79,246,80,246,81,246,82,246,83,246,84,246,85,246,86,246,87,246,88,246,89,246,90,246,91,246,92,246,93,246,94,246,95,246,96,246,97,246,98,246,99,246,100,246,101,246,102,246,103,246,104,246,105,246,106,246,107,246,108,246,109,246,110,246,111,246,112,246,113,246,114,246,115,246,116,246,117,246,118,246,119,246,120,246,121,246,122,246,123,246,124,246,125,246,126,246,128,246,129,246,130,246,131,246,132,246,133,246,134,246,135,246,136,246,137,246,138,246,139,246,140,246,141,246,142,246,143,246,144,246,145,246,146,246,147,246,148,246,149,246,150,246,151,246,152,246,153,246,154,246,155,246,156,246,157,246,158,246,159,246,160,247,64,247,65,247,66,247,67,247,68,247,69,247,70,247,71,247,72,247,73,247,74,247,75,247,76,247,77,247,78,247,79,247,80,247,81,247,82,247,83,247,84,247,85,247,86,247,87,247,88,247,89,247,90,247,91,247,92,247,93,247,94,247,95,247,96,247,97,247,98,247,99,247,100,247,101,247,102,247,103,247,104,247,105,247,106,247,107,247,108,247,109,247,110,247,111,247,112,247,113,247,114,247,115,247,116,247,117,247,118,247,119,247,120,247,121,247,122,247,123,247,124,247,125,247,126,247,128,211,227,247,129,247,130,246,207,247,131,194,179,246,208,247,132,247,133,246,209,246,210,246,211,246,212,247,134,247,135,246,214,247,136,177,171,246,215,247,137,246,216,246,217,246,218,247,138,246,219,246,220,247,139,247,140,247,141,247,142,246,221,246,222,207,202,247,143,246,223,246,224,246,225,246,226,246,227,246,228,192,240,246,229,246,230,246,231,246,232,246,233,247,144,246,234,247,145,246,235,246,236,247,146,246,237,246,238,246,239,246,240,246,241,246,242,246,243,246,244,190,168,247,147,246,245,246,246,246,247,246,248,247,148,247,149,247,150,247,151,247,152,200,250,246,249,246,250,246,251,246,252,247,153,247,154,246,253,246,254,247,161,247,162,247,163,247,164,247,165,247,155,247,156,247,166,247,167,247,168,177,238,247,169,247,170,247,171,247,157,247,158,247,172,247,173,193,219,247,174,247,159,247,160,247,175,248,64,248,65,248,66,248,67,248,68,248,69,248,70,248,71,248,72,248,73,248,74,248,75,248,76,248,77,248,78,248,79,248,80,248,81,248,82,248,83,248,84,248,85,248,86,248,87,248,88,248,89,248,90,248,91,248,92,248,93,248,94,248,95,248,96,248,97,248,98,248,99,248,100,248,101,248,102,248,103,248,104,248,105,248,106,248,107,248,108,248,109,248,110,248,111,248,112,248,113,248,114,248,115,248,116,248,117,248,118,248,119,248,120,248,121,248,122,248,123,248,124,248,125,248,126,248,128,248,129,248,130,248,131,248,132,248,133,248,134,248,135,248,136,248,137,248,138,248,139,248,140,248,141,248,142,248,143,248,144,248,145,248,146,248,147,248,148,248,149,248,150,248,151,248,152,248,153,248,154,248,155,248,156,248,157,248,158,248,159,248,160,249,64,249,65,249,66,249,67,249,68,249,69,249,70,249,71,249,72,249,73,249,74,249,75,249,76,249,77,249,78,249,79,249,80,249,81,249,82,249,83,249,84,249,85,249,86,249,87,249,88,249,89,249,90,249,91,249,92,249,93,249,94,249,95,249,96,249,97,249,98,249,99,249,100,249,101,249,102,249,103,249,104,249,105,249,106,249,107,249,108,249,109,249,110,249,111,249,112,249,113,249,114,249,115,249,116,249,117,249,118,249,119,249,120,249,121,249,122,249,123,249,124,249,125,249,126,249,128,249,129,249,130,249,131,249,132,249,133,249,134,249,135,249,136,249,137,249,138,249,139,249,140,249,141,249,142,249,143,249,144,249,145,249,146,249,147,249,148,249,149,249,150,249,151,249,152,249,153,249,154,249,155,249,156,249,157,249,158,249,159,249,160,250,64,250,65,250,66,250,67,250,68,250,69,250,70,250,71,250,72,250,73,250,74,250,75,250,76,250,77,250,78,250,79,250,80,250,81,250,82,250,83,250,84,250,85,250,86,250,87,250,88,250,89,250,90,250,91,250,92,250,93,250,94,250,95,250,96,250,97,250,98,250,99,250,100,250,101,250,102,250,103,250,104,250,105,250,106,250,107,250,108,250,109,250,110,250,111,250,112,250,113,250,114,250,115,250,116,250,117,250,118,250,119,250,120,250,121,250,122,250,123,250,124,250,125,250,126,250,128,250,129,250,130,250,131,250,132,250,133,250,134,250,135,250,136,250,137,250,138,250,139,250,140,250,141,250,142,250,143,250,144,250,145,250,146,250,147,250,148,250,149,250,150,250,151,250,152,250,153,250,154,250,155,250,156,250,157,250,158,250,159,250,160,251,64,251,65,251,66,251,67,251,68,251,69,251,70,251,71,251,72,251,73,251,74,251,75,251,76,251,77,251,78,251,79,251,80,251,81,251,82,251,83,251,84,251,85,251,86,251,87,251,88,251,89,251,90,251,91,196,241,240,175,188,166,240,176,195,249,251,92,197,184,209,187,251,93,240,177,240,178,240,179,240,180,240,181,209,188,251,94,209,236,251,95,240,183,240,182,212,167,251,96,205,210,240,184,240,186,240,185,240,187,240,188,251,97,251,98,184,235,240,189,186,232,251,99,240,190,240,191,190,233,240,192,182,236,240,193,240,194,240,195,240,196,200,181,240,197,240,198,251,100,240,199,197,244,251,101,240,200,251,102,251,103,251,104,240,201,251,105,240,202,247,189,251,106,240,203,240,204,240,205,251,107,240,206,251,108,251,109,251,110,251,111,240,207,186,215,251,112,240,208,240,209,240,210,240,211,240,212,240,213,240,214,240,216,251,113,251,114,211,165,240,215,251,115,240,217,251,116,251,117,251,118,251,119,251,120,251,121,251,122,251,123,251,124,251,125,245,186,194,185,251,126,251,128,247,228,251,129,251,130,251,131,251,132,247,229,247,230,251,133,251,134,247,231,251,135,251,136,251,137,251,138,251,139,251,140,247,232,194,180,251,141,251,142,251,143,251,144,251,145,251,146,251,147,251,148,251,149,247,234,251,150,247,235,251,151,251,152,251,153,251,154,251,155,251,156,194,243,251,157,251,158,251,159,251,160,252,64,252,65,252,66,252,67,252,68,252,69,252,70,252,71,252,72,244,240,252,73,252,74,252,75,244,239,252,76,252,77,194,233,252,78,247,225,247,226,252,79,252,80,252,81,252,82,252,83,187,198,252,84,252,85,252,86,252,87,217,228,252,88,252,89,252,90,202,242,192,232,240,164,252,91,186,218,252,92,252,93,199,173,252,94,252,95,252,96,196,172,252,97,252,98,247,236,247,237,247,238,252,99,247,240,247,239,252,100,247,241,252,101,252,102,247,244,252,103,247,243,252,104,247,242,247,245,252,105,252,106,252,107,252,108,247,246,252,109,252,110,252,111,252,112,252,113,252,114,252,115,252,116,252,117,237,233,252,118,237,234,237,235,252,119,246,188,252,120,252,121,252,122,252,123,252,124,252,125,252,126,252,128,252,129,252,130,252,131,252,132,246,189,252,133,246,190,182,166,252,134,216,190,252,135,252,136,185,196,252,137,252,138,252,139,216,187,252,140,220,177,252,141,252,142,252,143,252,144,252,145,252,146,202,243,252,147,247,247,252,148,252,149,252,150,252,151,252,152,252,153,252,154,252,155,252,156,247,248,252,157,252,158,247,249,252,159,252,160,253,64,253,65,253,66,253,67,253,68,247,251,253,69,247,250,253,70,177,199,253,71,247,252,247,253,253,72,253,73,253,74,253,75,253,76,247,254,253,77,253,78,253,79,253,80,253,81,253,82,253,83,253,84,253,85,253,86,253,87,198,235,236,180,253,88,253,89,253,90,253,91,253,92,253,93,253,94,253,95,253,96,253,97,253,98,253,99,253,100,253,101,253,102,253,103,253,104,253,105,253,106,253,107,253,108,253,109,253,110,253,111,253,112,253,113,253,114,253,115,253,116,253,117,253,118,253,119,253,120,253,121,253,122,253,123,253,124,253,125,253,126,253,128,253,129,253,130,253,131,253,132,253,133,179,221,246,179,253,134,253,135,246,180,193,228,246,181,246,182,246,183,246,184,246,185,246,186,200,163,246,187,253,136,253,137,253,138,253,139,253,140,253,141,253,142,253,143,253,144,253,145,253,146,253,147,193,250,185,168,237,232,253,148,253,149,253,150,185,234,217,223,253,151,253,152,253,153,253,154,253,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,161,170,162,170,163,170,164,170,165,170,166,170,167,170,168,170,169,170,170,170,171,170,172,170,173,170,174,170,175,170,176,170,177,170,178,170,179,170,180,170,181,170,182,170,183,170,184,170,185,170,186,170,187,170,188,170,189,170,190,170,191,170,192,170,193,170,194,170,195,170,196,170,197,170,198,170,199,170,200,170,201,170,202,170,203,170,204,170,205,170,206,170,207,170,208,170,209,170,210,170,211,170,212,170,213,170,214,170,215,170,216,170,217,170,218,170,219,170,220,170,221,170,222,170,223,170,224,170,225,170,226,170,227,170,228,170,229,170,230,170,231,170,232,170,233,170,234,170,235,170,236,170,237,170,238,170,239,170,240,170,241,170,242,170,243,170,244,170,245,170,246,170,247,170,248,170,249,170,250,170,251,170,252,170,253,170,254,171,161,171,162,171,163,171,164,171,165,171,166,171,167,171,168,171,169,171,170,171,171,171,172,171,173,171,174,171,175,171,176,171,177,171,178,171,179,171,180,171,181,171,182,171,183,171,184,171,185,171,186,171,187,171,188,171,189,171,190,171,191,171,192,171,193,171,194,171,195,171,196,171,197,171,198,171,199,171,200,171,201,171,202,171,203,171,204,171,205,171,206,171,207,171,208,171,209,171,210,171,211,171,212,171,213,171,214,171,215,171,216,171,217,171,218,171,219,171,220,171,221,171,222,171,223,171,224,171,225,171,226,171,227,171,228,171,229,171,230,171,231,171,232,171,233,171,234,171,235,171,236,171,237,171,238,171,239,171,240,171,241,171,242,171,243,171,244,171,245,171,246,171,247,171,248,171,249,171,250,171,251,171,252,171,253,171,254,172,161,172,162,172,163,172,164,172,165,172,166,172,167,172,168,172,169,172,170,172,171,172,172,172,173,172,174,172,175,172,176,172,177,172,178,172,179,172,180,172,181,172,182,172,183,172,184,172,185,172,186,172,187,172,188,172,189,172,190,172,191,172,192,172,193,172,194,172,195,172,196,172,197,172,198,172,199,172,200,172,201,172,202,172,203,172,204,172,205,172,206,172,207,172,208,172,209,172,210,172,211,172,212,172,213,172,214,172,215,172,216,172,217,172,218,172,219,172,220,172,221,172,222,172,223,172,224,172,225,172,226,172,227,172,228,172,229,172,230,172,231,172,232,172,233,172,234,172,235,172,236,172,237,172,238,172,239,172,240,172,241,172,242,172,243,172,244,172,245,172,246,172,247,172,248,172,249,172,250,172,251,172,252,172,253,172,254,173,161,173,162,173,163,173,164,173,165,173,166,173,167,173,168,173,169,173,170,173,171,173,172,173,173,173,174,173,175,173,176,173,177,173,178,173,179,173,180,173,181,173,182,173,183,173,184,173,185,173,186,173,187,173,188,173,189,173,190,173,191,173,192,173,193,173,194,173,195,173,196,173,197,173,198,173,199,173,200,173,201,173,202,173,203,173,204,173,205,173,206,173,207,173,208,173,209,173,210,173,211,173,212,173,213,173,214,173,215,173,216,173,217,173,218,173,219,173,220,173,221,173,222,173,223,173,224,173,225,173,226,173,227,173,228,173,229,173,230,173,231,173,232,173,233,173,234,173,235,173,236,173,237,173,238,173,239,173,240,173,241,173,242,173,243,173,244,173,245,173,246,173,247,173,248,173,249,173,250,173,251,173,252,173,253,173,254,174,161,174,162,174,163,174,164,174,165,174,166,174,167,174,168,174,169,174,170,174,171,174,172,174,173,174,174,174,175,174,176,174,177,174,178,174,179,174,180,174,181,174,182,174,183,174,184,174,185,174,186,174,187,174,188,174,189,174,190,174,191,174,192,174,193,174,194,174,195,174,196,174,197,174,198,174,199,174,200,174,201,174,202,174,203,174,204,174,205,174,206,174,207,174,208,174,209,174,210,174,211,174,212,174,213,174,214,174,215,174,216,174,217,174,218,174,219,174,220,174,221,174,222,174,223,174,224,174,225,174,226,174,227,174,228,174,229,174,230,174,231,174,232,174,233,174,234,174,235,174,236,174,237,174,238,174,239,174,240,174,241,174,242,174,243,174,244,174,245,174,246,174,247,174,248,174,249,174,250,174,251,174,252,174,253,174,254,175,161,175,162,175,163,175,164,175,165,175,166,175,167,175,168,175,169,175,170,175,171,175,172,175,173,175,174,175,175,175,176,175,177,175,178,175,179,175,180,175,181,175,182,175,183,175,184,175,185,175,186,175,187,175,188,175,189,175,190,175,191,175,192,175,193,175,194,175,195,175,196,175,197,175,198,175,199,175,200,175,201,175,202,175,203,175,204,175,205,175,206,175,207,175,208,175,209,175,210,175,211,175,212,175,213,175,214,175,215,175,216,175,217,175,218,175,219,175,220,175,221,175,222,175,223,175,224,175,225,175,226,175,227,175,228,175,229,175,230,175,231,175,232,175,233,175,234,175,235,175,236,175,237,175,238,175,239,175,240,175,241,175,242,175,243,175,244,175,245,175,246,175,247,175,248,175,249,175,250,175,251,175,252,175,253,175,254,248,161,248,162,248,163,248,164,248,165,248,166,248,167,248,168,248,169,248,170,248,171,248,172,248,173,248,174,248,175,248,176,248,177,248,178,248,179,248,180,248,181,248,182,248,183,248,184,248,185,248,186,248,187,248,188,248,189,248,190,248,191,248,192,248,193,248,194,248,195,248,196,248,197,248,198,248,199,248,200,248,201,248,202,248,203,248,204,248,205,248,206,248,207,248,208,248,209,248,210,248,211,248,212,248,213,248,214,248,215,248,216,248,217,248,218,248,219,248,220,248,221,248,222,248,223,248,224,248,225,248,226,248,227,248,228,248,229,248,230,248,231,248,232,248,233,248,234,248,235,248,236,248,237,248,238,248,239,248,240,248,241,248,242,248,243,248,244,248,245,248,246,248,247,248,248,248,249,248,250,248,251,248,252,248,253,248,254,249,161,249,162,249,163,249,164,249,165,249,166,249,167,249,168,249,169,249,170,249,171,249,172,249,173,249,174,249,175,249,176,249,177,249,178,249,179,249,180,249,181,249,182,249,183,249,184,249,185,249,186,249,187,249,188,249,189,249,190,249,191,249,192,249,193,249,194,249,195,249,196,249,197,249,198,249,199,249,200,249,201,249,202,249,203,249,204,249,205,249,206,249,207,249,208,249,209,249,210,249,211,249,212,249,213,249,214,249,215,249,216,249,217,249,218,249,219,249,220,249,221,249,222,249,223,249,224,249,225,249,226,249,227,249,228,249,229,249,230,249,231,249,232,249,233,249,234,249,235,249,236,249,237,249,238,249,239,249,240,249,241,249,242,249,243,249,244,249,245,249,246,249,247,249,248,249,249,249,250,249,251,249,252,249,253,249,254,250,161,250,162,250,163,250,164,250,165,250,166,250,167,250,168,250,169,250,170,250,171,250,172,250,173,250,174,250,175,250,176,250,177,250,178,250,179,250,180,250,181,250,182,250,183,250,184,250,185,250,186,250,187,250,188,250,189,250,190,250,191,250,192,250,193,250,194,250,195,250,196,250,197,250,198,250,199,250,200,250,201,250,202,250,203,250,204,250,205,250,206,250,207,250,208,250,209,250,210,250,211,250,212,250,213,250,214,250,215,250,216,250,217,250,218,250,219,250,220,250,221,250,222,250,223,250,224,250,225,250,226,250,227,250,228,250,229,250,230,250,231,250,232,250,233,250,234,250,235,250,236,250,237,250,238,250,239,250,240,250,241,250,242,250,243,250,244,250,245,250,246,250,247,250,248,250,249,250,250,250,251,250,252,250,253,250,254,251,161,251,162,251,163,251,164,251,165,251,166,251,167,251,168,251,169,251,170,251,171,251,172,251,173,251,174,251,175,251,176,251,177,251,178,251,179,251,180,251,181,251,182,251,183,251,184,251,185,251,186,251,187,251,188,251,189,251,190,251,191,251,192,251,193,251,194,251,195,251,196,251,197,251,198,251,199,251,200,251,201,251,202,251,203,251,204,251,205,251,206,251,207,251,208,251,209,251,210,251,211,251,212,251,213,251,214,251,215,251,216,251,217,251,218,251,219,251,220,251,221,251,222,251,223,251,224,251,225,251,226,251,227,251,228,251,229,251,230,251,231,251,232,251,233,251,234,251,235,251,236,251,237,251,238,251,239,251,240,251,241,251,242,251,243,251,244,251,245,251,246,251,247,251,248,251,249,251,250,251,251,251,252,251,253,251,254,252,161,252,162,252,163,252,164,252,165,252,166,252,167,252,168,252,169,252,170,252,171,252,172,252,173,252,174,252,175,252,176,252,177,252,178,252,179,252,180,252,181,252,182,252,183,252,184,252,185,252,186,252,187,252,188,252,189,252,190,252,191,252,192,252,193,252,194,252,195,252,196,252,197,252,198,252,199,252,200,252,201,252,202,252,203,252,204,252,205,252,206,252,207,252,208,252,209,252,210,252,211,252,212,252,213,252,214,252,215,252,216,252,217,252,218,252,219,252,220,252,221,252,222,252,223,252,224,252,225,252,226,252,227,252,228,252,229,252,230,252,231,252,232,252,233,252,234,252,235,252,236,252,237,252,238,252,239,252,240,252,241,252,242,252,243,252,244,252,245,252,246,252,247,252,248,252,249,252,250,252,251,252,252,252,253,252,254,253,161,253,162,253,163,253,164,253,165,253,166,253,167,253,168,253,169,253,170,253,171,253,172,253,173,253,174,253,175,253,176,253,177,253,178,253,179,253,180,253,181,253,182,253,183,253,184,253,185,253,186,253,187,253,188,253,189,253,190,253,191,253,192,253,193,253,194,253,195,253,196,253,197,253,198,253,199,253,200,253,201,253,202,253,203,253,204,253,205,253,206,253,207,253,208,253,209,253,210,253,211,253,212,253,213,253,214,253,215,253,216,253,217,253,218,253,219,253,220,253,221,253,222,253,223,253,224,253,225,253,226,253,227,253,228,253,229,253,230,253,231,253,232,253,233,253,234,253,235,253,236,253,237,253,238,253,239,253,240,253,241,253,242,253,243,253,244,253,245,253,246,253,247,253,248,253,249,253,250,253,251,253,252,253,253,253,254,254,161,254,162,254,163,254,164,254,165,254,166,254,167,254,168,254,169,254,170,254,171,254,172,254,173,254,174,254,175,254,176,254,177,254,178,254,179,254,180,254,181,254,182,254,183,254,184,254,185,254,186,254,187,254,188,254,189,254,190,254,191,254,192,254,193,254,194,254,195,254,196,254,197,254,198,254,199,254,200,254,201,254,202,254,203,254,204,254,205,254,206,254,207,254,208,254,209,254,210,254,211,254,212,254,213,254,214,254,215,254,216,254,217,254,218,254,219,254,220,254,221,254,222,254,223,254,224,254,225,254,226,254,227,254,228,254,229,254,230,254,231,254,232,254,233,254,234,254,235,254,236,254,237,254,238,254,239,254,240,254,241,254,242,254,243,254,244,254,245,254,246,254,247,254,248,254,249,254,250,254,251,254,252,254,253,254,254,161,64,161,65,161,66,161,67,161,68,161,69,161,70,161,71,161,72,161,73,161,74,161,75,161,76,161,77,161,78,161,79,161,80,161,81,161,82,161,83,161,84,161,85,161,86,161,87,161,88,161,89,161,90,161,91,161,92,161,93,161,94,161,95,161,96,161,97,161,98,161,99,161,100,161,101,161,102,161,103,161,104,161,105,161,106,161,107,161,108,161,109,161,110,161,111,161,112,161,113,161,114,161,115,161,116,161,117,161,118,161,119,161,120,161,121,161,122,161,123,161,124,161,125,161,126,161,128,161,129,161,130,161,131,161,132,161,133,161,134,161,135,161,136,161,137,161,138,161,139,161,140,161,141,161,142,161,143,161,144,161,145,161,146,161,147,161,148,161,149,161,150,161,151,161,152,161,153,161,154,161,155,161,156,161,157,161,158,161,159,161,160,162,64,162,65,162,66,162,67,162,68,162,69,162,70,162,71,162,72,162,73,162,74,162,75,162,76,162,77,162,78,162,79,162,80,162,81,162,82,162,83,162,84,162,85,162,86,162,87,162,88,162,89,162,90,162,91,162,92,162,93,162,94,162,95,162,96,162,97,162,98,162,99,162,100,162,101,162,102,162,103,162,104,162,105,162,106,162,107,162,108,162,109,162,110,162,111,162,112,162,113,162,114,162,115,162,116,162,117,162,118,162,119,162,120,162,121,162,122,162,123,162,124,162,125,162,126,162,128,162,129,162,130,162,131,162,132,162,133,162,134,162,135,162,136,162,137,162,138,162,139,162,140,162,141,162,142,162,143,162,144,162,145,162,146,162,147,162,148,162,149,162,150,162,151,162,152,162,153,162,154,162,155,162,156,162,157,162,158,162,159,162,160,163,64,163,65,163,66,163,67,163,68,163,69,163,70,163,71,163,72,163,73,163,74,163,75,163,76,163,77,163,78,163,79,163,80,163,81,163,82,163,83,163,84,163,85,163,86,163,87,163,88,163,89,163,90,163,91,163,92,163,93,163,94,163,95,163,96,163,97,163,98,163,99,163,100,163,101,163,102,163,103,163,104,163,105,163,106,163,107,163,108,163,109,163,110,163,111,163,112,163,113,163,114,163,115,163,116,163,117,163,118,163,119,163,120,163,121,163,122,163,123,163,124,163,125,163,126,163,128,163,129,163,130,163,131,163,132,163,133,163,134,163,135,163,136,163,137,163,138,163,139,163,140,163,141,163,142,163,143,163,144,163,145,163,146,163,147,163,148,163,149,163,150,163,151,163,152,163,153,163,154,163,155,163,156,163,157,163,158,163,159,163,160,164,64,164,65,164,66,164,67,164,68,164,69,164,70,164,71,164,72,164,73,164,74,164,75,164,76,164,77,164,78,164,79,164,80,164,81,164,82,164,83,164,84,164,85,164,86,164,87,164,88,164,89,164,90,164,91,164,92,164,93,164,94,164,95,164,96,164,97,164,98,164,99,164,100,164,101,164,102,164,103,164,104,164,105,164,106,164,107,164,108,164,109,164,110,164,111,164,112,164,113,164,114,164,115,164,116,164,117,164,118,164,119,164,120,164,121,164,122,164,123,164,124,164,125,164,126,164,128,164,129,164,130,164,131,164,132,164,133,164,134,164,135,164,136,164,137,164,138,164,139,164,140,164,141,164,142,164,143,164,144,164,145,164,146,164,147,164,148,164,149,164,150,164,151,164,152,164,153,164,154,164,155,164,156,164,157,164,158,164,159,164,160,165,64,165,65,165,66,165,67,165,68,165,69,165,70,165,71,165,72,165,73,165,74,165,75,165,76,165,77,165,78,165,79,165,80,165,81,165,82,165,83,165,84,165,85,165,86,165,87,165,88,165,89,165,90,165,91,165,92,165,93,165,94,165,95,165,96,165,97,165,98,165,99,165,100,165,101,165,102,165,103,165,104,165,105,165,106,165,107,165,108,165,109,165,110,165,111,165,112,165,113,165,114,165,115,165,116,165,117,165,118,165,119,165,120,165,121,165,122,165,123,165,124,165,125,165,126,165,128,165,129,165,130,165,131,165,132,165,133,165,134,165,135,165,136,165,137,165,138,165,139,165,140,165,141,165,142,165,143,165,144,165,145,165,146,165,147,165,148,165,149,165,150,165,151,165,152,165,153,165,154,165,155,165,156,165,157,165,158,165,159,165,160,166,64,166,65,166,66,166,67,166,68,166,69,166,70,166,71,166,72,166,73,166,74,166,75,166,76,166,77,166,78,166,79,166,80,166,81,166,82,166,83,166,84,166,85,166,86,166,87,166,88,166,89,166,90,166,91,166,92,166,93,166,94,166,95,166,96,166,97,166,98,166,99,166,100,166,101,166,102,166,103,166,104,166,105,166,106,166,107,166,108,166,109,166,110,166,111,166,112,166,113,166,114,166,115,166,116,166,117,166,118,166,119,166,120,166,121,166,122,166,123,166,124,166,125,166,126,166,128,166,129,166,130,166,131,166,132,166,133,166,134,166,135,166,136,166,137,166,138,166,139,166,140,166,141,166,142,166,143,166,144,166,145,166,146,166,147,166,148,166,149,166,150,166,151,166,152,166,153,166,154,166,155,166,156,166,157,166,158,166,159,166,160,167,64,167,65,167,66,167,67,167,68,167,69,167,70,167,71,167,72,167,73,167,74,167,75,167,76,167,77,167,78,167,79,167,80,167,81,167,82,167,83,167,84,167,85,167,86,167,87,167,88,167,89,167,90,167,91,167,92,167,93,167,94,167,95,167,96,167,97,167,98,167,99,167,100,167,101,167,102,167,103,167,104,167,105,167,106,167,107,167,108,167,109,167,110,167,111,167,112,167,113,167,114,167,115,167,116,167,117,167,118,167,119,167,120,167,121,167,122,167,123,167,124,167,125,167,126,167,128,167,129,167,130,167,131,167,132,167,133,167,134,167,135,167,136,167,137,167,138,167,139,167,140,167,141,167,142,167,143,167,144,167,145,167,146,167,147,167,148,167,149,167,150,167,151,167,152,167,153,167,154,167,155,167,156,167,157,167,158,167,159,167,160,162,171,162,172,162,173,162,174,162,175,162,176,162,227,162,228,162,239,162,240,162,253,162,254,164,244,164,245,164,246,164,247,164,248,164,249,164,250,164,251,164,252,164,253,164,254,165,247,165,248,165,249,165,250,165,251,165,252,165,253,165,254,166,185,166,186,166,187,166,188,166,189,166,190,166,191,166,192,166,217,166,218,166,219,166,220,166,221,166,222,166,223,166,236,166,237,166,243,166,246,166,247,166,248,166,249,166,250,166,251,166,252,166,253,166,254,167,194,167,195,167,196,167,197,167,198,167,199,167,200,167,201,167,202,167,203,167,204,167,205,167,206,167,207,167,208,167,242,167,243,167,244,167,245,167,246,167,247,167,248,167,249,167,250,167,251,167,252,167,253,167,254,168,150,168,151,168,152,168,153,168,154,168,155,168,156,168,157,168,158,168,159,168,160,168,188,168,191,168,193,168,194,168,195,168,196,168,234,168,235,168,236,168,237,168,238,168,239,168,240,168,241,168,242,168,243,168,244,168,245,168,246,168,247,168,248,168,249,168,250,168,251,168,252,168,253,168,254,169,88,169,91,169,93,169,94,169,95,169,137,169,138,169,139,169,140,169,141,169,142,169,143,169,144,169,145,169,146,169,147,169,148,169,149,169,151,169,152,169,153,169,154,169,155,169,156,169,157,169,158,169,159,169,160,169,161,169,162,169,163,169,240,169,241,169,242,169,243,169,244,169,245,169,246,169,247,169,248,169,249,169,250,169,251,169,252,169,253,169,254,215,250,215,251,215,252,215,253,215,254,254,80,254,81,254,82,254,83,254,84,254,85,254,86,254,87,254,88,254,89,254,90,254,91,254,92,254,93,254,94,254,95,254,96,254,97,254,98,254,99,254,100,254,101,254,102,254,103,254,104,254,105,254,106,254,107,254,108,254,109,254,110,254,111,254,112,254,113,254,114,254,115,254,116,254,117,254,118,254,119,254,120,254,121,254,122,254,123,254,124,254,125,254,126,254,128,254,129,254,130,254,131,254,132,254,133,254,134,254,135,254,136,254,137,254,138,254,139,254,140,254,141,254,142,254,143,254,144,254,145,254,146,254,147,254,148,254,149,254,150,254,151,254,152,254,153,254,154,254,155,254,156,254,157,254,158,254,159,254,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,77,184,252,220,135,217,90,187,172,180,174,190,228,253,148,253,148,198,245,189,240,192,174,196,206,145,208,176,93,193,95,204,125,194,221,194,227,223,137,152,183,194,229,192,211,231,243,194,228,192,210,241,152,129,121,194,209,153,218,160,128,204,109,251,91,141,185,158,69,203,123,210,104,192,173,197,68,207,158,192,200,192,202,192,203,192,199,253,156,129,237,192,228,132,218,147,239,153,169,160,116,177,82,192,207,204,74,204,148,194,183,194,182,244,148,250,152,194,181,181,147,190,71,199,138,228,155,194,185,213,147,137,197,197,170,187,92,195,64,192,206,192,218,217,84,192,215,137,190,140,210,152,199,156,73,194,169,192,219,191,124,194,170,192,213,192,223,132,67,193,232,182,160,190,99,193,226,193,234,215,120,146,130,152,183,214,90,181,164,140,142,197,173,194,202,174,144,177,177,180,145,177,227,143,205,178,187,195,218,148,181,203,247,133,162,200,251,202,161,200,126,213,102,154,162,179,189,201,242,202,176,200,244,194,211,194,212,193,193,131,201,253,157,193,186,188,90,193,188,213,143,193,191,132,238,133,206,197,174,143,93,194,195,158,86,181,90,233,130,243,80,251,144,192,232,193,166,149,209,154,118,222,93,196,234,145,122,145,217,147,211,157,105,159,146,173,73,253,158,190,154,194,147,221,130,201,143,223,66,229,128,193,208,193,211,209,202,193,210,193,209,213,102,193,174,196,238,196,237,154,154,186,159,171,67,193,238,224,242,140,142,142,88,193,175,193,225,172,147,193,231,241,246,226,143,193,227,236,96,238,73,192,253,182,89,245,183,235,96,144,186,193,203,193,197,229,188,196,242,193,207,152,183,193,199,175,159,222,164,223,124,253,136,149,158,200,238,132,162,150,131,193,248,193,247,193,239,193,240,193,244,193,242,188,126,238,144,193,249,194,190,234,145,130,144,141,145,156,83,221,134,194,201,144,252,192,245,194,202,194,161,192,251,192,244,194,196,210,215,192,238,192,230,196,224,192,237,193,161,238,190,253,159,209,101,192,239,235,120,196,228,196,231,193,223,159,251,173,85,204,65,253,160,247,91,247,235,193,214,193,220,197,82,193,162,243,210,193,163,160,238,214,203,215,82,202,178,178,232,180,204,199,208,182,200,205,216,204,199,213,172,182,180,177,169,221,151,208,208,189,181,210,138,192,170,254,64,254,65,254,66,254,67,137,86,254,68,199,231,254,69,254,70,132,68,216,105,210,230,254,71,201,241,207,233,184,163,190,184,190,171,211,240,254,72,254,73,254,74,214,84,254,75,254,76,210,221,182,188,254,77,254,78,254,79,239,136,239,149,240,94,250,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,85,166,242,0,0,166,244,166,245,166,224,166,225,166,240,166,241,166,226,166,227,166,238,166,239,166,230,166,231,166,228,166,229,166,232,166,233,166,234,166,235,0,0,0,0,0,0,0,0,169,104,169,105,169,106,169,107,169,108,169,109,169,110,169,111,169,112,169,113,0,0,169,114,169,115,169,116,169,117,0,0,169,118,169,119,169,120,169,121,169,122,169,123,169,124,169,125,169,126,169,128,169,129,169,130,169,131,169,132,0,0,169,133,169,134,169,135,169,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,163,161,163,162,163,163,161,231,163,165,163,166,163,167,163,168,163,169,163,170,163,171,163,172,163,173,163,174,163,175,163,176,163,177,163,178,163,179,163,180,163,181,163,182,163,183,163,184,163,185,163,186,163,187,163,188,163,189,163,190,163,191,163,192,163,193,163,194,163,195,163,196,163,197,163,198,163,199,163,200,163,201,163,202,163,203,163,204,163,205,163,206,163,207,163,208,163,209,163,210,163,211,163,212,163,213,163,214,163,215,163,216,163,217,163,218,163,219,163,220,163,221,163,222,163,223,163,224,163,225,163,226,163,227,163,228,163,229,163,230,163,231,163,232,163,233,163,234,163,235,163,236,163,237,163,238,163,239,163,240,163,241,163,242,163,243,163,244,163,245,163,246,163,247,163,248,163,249,163,250,163,251,163,252,163,253,161,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,233,161,234,169,86,163,254,169,87,163,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}; uchar g_gbk[65536*2]={0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,2,78,164,79,189,80,216,81,17,83,162,84,6,86,18,87,62,88,61,89,97,90,72,91,170,92,161,93,198,94,8,96,71,97,79,98,193,99,219,100,242,101,4,103,92,104,97,105,92,106,47,107,89,108,205,109,240,110,230,111,220,112,214,113,198,228,38,229,134,229,230,229,70,230,166,230,6,231,202,2,33,48,220,114,114,115,248,115,123,116,243,116,136,117,69,118,196,118,93,119,230,119,132,120,13,121,147,121,29,122,163,122,47,123,197,123,67,124,191,124,55,125,153,125,251,125,94,126,86,127,228,127,126,128,64,129,212,129,106,130,62,131,238,131,125,132,3,133,130,133,249,133,109,134,25,135,165,135,36,136,172,136,56,137,162,137,30,138,129,138,228,138,70,139,56,140,174,140,14,141,213,141,115,142,229,142,69,143,25,144,194,144,69,145,230,145,70,146,168,146,10,147,108,147,206,147,47,148,39,149,204,149,140,150,33,151,158,151,15,152,111,152,8,153,140,153,250,153,90,154,7,155,124,155,220,155,60,156,227,156,67,157,163,157,3,158,171,158,50,159,12,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,4,78,171,79,190,80,217,81,18,83,165,84,7,86,19,87,63,88,62,89,99,90,73,91,174,92,162,93,199,94,9,96,73,97,80,98,194,99,220,100,243,101,5,103,93,104,98,105,93,106,48,107,90,108,206,109,241,110,231,111,221,112,215,113,199,228,39,229,135,229,231,229,71,230,167,230,7,231,203,2,34,48,221,114,115,115,249,115,124,116,245,116,137,117,70,118,199,118,94,119,232,119,133,120,14,121,148,121,31,122,164,122,48,123,200,123,68,124,192,124,56,125,154,125,252,125,95,126,89,127,231,127,129,128,65,129,213,129,107,130,63,131,239,131,126,132,4,133,131,133,250,133,111,134,27,135,166,135,37,136,174,136,57,137,163,137,31,138,130,138,229,138,71,139,57,140,175,140,15,141,216,141,117,142,230,142,70,143,28,144,195,144,71,145,231,145,71,146,169,146,11,147,109,147,207,147,48,148,51,149,205,149,142,150,34,151,159,151,16,152,112,152,9,153,142,153,251,153,91,154,9,155,125,155,221,155,61,156,228,156,68,157,164,157,4,158,172,158,51,159,13,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,5,78,173,79,191,80,218,81,19,83,174,84,10,86,20,87,64,88,63,89,100,90,74,91,175,92,163,93,200,94,11,96,75,97,85,98,195,99,221,100,244,101,6,103,94,104,100,105,94,106,49,107,98,108,207,109,242,110,232,111,222,112,216,113,200,228,40,229,136,229,232,229,72,230,168,230,8,231,217,2,35,48,223,114,116,115,250,115,125,116,248,116,138,117,71,118,201,118,95,119,234,119,134,120,15,121,149,121,33,122,167,122,50,123,201,123,69,124,194,124,57,125,155,125,253,125,96,126,91,127,232,127,130,128,66,129,214,129,108,130,65,131,243,131,127,132,5,133,134,133,252,133,112,134,29,135,167,135,38,136,175,136,58,137,164,137,32,138,131,138,230,138,72,139,58,140,176,140,16,141,217,141,119,142,231,142,71,143,35,144,198,144,72,145,232,145,72,146,170,146,12,147,110,147,208,147,49,148,61,149,206,149,145,150,35,151,161,151,17,152,113,152,10,153,154,153,252,153,92,154,10,155,126,155,222,155,62,156,229,156,69,157,165,157,5,158,173,158,52,159,14,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,6,78,176,79,192,80,220,81,20,83,176,84,11,86,21,87,65,88,64,89,101,90,75,91,176,92,164,93,203,94,12,96,77,97,86,98,197,99,223,100,245,101,7,103,95,104,101,105,95,106,51,107,99,108,208,109,243,110,233,111,224,112,217,113,201,228,41,229,137,229,233,229,73,230,169,230,9,231,19,32,36,48,226,114,117,115,251,115,127,116,249,116,140,117,72,118,203,118,96,119,239,119,136,120,16,121,150,121,34,122,169,122,52,123,202,123,70,124,195,124,58,125,156,125,254,125,97,126,92,127,234,127,133,128,67,129,215,129,109,130,66,131,244,131,128,132,6,133,136,133,253,133,114,134,31,135,169,135,39,136,176,136,59,137,165,137,33,138,132,138,231,138,73,139,59,140,177,140,17,141,220,141,120,142,232,142,72,143,36,144,200,144,81,145,233,145,73,146,171,146,13,147,111,147,209,147,50,148,67,149,207,149,146,150,36,151,162,151,18,152,114,152,11,153,155,153,253,153,93,154,11,155,127,155,223,155,63,156,230,156,70,157,166,157,6,158,174,158,53,159,15,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,15,78,177,79,193,80,222,81,24,83,178,84,13,86,22,87,66,88,67,89,102,90,76,91,178,92,165,93,204,94,16,96,79,97,87,98,199,99,224,100,248,101,12,103,106,104,103,105,96,106,52,107,101,108,210,109,245,110,234,111,225,112,218,113,202,228,42,229,138,229,234,229,74,230,170,230,10,231,21,32,37,48,227,114,118,115,252,115,130,116,250,116,141,117,73,118,204,118,100,119,240,119,138,120,17,121,151,121,36,122,170,122,53,123,203,123,71,124,196,124,59,125,157,125,255,125,98,126,93,127,235,127,136,128,68,129,216,129,113,130,68,131,245,131,129,132,7,133,137,133,254,133,115,134,32,135,170,135,40,136,178,136,60,137,166,137,34,138,133,138,232,138,74,139,60,140,178,140,18,141,224,141,121,142,233,142,73,143,37,144,201,144,83,145,234,145,74,146,172,146,14,147,112,147,210,147,51,148,72,149,208,149,147,150,37,151,164,151,19,152,115,152,12,153,156,153,254,153,94,154,12,155,128,155,224,155,64,156,231,156,71,157,167,157,7,158,175,158,54,159,17,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,18,78,178,79,194,80,223,81,27,83,181,84,16,86,23,87,67,88,69,89,104,90,77,91,180,92,166,93,205,94,17,96,80,97,89,98,200,99,225,100,249,101,14,103,108,104,104,105,98,106,53,107,102,108,211,109,246,110,235,111,226,112,219,113,203,228,43,229,139,229,235,229,75,230,171,230,11,231,37,32,38,48,228,114,119,115,253,115,132,116,251,116,142,117,74,118,211,118,103,119,241,119,139,120,18,121,152,121,37,122,171,122,54,123,205,123,72,124,198,124,60,125,158,125,0,126,99,126,94,127,236,127,138,128,69,129,217,129,117,130,69,131,246,131,131,132,8,133,138,133,0,134,116,134,36,135,174,135,41,136,179,136,61,137,167,137,35,138,134,138,233,138,75,139,61,140,179,140,19,141,225,141,122,142,234,142,74,143,39,144,203,144,84,145,235,145,75,146,173,146,15,147,113,147,211,147,52,148,75,149,209,149,149,150,38,151,165,151,20,152,116,152,14,153,157,153,255,153,95,154,13,155,129,155,225,155,65,156,232,156,72,157,168,157,8,158,176,158,56,159,19,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,23,78,179,79,195,80,226,81,28,83,182,84,17,86,24,87,69,88,70,89,105,90,78,91,182,92,167,93,206,94,19,96,82,97,90,98,202,99,227,100,251,101,15,103,109,104,105,105,99,106,54,107,103,108,212,109,247,110,236,111,227,112,220,113,204,228,44,229,140,229,236,229,76,230,172,230,12,231,53,32,39,48,229,114,120,115,254,115,133,116,252,116,144,117,75,118,213,118,105,119,242,119,143,120,20,121,153,121,38,122,174,122,55,123,206,123,73,124,201,124,61,125,159,125,1,126,100,126,96,127,237,127,141,128,71,129,218,129,118,130,72,131,247,131,132,132,9,133,139,133,1,134,117,134,38,135,176,135,42,136,180,136,62,137,168,137,36,138,135,138,234,138,76,139,62,140,180,140,20,141,226,141,123,142,235,142,75,143,40,144,204,144,85,145,236,145,76,146,175,146,16,147,114,147,212,147,53,148,85,149,210,149,150,150,39,151,166,151,21,152,139,152,15,153,158,153,0,154,96,154,14,155,130,155,226,155,66,156,233,156,73,157,169,157,9,158,177,158,58,159,20,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,31,78,180,79,196,80,227,81,30,83,183,84,18,86,25,87,70,88,74,89,107,90,79,91,185,92,168,93,207,94,23,96,83,97,92,98,203,99,229,100,252,101,17,103,110,104,106,105,100,106,56,107,107,108,213,109,248,110,237,111,229,112,221,113,205,228,45,229,141,229,237,229,77,230,173,230,13,231,5,33,40,48,230,114,121,115,255,115,134,116,253,116,147,117,78,118,217,118,106,119,244,119,144,120,21,121,155,121,39,122,175,122,57,123,207,123,74,124,203,124,62,125,160,125,2,126,101,126,99,127,239,127,142,128,73,129,219,129,119,130,74,131,250,131,133,132,10,133,140,133,2,134,118,134,39,135,177,135,43,136,181,136,63,137,169,137,37,138,136,138,235,138,77,139,63,140,181,140,21,141,229,141,125,142,236,142,76,143,41,144,205,144,86,145,237,145,77,146,176,146,17,147,115,147,213,147,54,148,90,149,211,149,154,150,40,151,167,151,22,152,142,152,17,153,159,153,1,154,97,154,16,155,131,155,227,155,67,156,234,156,74,157,170,157,10,158,178,158,60,159,24,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,32,78,182,79,197,80,229,81,31,83,185,84,19,86,26,87,71,88,76,89,108,90,82,91,186,92,169,93,208,94,24,96,84,97,93,98,204,99,231,100,253,101,18,103,111,104,108,105,102,106,59,107,108,108,215,109,250,110,240,111,234,112,222,113,206,228,46,229,142,229,238,229,78,230,174,230,14,231,9,33,41,48,231,114,122,115,0,116,136,116,254,116,149,117,79,118,218,118,109,119,245,119,146,120,22,121,156,121,40,122,176,122,59,123,208,123,75,124,206,124,63,125,161,125,3,126,102,126,100,127,242,127,143,128,77,129,220,129,120,130,75,131,251,131,134,132,11,133,141,133,3,134,119,134,40,135,178,135,44,136,182,136,64,137,170,137,38,138,139,138,236,138,78,139,64,140,182,140,22,141,230,141,126,142,237,142,77,143,42,144,210,144,88,145,238,145,78,146,177,146,18,147,116,147,215,147,55,148,96,149,212,149,155,150,41,151,168,151,23,152,146,152,18,153,160,153,2,154,98,154,17,155,132,155,228,155,68,156,235,156,75,157,171,157,11,158,179,158,63,159,31,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,33,78,183,79,198,80,230,81,34,83,186,84,20,86,27,87,72,88,77,89,109,90,86,91,187,92,170,93,212,94,26,96,86,97,94,98,209,99,232,100,254,101,19,103,112,104,109,105,103,106,60,107,109,108,218,109,251,110,241,111,238,112,223,113,207,228,47,229,143,229,239,229,79,230,175,230,15,231,150,33,163,50,234,114,123,115,1,116,137,116,0,117,152,117,80,118,220,118,110,119,247,119,148,120,23,121,157,121,41,122,177,122,61,123,210,123,76,124,207,124,64,125,162,125,4,126,103,126,101,127,244,127,144,128,78,129,221,129,123,130,76,131,252,131,138,132,13,133,142,133,4,134,120,134,42,135,180,135,45,136,184,136,66,137,171,137,39,138,140,138,237,138,79,139,66,140,183,140,23,141,231,141,128,142,238,142,78,143,43,144,212,144,89,145,239,145,79,146,178,146,19,147,117,147,216,147,56,148,110,149,213,149,157,150,43,151,169,151,24,152,149,152,19,153,161,153,3,154,99,154,18,155,133,155,229,155,69,156,236,156,76,157,172,157,12,158,181,158,64,159,32,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,35,78,184,79,199,80,231,81,36,83,188,84,21,86,29,87,73,88,80,89,110,90,94,91,188,92,171,93,213,94,30,96,87,97,95,98,211,99,233,100,255,101,22,103,113,104,111,105,104,106,61,107,110,108,219,109,252,110,242,111,240,112,225,113,208,228,48,229,144,229,240,229,80,230,176,230,16,231,151,33,142,51,235,114,124,115,2,116,138,116,1,117,155,117,81,118,221,118,111,119,249,119,149,120,24,121,158,121,42,122,178,122,63,123,212,123,78,124,208,124,65,125,163,125,5,126,104,126,102,127,245,127,145,128,79,129,222,129,124,130,77,131,254,131,141,132,14,133,144,133,6,134,131,134,43,135,182,135,46,136,185,136,67,137,172,137,40,138,141,138,238,138,80,139,67,140,184,140,24,141,233,141,130,142,239,142,79,143,44,144,213,144,91,145,240,145,80,146,179,146,20,147,118,147,217,147,57,148,116,149,214,149,158,150,44,151,170,151,25,152,153,152,20,153,162,153,4,154,100,154,20,155,134,155,230,155,70,156,237,156,77,157,173,157,13,158,182,158,65,159,33,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,38,78,185,79,200,80,232,81,37,83,190,84,22,86,30,87,74,88,82,89,111,90,96,91,190,92,172,93,215,94,31,96,88,97,96,98,212,99,234,100,1,102,24,103,114,104,112,105,105,106,63,107,111,108,220,109,253,110,243,111,241,112,226,113,209,228,49,229,145,229,241,229,81,230,177,230,17,231,152,33,143,51,245,114,125,115,4,116,140,116,2,117,156,117,82,118,222,118,112,119,250,119,150,120,25,121,159,121,43,122,180,122,64,123,213,123,79,124,209,124,66,125,164,125,6,126,105,126,103,127,246,127,146,128,82,129,223,129,128,130,78,131,255,131,143,132,15,133,145,133,7,134,132,134,44,135,183,135,47,136,186,136,69,137,173,137,41,138,142,138,239,138,81,139,68,140,185,140,25,141,237,141,131,142,240,142,80,143,48,144,214,144,92,145,241,145,81,146,180,146,21,147,119,147,218,147,58,148,117,149,215,149,159,150,46,151,172,151,26,152,163,152,21,153,163,153,5,154,101,154,21,155,135,155,231,155,71,156,238,156,78,157,174,157,14,158,183,158,66,159,35,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,41,78,186,79,201,80,233,81,39,83,195,84,23,86,32,87,75,88,83,89,112,90,97,91,192,92,173,93,216,94,34,96,89,97,97,98,213,99,235,100,4,102,25,103,115,104,114,105,106,106,64,107,113,108,223,109,254,110,244,111,242,112,227,113,210,228,50,229,146,229,242,229,82,230,178,230,18,231,153,33,156,51,246,114,127,115,7,116,141,116,3,117,158,117,83,118,224,118,113,119,251,119,153,120,26,121,160,121,44,122,181,122,65,123,214,123,80,124,210,124,67,125,165,125,7,126,106,126,107,127,247,127,148,128,86,129,224,129,129,130,83,131,0,132,144,132,16,133,146,133,8,134,133,134,45,135,184,135,48,136,187,136,70,137,174,137,42,138,143,138,240,138,82,139,69,140,186,140,26,141,238,141,132,142,241,142,81,143,49,144,216,144,95,145,242,145,82,146,181,146,22,147,120,147,219,147,59,148,119,149,216,149,160,150,47,151,174,151,27,152,168,152,22,153,164,153,6,154,102,154,22,155,136,155,232,155,72,156,239,156,79,157,175,157,15,158,185,158,67,159,36,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,46,78,187,79,202,80,234,81,40,83,197,84,25,86,33,87,78,88,89,89,113,90,103,91,194,92,174,93,217,94,35,96,90,97,98,98,215,99,236,100,5,102,26,103,117,104,115,105,107,106,65,107,115,108,226,109,255,110,245,111,243,112,228,113,211,228,51,229,147,229,243,229,83,230,179,230,19,231,21,34,157,51,249,114,128,115,8,116,143,116,5,117,162,117,85,118,225,118,114,119,252,119,157,120,27,121,161,121,45,122,182,122,66,123,215,123,81,124,211,124,68,125,167,125,8,126,107,126,108,127,248,127,149,128,87,129,225,129,131,130,85,131,2,132,145,132,18,133,147,133,9,134,134,134,47,135,185,135,49,136,189,136,71,137,175,137,43,138,144,138,241,138,83,139,72,140,187,140,27,141,240,141,134,142,242,142,82,143,50,144,217,144,96,145,243,145,83,146,182,146,23,147,121,147,220,147,60,148,120,149,217,149,161,150,49,151,176,151,28,152,169,152,23,153,166,153,7,154,103,154,23,155,137,155,233,155,73,156,240,156,80,157,176,157,16,158,186,158,69,159,39,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,47,78,188,79,203,80,236,81,41,83,202,84,26,86,34,87,79,88,91,89,114,90,104,91,195,92,175,93,218,94,36,96,91,97,100,98,216,99,237,100,7,102,28,103,120,104,116,105,108,106,66,107,117,108,227,109,0,111,246,111,244,112,230,113,212,228,52,229,148,229,244,229,84,230,180,230,20,231,31,34,158,51,253,114,129,115,11,116,145,116,6,117,166,117,87,118,226,118,115,119,3,120,158,120,28,121,162,121,46,122,183,122,67,123,216,123,82,124,212,124,69,125,168,125,9,126,108,126,109,127,249,127,151,128,88,129,226,129,133,130,86,131,5,132,146,132,20,133,148,133,10,134,135,134,48,135,187,135,51,136,190,136,72,137,176,137,44,138,145,138,242,138,84,139,74,140,188,140,28,141,241,141,136,142,243,142,83,143,51,144,218,144,102,145,244,145,84,146,183,146,24,147,122,147,221,147,61,148,121,149,218,149,162,150,51,151,177,151,29,152,170,152,24,153,167,153,8,154,104,154,24,155,138,155,234,155,74,156,241,156,81,157,177,157,17,158,188,158,70,159,40,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,49,78,189,79,204,80,238,81,43,83,203,84,28,86,36,87,80,88,92,89,115,90,107,91,197,92,176,93,220,94,44,96,92,97,101,98,217,99,238,100,8,102,30,103,121,104,117,105,109,106,68,107,119,108,229,109,1,111,247,111,245,112,232,113,213,228,53,229,149,229,245,229,85,230,181,230,21,231,35,34,161,51,254,114,130,115,12,116,146,116,7,117,167,117,88,118,227,118,116,119,4,120,160,120,29,121,163,121,47,122,184,122,68,123,219,123,83,124,216,124,70,125,169,125,10,126,109,126,111,127,250,127,153,128,91,129,228,129,134,130,87,131,7,132,147,132,21,133,149,133,11,134,136,134,50,135,188,135,52,136,191,136,73,137,177,137,45,138,146,138,243,138,85,139,75,140,189,140,32,141,242,141,137,142,244,142,84,143,52,144,222,144,103,145,245,145,85,146,184,146,25,147,123,147,222,147,63,148,122,149,219,149,163,150,52,151,179,151,30,152,171,152,25,153,169,153,9,154,105,154,25,155,139,155,235,155,75,156,242,156,82,157,178,157,18,158,191,158,71,159,41,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,51,78,190,79,205,80,241,81,44,83,214,84,29,86,37,87,82,88,93,89,120,90,109,91,198,92,177,93,221,94,45,96,94,97,104,98,218,99,239,100,9,102,32,103,122,104,118,105,110,106,69,107,120,108,231,109,3,111,248,111,246,112,233,113,214,228,54,229,150,229,246,229,86,230,182,230,22,231,82,34,196,51,255,114,131,115,13,116,147,116,8,117,168,117,89,118,228,118,117,119,5,120,162,120,31,121,164,121,48,122,185,122,70,123,220,123,84,124,218,124,71,125,170,125,11,126,110,126,112,127,253,127,158,128,92,129,229,129,135,130,88,131,8,132,148,132,22,133,150,133,12,134,137,134,51,135,190,135,53,136,192,136,74,137,178,137,46,138,148,138,244,138,86,139,77,140,190,140,81,141,244,141,138,142,245,142,85,143,55,144,223,144,104,145,246,145,86,146,185,146,26,147,124,147,223,147,64,148,123,149,220,149,164,150,53,151,181,151,31,152,172,152,26,153,170,153,10,154,106,154,26,155,140,155,236,155,76,156,243,156,83,157,179,157,19,158,192,158,72,159,21,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,53,78,192,79,206,80,242,81,45,83,216,84,32,86,38,87,83,88,94,89,121,90,110,91,199,92,178,93,222,94,46,96,95,97,113,98,219,99,240,100,11,102,33,103,123,104,122,105,111,106,72,107,122,108,232,109,4,111,249,111,248,112,234,113,215,228,55,229,151,229,247,229,87,230,183,230,23,231,102,34,206,51,0,115,133,115,14,116,148,116,9,117,169,117,90,118,230,118,118,119,6,120,164,120,32,121,165,121,49,122,186,122,72,123,222,123,85,124,219,124,72,125,171,125,12,126,111,126,115,127,254,127,163,128,93,129,230,129,137,130,89,131,9,132,149,132,24,133,151,133,13,134,142,134,53,135,191,135,54,136,195,136,75,137,179,137,47,138,149,138,245,138,87,139,78,140,191,140,82,141,246,141,139,142,246,142,86,143,57,144,224,144,107,145,247,145,87,146,186,146,27,147,125,147,224,147,65,148,124,149,221,149,165,150,54,151,182,151,32,152,173,152,27,153,171,153,11,154,107,154,27,155,141,155,237,155,77,156,244,156,84,157,180,157,20,158,193,158,73,159,22,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,55,78,193,79,208,80,244,81,47,83,219,84,33,86,39,87,85,88,95,89,123,90,111,91,200,92,179,93,223,94,48,96,96,97,114,98,220,99,241,100,13,102,34,103,124,104,123,105,112,106,74,107,123,108,233,109,5,111,250,111,250,112,235,113,216,228,56,229,152,229,248,229,88,230,184,230,24,231,103,34,209,51,2,115,134,115,17,116,149,116,10,117,170,117,91,118,231,118,119,119,7,120,166,120,33,121,166,121,50,122,187,122,74,123,223,123,86,124,221,124,73,125,172,125,13,126,112,126,117,127,255,127,166,128,94,129,232,129,140,130,93,131,10,132,150,132,25,133,152,133,14,134,143,134,54,135,193,135,55,136,196,136,76,137,180,137,48,138,150,138,246,138,88,139,79,140,192,140,87,141,252,141,140,142,247,142,87,143,58,144,227,144,109,145,248,145,88,146,187,146,28,147,126,147,225,147,66,148,125,149,222,149,166,150,55,151,183,151,33,152,174,152,28,153,172,153,12,154,114,154,28,155,142,155,238,155,78,156,245,156,85,157,181,157,21,158,194,158,74,159,23,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,60,78,194,79,209,80,247,81,48,83,224,84,34,86,43,87,86,88,97,89,124,90,114,91,201,92,180,93,224,94,49,96,97,97,116,98,221,99,242,100,16,102,35,103,125,104,125,105,114,106,75,107,124,108,234,109,7,111,251,111,251,112,236,113,217,228,57,229,153,229,249,229,89,230,185,230,25,231,191,34,210,51,4,115,136,115,18,116,150,116,11,117,173,117,93,118,232,118,120,119,8,120,168,120,34,121,168,121,52,122,188,122,77,123,224,123,87,124,222,124,74,125,173,125,14,126,113,126,118,127,2,128,167,128,95,129,233,129,144,130,98,131,16,132,152,132,27,133,153,133,15,134,144,134,56,135,194,135,56,136,199,136,77,137,181,137,49,138,151,138,247,138,89,139,80,140,193,140,95,141,254,141,141,142,248,142,88,143,61,144,228,144,115,145,249,145,89,146,188,146,29,147,127,147,226,147,67,148,126,149,223,149,168,150,58,151,184,151,34,152,175,152,29,153,173,153,13,154,131,154,29,155,143,155,239,155,79,156,246,156,86,157,182,157,22,158,195,158,75,159,24,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,64,78,198,79,210,80,254,81,49,83,225,84,37,86,49,87,87,88,99,89,125,90,116,91,202,92,181,93,225,94,50,96,99,97,117,98,223,99,243,100,17,102,36,103,126,104,126,105,115,106,77,107,127,108,237,109,8,111,252,111,252,112,237,113,218,228,58,229,154,229,250,229,90,230,186,230,26,231,80,37,213,51,5,115,138,115,19,116,151,116,12,117,182,117,95,118,233,118,122,119,10,120,169,120,35,121,169,121,53,122,189,122,78,123,226,123,88,124,225,124,75,125,175,125,15,126,114,126,119,127,7,128,168,128,97,129,235,129,147,130,112,131,18,132,154,132,28,133,154,133,16,134,145,134,57,135,195,135,58,136,200,136,78,137,182,137,50,138,152,138,248,138,90,139,81,140,194,140,101,141,255,141,142,142,249,142,89,143,63,144,229,144,122,145,250,145,90,146,189,146,30,147,128,147,227,147,68,148,128,149,224,149,169,150,59,151,185,151,35,152,176,152,30,153,174,153,14,154,137,154,30,155,144,155,240,155,80,156,247,156,87,157,183,157,23,158,197,158,76,159,25,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,65,78,199,79,211,80,4,82,50,83,226,84,38,86,50,87,89,88,100,89,126,90,118,91,204,92,182,93,226,94,51,96,100,97,119,98,226,99,244,100,18,102,37,103,127,104,127,105,116,106,78,107,128,108,239,109,10,111,253,111,254,112,239,113,219,228,59,229,155,229,251,229,91,230,187,230,27,231,81,37,48,254,6,115,140,115,20,116,152,116,14,117,183,117,96,118,234,118,123,119,11,120,170,120,37,121,170,121,54,122,190,122,83,123,227,123,89,124,226,124,76,125,176,125,16,126,115,126,120,127,8,128,172,128,98,129,238,129,148,130,113,131,19,132,155,132,29,133,157,133,18,134,146,134,58,135,196,135,59,136,202,136,79,137,183,137,51,138,153,138,249,138,91,139,82,140,195,140,104,141,0,142,145,142,250,142,90,143,64,144,233,144,123,145,251,145,91,146,190,146,31,147,129,147,228,147,69,148,129,149,225,149,170,150,60,151,186,151,36,152,177,152,31,153,175,153,15,154,141,154,32,155,145,155,241,155,81,156,248,156,88,157,184,157,24,158,198,158,77,159,26,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,66,78,200,79,212,80,5,82,51,83,227,84,40,86,52,87,90,88,102,89,128,90,119,91,205,92,184,93,227,94,52,96,101,97,120,98,228,99,245,100,22,102,39,103,128,104,129,105,117,106,79,107,132,108,240,109,11,111,254,111,255,112,240,113,220,228,60,229,156,229,252,229,92,230,188,230,28,231,82,37,226,255,7,115,141,115,21,116,153,116,16,117,186,117,97,118,235,118,124,119,14,120,171,120,38,121,171,121,56,122,192,122,85,123,228,123,90,124,227,124,77,125,177,125,17,126,116,126,122,127,9,128,176,128,99,129,239,129,149,130,114,131,20,132,157,132,30,133,158,133,19,134,148,134,60,135,197,135,61,136,203,136,80,137,184,137,52,138,154,138,250,138,92,139,83,140,196,140,105,141,1,142,146,142,251,142,91,143,67,144,234,144,124,145,252,145,92,146,191,146,32,147,130,147,229,147,70,148,130,149,226,149,171,150,61,151,187,151,37,152,178,152,32,153,176,153,16,154,142,154,33,155,146,155,242,155,82,156,249,156,89,157,185,157,25,158,199,158,78,159,27,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,68,78,201,79,213,80,9,82,52,83,228,84,41,86,53,87,91,88,103,89,129,90,120,91,206,92,185,93,228,94,54,96,102,97,122,98,229,99,246,100,23,102,41,103,130,104,131,105,118,106,80,107,135,108,242,109,12,111,255,111,0,113,241,113,221,228,61,229,157,229,253,229,93,230,189,230,29,231,83,37,228,255,8,115,143,115,22,116,154,116,18,117,187,117,98,118,236,118,129,119,15,120,172,120,39,121,172,121,58,122,193,122,87,123,231,123,91,124,228,124,78,125,178,125,18,126,117,126,123,127,10,128,179,128,100,129,240,129,150,130,115,131,21,132,158,132,32,133,159,133,20,134,150,134,61,135,199,135,62,136,204,136,81,137,185,137,53,138,155,138,251,138,93,139,84,140,197,140,106,141,2,142,147,142,252,142,92,143,69,144,236,144,128,145,253,145,93,146,192,146,33,147,131,147,230,147,71,148,131,149,227,149,172,150,63,151,188,151,38,152,179,152,33,153,177,153,17,154,148,154,34,155,147,155,243,155,83,156,250,156,90,157,186,157,26,158,200,158,79,159,28,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,70,78,203,79,215,80,11,82,53,83,235,84,42,86,54,87,92,88,104,89,130,90,121,91,207,92,186,93,229,94,55,96,105,97,123,98,230,99,247,100,24,102,46,103,132,104,133,105,119,106,81,107,138,108,244,109,13,111,0,112,1,113,242,113,222,228,62,229,158,229,254,229,94,230,190,230,30,231,84,37,226,231,9,115,144,115,23,116,155,116,20,117,191,117,100,118,237,118,130,119,16,120,173,120,40,121,173,121,62,122,194,122,89,123,232,123,92,124,229,124,79,125,179,125,19,126,118,126,124,127,14,128,181,128,102,129,241,129,154,130,116,131,22,132,159,132,34,133,160,133,21,134,151,134,64,135,200,135,63,136,205,136,82,137,186,137,54,138,156,138,252,138,94,139,86,140,198,140,108,141,3,142,149,142,253,142,93,143,70,144,238,144,129,145,254,145,94,146,193,146,34,147,132,147,231,147,72,148,132,149,228,149,173,150,64,151,189,151,39,152,180,152,34,153,178,153,18,154,149,154,36,155,148,155,244,155,84,156,251,156,91,157,187,157,27,158,202,158,82,159,29,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,74,78,204,79,216,80,12,82,54,83,236,84,43,86,55,87,93,88,105,89,131,90,123,91,208,92,187,93,230,94,56,96,106,97,125,98,231,99,248,100,26,102,48,103,135,104,138,105,120,106,82,107,139,108,245,109,14,111,1,112,2,113,243,113,223,228,63,229,159,229,255,229,95,230,191,230,31,231,85,37,33,33,11,115,146,115,24,116,157,116,21,117,192,117,101,118,240,118,131,119,19,120,174,120,41,121,174,121,64,122,195,122,92,123,233,123,93,124,230,124,80,125,180,125,20,126,119,126,125,127,15,128,182,128,104,129,242,129,155,130,117,131,23,132,160,132,35,133,161,133,23,134,152,134,65,135,201,135,65,136,207,136,83,137,187,137,55,138,157,138,253,138,95,139,87,140,199,140,110,141,4,142,150,142,254,142,94,143,72,144,240,144,130,145,255,145,95,146,194,146,35,147,133,147,232,147,73,148,133,149,229,149,174,150,65,151,190,151,40,152,181,152,35,153,179,153,19,154,153,154,37,155,149,155,245,155,85,156,252,156,92,157,188,157,28,158,203,158,83,159,30,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,81,78,205,79,217,80,15,82,55,83,239,84,46,86,56,87,95,88,106,89,132,90,124,91,209,92,188,93,231,94,57,96,107,97,129,98,232,99,249,100,27,102,50,103,136,104,139,105,122,106,83,107,141,108,246,109,16,111,2,112,3,113,244,113,224,228,64,229,160,229,0,230,96,230,192,230,32,231,86,37,49,50,12,115,147,115,25,116,159,116,22,117,193,117,102,118,243,118,134,119,21,120,175,120,42,121,175,121,65,122,196,122,94,123,235,123,94,124,231,124,81,125,181,125,21,126,120,126,127,127,17,128,184,128,106,129,245,129,158,130,118,131,25,132,162,132,36,133,162,133,24,134,153,134,66,135,204,135,66,136,208,136,84,137,188,137,56,138,158,138,254,138,96,139,88,140,200,140,111,141,6,142,151,142,255,142,95,143,73,144,241,144,131,145,0,146,96,146,195,146,36,147,134,147,233,147,74,148,134,149,230,149,175,150,66,151,191,151,41,152,182,152,36,153,180,153,20,154,166,154,38,155,150,155,246,155,86,156,253,156,93,157,189,157,29,158,204,158,84,159,31,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,85,78,210,79,219,80,16,82,56,83,240,84,47,86,60,87,96,88,107,89,133,90,126,91,211,92,189,93,233,94,58,96,108,97,130,98,235,99,250,100,28,102,51,103,137,104,140,105,123,106,84,107,142,108,248,109,17,111,3,112,4,113,245,113,225,228,65,229,161,229,1,230,97,230,193,230,33,231,87,37,227,231,13,115,148,115,28,116,160,116,23,117,198,117,103,118,245,118,135,119,25,120,181,120,43,121,176,121,66,122,197,122,95,123,236,123,95,124,233,124,82,125,182,125,22,126,121,126,128,127,19,128,185,128,107,129,246,129,160,130,121,131,26,132,163,132,37,133,163,133,25,134,154,134,67,135,205,135,67,136,209,136,85,137,189,137,57,138,159,138,255,138,97,139,89,140,201,140,113,141,7,142,152,142,0,143,96,143,74,144,242,144,132,145,1,146,97,146,196,146,37,147,135,147,234,147,75,148,135,149,231,149,177,150,67,151,192,151,42,152,183,152,37,153,181,153,21,154,169,154,39,155,151,155,247,155,87,156,254,156,94,157,190,157,30,158,208,158,85,159,32,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,87,78,211,79,220,80,19,82,60,83,241,84,48,86,61,87,97,88,108,89,134,90,127,91,212,92,190,93,235,94,61,96,109,97,131,98,236,99,251,100,30,102,54,103,138,104,142,105,125,106,85,107,145,108,250,109,18,111,4,112,5,113,246,113,226,228,66,229,162,229,2,230,98,230,194,230,34,231,88,37,16,32,15,115,149,115,29,116,161,116,27,117,203,117,104,118,246,118,136,119,27,120,182,120,44,121,177,121,67,122,198,122,97,123,237,123,96,124,234,124,83,125,183,125,23,126,122,126,130,127,26,128,187,128,108,129,247,129,162,130,122,131,27,132,164,132,38,133,165,133,26,134,155,134,68,135,206,135,70,136,211,136,86,137,190,137,58,138,160,138,0,139,98,139,91,140,202,140,114,141,8,142,153,142,1,143,97,143,75,144,243,144,134,145,2,146,98,146,197,146,38,147,136,147,235,147,76,148,136,149,236,149,178,150,68,151,193,151,43,152,184,152,38,153,182,153,22,154,170,154,40,155,152,155,248,155,88,156,255,156,95,157,191,157,36,158,210,158,86,159,33,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,90,78,212,79,221,80,20,82,61,83,244,84,51,86,63,87,98,88,109,89,135,90,130,91,213,92,191,93,236,94,62,96,110,97,133,98,238,99,252,100,33,102,55,103,139,104,143,105,126,106,86,107,146,108,253,109,22,111,5,112,6,113,247,113,227,228,67,229,163,229,3,230,99,230,195,230,35,231,89,37,228,231,16,115,151,115,30,116,162,116,29,117,204,117,105,118,247,118,137,119,30,120,183,120,45,121,178,121,68,122,199,122,99,123,239,123,97,124,235,124,84,125,184,125,24,126,123,126,131,127,27,128,197,128,111,129,248,129,163,130,126,131,30,132,165,132,39,133,166,133,27,134,158,134,69,135,207,135,71,136,214,136,87,137,191,137,59,138,161,138,1,139,99,139,92,140,203,140,120,141,11,142,154,142,2,143,98,143,76,144,245,144,136,145,3,146,99,146,198,146,39,147,137,147,236,147,77,148,137,149,255,149,180,150,69,151,194,151,44,152,185,152,39,153,183,153,23,154,171,154,41,155,153,155,249,155,89,156,0,157,96,157,192,157,39,158,211,158,87,159,34,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,91,78,213,79,222,80,21,82,64,83,245,84,53,86,65,87,99,88,110,89,136,90,134,91,214,92,192,93,237,94,64,96,111,97,134,98,239,99,253,100,34,102,56,103,140,104,144,105,127,106,87,107,149,108,254,109,23,111,6,112,7,113,248,113,228,228,68,229,164,229,4,230,100,230,196,230,36,231,90,37,229,231,17,115,152,115,31,116,163,116,30,117,206,117,106,118,250,118,138,119,32,120,184,120,46,121,180,121,69,122,200,122,100,123,240,123,98,124,236,124,85,125,185,125,25,126,124,126,132,127,29,128,199,128,114,129,249,129,167,130,127,131,31,132,166,132,40,133,167,133,28,134,159,134,70,135,208,135,72,136,215,136,88,137,192,137,60,138,162,138,2,139,100,139,93,140,204,140,121,141,13,142,155,142,3,143,99,143,78,144,246,144,138,145,4,146,100,146,199,146,40,147,138,147,237,147,78,148,138,149,7,150,181,150,70,151,195,151,45,152,186,152,40,153,184,153,24,154,172,154,42,155,154,155,250,155,90,156,1,157,97,157,193,157,46,158,213,158,88,159,35,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,98,78,214,79,223,80,28,82,66,83,246,84,55,86,67,87,100,88,111,89,137,90,138,91,215,92,193,93,238,94,68,96,113,97,135,98,240,99,254,100,35,102,57,103,141,104,145,105,129,106,88,107,150,108,255,109,24,111,7,112,8,113,250,113,229,228,69,229,165,229,5,230,101,230,197,230,37,231,91,37,230,231,18,115,153,115,32,116,164,116,32,117,207,117,108,118,251,118,139,119,33,120,186,120,47,121,181,121,71,122,201,122,101,123,242,123,99,124,237,124,86,125,186,125,26,126,125,126,133,127,30,128,200,128,115,129,250,129,178,130,128,131,32,132,167,132,41,133,169,133,29,134,160,134,74,135,212,135,73,136,218,136,89,137,195,137,61,138,163,138,3,139,101,139,94,140,205,140,122,141,14,142,157,142,4,143,100,143,84,144,247,144,142,145,5,146,101,146,201,146,41,147,139,147,238,147,79,148,139,149,19,150,183,150,71,151,196,151,46,152,187,152,41,153,185,153,25,154,173,154,43,155,155,155,251,155,91,156,2,157,98,157,194,157,48,158,214,158,89,159,36,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,99,78,217,79,224,80,30,82,68,83,247,84,56,86,68,87,102,88,112,89,138,90,141,91,216,92,194,93,239,94,69,96,114,97,136,98,241,99,255,100,36,102,59,103,142,104,146,105,130,106,90,107,151,108,0,110,25,111,8,112,11,113,251,113,230,228,70,229,166,229,6,230,102,230,198,230,38,231,92,37,252,48,20,115,154,115,33,116,165,116,33,117,208,117,109,118,253,118,143,119,34,120,187,120,48,121,182,121,72,122,202,122,102,123,243,123,100,124,238,124,87,125,187,125,27,126,126,126,134,127,31,128,201,128,117,129,253,129,181,130,129,131,33,132,168,132,42,133,171,133,30,134,161,134,75,135,213,135,74,136,219,136,90,137,205,137,63,138,164,138,4,139,103,139,95,140,206,140,123,141,16,142,159,142,5,143,101,143,85,144,249,144,143,145,6,146,102,146,202,146,42,147,140,147,239,147,80,148,140,149,24,150,184,150,72,151,197,151,47,152,188,152,42,153,186,153,26,154,174,154,44,155,156,155,252,155,92,156,3,157,99,157,195,157,52,158,215,158,90,159,37,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,100,78,219,79,225,80,31,82,70,83,248,84,58,86,69,87,103,88,113,89,139,90,142,91,218,92,195,93,240,94,70,96,115,97,139,98,243,99,1,101,38,102,60,103,144,104,147,105,131,106,91,107,152,108,1,110,26,111,9,112,12,113,252,113,231,228,71,229,167,229,7,230,103,230,199,230,39,231,93,37,155,48,24,115,156,115,35,116,166,116,34,117,209,117,110,118,255,118,144,119,36,120,188,120,49,121,183,121,73,122,204,122,103,123,244,123,101,124,240,124,88,125,188,125,28,126,127,126,135,127,33,128,202,128,118,129,255,129,182,130,130,131,34,132,169,132,45,133,172,133,31,134,162,134,77,135,214,135,75,136,220,136,91,137,211,137,64,138,165,138,5,139,104,139,96,140,207,140,124,141,17,142,160,142,6,143,106,143,86,144,250,144,147,145,7,146,103,146,203,146,43,147,141,147,240,147,81,148,141,149,27,150,186,150,73,151,198,151,48,152,189,152,43,153,187,153,27,154,175,154,45,155,157,155,253,155,93,156,4,157,100,157,196,157,59,158,217,158,91,159,38,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,101,78,224,79,226,80,33,82,75,83,249,84,60,86,70,87,104,88,114,89,140,90,144,91,219,92,196,93,241,94,71,96,116,97,140,98,245,99,2,101,41,102,62,103,145,104,150,105,133,106,92,107,154,108,2,110,27,111,10,112,13,113,253,113,232,228,72,229,168,229,8,230,104,230,200,230,40,231,94,37,156,48,25,115,157,115,36,116,170,116,35,117,211,117,112,118,0,119,147,119,40,120,189,120,50,121,184,121,74,122,205,122,104,123,245,123,102,124,241,124,89,125,189,125,29,126,128,126,136,127,35,128,203,128,119,129,3,130,186,130,131,131,35,132,170,132,46,133,173,133,32,134,165,134,79,135,215,135,78,136,221,136,92,137,212,137,65,138,166,138,6,139,105,139,99,140,208,140,125,141,18,142,161,142,7,143,128,143,89,144,251,144,148,145,8,146,104,146,204,146,44,147,142,147,241,147,82,148,142,149,30,150,187,150,74,151,199,151,49,152,190,152,44,153,188,153,28,154,178,154,46,155,158,155,254,155,94,156,5,157,101,157,197,157,60,158,218,158,92,159,39,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,103,78,226,79,227,80,34,82,76,83,251,84,61,86,72,87,105,88,117,89,141,90,145,91,220,92,198,93,242,94,72,96,118,97,141,98,247,99,3,101,42,102,63,103,146,104,151,105,134,106,93,107,156,108,3,110,28,111,11,112,14,113,254,113,233,228,73,229,169,229,9,230,105,230,201,230,41,231,95,37,253,48,26,115,158,115,39,116,171,116,36,117,215,117,113,118,2,119,148,119,42,120,191,120,51,121,188,121,75,122,206,122,105,123,246,123,103,124,242,124,90,125,190,125,30,126,129,126,137,127,36,128,207,128,120,129,7,130,187,130,132,131,41,132,171,132,47,133,177,133,33,134,166,134,80,135,216,135,79,136,222,136,93,137,213,137,66,138,167,138,8,139,106,139,100,140,209,140,126,141,19,142,162,142,8,143,140,143,90,144,252,144,149,145,9,146,105,146,205,146,45,147,144,147,242,147,83,148,143,149,32,150,191,150,75,151,200,151,50,152,191,152,45,153,189,153,29,154,179,154,48,155,159,155,255,155,95,156,6,157,102,157,198,157,64,158,222,158,93,159,40,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,104,78,228,79,228,80,35,82,77,83,254,84,62,86,73,87,106,88,119,89,142,90,146,91,221,92,199,93,243,94,73,96,120,97,142,98,249,99,4,101,43,102,65,103,148,104,153,105,135,106,94,107,157,108,4,110,29,111,12,112,15,113,255,113,234,228,74,229,170,229,10,230,106,230,202,230,42,231,96,37,254,48,31,115,160,115,41,116,172,116,38,117,217,117,114,118,3,119,149,119,43,120,192,120,53,121,191,121,76,122,207,122,106,123,248,123,104,124,243,124,91,125,191,125,31,126,131,126,139,127,43,128,208,128,129,129,8,130,188,130,135,131,42,132,172,132,48,133,178,133,34,134,171,134,81,135,217,135,80,136,224,136,96,137,215,137,67,138,168,138,9,139,107,139,101,140,210,140,127,141,21,142,163,142,9,143,146,143,92,144,255,144,150,145,10,146,106,146,206,146,46,147,145,147,243,147,84,148,144,149,35,150,194,150,76,151,201,151,51,152,192,152,47,153,190,153,30,154,180,154,49,155,160,155,0,156,96,156,7,157,103,157,199,157,77,158,225,158,94,159,41,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,106,78,229,79,229,80,37,82,80,83,0,85,64,86,75,87,109,88,122,89,143,90,148,91,222,92,200,93,245,94,74,96,121,97,143,98,250,99,5,101,44,102,68,103,149,104,154,105,136,106,95,107,158,108,6,110,30,111,13,112,17,113,0,114,235,228,75,229,171,229,11,230,107,230,203,230,43,231,97,37,6,48,32,115,161,115,43,116,173,116,39,117,218,117,115,118,5,119,150,119,46,120,194,120,54,121,194,121,77,122,208,122,107,123,249,123,105,124,244,124,92,125,192,125,32,126,132,126,141,127,44,128,209,128,131,129,9,130,191,130,136,131,43,132,173,132,49,133,179,133,35,134,173,134,82,135,218,135,81,136,225,136,97,137,216,137,68,138,169,138,10,139,109,139,102,140,211,140,128,141,22,142,164,142,10,143,157,143,93,144,0,145,151,145,11,146,107,146,207,146,47,147,146,147,244,147,85,148,145,149,36,150,195,150,77,151,202,151,52,152,193,152,48,153,191,153,31,154,181,154,51,155,161,155,1,156,97,156,8,157,104,157,200,157,80,158,227,158,95,159,42,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,107,78,231,79,232,80,38,82,84,83,2,85,65,86,82,87,110,88,123,89,144,90,150,91,223,92,201,93,248,94,76,96,122,97,144,98,251,99,6,101,46,102,69,103,150,104,157,105,137,106,96,107,160,108,7,110,31,111,14,112,18,113,1,114,236,228,76,229,172,229,12,230,108,230,204,230,44,231,98,37,157,48,35,115,163,115,45,116,174,116,42,117,220,117,116,118,6,119,151,119,47,120,195,120,55,121,196,121,78,122,209,122,108,123,250,123,106,124,245,124,93,125,193,125,33,126,133,126,143,127,45,128,210,128,132,129,10,130,192,130,138,131,44,132,174,132,50,133,180,133,36,134,174,134,84,135,220,135,82,136,230,136,98,137,217,137,69,138,170,138,11,139,110,139,103,140,212,140,130,141,23,142,165,142,11,143,160,143,94,144,1,145,152,145,12,146,108,146,208,146,48,147,147,147,245,147,86,148,146,149,37,150,200,150,78,151,203,151,53,152,194,152,49,153,192,153,32,154,185,154,52,155,162,155,2,156,98,156,9,157,105,157,201,157,82,158,228,158,96,159,43,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,108,78,235,79,233,80,39,82,88,83,3,85,66,86,83,87,111,88,124,89,145,90,159,91,224,92,202,93,249,94,78,96,123,97,148,98,252,99,7,101,48,102,71,103,152,104,158,105,138,106,97,107,162,108,8,110,33,111,15,112,20,113,2,114,237,228,77,229,173,229,13,230,109,230,205,230,45,231,99,37,158,48,36,115,164,115,47,116,175,116,46,117,221,117,117,118,10,119,152,119,49,120,196,120,56,121,197,121,79,122,210,122,109,123,251,123,107,124,246,124,94,125,194,125,34,126,134,126,144,127,46,128,211,128,133,129,11,130,194,130,139,131,45,132,176,132,51,133,181,133,37,134,178,134,85,135,221,135,83,136,231,136,99,137,219,137,70,138,171,138,12,139,111,139,104,140,213,140,131,141,24,142,166,142,12,143,161,143,95,144,3,145,153,145,13,146,109,146,209,146,49,147,148,147,246,147,87,148,147,149,38,150,202,150,79,151,204,151,54,152,195,152,50,153,193,153,33,154,187,154,53,155,163,155,3,156,99,156,10,157,106,157,202,157,83,158,230,158,97,159,44,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,109,78,236,79,234,80,42,82,89,83,4,85,67,86,84,87,112,88,126,89,147,90,167,91,226,92,203,93,251,94,79,96,124,97,153,98,254,99,8,101,50,102,74,103,153,104,159,105,139,106,104,107,168,108,9,110,34,111,16,112,23,113,3,114,238,228,78,229,174,229,14,230,110,230,206,230,46,231,100,37,73,254,38,115,165,115,49,116,176,116,52,117,223,117,118,118,12,119,153,119,50,120,198,120,57,121,199,121,80,122,211,122,111,123,253,123,108,124,247,124,95,125,195,125,35,126,135,126,145,127,47,128,212,128,134,129,14,130,195,130,140,131,46,132,177,132,52,133,182,133,38,134,179,134,86,135,222,135,85,136,233,136,100,137,221,137,71,138,172,138,13,139,112,139,105,140,214,140,134,141,25,142,167,142,13,143,162,143,96,144,5,145,156,145,14,146,110,146,210,146,50,147,149,147,247,147,88,148,148,149,39,150,203,150,80,151,205,151,55,152,196,152,51,153,194,153,34,154,189,154,54,155,164,155,4,156,100,156,11,157,107,157,203,157,84,158,232,158,98,159,45,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,110,78,240,79,235,80,44,82,91,83,5,85,68,86,85,87,113,88,127,89,148,90,168,91,227,92,204,93,252,94,81,96,125,97,156,98,3,100,10,101,51,102,75,103,154,104,160,105,140,106,105,107,172,108,11,110,35,111,18,112,27,113,4,114,239,228,79,229,175,229,15,230,111,230,207,230,47,231,101,37,74,254,39,115,166,115,50,116,177,116,54,117,224,117,119,118,14,119,154,119,51,120,199,120,61,121,200,121,82,122,212,122,112,123,255,123,109,124,249,124,96,125,196,125,36,126,136,126,146,127,48,128,213,128,135,129,15,130,197,130,141,131,47,132,179,132,53,133,184,133,40,134,183,134,88,135,223,135,86,136,234,136,101,137,223,137,73,138,173,138,14,139,113,139,108,140,215,140,135,141,26,142,168,142,14,143,164,143,97,144,6,145,157,145,15,146,111,146,211,146,51,147,150,147,248,147,89,148,149,149,40,150,208,150,81,151,206,151,56,152,197,152,52,153,195,153,35,154,190,154,55,155,165,155,5,156,101,156,12,157,108,157,204,157,86,158,235,158,99,159,46,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,111,78,242,79,239,80,47,82,93,83,8,85,69,86,86,87,114,88,128,89,149,90,169,91,231,92,206,93,253,94,83,96,126,97,157,98,4,100,11,101,55,102,77,103,155,104,161,105,141,106,107,107,175,108,15,110,37,111,19,112,28,113,5,114,240,228,80,229,176,229,16,230,112,230,208,230,48,231,102,37,75,254,40,115,167,115,55,116,178,116,57,117,225,117,121,118,15,119,155,119,53,120,200,120,63,121,202,121,83,122,213,122,115,123,0,124,110,124,250,124,97,125,197,125,37,126,137,126,147,127,50,128,216,128,137,129,17,130,198,130,143,131,48,132,181,132,54,133,186,133,42,134,184,134,90,135,225,135,88,136,235,136,103,137,224,137,74,138,174,138,15,139,114,139,109,140,216,140,136,141,27,142,169,142,15,143,165,143,100,144,7,145,158,145,16,146,112,146,212,146,52,147,151,147,249,147,90,148,150,149,41,150,209,150,84,151,207,151,57,152,198,152,53,153,196,153,36,154,191,154,56,155,166,155,6,156,102,156,13,157,109,157,205,157,89,158,236,158,100,159,47,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,114,78,244,79,240,80,49,82,101,83,10,85,70,86,88,87,115,88,133,89,150,90,172,91,233,92,207,93,5,95,84,96,127,97,158,98,6,100,12,101,56,102,82,103,156,104,162,105,143,106,108,107,176,108,18,110,38,111,20,112,29,113,7,114,241,228,81,229,177,229,17,230,113,230,209,230,49,231,103,37,76,254,45,115,168,115,56,116,179,116,60,117,229,117,122,118,16,119,156,119,54,120,204,120,66,121,204,121,84,122,215,122,116,123,1,124,111,124,252,124,98,125,198,125,38,126,138,126,149,127,52,128,223,128,139,129,19,130,201,130,144,131,50,132,182,132,62,133,187,133,43,134,185,134,91,135,226,135,90,136,236,136,104,137,225,137,75,138,175,138,16,139,115,139,110,140,217,140,137,141,28,142,170,142,16,143,166,143,102,144,8,145,159,145,17,146,113,146,213,146,53,147,152,147,250,147,91,148,151,149,43,150,211,150,85,151,208,151,58,152,199,152,54,153,197,153,37,154,195,154,57,155,167,155,7,156,103,156,14,157,110,157,206,157,93,158,237,158,101,159,48,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,116,78,245,79,241,80,50,82,104,83,11,85,71,86,89,87,116,88,137,89,151,90,173,91,235,92,208,93,6,95,86,96,128,97,163,98,7,100,13,101,57,102,84,103,157,104,163,105,146,106,109,107,180,108,19,110,39,111,21,112,30,113,8,114,242,228,82,229,178,229,18,230,114,230,210,230,50,231,104,37,77,254,47,115,170,115,57,116,180,116,61,117,233,117,124,118,17,119,157,119,61,120,205,120,67,121,206,121,85,122,216,122,118,123,2,124,112,124,253,124,99,125,199,125,39,126,139,126,150,127,57,128,224,128,140,129,21,130,208,130,145,131,51,132,183,132,63,133,188,133,44,134,187,134,92,135,227,135,91,136,237,136,105,137,226,137,76,138,176,138,17,139,116,139,111,140,218,140,140,141,32,142,173,142,17,143,167,143,103,144,9,145,160,145,18,146,114,146,214,146,54,147,153,147,251,147,92,148,152,149,44,150,212,150,87,151,209,151,59,152,200,152,55,153,198,153,38,154,196,154,58,155,168,155,8,156,104,156,15,157,111,157,207,157,95,158,238,158,102,159,49,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,117,78,246,79,242,80,52,82,106,83,12,85,72,86,98,87,117,88,139,89,152,90,174,91,236,92,209,93,7,95,87,96,129,97,166,98,8,100,14,101,58,102,85,103,158,104,164,105,147,106,110,107,181,108,21,110,40,111,22,112,31,113,9,114,243,228,83,229,179,229,19,230,115,230,211,230,51,231,105,37,78,254,48,115,172,115,58,116,181,116,63,117,236,117,127,118,18,119,158,119,63,120,206,120,68,121,207,121,86,122,218,122,120,123,3,124,113,124,254,124,100,125,200,125,40,126,140,126,151,127,58,128,226,128,141,129,22,130,214,130,148,131,52,132,187,132,64,133,189,133,45,134,188,134,93,135,228,135,92,136,238,136,106,137,228,137,77,138,177,138,18,139,117,139,112,140,219,140,141,141,33,142,174,142,18,143,170,143,105,144,10,145,161,145,19,146,115,146,215,146,55,147,154,147,252,147,93,148,153,149,45,150,214,150,88,151,210,151,60,152,201,152,56,153,199,153,39,154,198,154,61,155,169,155,9,156,105,156,16,157,112,157,208,157,96,158,240,158,103,159,50,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,118,78,247,79,244,80,53,82,108,83,13,85,73,86,99,87,118,88,140,89,153,90,175,91,238,92,210,93,9,95,88,96,130,97,167,98,9,100,15,101,59,102,87,103,159,104,165,105,148,106,111,107,182,108,24,110,44,111,23,112,32,113,10,114,244,228,84,229,180,229,20,230,116,230,212,230,52,231,106,37,79,254,50,115,173,115,59,116,182,116,65,117,237,117,128,118,19,119,161,119,65,120,207,120,69,121,208,121,88,122,219,122,122,123,4,124,114,124,255,124,101,125,201,125,41,126,141,126,152,127,60,128,227,128,142,129,23,130,217,130,149,131,53,132,188,132,65,133,190,133,46,134,189,134,94,135,230,135,93,136,239,136,107,137,231,137,78,138,178,138,19,139,118,139,113,140,220,140,142,141,36,142,176,142,19,143,172,143,106,144,11,145,164,145,20,146,117,146,216,146,56,147,155,147,253,147,94,148,154,149,47,150,215,150,90,151,211,151,61,152,202,152,57,153,200,153,40,154,199,154,62,155,170,155,10,156,106,156,17,157,113,157,209,157,97,158,241,158,104,159,51,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,119,78,249,79,246,80,60,82,109,83,14,85,74,86,101,87,119,88,142,89,156,90,177,91,239,92,211,93,12,95,91,96,131,97,169,98,10,100,16,101,61,102,88,103,160,104,166,105,149,106,112,107,183,108,25,110,46,111,24,112,33,113,11,114,245,228,85,229,181,229,21,230,117,230,213,230,53,231,107,37,80,254,51,115,177,115,61,116,183,116,66,117,238,117,129,118,20,119,163,119,66,120,209,120,71,121,211,121,89,122,220,122,124,123,5,124,117,124,0,125,102,125,202,125,42,126,142,126,153,127,62,128,230,128,144,129,24,130,218,130,150,131,54,132,190,132,66,133,191,133,47,134,190,134,95,135,231,135,94,136,242,136,108,137,232,137,79,138,179,138,20,139,119,139,114,140,221,140,143,141,37,142,177,142,20,143,173,143,107,144,12,145,165,145,21,146,118,146,217,146,57,147,156,147,254,147,95,148,155,149,48,150,216,150,92,151,212,151,62,152,203,152,58,153,201,153,41,154,200,154,63,155,171,155,11,156,107,156,18,157,114,157,210,157,98,158,242,158,105,159,52,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,120,78,251,79,247,80,62,82,114,83,18,85,75,86,103,87,120,88,143,89,157,90,178,91,241,92,212,93,13,95,92,96,132,97,170,98,13,100,17,101,63,102,89,103,161,104,169,105,150,106,113,107,186,108,27,110,48,111,25,112,34,113,12,114,246,228,86,229,182,229,22,230,118,230,214,230,54,231,108,37,81,254,53,115,180,115,62,116,184,116,67,117,239,117,131,118,21,119,164,119,67,120,210,120,74,121,212,121,90,122,221,122,125,123,6,124,118,124,1,125,103,125,203,125,43,126,143,126,155,127,64,128,238,128,146,129,25,130,221,130,151,131,55,132,192,132,68,133,192,133,48,134,191,134,97,135,232,135,95,136,245,136,109,137,233,137,80,138,180,138,21,139,120,139,116,140,222,140,144,141,38,142,179,142,21,143,174,143,108,144,13,145,166,145,22,146,119,146,218,146,58,147,157,147,255,147,96,148,156,149,55,150,217,150,93,151,213,151,63,152,204,152,59,153,202,153,42,154,201,154,64,155,172,155,12,156,108,156,19,157,115,157,211,157,101,158,243,158,106,159,53,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,121,78,252,79,248,80,68,82,118,83,19,85,79,86,108,87,121,88,144,89,158,90,183,91,242,92,213,93,14,95,94,96,133,97,173,98,14,100,19,101,64,102,90,103,163,104,170,105,152,106,114,107,192,108,28,110,50,111,28,112,35,113,13,114,247,228,87,229,183,229,23,230,119,230,215,230,55,231,109,37,82,254,54,115,181,115,63,116,185,116,68,117,242,117,133,118,22,119,166,119,68,120,211,120,75,121,214,121,91,122,225,122,127,123,8,124,119,124,2,125,104,125,204,125,44,126,144,126,156,127,65,128,245,128,147,129,26,130,226,130,153,131,57,132,194,132,69,133,194,133,49,134,193,134,98,135,233,135,96,136,246,136,110,137,234,137,81,138,181,138,22,139,121,139,117,140,223,140,146,141,39,142,180,142,22,143,175,143,111,144,14,145,167,145,23,146,120,146,219,146,59,147,158,147,0,148,97,148,157,149,56,150,218,150,95,151,214,151,64,152,205,152,60,153,203,153,43,154,202,154,70,155,173,155,13,156,109,156,20,157,116,157,212,157,110,158,244,158,107,159,54,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,122,78,253,79,249,80,69,82,121,83,21,85,80,86,110,87,122,88,145,89,159,90,186,91,243,92,214,93,16,95,95,96,134,97,174,98,17,100,20,101,66,102,91,103,164,104,172,105,153,106,115,107,193,108,30,110,52,111,29,112,36,113,14,114,248,228,88,229,184,229,24,230,120,230,216,230,56,231,110,37,84,254,58,115,182,115,64,116,187,116,70,117,243,117,137,118,23,119,168,119,70,120,214,120,76,121,215,121,92,122,226,122,129,123,9,124,120,124,3,125,105,125,205,125,45,126,145,126,160,127,68,128,247,128,148,129,29,130,231,130,154,131,58,132,195,132,70,133,195,133,50,134,194,134,102,135,235,135,102,136,247,136,111,137,236,137,82,138,182,138,23,139,122,139,118,140,224,140,147,141,40,142,181,142,23,143,178,143,112,144,15,145,168,145,24,146,121,146,220,146,60,147,159,147,1,148,98,148,158,149,57,150,219,150,99,151,215,151,65,152,207,152,61,153,204,153,44,154,205,154,74,155,174,155,14,156,110,156,21,157,117,157,213,157,111,158,245,158,108,159,55,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,123,78,255,79,250,80,70,82,123,83,22,85,81,86,112,87,123,88,148,89,160,90,187,91,244,92,215,93,18,95,96,96,135,97,175,98,18,100,21,101,68,102,93,103,165,104,174,105,154,106,116,107,194,108,31,110,53,111,30,112,37,113,15,114,249,228,89,229,185,229,25,230,121,230,217,230,57,231,111,37,85,254,59,115,184,115,66,116,188,116,71,117,245,117,138,118,24,119,171,119,72,120,215,120,77,121,217,121,93,122,228,122,130,123,10,124,121,124,4,125,106,125,206,125,46,126,146,126,162,127,69,128,249,128,149,129,32,130,232,130,157,131,59,132,197,132,71,133,196,133,51,134,195,134,103,135,236,135,103,136,250,136,112,137,237,137,83,138,183,138,24,139,123,139,119,140,225,140,149,141,43,142,182,142,24,143,179,143,113,144,16,145,169,145,25,146,122,146,221,146,61,147,160,147,2,148,99,148,159,149,58,150,220,150,100,151,216,151,66,152,208,152,62,153,205,153,45,154,206,154,75,155,175,155,15,156,111,156,22,157,118,157,214,157,114,158,246,158,109,159,56,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,124,78,0,80,252,80,71,82,124,83,23,85,82,86,113,87,124,88,149,89,161,90,188,91,245,92,216,93,20,95,97,96,136,97,176,98,21,100,22,101,69,102,98,103,169,104,175,105,155,106,117,107,195,108,34,110,55,111,31,112,39,113,16,114,250,228,90,229,186,229,26,230,122,230,218,230,58,231,112,37,86,254,60,115,185,115,67,116,189,116,73,117,246,117,140,118,27,119,173,119,73,120,216,120,78,121,218,121,94,122,231,122,131,123,13,124,122,124,5,125,107,125,207,125,47,126,147,126,163,127,71,128,251,128,150,129,36,130,233,130,159,131,62,132,198,132,75,133,197,133,52,134,197,134,104,135,237,135,106,136,251,136,113,137,238,137,84,138,184,138,25,139,124,139,123,140,226,140,150,141,45,142,183,142,25,143,180,143,114,144,17,145,171,145,26,146,123,146,222,146,63,147,161,147,3,148,100,148,160,149,62,150,221,150,102,151,217,151,67,152,212,152,63,153,206,153,46,154,207,154,76,155,176,155,16,156,112,156,23,157,119,157,215,157,116,158,247,158,110,159,57,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,125,78,1,80,253,80,72,82,125,83,24,85,83,86,114,87,125,88,152,89,162,90,192,91,246,92,217,93,22,95,101,96,137,97,178,98,22,100,23,101,70,102,99,103,170,104,176,105,156,106,118,107,198,108,38,110,56,111,32,112,40,113,17,114,251,228,91,229,187,229,27,230,123,230,219,230,59,231,113,37,87,254,61,115,188,115,68,116,190,116,74,117,247,117,141,118,28,119,174,119,74,120,218,120,79,121,219,121,95,122,232,122,132,123,14,124,126,124,6,125,108,125,208,125,48,126,148,126,165,127,72,128,254,128,151,129,37,130,234,130,161,131,63,132,199,132,76,133,198,133,53,134,200,134,105,135,239,135,109,136,253,136,114,137,240,137,85,138,185,138,26,139,125,139,124,140,227,140,151,141,48,142,184,142,26,143,181,143,115,144,18,145,172,145,27,146,124,146,223,146,64,147,162,147,4,148,101,148,161,149,65,150,222,150,103,151,218,151,68,152,214,152,64,153,207,153,47,154,208,154,78,155,177,155,17,156,113,156,24,157,120,157,216,157,117,158,248,158,111,159,58,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,127,78,2,80,254,80,73,82,126,83,25,85,85,86,116,87,127,88,154,89,163,90,193,91,247,92,218,93,25,95,102,96,138,97,179,98,23,100,25,101,71,102,100,103,171,104,178,105,157,106,119,107,199,108,39,110,57,111,33,112,41,113,18,114,252,228,92,229,188,229,28,230,124,230,220,230,60,231,114,37,89,254,64,115,189,115,69,116,191,116,77,117,248,117,143,118,29,119,175,119,75,120,219,120,80,121,220,121,96,122,233,122,134,123,16,124,127,124,7,125,109,125,209,125,49,126,149,126,166,127,73,128,255,128,153,129,38,130,236,130,162,131,64,132,200,132,77,133,199,133,54,134,204,134,106,135,240,135,111,136,255,136,115,137,241,137,86,138,186,138,27,139,126,139,125,140,228,140,152,141,50,142,185,142,27,143,183,143,118,144,19,145,176,145,28,146,125,146,224,146,65,147,163,147,5,148,102,148,162,149,67,150,223,150,104,151,219,151,69,152,215,152,65,153,208,153,48,154,210,154,80,155,178,155,18,156,114,156,25,157,121,157,217,157,118,158,250,158,112,159,59,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,128,78,3,80,255,80,75,82,128,83,26,85,86,86,117,87,130,88,155,89,164,90,195,91,248,92,220,93,26,95,110,96,140,97,180,98,24,100,26,101,72,102,102,103,172,104,179,105,158,106,120,107,200,108,40,110,58,111,34,112,42,113,19,114,253,228,93,229,189,229,29,230,125,230,221,230,61,231,115,37,90,254,65,115,190,115,70,116,192,116,80,117,250,117,144,118,30,119,177,119,77,120,220,120,81,121,221,121,97,122,234,122,135,123,17,124,128,124,8,125,111,125,210,125,50,126,150,126,168,127,78,128,0,129,154,129,39,130,237,130,163,131,65,132,203,132,78,133,200,133,55,134,205,134,107,135,241,135,113,136,0,137,116,137,242,137,87,138,187,138,28,139,127,139,126,140,229,140,153,141,51,142,187,142,28,143,184,143,119,144,20,145,177,145,29,146,126,146,225,146,66,147,164,147,6,148,103,148,163,149,74,150,225,150,106,151,220,151,70,152,219,152,66,153,209,153,49,154,212,154,82,155,179,155,19,156,115,156,26,157,122,157,218,157,119,158,253,158,113,159,60,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,129,78,4,80,0,81,78,82,129,83,28,85,90,86,120,87,132,88,156,89,165,90,200,91,249,92,223,93,28,95,113,96,141,97,182,98,25,100,27,101,73,102,103,103,174,104,181,105,159,106,122,107,203,108,42,110,59,111,36,112,43,113,20,114,254,228,94,229,190,229,30,230,126,230,222,230,62,231,129,37,91,254,66,115,191,115,71,116,193,116,81,117,251,117,146,118,33,119,178,119,79,120,221,120,82,121,222,121,98,122,235,122,136,123,18,124,129,124,9,125,112,125,211,125,51,126,151,126,169,127,79,128,1,129,158,129,41,130,238,130,164,131,66,132,204,132,79,133,202,133,57,134,210,134,108,135,242,135,115,136,1,137,117,137,244,137,88,138,188,138,29,139,128,139,127,140,230,140,154,141,52,142,188,142,29,143,186,143,120,144,21,145,178,145,30,146,127,146,226,146,67,147,165,147,7,148,104,148,164,149,78,150,226,150,107,151,221,151,71,152,220,152,67,153,210,153,50,154,213,154,83,155,180,155,20,156,116,156,27,157,123,157,219,157,120,158,255,158,114,159,61,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,130,78,5,80,1,81,79,82,131,83,29,85,91,86,121,87,134,88,157,89,166,90,201,91,250,92,224,93,29,95,114,96,143,97,183,98,26,100,28,101,74,102,107,103,177,104,182,105,161,106,125,107,205,108,44,110,60,111,37,112,44,113,21,114,255,228,95,229,191,229,31,230,127,230,223,230,63,231,130,37,92,254,67,115,193,115,72,116,194,116,82,117,253,117,148,118,35,119,180,119,81,120,222,120,84,121,224,121,99,122,236,122,137,123,19,124,130,124,11,125,113,125,212,125,52,126,152,126,170,127,80,128,3,129,159,129,46,130,240,130,165,131,67,132,206,132,80,133,203,133,58,134,211,134,109,135,243,135,116,136,3,137,118,137,245,137,89,138,189,138,30,139,129,139,128,140,231,140,155,141,54,142,189,142,30,143,187,143,121,144,22,145,179,145,31,146,128,146,227,146,68,147,166,147,8,148,105,148,165,149,79,150,227,150,108,151,222,151,72,152,221,152,68,153,211,153,51,154,214,154,85,155,181,155,21,156,117,156,28,157,124,157,220,157,121,158,0,159,115,159,62,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,131,78,6,80,2,81,82,82,135,83,30,85,93,86,122,87,135,88,159,89,167,90,202,91,252,92,227,93,30,95,116,96,144,97,184,98,29,100,29,101,77,102,108,103,178,104,184,105,162,106,126,107,206,108,46,110,61,111,38,112,45,113,22,114,0,229,96,229,192,229,32,230,128,230,224,230,64,231,131,37,93,254,68,115,195,115,73,116,195,116,83,117,254,117,149,118,36,119,182,119,83,120,223,120,85,121,225,121,100,122,238,122,138,123,20,124,131,124,12,125,114,125,213,125,53,126,153,126,171,127,81,128,4,129,160,129,50,130,242,130,166,131,68,132,207,132,81,133,204,133,59,134,213,134,111,135,244,135,117,136,4,137,119,137,246,137,90,138,190,138,31,139,130,139,129,140,232,140,156,141,55,142,190,142,31,143,188,143,122,144,23,145,182,145,32,146,129,146,228,146,69,147,167,147,9,148,106,148,166,149,81,150,228,150,109,151,223,151,73,152,224,152,69,153,212,153,52,154,215,154,86,155,182,155,22,156,118,156,29,157,125,157,221,157,122,158,1,159,116,159,63,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,132,78,7,80,3,81,83,82,136,83,31,85,94,86,125,87,136,88,160,89,168,90,203,91,253,92,228,93,33,95,117,96,145,97,186,98,31,100,30,101,78,102,110,103,180,104,185,105,163,106,127,107,207,108,48,110,63,111,39,112,46,113,23,114,1,229,97,229,193,229,33,230,129,230,225,230,65,231,132,37,94,254,69,115,196,115,74,116,196,116,85,117,2,118,151,118,37,119,183,119,84,120,224,120,88,121,226,121,101,122,240,122,139,123,21,124,132,124,13,125,115,125,214,125,54,126,154,126,172,127,83,128,5,129,161,129,58,130,243,130,167,131,69,132,210,132,82,133,205,133,61,134,214,134,113,135,245,135,118,136,5,137,120,137,247,137,91,138,191,138,32,139,131,139,131,140,233,140,157,141,56,142,191,142,32,143,191,143,123,144,24,145,183,145,33,146,130,146,229,146,70,147,168,147,10,148,108,148,167,149,82,150,229,150,110,151,224,151,74,152,225,152,70,153,213,153,53,154,217,154,87,155,183,155,23,156,119,156,30,157,126,157,222,157,123,158,2,159,117,159,64,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,133,78,8,80,4,81,85,82,138,83,33,85,95,86,126,87,138,88,161,89,169,90,205,91,254,92,234,93,34,95,119,96,146,97,190,98,34,100,31,101,80,102,113,103,182,104,186,105,164,106,128,107,209,108,49,110,64,111,40,112,50,113,24,114,2,229,98,229,194,229,34,230,130,230,226,230,66,231,133,37,95,254,70,115,197,115,75,116,197,116,86,117,4,118,152,118,39,119,184,119,88,120,225,120,89,121,229,121,102,122,241,122,140,123,23,124,133,124,14,125,116,125,215,125,55,126,156,126,173,127,85,128,7,129,162,129,60,130,245,130,172,131,71,132,212,132,83,133,206,133,62,134,215,134,114,135,246,135,120,136,6,137,121,137,248,137,92,138,192,138,33,139,132,139,132,140,234,140,158,141,59,142,192,142,33,143,192,143,124,144,26,145,184,145,34,146,131,146,230,146,71,147,169,147,11,148,109,148,168,149,83,150,230,150,111,151,225,151,75,152,226,152,71,153,214,153,54,154,218,154,88,155,184,155,24,156,120,156,31,157,127,157,223,157,124,158,3,159,118,159,65,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,135,78,9,80,5,81,87,82,142,83,37,85,96,86,127,87,139,88,162,89,171,90,206,91,255,92,236,93,35,95,126,96,147,97,192,98,35,100,32,101,81,102,116,103,183,104,188,105,165,106,133,107,210,108,51,110,65,111,41,112,51,113,25,114,3,229,99,229,195,229,35,230,131,230,227,230,67,231,134,37,96,254,71,115,198,115,76,116,198,116,87,117,6,118,154,118,42,119,185,119,89,120,226,120,97,121,232,121,103,122,242,122,142,123,24,124,134,124,15,125,117,125,216,125,56,126,157,126,174,127,86,128,8,129,164,129,61,130,246,130,173,131,72,132,213,132,84,133,209,133,63,134,218,134,115,135,247,135,121,136,7,137,122,137,249,137,93,138,193,138,34,139,133,139,134,140,235,140,160,141,60,142,193,142,34,143,195,143,126,144,27,145,185,145,35,146,132,146,231,146,72,147,170,147,12,148,110,148,169,149,86,150,231,150,112,151,226,151,76,152,227,152,72,153,215,153,55,154,219,154,89,155,185,155,25,156,121,156,32,157,128,157,224,157,125,158,4,159,119,159,66,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,138,78,10,80,8,81,88,82,143,83,38,85,97,86,128,87,140,88,166,89,172,90,207,91,0,93,237,93,36,95,128,96,149,97,193,98,36,100,33,101,88,102,118,103,184,104,189,105,166,106,136,107,216,108,53,110,66,111,42,112,52,113,26,114,4,229,100,229,196,229,36,230,132,230,228,230,68,231,135,37,97,254,72,115,199,115,77,116,199,116,88,117,7,118,155,118,43,119,186,119,90,120,227,120,99,121,234,121,104,122,243,122,143,123,25,124,135,124,16,125,118,125,217,125,57,126,158,126,177,127,87,128,11,129,165,129,63,130,248,130,174,131,73,132,215,132,85,133,210,133,64,134,220,134,117,135,248,135,122,136,8,137,124,137,250,137,94,138,194,138,35,139,134,139,135,140,236,140,161,141,62,142,194,142,35,143,198,143,129,144,28,145,187,145,36,146,133,146,232,146,73,147,171,147,13,148,111,148,170,149,87,150,235,150,113,151,227,151,77,152,228,152,73,153,216,153,56,154,220,154,90,155,186,155,26,156,122,156,33,157,129,157,225,157,128,158,5,159,120,159,67,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,144,78,11,80,9,81,89,82,144,83,40,85,99,86,129,87,141,88,167,89,173,90,209,91,1,93,240,93,40,95,129,96,150,97,195,98,37,100,34,101,89,102,120,103,185,104,190,105,167,106,140,107,217,108,54,110,67,111,43,112,53,113,27,114,5,229,101,229,197,229,37,230,133,230,229,230,69,231,136,37,98,254,73,115,203,115,78,116,200,116,93,117,8,118,156,118,44,119,188,119,91,120,228,120,100,121,236,121,105,122,244,122,145,123,26,124,136,124,17,125,120,125,218,125,58,126,174,126,179,127,89,128,12,129,167,129,64,130,250,130,175,131,74,132,216,132,87,133,212,133,65,134,221,134,119,135,250,135,123,136,9,137,125,137,251,137,95,138,195,138,36,139,135,139,136,140,237,140,162,141,63,142,195,142,36,143,201,143,132,144,29,145,188,145,37,146,134,146,233,146,74,147,172,147,14,148,112,148,171,149,88,150,236,150,114,151,228,151,78,152,229,152,74,153,217,153,57,154,221,154,91,155,187,155,27,156,123,156,34,157,130,157,226,157,129,158,6,159,121,159,68,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,78,14,80,10,81,90,82,145,83,41,85,101,86,135,87,142,88,172,89,174,90,212,91,4,93,245,93,43,95,130,96,151,97,203,98,39,100,35,101,91,102,121,103,186,104,191,105,168,106,142,107,218,108,55,110,68,111,44,112,55,113,28,114,6,229,102,229,198,229,38,230,134,230,230,230,70,231,137,37,99,254,74,115,204,115,79,116,201,116,94,117,9,118,157,118,46,119,190,119,92,120,229,120,102,121,238,121,106,122,245,122,146,123,27,124,138,124,18,125,121,125,219,125,60,126,180,126,180,127,91,128,21,129,169,129,65,130,252,130,181,131,75,132,217,132,88,133,214,133,66,134,224,134,120,135,251,135,124,136,11,137,126,137,252,137,96,138,196,138,37,139,136,139,139,140,238,140,164,141,67,142,196,142,37,143,202,143,133,144,31,145,189,145,38,146,135,146,234,146,75,147,173,147,15,148,113,148,172,149,89,150,237,150,117,151,229,151,79,152,230,152,75,153,218,153,58,154,222,154,92,155,188,155,28,156,125,156,35,157,131,157,227,157,131,158,7,159,122,159,69,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151,78,16,80,12,81,91,82,146,83,43,85,102,86,136,87,143,88,173,89,175,90,213,91,5,93,246,93,44,95,133,96,152,97,207,98,40,100,36,101,92,102,122,103,187,104,192,105,170,106,143,107,220,108,57,110,69,111,45,112,56,113,30,114,7,229,103,229,199,229,39,230,135,230,231,230,71,231,138,37,100,254,75,115,206,115,80,116,202,116,95,117,11,118,158,118,48,119,192,119,94,120,230,120,105,121,241,121,107,122,246,122,147,123,28,124,139,124,19,125,122,125,220,125,61,126,187,126,181,127,92,128,23,129,171,129,66,130,253,130,187,131,76,132,218,132,90,133,215,133,67,134,225,134,121,135,252,135,128,136,12,137,128,137,253,137,97,138,197,138,39,139,137,139,141,140,239,140,165,141,69,142,197,142,38,143,203,143,134,144,32,145,190,145,39,146,136,146,235,146,76,147,174,147,16,148,114,148,173,149,90,150,238,150,119,151,232,151,80,152,233,152,76,153,219,153,59,154,224,154,93,155,189,155,29,156,126,156,36,157,132,157,228,157,132,158,8,159,123,159,70,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,78,17,80,13,81,93,82,147,83,45,85,103,86,137,87,144,88,176,89,176,90,214,91,8,93,248,93,46,95,134,96,153,97,209,98,41,100,38,101,93,102,123,103,188,104,194,105,173,106,144,107,221,108,59,110,72,111,46,112,57,113,31,114,8,229,104,229,200,229,40,230,136,230,232,230,72,231,139,37,101,254,76,115,210,115,81,116,203,116,96,117,13,118,159,118,49,119,193,119,95,120,231,120,106,121,242,121,108,122,247,122,150,123,29,124,140,124,20,125,123,125,221,125,62,126,188,126,182,127,93,128,25,129,172,129,67,130,254,130,190,131,77,132,219,132,91,133,216,133,68,134,226,134,122,135,253,135,131,136,13,137,130,137,254,137,98,138,198,138,40,139,138,139,142,140,240,140,166,141,70,142,198,142,39,143,204,143,135,144,33,145,191,145,40,146,137,146,236,146,77,147,175,147,17,148,115,148,174,149,92,150,240,150,120,151,238,151,81,152,234,152,77,153,220,153,60,154,226,154,94,155,190,155,30,156,128,156,37,157,133,157,229,157,133,158,9,159,124,159,71,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,78,19,80,14,81,95,82,148,83,50,85,109,86,138,87,145,88,177,89,177,90,215,91,9,93,249,93,48,95,135,96,154,97,213,98,43,100,39,101,94,102,125,103,189,104,195,105,174,106,145,107,223,108,60,110,73,111,47,112,58,113,32,114,9,229,105,229,201,229,41,230,137,230,233,230,73,231,140,37,102,254,78,115,211,115,82,116,204,116,97,117,14,118,160,118,50,119,194,119,96,120,233,120,107,121,243,121,109,122,248,122,152,123,30,124,141,124,21,125,124,125,222,125,63,126,214,126,183,127,94,128,27,129,173,129,69,130,255,130,191,131,78,132,220,132,92,133,217,133,69,134,227,134,127,135,255,135,134,136,14,137,132,137,255,137,99,138,199,138,41,139,139,139,143,140,241,140,167,141,76,142,199,142,40,143,205,143,137,144,36,145,192,145,41,146,138,146,237,146,78,147,176,147,18,148,116,148,175,149,93,150,241,150,121,151,239,151,82,152,235,152,78,153,221,153,61,154,227,154,95,155,191,155,31,156,131,156,38,157,134,157,230,157,134,158,10,159,125,159,72,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,157,78,21,80,15,81,96,82,150,83,52,85,110,86,141,87,148,88,179,89,180,90,216,91,10,93,250,93,50,95,136,96,155,97,221,98,46,100,40,101,96,102,128,103,190,104,196,105,175,106,148,107,228,108,61,110,74,111,48,112,59,113,33,114,10,229,106,229,202,229,42,230,138,230,234,230,74,231,141,37,104,254,79,115,212,115,83,116,205,116,98,117,15,118,161,118,51,119,195,119,97,120,234,120,108,121,244,121,110,122,251,122,153,123,32,124,142,124,22,125,125,125,223,125,64,126,228,126,186,127,95,128,28,129,174,129,70,130,0,131,194,131,79,132,222,132,93,133,218,133,70,134,229,134,128,135,0,136,135,136,15,137,133,137,1,138,100,138,200,138,42,139,140,139,144,140,242,140,168,141,77,142,200,142,41,143,207,143,138,144,37,145,193,145,42,146,139,146,238,146,79,147,177,147,19,148,117,148,176,149,94,150,242,150,122,151,240,151,83,152,236,152,79,153,222,153,62,154,228,154,96,155,192,155,32,156,132,156,39,157,135,157,231,157,137,158,12,159,126,159,73,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,158,78,22,80,16,81,98,82,151,83,53,85,111,86,142,87,149,88,180,89,182,90,217,91,11,93,251,93,51,95,138,96,156,97,222,98,47,100,41,101,98,102,130,103,191,104,197,105,176,106,149,107,230,108,62,110,76,111,49,112,60,113,34,114,11,229,107,229,203,229,43,230,139,230,235,230,75,231,142,37,105,254,81,115,213,115,84,116,206,116,99,117,17,118,162,118,52,119,196,119,98,120,235,120,110,121,245,121,111,122,252,122,154,123,33,124,143,124,23,125,126,125,224,125,66,126,236,126,187,127,96,128,29,129,175,129,72,130,10,131,195,131,80,132,225,132,95,133,219,133,71,134,230,134,129,135,1,136,137,136,17,137,135,137,2,138,101,138,201,138,43,139,141,139,145,140,243,140,169,141,78,142,201,142,42,143,210,143,140,144,38,145,194,145,43,146,140,146,239,146,80,147,178,147,20,148,118,148,177,149,96,150,244,150,123,151,241,151,84,152,237,152,80,153,223,153,63,154,229,154,97,155,193,155,33,156,137,156,40,157,136,157,232,157,138,158,15,159,129,159,74,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,163,78,23,80,17,81,99,82,153,83,54,85,112,86,143,87,150,88,181,89,183,90,218,91,12,93,252,93,52,95,139,96,158,97,224,98,48,100,42,101,99,102,131,103,193,104,198,105,177,106,151,107,231,108,63,110,78,111,50,112,61,113,35,114,12,229,108,229,204,229,44,230,140,230,236,230,76,231,143,37,106,254,83,115,214,115,86,116,207,116,100,117,18,118,163,118,57,119,197,119,99,120,237,120,112,121,246,121,113,122,254,122,155,123,34,124,144,124,24,125,127,125,225,125,67,126,249,126,190,127,97,128,31,129,176,129,74,130,11,131,196,131,82,132,226,132,96,133,221,133,72,134,231,134,132,135,2,136,138,136,20,137,136,137,3,138,102,138,202,138,44,139,142,139,146,140,244,140,170,141,79,142,202,142,43,143,214,143,141,144,39,145,195,145,44,146,141,146,240,146,81,147,179,147,21,148,119,148,178,149,99,150,245,150,125,151,242,151,85,152,238,152,81,153,224,153,64,154,231,154,98,155,194,155,34,156,138,156,41,157,137,157,233,157,140,158,17,159,130,159,75,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,78,27,80,19,81,100,82,155,83,56,85,114,86,144,87,151,88,182,89,185,90,219,91,13,93,255,93,53,95,142,96,159,97,225,98,49,100,44,101,101,102,133,103,195,104,199,105,178,106,152,107,233,108,64,110,79,111,51,112,62,113,36,114,13,229,109,229,205,229,45,230,141,230,237,230,77,231,147,37,107,254,84,115,215,115,88,116,208,116,103,117,19,118,165,118,59,119,198,119,100,120,238,120,113,121,247,121,114,122,0,123,158,123,35,124,147,124,25,125,128,125,226,125,68,126,10,127,192,127,98,128,32,129,177,129,76,130,13,131,198,131,83,132,228,132,97,133,222,133,73,134,232,134,134,135,4,136,140,136,21,137,137,137,4,138,103,138,203,138,45,139,143,139,147,140,245,140,171,141,80,142,203,142,44,143,215,143,142,144,40,145,196,145,45,146,143,146,241,146,82,147,180,147,22,148,120,148,179,149,101,150,248,150,126,151,244,151,86,152,239,152,82,153,225,153,65,154,232,154,99,155,195,155,35,156,140,156,42,157,138,157,234,157,141,158,18,159,141,159,76,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,78,29,80,20,81,102,82,156,83,57,85,115,86,145,87,152,88,183,89,186,90,220,91,15,93,0,94,54,95,143,96,160,97,228,98,50,100,45,101,103,102,134,103,196,104,200,105,179,106,153,107,236,108,65,110,80,111,52,112,63,113,37,114,14,229,110,229,206,229,46,230,142,230,238,230,78,231,148,37,231,231,85,115,216,115,93,116,209,116,104,117,20,118,166,118,61,119,199,119,101,120,239,120,114,121,249,121,115,122,1,123,159,123,36,124,148,124,26,125,129,125,227,125,69,126,16,127,194,127,99,128,33,129,178,129,77,130,16,131,200,131,84,132,231,132,98,133,223,133,74,134,234,134,135,135,5,136,142,136,22,137,138,137,5,138,104,138,204,138,46,139,144,139,149,140,246,140,172,141,83,142,204,142,45,143,218,143,143,144,41,145,197,145,46,146,144,146,242,146,83,147,181,147,23,148,121,148,180,149,102,150,250,150,127,151,247,151,87,152,240,152,83,153,226,153,66,154,233,154,100,155,196,155,36,156,143,156,43,157,139,157,235,157,142,158,20,159,142,159,77,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,78,30,80,21,81,104,82,158,83,58,85,116,86,148,87,155,88,184,89,187,90,224,91,16,93,4,94,55,95,144,96,161,97,234,98,51,100,48,101,105,102,136,103,197,104,201,105,180,106,156,107,237,108,66,110,81,111,54,112,64,113,38,114,15,229,111,229,207,229,47,230,143,230,239,230,79,231,149,37,232,231,86,115,218,115,96,116,211,116,105,117,22,118,167,118,62,119,200,119,102,120,240,120,115,121,250,121,117,122,2,123,160,123,37,124,150,124,27,125,130,125,228,125,70,126,30,127,195,127,100,128,34,129,180,129,78,130,18,131,201,131,85,132,232,132,99,133,224,133,75,134,235,134,137,135,6,136,143,136,23,137,139,137,6,138,105,138,205,138,47,139,145,139,150,140,247,140,173,141,84,142,205,142,46,143,224,143,144,144,42,145,198,145,47,146,145,146,243,146,84,147,182,147,24,148,122,148,181,149,107,150,251,150,128,151,248,151,88,152,241,152,86,153,227,153,67,154,234,154,101,155,197,155,37,156,147,156,44,157,140,157,236,157,143,158,21,159,143,159,78,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,78,32,80,22,81,107,82,160,83,59,85,117,86,149,87,156,88,186,89,188,90,226,91,17,93,7,94,56,95,145,96,162,97,235,98,53,100,49,101,106,102,138,103,198,104,203,105,181,106,157,107,242,108,69,110,82,111,55,112,65,113,39,114,16,229,112,229,208,229,48,230,144,230,240,230,80,231,188,37,233,231,88,115,219,115,97,116,212,116,107,117,26,118,168,118,63,119,201,119,103,120,241,120,116,121,252,121,123,122,5,123,163,123,40,124,153,124,28,125,131,125,229,125,72,126,55,127,196,127,101,128,35,129,181,129,80,130,19,131,203,131,86,132,233,132,101,133,225,133,76,134,236,134,138,135,7,136,144,136,24,137,140,137,8,138,106,138,206,138,48,139,146,139,151,140,248,140,174,141,85,142,207,142,47,143,225,143,146,144,43,145,200,145,48,146,146,146,244,146,85,147,183,147,25,148,123,148,182,149,109,150,252,150,129,151,249,151,89,152,242,152,87,153,228,153,68,154,236,154,102,155,198,155,38,156,150,156,45,157,141,157,237,157,144,158,22,159,144,159,79,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180,78,34,80,23,81,108,82,161,83,61,85,119,86,150,87,157,88,188,89,189,90,227,91,18,93,9,94,59,95,147,96,163,97,240,98,54,100,50,101,107,102,140,103,199,104,205,105,182,106,158,107,244,108,70,110,83,111,56,112,66,113,41,114,17,229,113,229,209,229,49,230,145,230,241,230,81,231,189,37,234,231,89,115,220,115,98,116,213,116,108,117,28,118,169,118,66,119,202,119,104,120,243,120,117,121,254,121,124,122,7,123,164,123,41,124,154,124,29,125,132,125,230,125,73,126,57,127,198,127,102,128,36,129,182,129,81,130,22,131,205,131,88,132,234,132,102,133,226,133,82,134,239,134,140,135,8,136,145,136,28,137,141,137,9,138,107,138,207,138,49,139,147,139,153,140,249,140,175,141,86,142,208,142,48,143,227,143,148,144,44,145,203,145,49,146,147,146,245,146,86,147,184,147,26,148,124,148,183,149,110,150,253,150,130,151,250,151,90,152,243,152,88,153,229,153,69,154,238,154,103,155,199,155,39,156,151,156,46,157,142,157,238,157,145,158,24,159,145,159,80,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,182,78,35,80,24,81,109,82,164,83,64,85,120,86,151,87,160,88,189,89,191,90,230,91,19,93,10,94,61,95,149,96,164,97,242,98,55,100,51,101,108,102,141,103,200,104,207,105,183,106,159,107,249,108,71,110,84,111,58,112,67,113,43,114,18,229,114,229,210,229,50,230,146,230,242,230,82,231,226,37,235,231,90,115,221,115,99,116,214,116,109,117,29,118,170,118,68,119,203,119,105,120,245,120,118,121,255,121,125,122,9,123,165,123,43,124,155,124,30,125,133,125,231,125,74,126,59,127,199,127,103,128,37,129,183,129,82,130,24,131,206,131,93,132,235,132,103,133,227,133,83,134,245,134,142,135,9,136,147,136,29,137,142,137,10,138,108,138,208,138,50,139,148,139,154,140,250,140,176,141,87,142,209,142,49,143,231,143,150,144,45,145,208,145,50,146,148,146,246,146,87,147,185,147,27,148,125,148,184,149,111,150,255,150,131,151,251,151,91,152,244,152,89,153,230,153,70,154,240,154,104,155,200,155,40,156,152,156,47,157,143,157,239,157,148,158,26,159,146,159,81,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,78,36,80,25,81,110,82,167,83,66,85,121,86,152,87,161,88,191,89,192,90,231,91,21,93,11,94,62,95,151,96,165,97,245,98,56,100,55,101,109,102,142,103,202,104,209,105,184,106,160,107,255,108,72,110,85,111,59,112,68,113,45,114,19,229,115,229,211,229,51,230,147,230,243,230,83,231,227,37,236,231,91,115,223,115,100,116,215,116,110,117,30,118,171,118,69,119,204,119,111,120,246,120,121,121,1,122,126,122,12,123,174,123,44,124,160,124,31,125,134,125,232,125,75,126,60,127,200,127,104,128,38,129,184,129,83,130,25,131,208,131,94,132,237,132,105,133,229,133,85,134,246,134,143,135,11,136,148,136,30,137,143,137,11,138,109,138,209,138,51,139,149,139,155,140,251,140,178,141,88,142,210,142,50,143,236,143,152,144,46,145,210,145,51,146,149,146,247,146,88,147,186,147,28,148,126,148,185,149,112,150,2,151,132,151,252,151,92,152,245,152,90,153,231,153,71,154,241,154,105,155,201,155,41,156,153,156,48,157,144,157,240,157,149,158,27,159,147,159,82,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,78,39,80,26,81,112,82,170,83,69,85,122,86,153,87,162,88,192,89,195,90,233,91,23,93,13,94,63,95,152,96,166,97,248,98,57,100,58,101,113,102,143,103,204,104,210,105,185,106,162,107,0,109,73,110,86,111,60,112,70,113,46,114,20,229,116,229,212,229,52,230,148,230,244,230,84,231,228,37,237,231,92,115,225,115,101,116,216,116,111,117,33,118,172,118,70,119,206,119,112,120,248,120,123,121,4,122,130,122,13,123,175,123,45,124,161,124,33,125,135,125,233,125,76,126,61,127,201,127,107,128,39,129,185,129,84,130,29,131,209,131,95,132,238,132,106,133,230,133,86,134,247,134,144,135,12,136,149,136,31,137,144,137,12,138,110,138,210,138,52,139,150,139,156,140,252,140,182,141,90,142,211,142,51,143,239,143,154,144,48,145,211,145,52,146,150,146,248,146,89,147,187,147,29,148,127,148,186,149,113,150,3,151,134,151,253,151,93,152,246,152,91,153,232,153,72,154,242,154,106,155,202,155,42,156,157,156,49,157,145,157,241,157,150,158,28,159,148,159,83,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,78,43,80,27,81,113,82,171,83,71,85,125,86,154,87,163,88,193,89,196,90,234,91,24,93,14,94,65,95,153,96,170,97,249,98,59,100,60,101,114,102,145,103,206,104,211,105,186,106,163,107,2,109,74,110,87,111,61,112,71,113,47,114,21,229,117,229,213,229,53,230,149,230,245,230,85,231,229,37,238,231,93,115,226,115,102,116,217,116,112,117,35,118,173,118,72,119,207,119,113,120,249,120,124,121,5,122,133,122,14,123,176,123,46,124,163,124,35,125,136,125,234,125,77,126,62,127,203,127,108,128,40,129,188,129,85,130,30,131,210,131,96,132,239,132,107,133,231,133,87,134,250,134,145,135,13,136,151,136,32,137,145,137,13,138,111,138,211,138,53,139,151,139,157,140,253,140,183,141,91,142,212,142,52,143,241,143,156,144,50,145,212,145,53,146,151,146,249,146,90,147,188,147,30,148,128,148,187,149,115,150,5,151,135,151,254,151,94,152,247,152,92,153,233,153,73,154,243,154,107,155,203,155,43,156,170,156,50,157,146,157,242,157,151,158,29,159,149,159,84,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,78,47,80,28,81,115,82,172,83,72,85,126,86,156,87,164,88,194,89,197,90,235,91,25,93,18,94,66,95,156,96,171,97,250,98,60,100,61,101,115,102,146,103,207,104,213,105,187,106,164,107,3,109,75,110,89,111,62,112,72,113,50,114,22,229,118,229,214,229,54,230,150,230,246,230,86,231,9,38,239,231,94,115,227,115,103,116,218,116,113,117,39,118,175,118,73,119,208,119,114,120,251,120,125,121,7,122,135,122,16,123,178,123,47,124,166,124,36,125,137,125,235,125,78,126,63,127,205,127,109,128,41,129,189,129,86,130,31,131,211,131,98,132,241,132,108,133,232,133,88,134,251,134,146,135,14,136,152,136,34,137,146,137,14,138,112,138,212,138,54,139,152,139,158,140,254,140,185,141,92,142,213,142,53,143,242,143,158,144,51,145,213,145,54,146,152,146,250,146,91,147,189,147,31,148,129,148,188,149,120,150,10,151,136,151,255,151,95,152,248,152,93,153,234,153,74,154,244,154,108,155,204,155,44,156,172,156,51,157,147,157,243,157,152,158,30,159,150,159,85,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,78,48,80,29,81,116,82,173,83,75,85,127,86,157,87,165,88,195,89,198,90,236,91,26,93,19,94,67,95,158,96,173,97,251,98,62,100,64,101,117,102,147,103,208,104,214,105,188,106,165,107,5,109,76,110,90,111,63,112,73,113,51,114,23,229,119,229,215,229,55,230,151,230,247,230,87,231,149,34,240,231,95,115,228,115,104,116,219,116,115,117,40,118,176,118,74,119,209,119,115,120,252,120,126,121,8,122,137,122,18,123,179,123,48,124,167,124,37,125,138,125,236,125,79,126,64,127,207,127,110,128,42,129,190,129,87,130,32,131,213,131,100,132,242,132,109,133,234,133,89,134,252,134,148,135,15,136,153,136,35,137,147,137,15,138,113,138,213,138,55,139,153,139,159,140,255,140,187,141,93,142,214,142,54,143,244,143,159,144,52,145,214,145,55,146,153,146,251,146,92,147,190,147,32,148,130,148,189,149,121,150,11,151,137,151,0,152,96,152,249,152,94,153,235,153,75,154,245,154,109,155,205,155,45,156,175,156,52,157,148,157,244,157,153,158,31,159,151,159,86,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,190,78,49,80,30,81,117,82,175,83,76,85,128,86,158,87,166,88,196,89,199,90,237,91,28,93,23,94,68,95,161,96,174,97,0,99,64,100,65,101,120,102,148,103,209,104,215,105,189,106,166,107,6,109,79,110,91,111,64,112,75,113,52,114,24,229,120,229,216,229,56,230,152,230,248,230,88,231,18,48,241,231,97,115,230,115,105,116,221,116,117,117,44,118,179,118,75,119,210,119,116,120,253,120,127,121,9,122,138,122,19,123,181,123,49,124,168,124,38,125,139,125,237,125,80,126,65,127,208,127,111,128,43,129,191,129,89,130,33,131,215,131,101,132,243,132,110,133,235,133,91,134,253,134,149,135,16,136,154,136,36,137,148,137,16,138,114,138,214,138,56,139,154,139,160,140,0,141,189,141,94,142,215,142,55,143,245,143,160,144,53,145,215,145,56,146,154,146,252,146,93,147,191,147,33,148,131,148,190,149,122,150,12,151,138,151,1,152,97,152,250,152,95,153,236,153,76,154,246,154,110,155,206,155,46,156,185,156,53,157,149,157,245,157,154,158,33,159,152,159,87,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,78,50,80,31,81,118,82,176,83,77,85,129,86,159,87,167,88,197,89,200,90,239,91,29,93,30,94,69,95,162,96,175,97,3,99,66,100,66,101,121,102,150,103,211,104,216,105,190,106,167,107,8,109,80,110,93,111,65,112,77,113,58,114,25,229,121,229,217,229,57,230,153,230,249,230,89,231,29,48,242,231,98,115,232,115,106,116,223,116,118,117,46,118,181,118,76,119,211,119,117,120,254,120,130,121,10,122,139,122,22,123,182,123,50,124,169,124,40,125,140,125,238,125,81,126,67,127,209,127,112,128,45,129,196,129,91,130,34,131,217,131,102,132,244,132,111,133,236,133,92,134,255,134,150,135,17,136,155,136,38,137,149,137,17,138,115,138,215,138,57,139,155,139,161,140,1,141,192,141,95,142,216,142,56,143,246,143,164,144,54,145,216,145,57,146,155,146,253,146,94,147,192,147,34,148,132,148,191,149,123,150,16,151,140,151,2,152,98,152,251,152,96,153,237,153,77,154,247,154,111,155,207,155,47,156,190,156,54,157,150,157,246,157,155,158,35,159,156,159,88,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,78,51,80,32,81,119,82,177,83,78,85,130,86,165,87,170,88,199,89,202,90,241,91,31,93,31,94,70,95,164,96,176,97,4,99,67,100,67,101,123,102,153,103,212,104,217,105,191,106,168,107,9,109,81,110,95,111,66,112,79,113,60,114,26,229,122,229,218,229,58,230,154,230,250,230,90,231,30,48,243,231,99,115,234,115,107,116,225,116,119,117,47,118,182,118,77,119,212,119,118,120,255,120,131,121,12,122,140,122,23,123,183,123,51,124,171,124,41,125,141,125,239,125,82,126,70,127,210,127,114,128,46,129,197,129,92,130,35,131,218,131,103,132,245,132,112,133,237,133,93,134,1,135,152,135,18,136,157,136,39,137,150,137,18,138,116,138,216,138,58,139,156,139,162,140,2,141,193,141,96,142,217,142,57,143,250,143,165,144,55,145,217,145,58,146,156,146,254,146,95,147,193,147,35,148,145,148,192,149,124,150,17,151,142,151,3,152,99,152,252,152,97,153,238,153,78,154,248,154,112,155,208,155,48,156,191,156,55,157,151,157,247,157,156,158,36,159,157,159,89,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,78,52,80,34,81,120,82,178,83,79,85,131,86,168,87,171,88,200,89,203,90,242,91,32,93,32,94,71,95,165,96,177,97,5,99,73,100,68,101,124,102,155,103,214,104,218,105,192,106,169,107,10,109,82,110,96,111,67,112,80,113,62,114,27,229,123,229,219,229,59,230,155,230,251,230,91,231,188,231,7,48,100,115,235,115,108,116,229,116,122,117,49,118,183,118,78,119,213,119,120,120,0,121,134,121,15,122,142,122,24,123,185,123,52,124,172,124,42,125,142,125,240,125,83,126,71,127,211,127,115,128,48,129,199,129,93,130,36,131,219,131,104,132,246,132,113,133,238,133,95,134,4,135,153,135,20,136,158,136,40,137,151,137,19,138,117,138,217,138,59,139,157,139,163,140,3,141,194,141,97,142,218,142,58,143,251,143,167,144,56,145,218,145,59,146,157,146,255,146,96,147,194,147,36,148,150,148,193,149,125,150,18,151,143,151,4,152,100,152,253,152,98,153,239,153,79,154,250,154,113,155,209,155,49,156,192,156,56,157,152,157,248,157,158,158,37,159,158,159,90,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,78,53,80,35,81,121,82,179,83,81,85,132,86,170,87,172,88,201,89,205,90,243,91,33,93,33,94,72,95,167,96,178,97,6,99,75,100,70,101,125,102,159,103,215,104,220,105,193,106,171,107,13,109,85,110,97,111,68,112,81,113,64,114,28,229,124,229,220,229,60,230,156,230,252,230,92,231,189,231,244,231,101,115,236,115,110,116,231,116,123,117,50,118,184,118,79,119,214,119,121,120,2,121,135,121,16,122,143,122,26,123,186,123,53,124,173,124,44,125,143,125,241,125,84,126,72,127,214,127,116,128,51,129,200,129,94,130,37,131,222,131,106,132,247,132,115,133,239,133,96,134,5,135,154,135,23,136,159,136,41,137,152,137,20,138,118,138,218,138,60,139,158,139,164,140,4,141,197,141,98,142,219,142,59,143,252,143,168,144,58,145,219,145,60,146,158,146,0,147,97,147,195,147,37,148,152,148,194,149,126,150,20,151,144,151,5,152,101,152,254,152,100,153,240,153,80,154,252,154,114,155,210,155,50,156,193,156,57,157,153,157,249,157,160,158,38,159,161,159,91,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,78,54,80,36,81,122,82,180,83,82,85,135,86,172,87,173,88,204,89,206,90,244,91,34,93,34,94,73,95,169,96,179,97,10,99,76,100,71,101,127,102,160,103,217,104,221,105,194,106,172,107,15,109,87,110,99,111,69,112,82,113,65,114,29,229,125,229,221,229,61,230,157,230,253,230,93,231,190,231,245,231,102,115,238,115,111,116,232,116,124,117,54,118,185,118,82,119,216,119,122,120,3,121,136,121,17,122,144,122,28,123,187,123,54,124,175,124,45,125,144,125,242,125,85,126,73,127,215,127,117,128,52,129,201,129,96,130,38,131,226,131,110,132,248,132,117,133,240,133,97,134,6,135,155,135,24,136,160,136,44,137,153,137,21,138,119,138,219,138,61,139,159,139,165,140,5,141,199,141,99,142,220,142,60,143,254,143,169,144,59,145,221,145,61,146,159,146,1,147,98,147,196,147,38,148,199,148,195,149,127,150,21,151,147,151,6,152,102,152,255,152,102,153,241,153,81,154,253,154,115,155,211,155,51,156,194,156,58,157,154,157,250,157,161,158,39,159,162,159,92,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,218,78,55,80,37,81,123,82,181,83,83,85,136,86,175,87,174,88,205,89,207,90,245,91,35,93,35,94,74,95,170,96,180,97,11,99,77,100,74,101,128,102,161,103,219,104,222,105,195,106,173,107,16,109,89,110,100,111,70,112,83,113,66,114,30,229,126,229,222,229,62,230,158,230,254,230,94,231,191,231,246,231,103,115,239,115,113,116,233,116,125,117,55,118,186,118,83,119,217,119,123,120,4,121,137,121,18,122,147,122,29,123,188,123,55,124,176,124,46,125,145,125,243,125,86,126,74,127,217,127,118,128,53,129,203,129,97,130,41,131,227,131,111,132,249,132,118,133,241,133,99,134,11,135,156,135,25,136,161,136,45,137,154,137,22,138,120,138,220,138,62,139,172,139,166,140,6,141,200,141,100,142,221,142,61,143,255,143,171,144,60,145,222,145,62,146,160,146,2,147,99,147,197,147,39,148,207,148,196,149,128,150,23,151,149,151,7,152,103,152,0,153,115,153,242,153,82,154,254,154,116,155,212,155,52,156,200,156,59,157,155,157,251,157,162,158,40,159,163,159,93,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219,78,56,80,38,81,124,82,183,83,84,85,137,86,176,87,175,88,206,89,208,90,246,91,37,93,36,94,75,95,174,96,181,97,12,99,78,100,75,101,129,102,164,103,220,104,225,105,196,106,174,107,17,109,90,110,101,111,71,112,84,113,67,114,31,229,127,229,223,229,63,230,159,230,255,230,95,231,192,231,247,231,104,115,240,115,114,116,234,116,126,117,57,118,187,118,84,119,218,119,125,120,6,121,139,121,19,122,148,122,31,123,189,123,57,124,180,124,48,125,146,125,244,125,87,126,75,127,218,127,119,128,55,129,205,129,98,130,42,131,228,131,112,132,250,132,119,133,242,133,100,134,12,135,157,135,26,136,163,136,46,137,155,137,23,138,122,138,221,138,63,139,177,139,167,140,7,141,201,141,101,142,222,142,62,143,7,144,173,144,61,145,223,145,63,146,161,146,3,147,100,147,198,147,40,148,211,148,197,149,129,150,24,151,150,151,8,152,104,152,1,153,120,153,243,153,83,154,255,154,117,155,213,155,53,156,201,156,60,157,156,157,252,157,163,158,41,159,164,159,94,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,78,57,80,39,81,126,82,184,83,87,85,138,86,177,87,176,88,207,89,209,90,247,91,40,93,37,94,76,95,176,96,182,97,13,99,79,100,77,101,131,102,166,103,221,104,226,105,197,106,175,107,19,109,92,110,103,111,72,112,85,113,68,114,32,229,128,229,224,229,64,230,160,230,0,231,96,231,193,231,248,231,105,115,241,115,115,116,235,116,128,117,58,118,188,118,85,119,221,119,126,120,7,121,140,121,21,122,153,122,33,123,190,123,58,124,181,124,49,125,147,125,245,125,88,126,76,127,219,127,120,128,57,129,206,129,99,130,46,131,230,131,114,132,251,132,120,133,243,133,101,134,14,135,158,135,28,136,165,136,47,137,156,137,24,138,123,138,222,138,64,139,187,139,168,140,8,141,202,141,103,142,223,142,63,143,8,144,178,144,62,145,224,145,64,146,162,146,4,147,101,147,199,147,41,148,212,148,198,149,130,150,25,151,151,151,9,152,105,152,2,153,121,153,244,153,84,154,0,155,118,155,214,155,54,156,209,156,61,157,157,157,253,157,164,158,42,159,165,159,95,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,78,59,80,40,81,128,82,185,83,88,85,139,86,179,87,177,88,213,89,211,90,253,91,42,93,40,94,77,95,179,96,184,97,15,99,80,100,78,101,133,102,169,103,222,104,227,105,198,106,176,107,20,109,93,110,104,111,73,112,86,113,69,114,33,229,129,229,225,229,65,230,161,230,1,231,97,231,194,231,249,231,106,115,243,115,116,116,236,116,129,117,59,118,189,118,86,119,222,119,127,120,8,121,141,121,22,122,154,122,34,123,191,123,59,124,182,124,50,125,148,125,246,125,89,126,77,127,220,127,121,128,58,129,207,129,100,130,48,131,231,131,116,132,253,132,124,133,244,133,102,134,15,135,160,135,29,136,166,136,49,137,157,137,25,138,124,138,223,138,65,139,199,139,169,140,9,141,205,141,104,142,224,142,64,143,12,144,183,144,63,145,225,145,65,146,163,146,5,147,102,147,200,147,42,148,218,148,199,149,131,150,26,151,153,151,10,152,106,152,3,153,123,153,245,153,85,154,1,155,119,155,215,155,55,156,210,156,62,157,158,157,254,157,165,158,43,159,44,249,96,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,226,78,61,80,41,81,131,82,186,83,89,85,140,86,181,87,178,88,214,89,213,90,254,91,43,93,41,94,78,95,181,96,185,97,16,99,81,100,80,101,134,102,172,103,223,104,228,105,199,106,177,107,21,109,94,110,105,111,74,112,87,113,70,114,34,229,130,229,226,229,66,230,162,230,2,231,98,231,195,231,250,231,107,115,244,115,117,116,237,116,130,117,61,118,190,118,87,119,223,119,128,120,9,121,142,121,24,122,155,122,35,123,192,123,60,124,183,124,51,125,149,125,247,125,90,126,78,127,221,127,122,128,59,129,208,129,101,130,50,131,232,131,119,132,254,132,125,133,245,133,103,134,16,135,161,135,30,136,167,136,50,137,158,137,26,138,125,138,224,138,66,139,208,139,170,140,10,141,208,141,106,142,225,142,65,143,14,144,188,144,64,145,226,145,66,146,164,146,6,147,103,147,201,147,43,148,230,148,200,149,132,150,27,151,154,151,11,152,107,152,4,153,126,153,246,153,86,154,2,155,120,155,216,155,56,156,218,156,63,157,159,157,255,157,167,158,45,159,121,249,97,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,78,63,80,42,81,132,82,188,83,90,85,141,86,182,87,179,88,217,89,215,90,0,92,44,93,42,94,79,95,182,96,186,97,18,99,83,100,82,101,136,102,174,103,225,104,229,105,200,106,178,107,22,109,96,110,106,111,75,112,88,113,73,114,35,229,131,229,227,229,67,230,163,230,3,231,99,231,196,231,251,231,110,115,245,115,120,116,240,116,132,117,65,118,192,118,88,119,224,119,129,120,10,121,144,121,25,122,158,122,39,123,194,123,61,124,184,124,52,125,150,125,248,125,91,126,79,127,222,127,123,128,60,129,209,129,102,130,55,131,235,131,121,132,0,133,127,133,246,133,104,134,17,135,162,135,31,136,168,136,51,137,159,137,27,138,126,138,225,138,67,139,234,139,171,140,11,141,210,141,107,142,226,142,66,143,19,144,189,144,65,145,227,145,67,146,165,146,7,147,104,147,203,147,44,148,251,148,201,149,135,150,29,151,155,151,12,152,108,152,5,153,130,153,247,153,87,154,4,155,121,155,217,155,57,156,219,156,64,157,160,157,0,158,168,158,46,159,149,249,98,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,78,64,80,43,81,133,82,189,83,91,85,144,86,183,87,180,88,219,89,217,90,2,92,47,93,43,94,81,95,183,96,187,97,19,99,85,100,83,101,137,102,177,103,226,104,230,105,201,106,182,107,24,109,97,110,107,111,77,112,89,113,74,114,36,229,132,229,228,229,68,230,164,230,4,231,100,231,197,231,252,231,112,115,246,115,121,116,241,116,133,117,66,118,193,118,89,119,225,119,130,120,11,121,145,121,27,122,161,122,41,123,195,123,62,124,186,124,53,125,151,125,249,125,92,126,82,127,226,127,124,128,61,129,210,129,103,130,59,131,236,131,123,132,1,133,128,133,247,133,105,134,20,135,163,135,32,136,169,136,53,137,160,137,28,138,127,138,226,138,68,139,9,140,172,140,12,141,211,141,110,142,227,142,67,143,21,144,191,144,66,145,228,145,68,146,166,146,8,147,105,147,204,147,45,148,28,149,202,149,137,150,31,151,156,151,13,152,109,152,6,153,131,153,248,153,88,154,5,155,122,155,218,155,58,156,224,156,65,157,161,157,1,158,169,158,48,159,231,249,99,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,78,65,80,44,81,134,82,190,83,93,85,145,86,185,87,181,88,222,89,218,90,3,92,48,93,44,94,84,95,185,96,188,97,20,99,86,100,84,101,138,102,178,103,228,104,231,105,202,106,184,107,28,109,98,110,108,111,78,112,90,113,75,114,37,229,133,229,229,229,69,230,165,230,5,231,101,231,198,231,253,231,113,115,247,115,122,116,242,116,135,117,68,118,195,118,92,119,228,119,131,120,12,121,146,121,28,122,162,122,45,123,196,123,66,124,187,124,54,125,152,125,250,125,93,126,83,127,227,127,125,128,63,129,211,129,105,130,61,131,237,131,124,132,2,133,129,133,248,133,106,134,22,135,164,135,35,136,170,136,55,137,161,137,29,138,128,138,227,138,69,139,30,140,173,140,13,141,212,141,113,142,228,142,68,143,24,144,192,144,68,145,229,145,69,146,167,146,9,147,107,147,205,147,46,148,32,149,203,149,138,150,32,151,157,151,14,152,110,152,7,153,137,153,249,153,89,154,6,155,123,155,219,155,59,156,225,156,66,157,162,157,2,158,170,158,49,159,241,249,100,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,78,66,80,45,81,135,82,192,83,94,85,146,86,186,87,182,88,223,89,219,90,5,92,49,93,47,94,89,95,186,96,189,97,21,99,87,100,87,101,139,102,180,103,229,104,232,105,203,106,185,107,29,109,99,110,111,111,80,112,91,113,78,114,0,48,112,33,1,255,65,48,161,48,145,3,16,4,1,1,254,231,0,224,94,224,188,224,26,225,120,225,214,225,74,85,132,133,197,117,58,87,64,120,32,96,1,78,48,141,110,109,194,87,184,154,39,95,140,128,101,80,61,92,202,79,136,153,226,117,134,150,41,140,121,100,231,98,100,85,112,96,214,83,30,79,1,119,85,96,109,115,64,108,205,93,0,122,15,92,9,144,71,100,112,83,116,109,225,148,39,94,79,79,141,78,95,79,199,81,184,144,11,88,104,131,86,133,122,100,55,85,55,94,251,114,106,96,57,109,201,111,151,89,173,126,27,116,36,105,141,143,63,100,193,129,60,96,98,119,233,148,57,122,27,118,137,152,198,135,31,124,98,145,229,137,204,156,52,226,146,226,240,226,78,227,172,227,10,228,104,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,238,78,68,80,46,81,137,82,195,83,95,85,148,86,187,87,183,88,224,89,221,90,7,92,50,93,48,94,90,95,189,96,191,97,23,99,89,100,88,101,141,102,185,103,230,104,233,105,204,106,186,107,31,109,100,110,112,111,81,112,93,113,79,114,1,48,113,33,2,255,66,48,162,48,146,3,17,4,225,0,255,231,1,224,95,224,189,224,27,225,121,225,215,225,63,150,249,150,118,94,29,92,168,80,61,128,239,118,209,83,170,109,63,128,105,91,78,134,101,153,48,130,178,82,227,122,39,97,203,122,132,87,146,130,17,134,222,108,62,129,61,109,54,90,99,101,219,118,55,82,30,99,247,94,174,95,111,96,93,91,99,118,39,92,241,130,211,91,248,149,199,117,232,108,12,78,87,79,150,81,176,144,13,88,27,131,59,133,183,100,86,85,68,94,23,115,125,96,39,109,167,111,202,89,176,126,26,116,240,104,142,143,216,100,166,129,93,96,101,119,235,148,55,122,60,118,140,152,136,135,42,124,97,145,235,137,205,156,53,226,147,226,241,226,79,227,173,227,11,228,105,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,78,69,80,47,81,138,82,196,83,96,85,149,86,188,87,184,88,225,89,222,90,8,92,51,93,50,94,91,95,190,96,192,97,24,99,90,100,90,101,142,102,186,103,231,104,234,105,205,106,187,107,32,109,101,110,113,111,82,112,95,113,80,114,2,48,114,33,3,255,67,48,163,48,147,3,18,4,206,1,0,232,2,224,96,224,190,224,28,225,122,225,216,225,195,87,221,79,187,115,56,94,215,119,197,98,238,83,90,127,143,121,151,104,119,109,44,85,249,143,81,82,70,131,90,109,131,110,146,124,226,98,43,131,33,106,91,114,178,117,117,114,139,159,81,104,105,82,13,128,75,142,92,80,113,83,12,94,33,104,41,119,101,144,49,106,213,136,40,119,209,144,93,121,64,81,50,79,162,81,207,144,253,87,105,131,255,132,184,100,117,85,84,94,19,115,150,96,12,109,185,111,171,89,190,126,65,116,11,105,143,143,4,128,36,107,90,96,127,119,238,148,81,122,34,118,141,152,133,135,38,124,112,145,239,137,206,156,54,226,148,226,242,226,80,227,174,227,12,228,106,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,78,70,80,48,81,139,82,197,83,98,85,150,86,189,87,185,88,226,89,223,90,11,92,53,93,51,94,92,95,191,96,193,97,25,99,91,100,92,101,143,102,187,103,232,104,235,105,206,106,188,107,33,109,102,110,115,111,83,112,96,113,81,114,183,0,115,33,229,255,68,48,164,48,148,3,19,4,224,0,0,37,3,224,97,224,191,224,29,225,123,225,217,225,40,99,33,88,224,131,127,149,16,100,57,78,137,148,79,123,177,136,229,93,38,108,164,98,192,111,111,153,98,81,225,144,100,87,165,108,71,150,242,118,156,129,109,98,174,118,102,98,163,141,211,85,220,128,84,100,15,142,173,78,230,151,137,96,150,128,218,126,145,122,116,90,132,152,5,104,193,139,123,154,16,78,61,79,165,81,197,144,237,87,108,131,252,132,153,100,118,85,91,94,33,115,154,96,67,109,182,111,158,89,192,126,92,116,1,105,152,143,234,107,55,107,103,96,141,119,239,148,207,158,32,118,143,152,173,135,56,124,105,145,62,138,207,156,55,226,149,226,243,226,81,227,175,227,13,228,107,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,78,73,80,49,81,140,82,198,83,99,85,151,86,190,87,186,88,228,89,226,90,12,92,54,93,52,94,94,95,192,96,195,97,28,99,92,100,95,101,144,102,188,103,233,104,236,105,207,106,189,107,34,109,103,110,117,111,84,112,97,113,83,114,201,2,116,33,5,255,69,48,165,48,149,3,20,4,19,1,1,37,4,224,98,224,192,224,30,225,124,225,218,225,206,84,113,153,173,100,127,80,230,137,85,83,118,152,16,79,23,95,59,101,165,78,146,78,165,139,16,110,14,131,143,154,6,102,182,150,124,105,19,108,232,120,174,148,57,83,142,148,187,83,39,78,35,87,112,136,206,128,173,94,221,143,157,129,120,85,116,151,35,140,112,158,107,140,168,105,157,130,147,98,255,94,118,79,160,139,190,144,0,88,106,131,89,133,186,100,119,85,94,94,10,115,173,96,72,109,194,111,164,89,193,126,87,116,87,105,154,143,243,107,57,107,65,96,125,119,243,148,165,153,64,118,148,152,151,135,65,124,111,145,38,139,208,156,56,226,150,226,244,226,82,227,176,227,14,228,108,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,78,74,80,50,81,141,82,199,83,104,85,152,86,191,87,187,88,230,89,228,90,13,92,55,93,53,94,95,95,193,96,196,97,38,99,93,100,96,101,146,102,189,103,234,104,238,105,208,106,190,107,35,109,104,110,118,111,85,112,98,113,84,114,199,2,117,33,6,255,70,48,166,48,150,3,21,4,233,0,2,37,5,224,99,224,193,224,31,225,125,225,219,225,9,85,157,91,232,98,160,128,4,89,248,144,14,159,79,78,43,117,159,82,179,91,170,108,33,158,133,110,91,119,128,85,70,99,155,82,4,90,217,95,105,100,189,126,222,117,197,148,8,87,20,100,8,94,41,117,212,130,58,99,69,104,21,89,17,123,155,133,218,89,148,94,109,154,139,84,157,103,42,114,69,83,116,79,166,139,208,144,30,88,109,131,72,133,192,100,51,85,97,94,30,115,157,96,7,109,225,111,210,89,194,126,85,116,227,104,206,142,253,107,67,107,89,96,128,119,244,148,112,122,45,118,154,152,131,135,64,124,125,145,83,151,211,156,57,226,151,226,245,226,83,227,177,227,15,228,109,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,78,75,80,51,81,142,82,206,83,105,85,153,86,192,87,189,88,231,89,229,90,14,92,56,93,54,94,96,95,194,96,197,97,39,99,95,100,97,101,147,102,190,103,235,104,239,105,209,106,192,107,36,109,105,110,119,111,86,112,99,113,85,114,168,0,118,33,7,255,71,48,167,48,151,3,1,4,27,1,3,37,6,224,100,224,194,224,32,225,126,225,220,225,192,84,177,98,181,148,130,83,227,99,184,99,45,149,0,150,154,98,109,96,135,154,55,98,236,89,167,109,118,102,150,84,240,86,131,116,2,100,189,131,84,155,19,129,251,80,67,83,167,152,154,154,49,89,5,94,172,98,71,130,244,86,220,96,72,101,102,91,172,84,40,127,51,158,77,78,47,101,253,98,21,78,145,79,167,139,196,144,25,88,110,131,104,133,208,100,48,85,140,92,29,115,131,96,4,109,238,111,178,89,201,126,89,116,16,105,11,98,245,107,70,107,99,96,140,119,245,148,136,118,48,118,155,152,171,135,254,129,126,145,233,150,212,156,58,226,152,226,246,226,84,227,178,227,16,228,110,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250,78,77,80,52,81,143,82,207,83,107,85,154,86,193,87,190,88,233,89,231,90,16,92,57,93,57,94,99,95,195,96,198,97,41,99,96,100,100,101,148,102,191,103,236,104,240,105,210,106,195,107,38,109,106,110,121,111,87,112,101,113,87,114,3,48,119,33,8,255,72,48,168,48,152,3,22,4,232,0,4,37,7,224,101,224,195,224,33,225,127,225,221,225,145,118,165,98,226,108,94,101,221,93,198,128,154,91,213,108,133,143,154,159,99,145,177,130,233,126,250,94,184,156,97,83,236,98,233,84,211,123,43,115,185,98,83,109,65,92,193,143,67,103,107,98,238,114,19,104,240,83,26,144,47,85,132,113,84,105,116,122,0,130,185,131,10,110,184,112,49,84,19,78,152,78,137,79,170,139,199,144,68,88,176,131,100,133,215,100,92,85,122,92,21,115,146,96,25,109,222,111,175,89,203,126,119,116,113,105,23,98,249,107,89,107,171,96,145,119,247,148,142,118,63,118,158,152,229,135,1,130,114,145,243,150,213,156,59,226,153,226,247,226,85,227,179,227,17,228,111,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,78,80,80,53,81,145,82,208,83,111,85,155,86,196,87,191,88,234,89,232,90,18,92,58,93,58,94,101,95,196,96,199,97,44,99,97,100,101,101,149,102,192,103,237,104,241,105,211,106,196,107,40,109,108,110,123,111,88,112,105,113,88,114,5,48,120,33,9,255,73,48,169,48,153,3,23,4,43,1,5,37,8,224,102,224,196,224,34,225,128,225,222,225,76,118,180,102,90,83,69,117,127,122,230,101,162,139,208,115,239,79,155,79,168,97,215,84,9,127,245,80,172,78,175,84,105,98,233,79,15,111,5,131,43,103,156,81,108,139,126,123,155,145,194,90,189,101,244,98,240,108,80,104,223,96,239,112,155,78,234,150,111,131,36,132,164,81,200,139,24,135,22,120,30,78,131,79,180,139,211,144,32,88,120,131,94,133,228,100,139,85,141,92,34,115,140,96,14,109,224,111,215,89,204,126,109,116,57,105,27,98,5,108,209,152,6,97,159,119,249,148,147,118,53,118,159,152,172,135,2,130,116,145,239,150,215,156,60,226,154,226,248,226,86,227,180,227,18,228,112,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,78,81,80,54,81,146,82,210,83,112,85,156,86,197,87,192,88,235,89,234,90,19,92,59,93,62,94,103,95,199,96,201,97,45,99,98,100,103,101,152,102,194,103,239,104,243,105,212,106,198,107,41,109,109,110,125,111,89,112,106,113,90,114,20,32,121,33,10,255,74,48,170,48,154,3,24,4,237,0,6,37,9,224,103,224,197,224,35,225,129,225,223,225,60,133,121,140,195,82,49,85,61,105,46,108,34,78,233,133,220,145,172,142,175,144,78,83,9,84,220,89,202,96,0,95,211,94,84,128,75,150,26,149,171,131,4,95,199,123,223,78,201,108,95,116,127,110,28,151,94,145,110,145,58,78,170,110,71,107,64,136,129,137,37,132,67,81,88,100,229,119,108,143,50,155,143,79,181,139,230,144,101,88,179,131,122,133,226,100,210,85,144,92,57,115,155,96,43,109,239,111,190,89,208,126,126,116,96,105,31,98,7,108,210,152,13,97,160,119,252,148,153,118,67,118,161,152,181,135,4,130,121,145,6,151,216,156,61,226,155,226,249,226,87,227,181,227,19,228,113,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,82,80,55,81,148,82,211,83,113,85,157,86,198,87,194,88,237,89,236,90,23,92,60,93,63,94,104,95,200,96,204,97,46,99,99,100,104,101,153,102,197,103,242,104,244,105,213,106,199,107,44,109,111,110,126,111,90,112,107,113,92,114,94,255,102,231,11,255,75,48,171,48,155,3,25,4,208,1,7,37,10,224,104,224,198,224,36,225,130,225,224,225,238,119,141,156,15,100,33,80,32,79,70,79,28,78,6,94,167,101,108,81,233,151,62,115,129,103,6,92,190,124,233,99,20,150,178,131,166,130,219,107,168,88,116,89,79,80,38,140,104,81,114,130,215,139,204,83,42,89,179,119,77,111,80,108,78,135,203,82,0,128,103,131,163,87,139,101,162,128,176,100,108,91,126,79,183,139,226,144,108,88,180,131,162,119,9,101,131,85,150,92,37,115,236,96,77,109,26,112,5,90,212,126,156,116,66,105,34,98,6,108,211,152,93,97,176,119,253,148,164,118,62,118,162,152,179,135,236,129,140,145,1,151,217,156,62,226,156,226,250,226,88,227,182,227,20,228,114,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,79,83,80,56,81,149,82,213,83,114,85,158,86,199,87,195,88,238,89,237,90,25,92,63,93,64,94,107,95,201,96,205,97,48,99,100,100,105,101,154,102,198,103,243,104,245,105,214,106,200,107,45,109,112,110,127,111,91,112,108,113,94,114,22,32,103,231,12,255,76,48,172,48,156,3,26,4,236,0,8,37,11,224,105,224,199,224,37,225,131,225,225,225,126,130,6,114,194,148,133,141,57,130,238,96,172,81,106,117,47,129,171,91,43,84,209,110,216,104,70,109,179,124,119,105,131,87,222,143,98,83,219,119,216,158,170,82,71,114,126,78,202,117,169,109,56,92,61,114,1,96,12,84,244,126,128,114,139,151,143,113,48,105,71,135,129,136,133,91,2,129,90,141,105,86,123,79,194,139,220,144,129,88,160,131,67,133,37,101,177,85,136,92,44,115,187,96,46,109,35,112,6,90,215,126,142,116,93,105,33,98,13,108,213,152,169,97,181,119,255,148,222,116,51,118,165,152,203,135,68,136,133,145,8,151,220,156,63,226,157,226,251,226,89,227,183,227,21,228,115,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,79,84,80,57,81,150,82,218,83,115,85,159,86,200,87,196,88,239,89,238,90,27,92,64,93,65,94,110,95,204,96,206,97,49,99,101,100,106,101,155,102,199,103,244,104,246,105,215,106,201,107,47,109,113,110,128,111,92,112,109,113,96,114,38,32,104,231,13,255,77,48,173,48,157,3,27,4,77,1,9,37,12,224,106,224,200,224,38,225,132,225,226,225,141,120,111,103,148,123,132,98,152,85,225,109,99,132,251,127,81,129,19,95,181,109,59,117,145,143,95,108,207,126,239,81,201,98,112,149,133,152,198,148,171,108,18,96,151,154,212,158,243,98,238,104,113,134,1,140,112,108,220,148,199,130,132,106,79,83,170,95,78,86,206,143,159,83,132,122,65,108,198,123,40,78,170,79,195,139,215,144,137,88,170,131,114,133,46,101,185,85,152,92,56,115,177,96,53,109,27,112,221,89,219,126,128,116,132,105,37,98,21,108,217,152,157,97,189,119,3,149,224,116,77,118,166,152,211,135,33,130,144,145,15,151,221,156,64,226,158,226,252,226,90,227,184,227,22,228,116,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,79,86,80,58,81,151,82,220,83,116,85,160,86,201,87,198,88,240,89,239,90,30,92,65,93,67,94,111,95,205,96,207,97,51,99,102,100,109,101,156,102,200,103,246,104,247,105,216,106,202,107,48,109,114,110,129,111,93,112,111,113,99,114,24,32,105,231,14,255,78,48,174,48,158,3,28,4,243,0,10,37,13,224,107,224,201,224,39,225,133,225,227,225,49,114,145,120,47,79,158,148,50,78,222,139,194,97,10,106,156,94,233,93,210,91,18,82,77,124,134,117,149,78,104,97,135,85,201,94,144,94,111,83,32,111,115,89,216,152,177,148,172,114,231,80,65,83,52,108,77,87,100,95,14,132,173,136,31,99,236,101,54,128,98,141,244,99,58,80,75,78,105,104,186,121,124,79,203,139,219,144,154,88,147,131,123,133,11,95,136,85,153,92,49,115,221,96,26,109,57,112,8,90,224,126,129,116,107,105,36,98,24,108,218,152,203,97,58,117,2,149,44,117,94,118,77,134,189,135,34,130,141,145,14,151,223,156,65,226,159,226,253,226,91,227,185,227,23,228,117,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,79,87,80,59,81,152,82,221,83,121,85,161,86,202,87,199,88,241,89,240,90,31,92,66,93,70,94,114,95,206,96,208,97,52,99,104,100,110,101,158,102,201,103,247,104,248,105,217,106,204,107,52,109,115,110,130,111,95,112,112,113,100,114,25,32,106,231,15,255,79,48,175,48,159,3,29,4,210,1,11,37,14,224,108,224,202,224,40,225,134,225,228,225,152,150,178,96,27,94,29,103,174,117,57,95,168,82,254,119,80,129,94,108,253,81,22,83,198,150,139,132,102,139,10,82,33,135,28,96,137,112,2,131,222,91,150,102,2,111,179,148,56,82,142,131,243,119,97,119,74,100,229,122,212,89,45,94,58,100,226,139,55,114,200,118,149,143,232,91,199,126,132,94,63,78,172,79,207,139,235,144,128,88,156,131,164,133,210,95,129,85,145,92,80,115,216,96,79,109,53,112,227,89,225,126,135,116,128,105,44,98,25,108,179,107,209,97,64,117,6,149,32,158,84,118,84,134,209,135,35,130,145,145,42,151,226,156,66,226,160,226,254,226,92,227,186,227,24,228,118,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,79,88,80,60,81,153,82,222,83,122,85,162,86,204,87,200,88,242,89,242,90,32,92,67,93,71,94,116,95,207,96,211,97,53,99,106,100,111,101,159,102,202,103,248,104,249,105,218,106,206,107,54,109,116,110,131,111,96,112,113,113,101,114,28,32,107,231,16,255,80,48,176,48,160,3,30,4,242,0,12,37,15,224,109,224,203,224,41,225,135,225,229,225,141,151,81,83,54,130,50,86,151,122,203,134,11,104,146,148,116,141,241,98,138,85,221,139,202,83,104,104,111,102,42,88,74,129,159,109,179,99,146,81,76,150,80,134,226,116,77,82,157,82,2,120,254,98,14,122,42,141,118,104,31,79,96,78,170,144,251,91,206,145,113,95,237,86,187,119,76,128,197,136,21,83,148,79,206,139,239,144,168,153,133,131,168,133,25,117,159,85,154,92,77,115,198,96,82,109,79,112,216,89,232,126,139,116,152,105,231,129,26,108,64,95,6,98,78,117,7,149,34,158,92,118,108,134,192,135,45,130,162,145,45,151,124,151,67,226,161,226,255,226,93,227,187,227,25,228,119,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,79,89,80,61,81,154,82,225,83,125,85,164,86,205,87,201,88,243,89,243,90,33,92,68,93,72,94,117,95,208,96,213,97,54,99,107,100,113,101,160,102,203,103,251,104,250,105,219,106,208,107,55,109,117,110,133,111,97,112,116,113,104,114,29,32,136,36,17,255,81,48,177,48,161,3,31,4,107,1,13,37,16,224,110,224,204,224,42,225,136,225,230,225,40,108,23,83,22,129,110,111,98,94,83,95,151,79,65,126,111,82,33,141,85,127,208,105,37,96,86,89,136,152,216,82,163,143,24,94,100,83,61,94,11,140,159,117,104,121,92,111,58,127,64,103,246,101,46,84,43,118,69,99,42,79,179,90,156,101,111,154,182,81,150,152,88,84,225,107,244,118,134,89,71,78,230,79,210,139,254,144,25,159,124,131,135,133,17,95,126,85,156,92,87,115,218,96,84,109,94,112,249,89,235,126,158,116,120,105,239,116,33,108,194,107,128,128,75,117,9,149,40,158,86,118,110,134,202,135,47,130,163,145,48,151,133,151,68,226,162,226,0,227,94,227,188,227,26,228,120,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,79,91,80,62,81,156,82,226,83,127,85,165,86,208,87,202,88,244,89,244,90,35,92,69,93,73,94,118,95,210,96,214,97,55,99,108,100,115,101,161,102,204,103,253,104,251,105,220,106,209,107,56,109,118,110,134,111,98,112,117,113,106,114,20,48,137,36,18,255,82,48,178,48,163,3,32,4,250,0,14,37,17,224,111,224,205,224,43,225,137,225,231,225,137,91,136,143,138,129,226,93,138,94,33,99,107,96,225,81,134,137,113,81,240,127,138,95,190,117,178,139,89,151,78,87,102,85,91,101,79,134,140,140,95,114,42,99,135,100,99,144,148,112,57,82,192,78,172,119,233,110,82,123,62,92,156,85,193,128,225,93,95,78,108,120,6,87,121,138,13,105,158,100,45,89,232,79,211,139,4,145,255,97,182,131,143,133,95,83,214,85,181,92,96,115,180,96,51,109,128,91,12,90,238,126,168,116,52,105,244,116,41,108,243,137,127,128,72,117,10,149,41,158,107,118,127,134,219,135,40,130,170,145,62,151,145,151,69,226,163,226,1,227,95,227,189,227,27,228,121,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,79,93,80,66,81,164,82,231,83,133,85,166,86,209,87,203,88,245,89,245,90,38,92,70,93,74,94,120,95,211,96,215,97,56,99,110,100,117,101,162,102,205,103,254,104,252,105,221,106,216,107,58,109,119,110,135,111,99,112,118,113,107,114,21,48,138,36,19,255,83,48,179,48,164,3,33,4,212,1,15,37,18,224,112,224,206,224,44,225,138,225,232,225,250,79,204,128,36,110,53,84,239,149,90,81,187,81,230,112,75,141,169,148,188,100,0,96,114,108,32,83,131,88,13,120,177,131,56,129,129,156,56,141,208,103,230,97,165,119,69,109,56,118,153,108,223,152,122,152,91,87,223,126,172,126,227,148,16,140,137,107,117,152,32,102,63,115,152,124,150,107,238,88,59,114,234,79,212,139,34,145,121,130,169,131,121,133,241,83,145,85,162,92,108,115,32,97,145,109,132,91,9,90,239,126,169,116,204,105,255,116,36,108,144,101,147,108,91,117,13,149,42,158,111,118,122,134,234,135,43,130,173,145,128,159,146,151,70,226,164,226,2,227,96,227,190,227,28,228,122,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,79,94,80,71,81,165,82,244,83,134,85,167,86,211,87,204,88,246,89,246,90,40,92,72,93,75,94,122,95,212,96,216,97,59,99,111,100,118,101,163,102,206,103,255,104,254,105,222,106,218,107,63,109,120,110,138,111,100,112,119,113,108,114,8,48,139,36,20,255,84,48,180,48,165,3,34,4,249,0,16,37,19,224,113,224,207,224,45,225,139,225,233,225,9,99,29,141,202,108,146,112,27,82,97,131,30,109,205,83,13,89,254,82,77,99,238,109,115,83,113,145,108,101,11,119,101,103,254,148,147,158,72,78,199,98,239,124,252,98,52,140,116,83,177,126,128,134,28,130,128,106,219,117,42,103,23,109,153,81,91,108,150,99,223,84,144,110,190,108,103,98,182,114,110,83,197,79,214,139,30,145,125,130,125,131,174,133,253,83,123,85,189,92,111,115,38,97,111,109,149,91,50,90,241,126,144,116,135,105,15,117,42,108,81,159,246,108,114,117,14,149,43,158,202,127,124,134,224,135,56,130,174,145,131,159,148,151,71,226,165,226,3,227,97,227,191,227,29,228,123,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,79,95,80,74,81,166,82,250,83,140,85,168,86,214,87,205,88,247,89,247,90,41,92,73,93,77,94,125,95,214,96,217,97,60,99,112,100,120,101,164,102,213,103,0,105,0,106,223,106,220,107,64,109,121,110,139,111,101,112,121,113,109,114,9,48,140,36,21,255,85,48,181,48,166,3,35,4,214,1,17,37,20,224,114,224,208,224,46,225,140,225,234,225,151,102,161,148,115,154,102,143,57,84,99,104,92,81,212,143,133,80,159,108,241,101,79,87,201,90,77,150,92,149,183,94,86,141,75,96,140,120,171,115,97,114,250,139,145,152,17,88,74,158,187,80,158,91,244,139,240,117,119,80,26,133,251,124,176,104,173,139,26,78,229,98,24,127,207,118,60,80,14,105,16,108,218,79,216,139,35,145,127,130,184,131,156,133,233,83,223,85,172,92,126,115,21,97,158,109,147,91,52,90,242,126,167,116,136,105,17,117,50,108,147,101,252,109,121,117,15,149,44,158,230,122,123,134,238,135,59,130,175,145,133,159,175,151,72,226,166,226,4,227,98,227,192,227,30,228,124,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,79,96,80,76,81,167,82,254,83,141,85,169,86,215,87,206,88,248,89,248,90,42,92,77,93,78,94,126,95,215,96,218,97,62,99,113,100,121,101,165,102,214,103,2,105,1,106,224,106,221,107,66,109,122,110,143,111,102,112,123,113,112,114,10,48,141,36,22,255,86,48,182,48,167,3,36,4,216,1,18,37,21,224,115,224,209,224,47,225,141,225,235,225,184,92,13,80,85,99,111,98,138,112,0,82,150,98,3,131,216,78,223,130,190,97,34,107,167,126,73,133,132,95,119,97,221,132,188,112,50,151,154,103,169,78,230,84,43,141,76,93,183,105,101,85,198,139,85,120,109,111,149,98,115,84,153,150,120,83,175,139,246,83,99,79,220,143,169,101,132,79,37,149,223,86,227,79,217,139,49,145,143,130,123,131,133,133,232,83,189,85,171,92,27,130,35,97,160,109,165,91,17,90,13,127,210,116,206,105,19,117,53,101,188,101,246,119,131,117,18,149,50,158,120,122,168,134,22,136,51,130,181,145,134,159,171,151,73,226,167,226,5,227,99,227,193,227,31,228,125,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,79,97,80,78,81,174,82,255,83,142,85,170,86,219,87,207,88,250,89,249,90,43,92,78,93,79,94,127,95,217,96,219,97,63,99,114,100,122,101,166,102,215,103,3,105,2,106,225,106,222,107,68,109,123,110,144,111,103,112,124,113,113,114,11,48,142,36,23,255,87,48,183,48,168,3,37,4,218,1,19,37,22,224,116,224,210,224,48,225,142,225,236,225,250,128,200,114,92,83,164,100,118,99,99,99,151,101,41,141,28,150,215,114,141,96,175,115,36,99,18,105,201,117,224,124,106,90,195,126,239,141,133,104,198,89,39,107,193,84,32,107,110,120,94,113,242,83,20,103,45,140,52,89,79,117,15,98,249,135,10,144,243,102,195,129,209,130,151,143,64,87,253,143,228,128,220,79,220,139,47,145,138,130,152,131,185,133,251,83,190,85,177,92,37,89,244,96,94,109,184,91,35,90,246,126,186,116,137,105,52,101,85,101,198,101,248,119,88,127,19,149,49,158,121,122,141,134,19,136,52,130,180,145,135,159,163,151,74,226,168,226,6,227,100,227,194,227,32,228,126,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,79,98,80,79,81,175,82,0,84,144,85,171,86,220,87,208,88,252,89,250,90,45,92,79,93,80,94,131,95,219,96,220,97,64,99,115,100,123,101,169,102,219,103,4,105,3,106,226,106,223,107,73,109,124,110,145,111,104,112,126,113,115,114,12,48,143,36,24,255,88,48,184,48,169,3,38,4,220,1,20,37,23,224,117,224,211,224,49,225,143,225,237,225,72,104,7,89,250,84,163,99,36,149,72,142,97,150,175,114,54,114,162,87,10,113,83,104,224,81,1,121,86,151,91,98,15,104,174,124,66,141,118,145,205,107,37,158,88,128,73,107,192,150,91,123,226,119,193,112,8,140,15,144,195,128,198,126,200,97,197,143,75,129,200,117,63,97,45,93,7,99,88,141,151,153,209,79,223,139,57,145,168,130,158,131,183,133,18,84,148,85,163,92,231,152,0,97,147,109,47,117,19,90,250,126,234,151,102,105,238,101,107,101,196,101,0,120,97,127,20,149,54,158,128,122,139,134,254,135,62,130,186,145,136,159,178,151,75,226,169,226,7,227,101,227,195,227,33,228,127,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,79,99,80,80,81,176,82,2,84,146,85,172,86,222,87,210,88,253,89,251,90,46,92,80,93,81,94,134,95,222,96,221,97,65,99,116,100,124,101,170,102,223,103,6,105,4,106,227,106,224,107,76,109,125,110,146,111,105,112,127,113,116,114,13,48,144,36,25,255,89,48,185,48,133,231,39,4,252,0,21,37,24,224,118,224,212,224,50,225,144,225,238,225,174,128,235,96,101,136,123,95,130,87,18,80,70,140,109,153,121,129,132,103,87,108,216,143,10,129,38,113,223,122,151,98,230,98,201,81,127,158,9,151,147,88,180,107,82,78,170,103,217,136,82,102,127,79,175,101,102,87,248,81,130,85,142,119,196,108,139,83,28,89,184,94,40,96,85,92,98,107,96,87,211,107,223,79,224,139,67,145,132,130,168,131,176,133,22,84,153,85,193,92,36,89,14,97,148,109,158,154,64,90,251,126,235,151,99,105,239,101,77,114,195,101,9,120,95,127,21,149,56,158,134,122,172,134,10,136,68,130,85,140,137,159,180,151,76,226,170,226,8,227,102,227,196,227,34,228,128,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,79,100,80,82,81,180,82,5,84,147,85,173,86,225,87,211,88,254,89,252,90,47,92,81,93,82,94,141,95,225,96,222,97,68,99,117,100,125,101,171,102,225,103,7,105,5,106,228,106,226,107,80,109,128,110,147,111,106,112,128,113,118,114,14,48,145,36,26,255,90,48,186,48,134,231,40,4,234,0,22,37,25,224,119,224,213,224,51,225,145,225,239,225,2,102,25,113,224,87,136,111,37,102,155,92,23,144,219,108,31,141,45,141,73,108,19,127,241,93,246,128,222,122,162,78,238,123,129,104,94,111,100,113,174,102,213,133,106,87,91,84,164,127,202,115,78,92,149,100,239,107,195,121,79,155,126,134,251,108,188,98,178,109,205,150,98,150,56,134,190,141,0,127,126,119,248,79,228,139,70,145,142,130,186,131,211,133,6,84,234,85,183,92,2,89,43,97,92,109,52,100,103,90,254,126,236,151,121,105,240,101,82,114,204,101,23,120,72,138,22,149,55,158,136,122,157,134,27,136,73,130,126,158,138,159,177,154,77,226,171,226,9,227,103,227,197,227,35,228,129,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,79,102,80,83,81,181,82,7,84,149,85,174,86,226,87,212,88,0,90,253,90,48,92,82,93,83,94,142,95,226,96,223,97,71,99,118,100,126,101,172,102,227,103,8,105,6,106,229,106,227,107,85,109,129,110,148,111,110,112,129,113,119,114,15,48,146,36,27,255,91,48,187,48,135,231,41,4,81,2,23,37,26,224,120,224,214,224,52,225,146,225,240,225,206,118,171,136,13,78,244,144,63,105,119,121,216,117,74,87,204,91,31,89,47,89,98,99,223,132,164,78,192,81,149,112,17,150,177,124,132,121,161,108,85,94,85,84,249,130,84,129,54,113,235,130,118,154,54,86,146,136,129,122,77,79,35,83,34,140,38,158,0,78,10,142,240,102,8,104,234,83,6,140,23,159,41,80,232,139,13,82,145,130,188,131,193,133,75,84,247,85,196,92,99,153,74,97,96,109,228,91,74,90,1,127,76,103,155,105,10,102,86,114,206,101,24,120,104,127,24,149,57,158,149,122,167,134,33,136,75,130,184,141,140,159,176,154,78,226,172,226,10,227,104,227,198,227,36,228,130,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,79,103,80,87,81,182,82,11,84,150,85,176,86,227,87,214,88,2,90,254,90,50,92,83,93,86,94,143,95,227,96,224,97,72,99,119,100,127,101,173,102,228,103,9,105,7,106,230,106,228,107,86,109,130,110,149,111,113,112,130,113,120,114,22,48,147,36,28,255,92,48,188,48,136,231,42,4,199,231,24,37,27,224,121,224,215,224,53,225,147,225,241,225,249,81,84,89,3,94,227,129,135,145,252,91,253,144,179,130,163,139,156,143,109,103,163,96,128,98,202,144,175,112,3,128,112,81,111,130,85,95,9,119,223,82,118,80,13,132,140,127,195,113,73,103,203,89,29,96,179,120,254,86,45,110,30,151,81,92,45,158,249,88,249,134,166,126,96,83,232,101,198,81,54,78,76,80,233,139,66,89,151,130,193,131,220,133,82,84,201,85,210,92,103,153,117,97,124,109,238,91,85,90,2,127,83,103,167,105,25,102,48,114,210,101,17,120,116,127,27,149,58,158,166,122,163,134,57,136,79,130,235,141,254,158,183,154,79,226,173,226,11,227,105,227,199,227,37,228,131,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,79,104,80,88,81,183,82,20,84,151,85,177,86,229,87,215,88,10,90,255,90,51,92,84,93,87,94,145,95,228,96,225,97,74,99,123,100,128,101,175,102,230,103,10,105,8,106,231,106,229,107,87,109,132,110,150,111,114,112,131,113,123,114,23,48,148,36,29,255,93,48,189,48,137,231,43,4,68,1,25,37,28,224,122,224,216,224,54,225,148,225,242,225,86,101,239,130,101,107,176,143,7,85,48,82,99,119,185,101,68,150,199,131,42,130,36,85,128,81,71,109,152,122,247,98,156,111,36,78,70,150,146,90,85,97,164,108,115,94,153,88,137,81,113,92,15,95,193,121,162,99,146,95,19,140,150,143,170,133,64,84,59,83,143,84,138,141,24,98,184,126,73,99,159,78,243,79,238,139,162,82,153,130,1,132,255,133,83,84,31,86,228,92,104,153,172,97,99,109,48,137,60,90,3,127,94,103,187,105,114,103,98,134,214,101,171,101,113,127,29,149,62,158,160,122,170,134,60,136,90,130,5,142,11,159,88,158,80,226,174,226,12,227,106,227,200,227,38,228,132,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,79,105,80,89,81,184,82,24,84,154,85,178,86,230,87,216,88,11,90,0,91,53,92,85,93,88,94,147,95,229,96,226,97,81,99,124,100,129,101,176,102,231,103,12,105,9,106,232,106,230,107,88,109,135,110,151,111,115,112,133,113,124,114,16,48,149,36,30,255,94,48,190,48,138,231,44,4,72,1,26,37,29,224,123,224,217,224,55,225,149,225,243,225,172,113,44,103,63,124,24,92,243,109,59,122,210,107,170,128,135,89,149,84,213,88,234,117,99,91,132,154,234,99,228,112,48,140,134,143,46,98,65,149,40,103,106,85,237,81,55,133,211,103,32,82,58,121,248,83,249,83,20,144,9,92,135,102,175,130,43,78,214,99,243,108,195,141,217,122,215,95,217,98,16,159,44,80,240,139,172,82,171,130,229,131,39,134,84,84,209,85,203,92,105,153,148,97,26,110,240,91,98,90,7,127,72,103,171,105,3,102,22,82,128,112,45,120,121,127,30,149,65,158,172,122,147,134,54,127,95,130,89,142,13,159,182,154,81,226,175,226,13,227,107,227,201,227,39,228,133,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,79,106,80,91,81,185,82,25,84,155,85,179,86,231,87,217,88,13,90,1,91,54,92,86,93,89,94,148,95,234,96,227,97,82,99,125,100,130,101,177,102,232,103,15,105,11,106,233,106,231,107,91,109,136,110,152,111,116,112,134,113,125,114,17,48,150,36,31,255,95,48,191,48,139,231,45,4,200,231,27,37,30,224,124,224,218,224,56,225,150,225,244,225,241,127,40,123,232,144,104,102,175,126,188,96,138,114,63,98,26,127,141,123,142,86,98,140,14,79,7,90,118,122,96,151,253,99,207,145,116,154,207,107,238,118,180,141,246,116,58,95,228,116,125,113,235,88,29,78,173,112,130,109,112,97,225,92,12,149,189,130,241,148,140,109,165,148,91,110,26,99,83,83,92,78,15,80,243,139,173,82,184,130,216,131,5,134,86,84,235,85,229,92,106,153,167,97,199,109,71,142,117,90,8,127,105,103,173,105,21,102,159,128,156,112,28,120,129,127,31,149,66,158,168,122,169,134,66,127,104,130,105,142,185,150,186,154,82,226,176,226,14,227,108,227,202,227,40,228,134,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,79,107,80,93,81,186,82,26,84,158,85,180,86,232,87,218,88,14,90,2,91,55,92,87,93,90,94,150,95,241,96,228,97,83,99,126,100,131,101,178,102,234,103,17,105,12,106,234,106,232,107,93,109,138,110,153,111,119,112,135,113,130,114,177,0,151,36,32,255,96,48,192,48,140,231,46,4,97,2,28,37,31,224,125,224,219,224,57,225,151,225,245,225,132,136,41,93,22,96,241,95,34,136,83,144,236,114,50,150,144,84,48,79,106,140,21,113,109,121,188,86,160,126,119,87,200,137,126,102,21,84,142,127,102,119,44,114,196,139,162,98,228,88,107,136,22,78,123,107,100,108,96,92,107,83,160,79,35,107,89,114,157,79,56,108,179,92,253,126,183,99,76,104,105,78,46,80,246,139,190,82,190,130,7,88,41,134,67,84,236,85,2,93,107,153,183,97,197,109,7,139,236,128,11,127,165,103,212,105,0,102,156,128,150,112,29,120,126,127,34,149,68,158,173,122,182,134,68,127,126,136,181,141,188,150,188,154,83,226,177,226,15,227,109,227,203,227,41,228,135,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,79,109,80,94,81,187,82,28,84,160,85,181,86,233,87,219,88,15,90,3,91,67,92,89,93,92,94,154,95,242,96,229,97,84,99,127,100,132,101,179,102,235,103,19,105,13,106,235,106,233,107,95,109,139,110,154,111,121,112,136,113,131,114,215,0,152,36,33,255,97,48,193,48,177,3,47,4,201,231,29,37,32,224,126,224,220,224,58,225,152,225,246,225,178,80,247,126,230,100,137,108,51,98,215,118,251,139,168,89,118,86,189,108,235,107,163,109,66,82,5,100,150,115,219,130,210,97,174,78,221,148,39,102,103,114,21,94,79,92,71,106,24,101,234,149,255,103,134,128,88,88,31,87,31,118,237,114,155,143,156,134,10,79,127,96,164,124,31,106,243,129,34,116,147,78,45,80,249,139,255,84,176,130,24,132,22,134,33,84,212,85,3,93,108,153,212,97,222,109,182,143,170,90,12,127,135,103,177,105,133,112,147,128,157,112,57,120,205,118,42,149,70,158,179,122,196,134,69,127,133,136,191,141,189,150,193,154,84,226,178,226,16,227,110,227,204,227,42,228,136,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,79,110,80,95,81,188,82,34,84,161,85,182,86,234,87,220,88,16,90,4,91,68,92,90,93,93,94,155,95,245,96,231,97,86,99,128,100,133,101,181,102,237,103,20,105,14,106,236,106,236,107,97,109,140,110,155,111,122,112,137,113,133,114,247,0,153,36,34,255,98,48,194,48,178,3,160,231,202,231,30,37,33,224,127,224,221,224,59,225,153,225,247,225,101,89,45,117,28,115,72,150,240,126,183,95,53,88,255,78,14,86,100,91,221,144,166,91,184,96,240,148,237,151,239,103,6,127,5,140,163,79,208,91,70,122,21,96,97,87,57,149,183,86,85,150,139,78,250,91,42,100,16,84,41,110,11,78,176,101,22,93,99,136,199,82,8,103,224,122,244,129,1,131,136,130,254,79,252,139,208,82,200,130,11,132,60,134,87,84,230,85,39,93,116,153,245,97,14,110,211,143,155,90,15,127,106,103,193,105,247,102,188,128,187,112,58,120,229,118,43,149,71,158,100,136,181,134,16,130,136,136,188,141,206,150,192,154,85,226,179,226,17,227,111,227,205,227,43,228,137,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,79,111,80,96,81,189,82,36,84,162,85,184,86,235,87,221,88,18,90,5,91,70,92,92,93,95,94,157,95,247,96,232,97,87,99,129,100,134,101,182,102,238,103,21,105,15,106,237,106,237,107,98,109,141,110,157,111,123,112,139,113,134,114,54,34,154,36,35,255,99,48,195,48,179,3,161,231,203,231,31,37,34,224,128,224,222,224,60,225,154,225,248,225,202,97,245,108,193,136,129,141,181,117,151,95,121,119,191,139,229,139,209,89,125,89,123,94,78,109,235,119,69,78,245,104,194,112,169,100,197,101,185,89,255,98,54,116,252,108,114,101,169,139,197,100,237,98,227,85,2,88,84,81,138,134,166,83,251,95,89,136,144,152,40,117,166,96,112,95,110,127,76,145,91,91,28,80,255,139,214,82,202,130,221,131,254,94,89,84,221,85,38,93,119,153,221,95,191,109,213,143,119,90,17,127,115,103,202,105,29,102,10,103,192,112,59,120,50,136,41,149,72,158,105,136,206,134,250,122,216,136,186,141,210,150,197,154,86,226,180,226,18,227,112,227,206,227,44,228,138,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,79,112,80,97,81,192,82,37,84,163,85,185,86,236,87,222,88,20,90,6,91,71,92,94,93,96,94,158,95,248,96,233,97,88,99,131,100,136,101,183,102,242,103,22,105,16,106,238,106,238,107,100,109,142,110,158,111,125,112,140,113,135,114,39,34,155,36,36,255,100,48,196,48,180,3,162,231,204,231,32,37,35,224,129,224,223,224,61,225,155,225,249,225,179,111,102,142,80,103,108,136,40,131,132,118,76,141,186,126,57,101,19,159,23,128,82,131,196,91,165,79,120,112,213,120,229,110,74,128,101,92,154,90,234,84,205,98,135,152,132,96,118,153,97,141,147,138,219,86,224,104,77,110,135,101,15,89,195,95,175,109,55,89,125,94,5,150,51,111,28,94,68,85,108,85,12,80,0,140,240,82,227,130,253,131,8,95,35,84,196,85,46,93,125,153,179,150,224,109,229,143,122,90,18,127,152,103,223,105,52,102,189,128,183,112,31,120,133,148,44,149,73,158,114,136,176,134,253,122,223,136,196,141,191,119,194,154,87,226,181,226,19,227,113,227,207,227,45,228,139,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,79,113,80,99,81,193,82,42,84,164,85,186,86,238,87,223,88,21,90,7,91,76,92,95,93,99,94,159,95,251,96,234,97,89,99,134,100,137,101,184,102,245,103,23,105,17,106,239,106,240,107,101,109,145,110,159,111,129,112,141,113,136,114,40,34,116,36,37,255,101,48,197,48,181,3,163,231,5,49,33,37,36,224,130,224,224,224,62,225,156,225,250,225,173,130,248,143,77,98,145,100,193,120,108,142,92,103,62,101,130,105,228,83,247,83,76,97,194,91,26,129,93,78,151,152,5,116,218,80,97,92,232,149,80,84,146,99,70,90,101,104,112,98,179,129,29,144,58,79,155,129,226,86,251,149,19,84,225,79,197,150,87,144,24,79,24,128,32,95,217,92,64,119,15,86,37,80,2,140,223,83,152,130,214,131,60,89,50,84,239,85,36,93,128,153,233,149,17,110,238,143,190,90,23,127,167,103,149,105,49,102,177,128,171,112,60,120,134,148,49,149,75,158,125,136,186,134,8,123,94,137,214,141,224,150,203,154,88,226,182,226,20,227,114,227,208,227,46,228,140,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,79,114,80,100,81,194,82,48,84,165,85,187,86,240,87,224,88,22,90,8,91,77,92,96,93,100,94,160,95,252,96,235,97,90,99,136,100,138,101,186,102,246,103,24,105,18,106,240,106,241,107,103,109,146,110,160,111,130,112,142,113,137,114,17,34,117,36,38,255,102,48,198,48,182,3,164,231,6,49,34,37,37,224,131,224,225,224,63,225,157,225,251,225,76,99,60,144,34,141,240,121,204,150,111,112,64,149,242,131,153,148,202,134,105,109,196,158,161,139,225,114,82,145,209,121,148,105,151,117,21,127,247,149,160,148,76,114,52,120,167,119,213,126,132,85,191,82,60,79,16,85,168,99,185,126,128,99,69,136,209,84,251,121,160,96,145,78,140,99,54,82,124,112,196,78,40,80,4,140,238,113,183,130,28,132,65,89,130,84,229,85,30,93,132,153,235,149,230,109,228,143,235,90,25,127,117,103,224,105,54,102,171,128,177,112,37,120,135,148,50,149,76,158,127,136,177,134,3,123,157,127,215,141,142,146,204,154,89,226,183,226,21,227,115,227,209,227,47,228,141,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,57,79,115,80,102,81,196,82,51,84,166,85,189,86,241,87,225,88,23,90,10,91,82,92,97,93,101,94,162,95,253,96,236,97,91,99,137,100,141,101,187,102,247,103,25,105,19,106,241,106,242,107,104,109,147,110,162,111,131,112,144,113,140,114,15,34,118,36,39,255,103,48,199,48,183,3,165,231,7,49,35,37,38,224,132,224,226,224,64,225,158,225,252,225,82,98,59,159,108,119,206,87,158,143,123,118,154,128,94,151,214,118,168,154,117,84,250,120,176,139,210,137,169,83,243,88,252,114,206,113,81,134,236,78,163,144,152,95,68,155,84,78,249,96,85,108,47,102,114,153,214,124,147,152,59,84,40,149,31,102,154,78,234,78,231,95,231,144,168,109,122,102,74,109,141,83,126,80,7,140,205,119,174,130,56,132,55,128,148,84,242,85,6,93,135,153,241,149,221,109,233,143,178,90,28,127,168,103,141,105,53,102,173,128,232,112,44,120,139,148,52,149,78,158,130,136,175,134,4,123,159,127,218,141,174,146,209,154,90,226,184,226,22,227,116,227,210,227,48,228,142,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,79,116,80,103,81,197,82,54,84,168,85,190,86,242,87,226,88,25,90,11,91,83,92,98,93,102,94,163,95,254,96,237,97,92,99,138,100,142,101,188,102,248,103,26,105,20,106,242,106,244,107,107,109,148,110,163,111,132,112,145,113,142,114,42,34,119,36,40,255,104,48,200,48,184,3,166,231,8,49,36,37,39,224,133,224,227,224,65,225,159,225,253,225,237,83,212,107,41,142,89,106,72,97,73,123,166,94,97,85,137,110,55,140,157,85,87,135,226,101,122,153,81,101,179,84,202,94,229,91,47,108,12,132,28,90,67,110,235,143,168,79,237,112,71,98,220,85,243,93,24,80,127,129,51,122,72,81,101,129,182,139,240,128,36,92,0,83,86,103,233,121,121,81,157,83,67,80,12,140,244,94,203,130,17,132,85,89,119,84,243,85,27,93,138,153,243,149,217,109,230,143,210,90,27,127,158,103,255,105,6,128,180,128,202,112,35,120,138,148,54,149,81,158,162,136,201,134,21,123,167,127,222,141,200,146,69,155,91,226,185,226,23,227,117,227,211,227,49,228,143,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,79,117,80,105,81,198,82,55,84,169,85,191,86,243,87,227,88,26,90,12,91,84,92,99,93,103,94,164,95,255,96,238,97,93,99,139,100,143,101,189,102,249,103,27,105,21,106,243,106,246,107,108,109,149,110,164,111,134,112,146,113,144,114,41,34,120,36,41,255,105,48,201,48,185,3,167,231,9,49,37,37,40,224,134,224,228,224,66,225,160,225,254,225,39,84,25,145,199,145,16,98,247,116,170,119,33,110,222,152,114,94,161,128,119,131,39,124,204,95,52,127,231,101,239,83,206,144,189,143,139,95,153,132,179,126,62,109,149,124,231,93,236,88,46,127,108,86,126,103,186,142,21,135,10,125,217,78,41,115,9,113,145,117,49,117,104,150,8,78,26,122,168,84,163,83,85,80,15,140,245,81,204,130,6,132,90,89,113,84,204,85,88,93,141,153,245,149,22,110,243,143,212,90,31,127,173,103,47,106,95,102,183,128,16,113,41,120,140,148,55,149,85,158,198,136,207,134,10,123,175,127,206,141,62,147,67,155,92,226,186,226,24,227,118,227,212,227,50,228,144,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,79,120,80,106,81,200,82,58,84,170,85,192,86,245,87,229,88,27,90,13,91,86,92,100,93,104,94,165,95,2,97,239,97,96,99,140,100,146,101,191,102,250,103,28,105,22,106,244,106,247,107,109,109,150,110,165,111,135,112,147,113,145,114,8,34,121,36,42,255,106,48,202,48,186,3,168,231,10,49,38,37,41,224,135,224,229,224,67,225,161,225,255,225,6,123,20,123,105,95,72,84,205,139,243,81,146,89,165,128,24,117,69,101,207,131,135,118,69,150,222,126,252,129,52,110,23,103,102,111,135,115,172,106,22,108,0,101,86,82,152,151,193,78,146,88,2,144,56,128,204,109,42,137,238,149,156,156,250,96,189,84,130,108,174,144,65,81,16,94,40,141,68,141,165,83,72,80,17,140,252,81,193,130,212,131,88,89,100,84,205,85,62,93,144,153,246,149,171,109,232,143,184,90,33,127,139,103,237,105,84,102,231,128,19,113,78,120,141,148,56,149,87,158,183,136,180,134,43,123,176,127,207,141,106,147,71,155,93,226,187,226,25,227,119,227,213,227,51,228,145,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,79,121,80,111,81,202,82,61,84,171,85,193,86,246,87,230,88,29,90,14,91,87,92,101,93,105,94,166,95,3,97,240,97,100,99,141,100,148,101,192,102,251,103,29,105,25,106,245,106,248,107,112,109,151,110,166,111,136,112,149,113,147,114,55,34,122,36,43,255,107,48,203,48,187,3,169,231,11,49,39,37,42,224,136,224,230,224,68,225,162,225,0,226,107,81,124,95,220,131,88,78,100,107,147,144,239,122,42,83,70,103,126,152,56,104,240,81,147,89,127,82,5,130,75,81,106,109,134,78,228,110,223,118,67,78,88,111,81,98,172,100,186,78,36,79,213,78,2,96,159,141,0,144,225,85,164,126,116,81,9,150,156,91,192,148,208,143,38,141,153,112,255,89,174,83,78,80,18,140,47,155,169,130,223,131,15,83,154,84,232,85,52,93,145,153,252,149,12,110,5,144,224,90,34,127,119,103,23,106,65,102,232,128,22,113,109,120,143,148,60,149,90,158,188,136,233,134,15,123,178,127,219,141,202,147,73,155,94,226,188,226,26,227,120,227,214,227,52,228,146,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,79,122,80,114,81,204,82,63,84,172,85,194,86,247,87,231,88,30,90,15,91,88,92,102,93,106,94,167,95,4,97,241,97,101,99,142,100,149,101,193,102,252,103,30,105,26,106,246,106,250,107,113,109,153,110,168,111,139,112,150,113,148,114,26,34,123,36,44,255,108,48,204,48,188,3,170,231,12,49,40,37,43,224,137,224,231,224,69,225,163,225,1,226,164,117,167,120,33,133,11,122,58,82,36,88,237,119,253,139,209,103,250,86,190,121,246,96,231,126,89,101,142,84,59,82,94,99,130,100,255,126,48,149,118,89,216,118,250,148,216,127,205,95,70,85,141,79,130,152,235,112,30,84,193,127,184,84,17,82,223,112,232,89,185,114,116,133,215,78,212,117,203,110,101,151,108,80,20,140,182,83,180,130,15,132,34,92,155,84,245,85,61,93,147,153,254,149,174,109,4,144,227,90,35,127,124,103,24,106,79,102,233,128,47,113,86,120,144,148,62,149,91,158,201,136,241,134,71,123,124,124,198,141,143,147,72,155,95,226,189,226,27,227,121,227,215,227,53,228,147,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,79,124,80,122,81,205,82,65,84,173,85,195,86,251,87,232,88,33,90,16,91,90,92,103,93,107,94,169,95,5,97,242,97,102,99,143,100,150,101,194,102,254,103,33,105,27,106,247,106,251,107,114,109,154,110,169,111,140,112,151,113,149,114,165,34,124,36,45,255,109,48,205,48,189,3,171,231,13,49,41,37,44,224,138,224,232,224,70,225,164,225,2,226,244,93,214,132,16,153,233,96,80,141,78,79,59,149,32,84,255,122,199,150,140,84,76,113,170,126,117,145,49,92,162,91,179,82,99,149,230,92,27,115,16,128,208,120,198,78,237,92,231,151,79,141,202,145,1,144,143,99,111,92,238,116,36,141,139,87,249,109,93,95,185,108,93,145,192,128,222,110,196,109,93,141,123,80,21,140,1,95,161,130,3,132,37,92,132,84,228,85,108,93,148,153,3,150,43,110,11,144,241,90,36,127,240,103,101,106,86,102,234,128,49,113,87,120,148,148,63,149,92,158,226,136,242,134,56,123,73,101,236,141,62,148,77,155,96,226,190,226,28,227,122,227,216,227,54,228,148,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,79,125,80,126,81,206,82,66,84,174,85,196,86,252,87,233,88,34,90,17,91,91,92,104,93,108,94,171,95,7,97,243,97,104,99,144,100,152,101,195,102,1,104,34,105,28,106,248,106,252,107,115,109,155,110,170,111,141,112,154,113,150,114,37,34,125,36,46,255,110,48,206,48,190,3,172,231,14,49,42,37,45,224,139,224,233,224,71,225,165,225,3,226,212,98,61,133,194,83,132,111,33,107,244,110,181,107,186,128,157,128,46,82,85,79,67,102,9,86,127,143,154,117,254,139,98,114,214,94,27,99,166,104,72,89,252,118,134,131,207,79,251,78,76,102,112,153,139,91,155,109,192,129,29,99,84,136,98,95,208,118,5,105,56,110,85,102,52,118,187,108,92,91,26,83,165,80,22,140,90,117,170,130,248,131,44,92,118,84,148,143,91,93,149,153,4,150,110,110,38,144,214,90,37,127,9,104,242,105,97,102,219,128,115,113,38,120,151,148,66,149,94,158,206,136,237,134,42,123,145,124,247,141,107,148,81,155,97,226,191,226,29,227,123,227,217,227,55,228,149,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,79,129,80,127,81,207,82,68,84,175,85,197,86,254,87,234,88,36,90,18,91,92,92,106,93,109,94,172,95,10,97,244,97,106,99,147,100,154,101,196,102,2,104,35,105,29,106,249,106,254,107,117,109,157,110,171,111,143,112,155,113,151,114,32,34,126,36,47,255,111,48,207,48,191,3,173,231,15,49,43,37,46,224,140,224,234,224,72,225,166,225,4,226,203,141,213,107,149,134,218,139,106,128,234,143,173,101,159,94,118,141,220,116,8,84,76,94,183,103,131,143,160,151,175,128,1,128,153,101,106,91,95,91,87,83,84,117,97,132,141,122,164,139,10,78,15,108,188,139,212,110,214,98,23,135,55,130,162,144,37,78,129,134,73,145,245,151,156,150,146,122,43,125,245,83,167,80,25,140,239,93,159,130,249,131,52,92,102,84,30,86,111,93,128,94,6,150,78,110,17,144,230,90,38,127,216,103,68,106,87,102,194,128,92,113,80,120,149,148,53,149,99,158,227,136,243,134,25,123,157,124,248,141,127,156,232,152,98,226,192,226,30,227,124,227,218,227,56,228,150,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,79,130,80,131,81,209,82,69,84,176,85,198,86,255,87,237,88,38,90,19,91,93,92,109,93,110,94,175,95,11,97,246,97,107,99,148,100,157,101,197,102,3,104,37,105,30,106,250,106,255,107,118,109,158,110,172,111,144,112,156,113,152,114,18,35,127,36,48,255,112,48,208,48,192,3,174,231,16,49,44,37,47,224,141,224,235,224,73,225,167,225,5,226,118,151,217,107,139,107,127,98,113,132,76,101,14,127,184,108,31,97,80,82,210,118,77,96,57,89,235,83,216,98,67,85,108,79,23,82,230,110,47,119,55,117,36,82,233,131,7,82,3,82,26,92,2,94,245,139,230,126,88,98,161,109,242,149,76,136,20,120,26,80,9,103,85,91,219,98,45,78,212,78,38,83,169,80,27,140,76,87,196,130,234,131,76,98,157,84,8,86,93,93,145,94,8,150,107,110,13,144,216,90,39,127,10,104,62,106,119,102,196,128,104,113,71,120,154,148,68,149,102,158,229,136,208,134,46,123,156,124,227,141,130,156,13,153,99,226,193,226,31,227,125,227,219,227,57,228,151,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,79,131,80,132,81,211,82,71,84,178,85,199,86,1,88,239,88,39,90,20,91,95,92,110,93,111,94,176,95,12,97,247,97,108,99,151,100,158,101,198,102,4,104,38,105,32,106,251,106,0,108,121,109,160,110,173,111,145,112,157,113,153,114,153,34,128,36,49,255,113,48,209,48,193,3,48,4,17,49,45,37,48,224,142,224,236,224,74,225,168,225,6,226,138,98,214,107,237,96,30,144,241,86,27,123,6,88,57,141,198,121,225,91,137,140,14,140,115,79,150,122,217,114,166,87,229,89,194,136,117,83,154,145,190,150,219,83,178,132,4,131,138,89,243,136,67,96,28,100,4,132,49,129,157,122,142,109,146,145,18,135,242,93,203,83,29,83,45,102,197,118,125,124,46,83,186,80,24,140,169,87,206,130,197,131,106,98,208,84,12,86,107,93,139,94,10,150,178,110,22,144,220,90,42,127,233,103,160,106,132,102,217,128,69,113,76,120,155,148,69,149,103,158,241,136,19,135,49,123,158,124,249,141,133,156,46,153,100,226,194,226,32,227,126,227,220,227,58,228,152,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,79,132,80,134,81,212,82,73,84,180,85,200,86,3,88,241,88,40,90,21,91,98,92,112,93,112,94,177,95,16,97,248,97,111,99,152,100,160,101,199,102,6,104,39,105,34,106,252,106,1,108,122,109,161,110,174,111,147,112,158,113,154,114,43,34,129,36,50,255,114,48,210,48,195,3,49,4,18,49,46,37,49,224,143,224,237,224,75,225,169,225,7,226,25,128,1,94,232,96,139,154,6,83,196,114,81,81,172,130,98,101,2,99,2,150,112,112,182,91,237,99,189,117,115,96,106,145,200,112,113,78,97,151,202,86,83,78,212,87,20,78,171,126,162,104,164,91,88,130,67,104,53,158,17,98,38,95,120,94,169,92,89,78,243,83,56,120,126,98,224,95,211,110,62,83,214,80,29,140,161,87,164,130,192,131,159,98,173,84,1,86,75,93,150,94,11,150,95,110,33,144,9,91,43,127,176,103,80,106,140,102,205,128,114,113,106,120,156,148,70,149,104,158,26,137,222,134,32,123,162,124,251,141,134,156,85,153,101,226,195,226,33,227,127,227,221,227,59,228,153,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,79,134,80,135,81,213,82,76,84,182,85,201,86,4,88,242,88,42,90,24,91,100,92,113,93,113,94,178,95,17,97,249,97,112,99,154,100,162,101,200,102,13,104,40,105,35,106,253,106,2,108,123,109,163,110,175,111,151,112,161,113,155,114,46,34,130,36,51,255,115,48,211,48,196,3,50,4,19,49,47,37,50,224,144,224,238,224,76,225,170,225,8,226,93,87,135,94,127,112,228,121,206,78,164,109,31,150,90,145,99,141,2,137,179,108,37,99,160,82,165,99,69,92,81,87,217,112,163,82,160,99,220,124,32,99,158,94,52,103,47,96,84,98,78,99,198,137,222,100,3,144,64,150,161,101,204,90,79,103,246,94,227,119,81,79,66,103,188,108,159,148,80,91,92,141,6,81,31,140,126,88,225,130,38,132,187,98,194,84,36,86,74,93,165,94,12,150,134,110,53,144,23,91,44,127,12,104,91,106,167,102,215,128,74,113,155,120,163,148,73,149,105,158,252,136,244,134,37,123,178,124,228,141,135,156,84,153,102,226,196,226,34,227,128,227,222,227,60,228,154,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,79,135,80,138,81,215,82,77,84,184,85,203,86,5,88,244,88,43,90,25,91,103,92,114,93,117,94,179,95,18,97,250,97,114,99,155,100,163,101,201,102,16,104,41,105,36,106,254,106,3,108,125,109,164,110,176,111,152,112,162,113,156,114,97,34,131,36,52,255,116,48,212,48,197,3,51,4,20,49,48,37,51,224,145,224,239,224,77,225,171,225,9,226,56,151,249,117,205,130,3,84,27,78,223,127,249,91,41,84,136,81,86,78,184,109,137,143,90,131,134,118,121,154,45,84,157,109,14,115,101,117,247,143,17,129,193,101,3,87,131,122,205,78,13,122,213,139,253,85,216,109,110,154,103,83,62,102,39,96,0,138,229,78,201,145,61,104,117,141,119,136,234,129,102,83,237,80,32,140,188,88,9,131,240,131,202,98,180,84,35,86,105,93,160,94,13,150,83,110,54,144,22,91,45,127,217,103,53,106,157,102,16,103,120,113,147,120,164,148,76,149,106,158,232,136,223,134,36,123,188,124,9,142,136,156,223,154,103,226,197,226,35,227,129,227,223,227,61,228,155,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,79,137,80,139,81,217,82,78,84,186,85,204,86,8,88,245,88,44,90,26,91,104,92,115,93,119,94,180,95,19,97,251,97,115,99,156,100,166,101,202,102,18,104,42,105,37,106,255,106,4,108,126,109,166,110,177,111,154,112,163,113,157,114,76,34,132,36,53,255,117,48,213,48,198,3,52,4,21,49,49,37,52,224,146,224,240,224,78,225,172,225,10,226,98,127,237,149,49,130,244,117,209,81,225,90,169,88,27,108,26,82,208,98,107,141,189,95,138,152,248,121,202,131,122,122,210,82,51,116,161,98,28,140,124,96,42,128,110,102,166,148,229,101,231,112,54,101,207,130,118,150,124,154,225,99,105,150,211,89,156,152,122,130,241,139,201,84,103,113,200,126,13,110,99,83,236,80,33,140,197,88,247,130,225,131,218,98,210,84,254,85,116,93,185,94,15,150,84,110,45,144,50,91,47,127,181,103,142,106,190,102,221,128,122,113,154,120,171,148,78,149,107,158,254,136,216,134,51,123,189,124,253,141,35,122,225,154,104,226,198,226,36,227,130,227,224,227,62,228,156,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,79,138,80,142,81,218,82,79,84,188,85,205,86,9,88,247,88,45,90,27,91,105,92,117,93,121,94,182,95,20,97,252,97,116,99,157,100,168,101,203,102,20,104,43,105,38,106,0,107,8,108,127,109,168,110,178,111,155,112,164,113,158,114,72,34,133,36,54,255,118,48,214,48,199,3,53,4,22,49,50,37,53,224,147,224,241,224,79,225,173,225,11,226,56,114,93,101,211,78,1,99,151,124,181,98,40,84,6,82,162,148,42,96,16,137,98,96,62,141,87,136,64,92,80,96,80,78,151,103,110,143,37,95,249,149,214,128,102,109,181,79,14,98,141,130,75,98,101,145,168,139,45,105,131,108,176,115,68,81,14,150,145,98,200,83,126,112,105,127,205,121,87,91,2,82,230,80,37,140,209,88,228,130,92,132,215,98,167,84,0,86,130,93,181,94,18,150,50,110,47,144,55,91,48,127,218,103,121,106,219,102,235,128,152,113,135,120,170,148,79,149,108,158,240,136,209,134,62,123,193,124,20,142,139,156,230,154,105,226,199,226,37,227,131,227,225,227,63,228,157,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,79,139,80,143,81,219,82,81,84,191,85,206,86,10,88,248,88,46,90,28,91,106,92,118,93,126,94,184,95,22,97,253,97,117,99,159,100,170,101,204,102,21,104,44,105,39,106,1,107,9,108,128,109,169,110,180,111,158,112,165,113,160,114,61,34,134,36,55,255,119,48,215,48,200,3,81,4,23,49,51,37,54,224,148,224,242,224,80,225,174,225,12,226,125,118,10,95,167,108,25,83,139,145,149,94,114,142,183,126,56,127,250,104,100,158,212,134,50,117,54,150,128,84,84,91,247,150,247,120,38,79,115,124,214,109,155,98,49,140,178,78,56,131,250,82,150,153,215,79,87,89,165,89,235,93,46,115,246,81,142,112,19,102,124,94,176,91,70,81,191,128,3,155,8,82,238,80,39,140,41,87,15,131,81,132,238,98,166,84,39,86,153,93,190,94,21,150,37,110,68,144,64,91,49,127,179,103,61,106,220,102,241,128,179,113,156,120,173,148,82,149,113,158,33,137,3,135,30,123,199,124,29,142,142,156,239,154,106,226,200,226,38,227,132,227,226,227,64,228,158,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,79,140,80,144,81,220,82,90,84,192,85,207,86,12,88,250,88,47,90,29,91,107,92,119,93,129,94,185,95,23,97,254,97,120,99,160,100,172,101,205,102,24,104,46,105,41,106,2,107,10,108,129,109,171,110,181,111,159,112,166,113,161,114,29,34,135,36,56,255,120,48,216,48,201,3,54,4,24,49,52,37,55,224,149,224,243,224,81,225,175,225,13,226,207,103,197,95,207,133,96,108,7,124,48,87,102,101,95,87,155,128,115,81,58,141,222,86,190,148,42,98,233,119,167,99,109,149,22,151,209,78,216,121,98,84,134,84,221,102,230,121,201,132,246,151,136,91,32,125,121,114,211,98,92,84,191,83,248,128,191,108,145,144,194,143,125,143,135,128,205,145,213,104,14,82,7,81,42,140,44,87,7,131,90,132,34,99,211,84,45,86,157,93,179,94,22,150,68,110,81,144,21,92,50,127,221,103,40,106,230,102,244,128,181,113,161,120,172,148,83,149,109,158,25,137,7,135,88,123,204,124,31,142,144,156,235,154,107,226,201,226,39,227,133,227,227,227,65,228,159,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,79,142,80,145,81,221,82,93,84,193,85,208,86,14,88,251,88,48,90,30,91,108,92,120,93,130,94,186,95,24,97,0,98,121,99,161,100,174,101,206,102,25,104,47,105,43,106,3,107,11,108,131,109,172,110,183,111,160,112,167,113,162,114,96,34,96,36,57,255,121,48,217,48,141,231,55,4,25,49,53,37,56,224,150,224,244,224,82,225,176,225,14,226,126,118,159,143,205,100,223,143,195,79,130,132,127,152,26,113,178,126,152,91,63,86,193,107,71,80,171,82,62,78,160,98,126,133,52,78,166,108,197,137,129,153,40,82,17,112,52,116,99,131,17,92,255,91,31,144,228,133,62,85,168,148,122,129,8,83,68,89,121,92,228,109,141,81,236,83,242,78,42,142,45,82,11,81,43,140,42,87,220,130,89,132,246,98,212,84,88,86,115,140,83,141,23,150,223,110,82,144,28,92,51,127,0,104,88,106,233,102,237,128,168,113,163,120,175,148,84,149,115,158,19,137,248,134,90,123,205,124,44,142,145,156,251,154,108,226,202,226,40,227,134,227,228,227,66,228,160,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,98,79,143,80,147,81,222,82,94,84,194,85,209,86,15,88,252,88,51,90,31,91,109,92,121,93,131,94,187,95,25,97,1,98,124,99,162,100,177,101,207,102,26,104,49,105,44,106,4,107,12,108,132,109,173,110,184,111,161,112,169,113,163,114,110,34,97,36,58,255,122,48,218,48,142,231,56,4,26,49,54,37,57,224,151,224,245,224,83,225,177,225,15,226,70,100,193,88,217,124,27,95,127,142,44,123,228,86,126,108,151,92,160,81,209,158,148,96,60,122,130,130,174,108,227,83,202,120,187,144,182,126,204,108,133,81,174,112,31,103,228,82,141,135,232,84,136,99,159,124,126,129,22,99,76,78,133,153,121,108,169,99,191,78,142,78,40,87,110,144,23,79,151,91,51,82,221,78,46,140,51,87,244,130,115,132,57,99,114,84,57,86,183,93,210,94,25,150,177,110,80,144,90,91,53,127,195,103,124,106,50,141,13,129,160,113,178,120,176,148,86,149,146,117,27,137,8,135,69,123,200,124,46,142,146,156,237,154,109,226,203,226,41,227,135,227,229,227,67,228,161,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,79,144,80,148,81,224,82,95,84,195,85,210,86,16,88,253,88,53,90,32,91,112,92,122,93,133,94,190,95,27,97,2,98,125,99,163,100,178,101,208,102,27,104,50,105,45,106,5,107,14,108,134,109,174,110,186,111,162,112,170,113,164,114,111,34,98,36,59,255,123,48,219,48,143,231,57,4,27,49,55,37,58,224,152,224,246,224,84,225,178,225,16,226,112,79,194,129,253,105,112,154,225,123,29,94,157,148,137,124,47,110,194,137,213,117,103,97,247,78,84,104,90,128,99,98,47,125,222,156,186,139,28,135,233,90,141,136,58,107,185,130,148,113,181,144,46,85,243,80,188,117,199,84,97,108,161,127,196,150,60,119,121,95,194,118,177,84,152,98,31,130,252,126,63,82,61,108,47,140,57,87,210,130,135,132,75,99,163,84,87,86,197,93,209,94,26,150,152,110,104,144,101,91,122,94,184,103,145,106,51,141,14,129,224,113,185,120,178,148,87,149,148,117,10,137,10,135,117,123,197,124,35,142,148,156,249,154,110,226,204,226,42,227,136,227,230,227,68,228,162,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,79,145,80,152,81,225,82,96,84,198,85,211,86,18,88,254,88,55,90,33,91,114,92,123,93,136,94,191,95,28,97,3,98,126,99,165,100,179,101,209,102,28,104,51,105,46,106,6,107,18,108,135,109,176,110,187,111,163,112,171,113,165,114,100,34,99,36,60,255,124,48,220,48,144,231,58,4,28,49,56,37,59,224,153,224,247,224,85,225,179,225,17,226,37,141,127,144,249,102,59,128,156,122,31,95,254,118,75,89,96,103,161,123,136,95,73,83,182,103,112,103,210,98,199,91,33,81,203,109,29,132,198,91,253,128,209,141,22,104,210,100,182,110,205,126,215,83,81,88,138,138,217,134,236,139,170,91,138,113,77,136,198,129,134,105,18,101,242,84,104,84,59,96,64,82,88,79,50,140,46,87,216,130,136,132,67,99,213,84,44,86,115,95,219,94,44,78,224,110,88,144,115,91,127,117,226,103,144,106,54,141,242,128,212,113,165,120,180,148,88,149,150,117,52,137,13,135,76,123,215,124,47,142,149,156,8,155,111,226,205,226,43,227,137,227,231,227,69,228,163,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,79,146,80,154,81,226,82,97,84,199,85,213,86,19,88,255,88,56,90,34,91,115,92,124,93,137,94,192,95,29,97,4,98,127,99,166,100,180,101,210,102,30,104,53,105,48,106,7,107,23,108,138,109,179,110,188,111,164,112,173,113,166,114,101,34,100,36,61,255,125,48,221,48,145,231,59,4,29,49,57,37,60,224,154,224,248,224,86,225,180,225,18,226,220,98,91,150,73,131,127,159,103,100,18,144,65,144,253,78,217,123,134,153,224,114,224,96,126,154,119,99,110,99,175,103,146,87,219,81,186,135,66,94,174,89,225,108,26,98,189,121,185,91,98,89,38,118,175,110,175,104,60,109,75,92,119,150,17,79,20,111,56,144,94,134,130,102,240,134,222,93,181,126,76,82,101,79,51,140,47,87,12,131,122,132,173,99,187,84,77,86,119,95,232,94,63,114,45,111,98,144,81,91,219,93,14,104,169,106,59,141,252,128,231,113,212,120,182,148,89,149,160,117,43,137,9,135,93,123,232,124,58,142,154,156,15,155,112,226,206,226,44,227,138,227,232,227,70,228,164,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,79,147,80,157,81,227,82,99,84,200,85,214,86,20,88,0,89,57,90,35,91,116,92,125,93,140,94,193,95,30,97,5,98,129,99,167,100,181,101,211,102,31,104,54,105,50,106,8,107,28,108,139,109,181,110,189,111,165,112,174,113,167,114,30,34,101,36,62,255,126,48,222,48,146,231,60,4,30,49,58,37,61,224,155,224,249,224,87,225,181,225,19,226,23,122,173,151,149,83,136,79,20,93,20,127,135,99,255,95,139,118,80,127,104,96,102,102,193,90,107,119,232,93,237,84,194,100,65,141,87,127,201,104,19,151,120,84,187,89,221,91,210,126,74,141,125,81,191,91,84,82,3,90,224,101,80,150,238,79,115,130,132,128,26,97,94,141,153,143,50,109,185,144,94,82,206,79,53,140,92,87,251,130,137,132,246,99,191,84,98,86,130,95,234,94,21,98,226,110,91,144,83,91,62,117,193,103,151,106,61,141,21,103,249,113,217,120,183,148,91,149,157,117,54,137,35,135,96,123,110,130,64,142,155,156,19,155,113,226,207,226,45,227,139,227,233,227,71,228,165,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,79,148,80,158,81,229,82,101,84,202,85,216,86,22,88,1,89,58,90,36,91,117,92,126,93,141,94,194,95,33,97,7,98,131,99,168,100,182,101,212,102,32,104,55,105,51,106,9,107,29,108,141,109,184,110,190,111,166,112,175,113,168,114,53,34,102,36,63,255,127,48,223,48,147,231,61,4,31,49,59,37,62,224,156,224,250,224,88,225,182,225,20,226,145,101,185,143,86,123,58,92,172,80,160,152,198,84,36,97,216,154,239,96,252,84,63,141,124,107,237,122,119,81,159,122,139,128,29,84,59,144,32,119,42,80,218,128,3,78,129,108,151,81,199,134,44,133,201,139,34,142,230,116,156,130,191,126,158,127,48,88,171,117,6,130,67,141,5,128,204,139,112,141,97,82,160,159,54,140,59,87,211,130,120,132,113,99,204,84,89,86,135,95,186,129,53,108,165,110,185,102,98,91,149,144,253,103,171,106,64,141,18,129,29,114,201,120,184,148,94,149,172,117,65,137,59,135,110,123,168,102,57,142,158,156,31,155,114,226,208,226,46,227,140,227,234,227,72,228,166,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,79,149,80,159,81,230,82,103,84,203,85,217,86,23,88,3,89,59,90,37,91,118,92,127,93,142,94,199,95,34,97,9,98,132,99,170,100,183,101,213,102,34,104,56,105,52,106,10,107,30,108,143,109,185,110,191,111,167,112,176,113,169,114,52,34,103,36,64,255,128,48,224,48,53,254,62,4,32,49,60,37,63,224,157,224,251,224,89,225,183,225,21,226,237,115,22,127,167,79,100,141,6,129,130,99,26,89,170,124,143,129,76,112,168,78,253,121,209,118,1,109,221,141,230,130,123,124,206,98,35,149,245,126,229,108,249,87,196,81,82,151,201,99,12,130,162,103,131,128,17,149,156,136,167,104,248,118,61,103,213,113,166,78,89,79,15,129,23,149,165,124,79,89,92,82,70,108,105,83,66,87,17,131,60,132,122,99,217,84,92,86,137,95,196,95,84,108,167,110,116,144,117,154,142,115,50,104,55,115,69,141,90,140,40,114,236,120,185,148,95,149,163,117,102,137,30,135,123,123,191,127,53,142,159,156,35,155,115,226,209,226,47,227,141,227,235,227,73,228,167,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,79,150,80,161,81,231,82,105,84,206,85,220,86,24,88,5,89,61,90,38,91,119,92,128,93,146,94,200,95,37,97,19,98,133,99,171,100,184,101,214,102,35,104,58,105,54,106,11,107,32,108,144,109,188,110,193,111,168,112,177,113,170,114,66,38,104,36,65,255,129,48,225,48,54,254,63,4,33,49,61,37,64,224,158,224,252,224,90,225,184,225,22,226,44,100,44,141,140,81,197,127,1,118,199,110,58,89,48,78,148,127,47,141,42,106,26,79,90,87,211,126,30,142,119,145,234,108,178,115,169,123,149,81,60,92,244,136,6,111,123,143,212,103,13,130,179,104,120,145,208,99,106,107,62,84,162,83,197,85,140,83,212,136,222,79,108,132,23,133,116,143,205,99,175,132,116,124,122,83,105,87,26,131,70,132,142,99,218,84,76,86,140,95,201,95,92,108,189,110,125,144,119,154,145,115,51,104,82,115,70,141,54,129,108,112,242,120,186,148,93,149,179,117,123,137,37,135,98,123,206,127,61,142,160,156,189,158,116,226,210,226,48,227,142,227,236,227,74,228,168,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,79,151,80,163,81,232,82,106,84,207,85,227,86,26,88,6,89,62,90,39,91,120,92,129,93,152,94,202,95,40,97,20,98,134,99,175,100,186,101,215,102,36,104,59,105,55,106,12,107,35,108,146,109,190,110,195,111,169,112,178,113,171,114,64,38,105,36,66,255,130,48,226,48,57,254,64,4,34,49,62,37,65,224,159,224,253,224,91,225,185,225,23,226,115,98,65,98,75,109,165,101,185,124,152,120,155,87,1,92,213,124,73,81,97,136,233,112,22,92,227,137,47,149,147,94,241,104,241,131,161,154,77,81,223,98,84,141,210,103,34,108,137,128,102,141,138,107,156,132,152,152,22,89,52,84,118,149,8,149,26,120,15,97,62,144,109,144,217,143,152,128,223,121,125,82,110,81,29,150,133,87,6,131,105,132,180,99,220,84,84,86,149,95,214,95,74,108,187,110,130,144,120,154,174,115,96,104,129,107,72,141,30,129,24,113,5,121,188,148,97,149,180,117,139,117,46,135,114,123,213,127,49,142,161,156,190,158,117,226,211,226,49,227,143,227,237,227,75,228,169,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,79,152,80,166,81,233,82,107,84,208,85,229,86,27,88,8,89,63,90,40,91,123,92,131,93,155,94,203,95,41,97,25,98,139,99,177,100,187,101,216,102,37,104,60,105,56,106,13,107,37,108,150,109,191,110,196,111,170,112,180,113,174,114,176,0,108,231,67,255,131,48,227,48,58,254,65,4,35,49,63,37,66,224,160,224,254,224,92,225,186,225,24,226,44,130,191,79,66,92,189,112,236,109,185,112,178,142,171,103,30,100,127,94,82,96,71,108,58,123,208,89,241,79,228,136,94,105,246,150,248,136,201,82,96,79,106,150,143,108,62,80,57,131,68,100,146,98,151,123,68,142,76,140,203,107,153,153,192,121,193,150,197,107,124,156,223,124,89,109,26,94,179,141,130,82,253,93,34,150,107,87,20,131,118,132,109,99,169,84,134,86,153,95,207,95,163,108,183,110,136,144,122,154,162,115,97,104,130,107,73,141,44,129,102,113,244,120,189,148,98,149,184,117,229,128,26,135,113,123,229,127,73,142,162,156,59,126,118,226,212,226,50,227,144,227,238,227,76,228,170,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,119,79,153,80,167,81,234,82,108,84,213,85,230,86,28,88,9,89,65,90,41,91,124,92,132,93,157,94,206,95,42,97,28,98,141,99,178,100,190,101,218,102,38,104,62,105,57,106,14,107,43,108,151,109,192,110,197,111,176,112,182,113,177,114,50,32,109,231,68,255,132,48,228,48,63,254,66,4,36,49,64,37,67,224,161,224,255,224,93,225,187,225,25,226,129,152,216,83,109,142,69,81,224,127,120,81,53,103,2,135,80,149,27,144,112,143,179,139,244,149,18,98,229,83,56,89,183,81,132,159,61,132,41,90,63,83,77,145,118,81,127,83,21,136,4,92,147,143,125,134,124,85,47,95,102,107,177,123,150,136,1,85,198,95,9,97,255,81,205,115,146,84,82,83,129,82,201,158,33,150,134,87,21,131,140,132,172,99,170,84,100,86,156,95,3,96,133,108,215,110,131,144,127,154,159,115,78,104,135,107,71,141,24,129,185,113,19,121,191,148,100,149,196,117,178,118,62,135,144,123,225,127,65,142,163,156,130,158,119,226,213,226,51,227,145,227,239,227,77,228,171,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,79,154,80,168,81,235,82,109,84,215,85,231,86,29,88,10,89,66,90,42,91,125,92,133,93,161,94,211,95,44,97,29,98,145,99,179,100,191,101,222,102,39,104,64,105,58,106,15,107,44,108,152,109,195,110,198,111,178,112,183,113,178,114,51,32,32,50,69,255,133,48,229,48,64,254,67,4,37,49,65,37,68,224,162,224,0,225,94,225,188,225,26,226,127,103,94,83,210,99,178,81,81,103,91,151,250,141,240,92,63,122,112,116,196,84,242,139,78,113,201,133,231,96,174,87,152,83,195,148,27,109,5,127,123,129,105,79,203,104,5,110,18,81,81,97,212,83,139,150,83,79,126,110,148,78,68,137,227,126,102,95,73,78,29,110,251,133,159,101,177,118,207,101,144,82,152,153,49,150,124,87,224,130,142,132,138,99,164,84,113,86,168,95,238,95,144,108,180,110,139,144,125,154,207,115,98,104,132,107,77,141,50,129,62,98,36,121,196,148,101,149,177,117,180,118,72,135,166,123,230,127,66,142,165,156,135,158,120,226,214,226,52,227,146,227,240,227,78,228,172,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,79,155,80,169,81,236,82,110,84,216,85,232,86,31,88,11,89,67,90,43,91,126,92,134,93,162,94,212,95,45,97,30,98,147,99,180,100,192,101,223,102,40,104,65,105,59,106,16,107,45,108,153,109,196,110,199,111,180,112,184,113,179,114,3,33,33,50,70,255,134,48,230,48,61,254,68,4,38,49,66,37,69,224,163,224,1,225,95,225,189,225,27,226,72,114,168,143,201,83,107,134,88,91,171,87,53,130,11,149,74,84,196,137,216,112,216,126,124,81,165,130,172,112,14,99,168,104,54,79,134,154,98,151,6,144,155,108,71,89,206,100,122,91,137,109,18,130,143,150,255,102,169,115,66,99,88,110,159,88,48,113,202,118,20,110,163,103,31,119,153,91,86,121,147,82,129,81,42,150,123,87,213,130,49,132,105,99,221,84,107,86,173,95,4,96,148,108,207,110,80,95,128,154,194,115,68,104,146,107,85,141,72,129,61,98,30,121,200,148,102,149,176,117,220,119,52,135,167,123,233,127,81,142,166,156,136,158,121,226,215,226,53,227,147,227,241,227,79,228,173,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,122,79,156,80,170,81,237,82,111,84,217,85,233,86,34,88,12,89,68,90,44,91,128,92,135,93,163,94,213,95,46,97,32,98,148,99,182,100,194,101,224,102,43,104,67,105,60,106,17,107,49,108,154,109,197,110,200,111,181,112,186,113,181,114,4,255,34,50,71,255,135,48,231,48,62,254,69,4,39,49,67,37,70,224,164,224,2,225,96,225,190,225,28,226,110,98,169,143,44,131,7,93,248,91,53,117,65,82,206,152,229,84,45,87,121,134,100,131,169,128,76,117,103,82,232,141,129,114,154,127,220,126,215,130,186,110,183,85,103,107,116,102,130,89,62,121,209,109,229,126,143,86,125,152,72,83,97,78,12,98,180,91,162,110,133,150,233,101,4,117,60,102,197,139,130,81,20,89,61,150,104,87,28,131,109,132,174,99,207,84,123,86,181,95,225,95,140,108,143,110,87,95,129,154,209,115,100,104,147,107,89,141,76,129,67,98,52,121,201,148,103,149,195,117,18,128,49,135,184,123,238,127,82,142,167,156,139,158,122,226,216,226,54,227,148,227,242,227,80,228,174,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,79,157,80,173,81,238,82,112,84,218,85,234,86,35,88,14,89,69,90,45,91,131,92,136,93,164,94,218,95,47,97,35,98,149,99,185,100,199,101,225,102,44,104,68,105,63,106,18,107,51,108,156,109,198,110,202,111,182,112,187,113,186,114,164,0,35,50,72,255,136,48,232,48,65,254,70,4,40,49,68,37,71,224,165,224,3,225,97,225,191,225,29,226,204,98,171,143,54,131,160,91,203,120,67,79,240,96,175,117,76,107,69,120,63,158,15,102,112,130,31,80,80,99,239,128,206,158,204,81,136,89,207,99,43,133,198,118,102,117,48,108,177,143,190,139,143,117,211,154,213,96,56,78,30,130,212,127,0,151,26,140,227,139,136,78,161,111,39,120,164,154,59,150,84,127,249,82,60,150,109,87,81,131,193,132,188,99,222,84,124,86,188,95,228,95,104,108,194,110,86,95,133,154,183,115,131,104,141,107,199,137,83,129,72,98,155,159,202,148,104,149,194,117,20,128,41,135,172,123,243,127,74,142,168,156,146,158,123,226,217,226,55,227,149,227,243,227,81,228,175,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,79,158,80,174,81,239,82,116,84,219,85,236,86,37,88,16,89,71,90,46,91,132,92,137,93,168,94,219,95,48,97,38,98,151,99,187,100,200,101,226,102,45,104,69,105,64,106,19,107,54,108,162,109,200,110,203,111,186,112,188,113,187,114,224,255,36,50,73,255,137,48,233,48,66,254,71,4,41,49,69,37,72,224,166,224,4,225,98,225,192,225,30,226,52,79,77,144,229,103,189,98,174,100,56,117,21,88,253,112,1,100,82,95,42,109,90,90,120,89,203,78,67,158,87,87,241,123,117,112,187,158,132,119,200,98,48,120,14,93,197,96,115,78,55,120,102,78,142,120,149,109,247,112,13,79,101,121,90,134,140,154,174,139,49,90,164,134,251,129,224,115,196,126,187,78,13,83,66,150,118,87,91,131,205,132,242,99,27,85,133,86,98,136,254,95,105,108,159,110,88,95,136,154,179,115,29,104,154,107,202,137,116,129,73,98,249,158,203,148,105,149,214,117,22,128,55,135,157,123,248,124,112,142,169,156,214,147,124,226,218,226,56,227,150,227,244,227,82,228,176,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,79,159,80,180,81,241,82,121,84,222,85,238,86,38,88,17,89,72,90,47,91,133,92,138,93,169,94,220,95,49,97,39,98,153,99,189,100,201,101,227,102,46,104,70,105,65,106,20,107,55,108,165,109,201,110,204,111,190,112,189,113,188,114,225,255,37,50,74,255,138,48,234,48,67,254,72,4,205,231,70,37,73,224,167,224,5,225,99,225,193,225,31,226,227,116,7,104,180,120,108,145,19,100,151,94,254,134,34,144,8,98,159,159,143,91,66,155,4,127,165,117,31,90,119,123,248,114,117,150,155,115,208,133,116,94,168,98,16,129,119,152,93,108,51,117,78,141,129,92,67,82,140,91,174,79,230,139,24,86,131,107,10,140,232,150,129,142,30,141,42,104,187,148,195,78,7,138,73,150,115,87,92,131,208,132,248,99,231,84,147,86,97,95,5,96,116,108,98,111,59,92,138,154,192,115,85,104,155,107,203,137,89,129,59,121,251,158,204,148,106,149,205,117,28,128,63,135,168,123,119,125,118,142,171,156,157,158,125,226,219,226,57,227,151,227,245,227,83,228,177,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130,79,160,80,184,81,242,82,122,84,224,85,239,86,39,88,18,89,75,90,48,91,134,92,139,93,170,94,222,95,50,97,40,98,154,99,190,100,202,101,228,102,47,104,71,105,66,106,21,107,57,108,172,109,202,110,205,111,191,112,190,113,189,114,48,32,38,50,75,255,139,48,235,48,68,254,73,4,206,231,71,37,74,224,168,224,6,225,100,225,194,225,32,226,74,83,106,95,61,100,116,117,170,99,230,96,232,92,175,81,61,158,250,149,24,95,81,109,39,131,235,139,38,80,169,79,187,121,173,92,1,120,210,121,190,120,249,112,80,159,247,139,101,81,123,84,112,91,87,122,73,92,151,120,94,87,243,96,123,152,46,89,209,139,14,78,106,86,136,148,219,134,130,126,201,78,16,83,84,150,173,87,8,131,230,132,224,99,32,85,175,86,173,114,6,96,118,108,70,111,171,84,144,154,201,115,102,104,161,107,204,137,90,129,64,121,252,158,205,148,107,149,227,117,32,128,130,135,133,123,166,125,124,142,173,156,159,158,126,226,220,226,58,227,152,227,246,227,84,228,178,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,79,161,80,185,81,243,82,126,84,226,85,242,86,40,88,19,89,76,90,49,91,135,92,140,93,171,94,223,95,51,97,41,98,155,99,191,100,205,101,229,102,48,104,72,105,67,106,22,107,58,108,173,109,204,110,206,111,196,112,191,113,190,114,167,0,39,50,76,255,140,48,236,48,148,231,74,4,207,231,72,37,75,224,169,224,7,225,101,225,195,225,33,226,158,82,152,129,223,91,12,142,43,99,96,89,69,158,29,127,243,128,104,143,162,126,247,109,192,104,74,92,55,119,235,95,19,111,134,152,130,134,58,110,181,100,142,111,215,101,134,94,37,137,56,79,159,113,66,144,41,89,61,99,10,98,205,84,144,95,47,158,2,95,127,92,32,144,166,79,49,103,52,86,194,78,235,81,95,150,164,87,146,131,189,132,255,99,253,84,212,86,176,114,234,95,134,108,71,111,80,92,146,154,200,115,65,104,170,107,206,137,113,129,70,121,241,118,206,148,108,149,232,117,34,128,34,135,170,123,174,125,111,142,174,156,219,158,127,226,221,226,59,227,153,227,247,227,85,228,179,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,79,162,80,186,81,244,82,127,84,231,85,243,86,41,88,23,89,77,90,51,91,137,92,141,93,172,94,226,95,52,97,43,98,156,99,193,100,208,101,231,102,49,104,73,105,69,106,23,107,59,108,176,109,205,110,207,111,197,112,192,113,191,114,22,33,40,50,77,255,141,48,237,48,149,231,75,4,208,231,73,37,76,224,170,224,8,225,102,225,196,225,34,226,202,126,104,136,148,92,32,122,25,149,192,109,196,79,189,139,153,117,60,155,137,85,65,140,236,103,254,93,119,83,189,91,6,116,230,83,108,154,153,94,123,99,109,95,72,121,60,116,111,143,171,142,175,133,167,150,251,109,90,102,254,150,171,78,184,139,231,121,252,127,185,121,130,118,149,103,42,115,137,145,232,78,25,89,103,150,140,87,60,131,211,132,196,99,20,85,215,86,180,114,237,95,169,108,36,111,89,92,147,154,229,115,103,104,107,143,207,137,96,129,73,121,4,119,208,148,111,149,230,117,37,128,125,135,156,123,71,126,116,142,176,156,220,158,128,226,222,226,60,227,154,227,248,227,86,228,180,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,79,164,80,190,81,245,82,129,84,233,85,246,86,43,88,24,89,78,90,53,91,138,92,142,93,174,94,227,95,53,97,45,98,157,99,195,100,209,101,232,102,52,104,74,105,70,106,24,107,60,108,177,109,206,110,208,111,198,112,193,113,192,114,6,38,41,50,78,255,142,48,238,48,59,254,76,4,209,231,74,37,77,224,171,224,9,225,103,225,197,225,35,226,166,144,214,156,238,93,1,97,45,100,191,107,157,152,73,89,114,82,225,139,175,79,59,109,177,120,75,123,226,126,62,107,78,103,228,78,130,154,153,89,245,95,236,132,65,121,119,122,46,150,241,109,145,102,95,121,107,88,150,118,100,102,121,152,196,132,104,103,204,127,135,91,118,112,185,117,248,139,0,103,225,78,85,81,108,150,178,87,52,131,202,132,222,99,243,84,221,86,183,114,248,95,208,108,21,111,113,91,150,154,217,115,64,104,109,143,208,137,105,129,91,121,13,119,209,148,113,149,228,117,38,128,126,135,162,123,155,126,133,142,177,156,221,158,129,226,223,226,61,227,155,227,249,227,87,228,181,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,79,166,80,191,81,246,82,131,84,237,85,247,86,44,88,27,89,79,90,54,91,139,92,143,93,175,94,229,95,54,97,47,98,158,99,196,100,211,101,234,102,53,104,75,105,72,106,25,107,62,108,179,109,208,110,211,111,199,112,194,113,197,114,5,38,110,231,79,255,143,48,239,48,60,254,77,4,210,231,75,37,78,224,172,224,10,225,104,225,198,225,36,226,46,94,139,97,231,139,121,123,190,143,137,120,185,139,228,81,105,151,120,118,52,115,25,79,119,120,164,101,133,100,33,83,204,145,156,110,27,86,17,133,24,90,218,104,145,154,203,121,74,133,32,90,217,102,89,91,48,117,203,96,105,114,247,93,87,145,108,98,206,126,237,139,229,113,202,139,219,139,106,127,235,78,160,78,114,150,207,87,49,131,191,132,206,99,34,85,225,86,184,114,25,96,212,108,249,110,99,92,152,154,124,152,62,104,113,143,209,137,124,129,92,121,249,118,210,148,114,149,235,117,39,128,123,135,171,123,184,158,143,142,178,156,224,158,130,226,224,226,62,227,156,227,250,227,88,228,182,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,79,170,80,193,81,247,82,133,84,238,85,248,86,45,88,29,89,80,90,56,91,142,92,144,93,176,94,230,95,55,97,48,98,159,99,198,100,212,101,235,102,54,104,76,105,73,106,26,107,63,108,180,109,210,110,212,111,201,112,196,113,198,114,203,37,111,231,80,255,144,48,240,48,55,254,78,4,211,231,1,232,79,224,173,224,11,225,105,225,199,225,37,226,134,104,43,82,198,98,199,78,84,123,252,83,37,90,91,79,91,132,66,104,60,84,107,112,227,98,209,145,43,101,80,123,164,156,9,116,23,84,109,112,127,145,124,120,119,141,24,78,94,116,197,126,114,127,95,99,28,117,155,91,255,82,97,106,217,83,111,79,53,131,189,127,35,141,7,151,16,144,10,92,222,78,86,81,116,150,167,87,155,131,186,132,82,100,35,85,245,86,195,114,53,96,173,108,47,111,102,92,155,154,10,116,74,104,114,143,110,114,125,129,83,121,7,119,213,148,115,149,231,117,41,128,96,135,180,123,180,158,148,142,179,156,223,158,131,226,225,226,63,227,157,227,251,227,89,228,183,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,79,171,80,194,81,248,82,135,84,240,85,251,86,46,88,30,89,81,90,57,91,143,92,145,93,177,94,232,95,56,97,49,98,161,99,199,100,213,101,236,102,58,104,77,105,74,106,27,107,67,108,182,109,214,110,213,111,203,112,197,113,199,114,207,37,96,33,81,255,145,48,241,48,56,254,79,4,212,231,2,232,80,224,174,224,12,225,106,225,200,225,38,226,156,105,42,118,244,103,248,126,41,118,213,150,118,96,38,84,60,104,220,103,154,83,183,131,97,99,202,78,137,98,194,114,60,121,180,105,203,87,17,108,31,158,247,123,130,92,177,144,16,149,94,121,0,135,11,123,108,96,73,90,161,82,207,80,237,101,161,117,107,131,137,115,233,98,47,99,249,122,117,144,27,79,179,78,136,150,180,87,94,131,224,132,198,99,15,85,235,86,193,114,38,96,247,108,54,111,188,127,156,154,233,115,73,104,115,143,159,114,109,129,90,121,8,119,214,148,58,149,3,118,40,128,112,135,209,123,115,141,144,142,180,156,226,158,132,226,226,226,64,227,158,227,252,227,90,228,184,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,79,173,80,195,81,251,82,136,84,241,85,252,86,47,88,32,89,82,90,58,91,146,92,146,93,178,94,233,95,57,97,50,98,164,99,200,100,216,101,237,102,59,104,78,105,75,106,28,107,68,108,183,109,216,110,214,111,204,112,198,113,201,114,206,37,97,33,82,255,146,48,242,48,49,254,175,231,213,231,3,232,81,224,175,224,13,225,107,225,201,225,39,226,128,129,108,95,122,140,133,119,83,98,203,81,132,83,43,89,228,134,234,141,25,80,22,98,128,123,37,109,152,99,70,104,137,131,107,120,112,78,191,98,63,92,168,129,94,78,3,116,240,149,136,108,205,158,209,132,20,130,7,78,159,96,17,84,143,94,138,127,224,86,223,87,25,82,71,149,219,112,40,102,243,78,110,136,141,150,147,87,47,131,161,132,190,99,17,85,249,86,206,114,27,96,248,108,75,111,42,95,157,154,231,115,41,104,117,143,93,114,103,129,98,121,26,119,215,148,231,119,241,117,49,128,76,135,193,123,132,141,156,142,181,156,233,158,133,226,227,226,65,227,159,227,253,227,91,228,185,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,146,79,174,80,197,81,252,82,137,84,244,85,0,87,49,88,33,89,83,90,59,91,147,92,147,93,180,94,236,95,58,97,53,98,166,99,201,100,217,101,238,102,63,104,79,105,76,106,29,107,69,108,185,109,217,110,215,111,205,112,199,113,202,114,199,37,98,33,83,255,147,48,243,48,150,231,176,231,214,231,4,232,82,224,176,224,14,225,108,225,202,225,40,226,209,126,140,101,0,100,17,78,39,89,1,82,124,98,119,101,1,150,53,141,14,84,209,96,237,79,95,137,20,80,255,119,84,131,143,153,166,158,191,118,79,99,11,103,1,79,66,108,166,109,161,91,32,159,173,104,70,129,85,129,239,139,97,140,92,117,11,109,183,107,139,130,253,108,53,150,110,113,230,93,34,79,164,136,151,150,160,87,79,131,185,132,69,100,39,85,255,86,205,114,15,96,241,108,116,111,41,95,159,154,222,115,181,104,118,143,102,114,77,88,87,121,34,119,217,148,236,119,252,117,11,128,110,135,204,123,148,141,158,142,182,156,231,158,134,226,228,226,66,227,160,227,254,227,92,228,186,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,147,79,175,80,200,81,253,82,138,84,246,85,1,87,50,88,34,89,84,90,60,91,149,92,148,93,186,94,239,95,59,97,54,98,171,99,202,100,218,101,239,102,71,104,80,105,77,106,30,107,72,108,186,109,219,110,216,111,206,112,200,113,203,114,198,37,99,33,84,255,114,231,244,48,51,254,177,231,215,231,5,232,83,224,177,224,15,225,109,225,203,225,41,226,210,104,210,111,186,99,237,129,70,84,137,99,79,144,164,128,148,150,61,82,124,84,13,151,106,82,39,125,53,114,54,119,15,84,89,117,86,83,79,101,66,128,79,158,47,84,218,86,229,130,118,90,94,92,6,85,17,99,106,108,20,102,39,132,100,96,51,150,243,151,193,144,60,141,184,132,196,98,80,79,100,79,181,78,176,150,213,87,71,131,180,132,65,100,42,85,4,87,210,114,13,96,215,108,42,111,45,95,160,154,186,115,143,104,120,143,111,114,181,90,96,121,25,119,216,148,201,150,255,117,53,128,139,135,221,123,145,141,120,140,183,156,229,158,135,226,229,226,67,227,161,227,255,227,93,228,187,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149,79,176,80,202,81,1,83,141,84,248,85,2,87,51,88,35,89,86,90,61,91,157,92,149,93,187,94,240,95,60,97,56,98,175,99,203,100,219,101,241,102,75,104,81,105,78,106,31,107,75,108,187,109,220,110,217,111,207,112,201,113,204,114,161,37,100,33,85,255,115,231,245,48,52,254,178,231,216,231,6,232,84,224,178,224,16,225,110,225,204,225,42,226,197,120,232,110,73,135,29,82,121,107,10,84,2,145,117,91,236,148,138,143,78,78,39,141,207,81,38,149,201,137,247,101,23,104,24,82,200,143,175,96,125,91,103,99,81,89,75,145,49,95,26,117,47,103,41,127,97,103,139,115,153,113,93,120,110,125,39,108,52,150,1,84,14,96,35,99,169,119,222,103,245,78,20,129,151,144,216,87,67,131,151,132,11,100,103,85,10,87,232,114,41,96,178,108,9,111,116,130,162,154,242,115,116,104,119,143,126,114,136,129,111,121,45,119,219,148,213,121,16,118,67,128,83,135,218,123,177,141,130,140,186,156,234,158,136,226,230,226,68,227,162,227,0,228,94,228,188,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,79,177,80,205,81,2,83,145,84,249,85,5,87,52,88,38,89,87,90,62,91,158,92,150,93,188,94,242,95,61,97,57,98,177,99,204,100,220,101,245,102,77,104,82,105,79,106,37,107,76,108,188,109,221,110,218,111,208,112,202,113,207,114,160,37,101,33,86,255,116,231,246,48,151,231,179,231,217,231,7,232,85,224,179,224,17,225,111,225,205,225,43,226,140,134,190,91,139,153,250,81,163,80,147,148,127,153,118,98,42,78,218,110,253,95,120,121,80,131,197,78,179,81,181,81,61,78,36,118,9,129,253,149,110,85,176,120,12,120,197,108,146,100,190,128,240,143,16,116,226,143,161,78,144,103,4,151,127,90,240,78,251,89,71,144,158,88,65,119,49,86,90,80,37,79,210,136,155,144,218,87,95,131,229,132,27,100,143,85,9,87,239,114,43,96,224,108,41,111,60,95,163,154,15,116,119,104,121,143,127,114,130,129,103,121,38,119,222,148,237,121,0,118,70,128,99,135,229,123,103,141,138,140,187,156,239,158,137,226,231,226,69,227,163,227,1,228,95,228,189,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,79,179,80,206,81,3,83,147,84,250,85,7,87,54,88,40,89,88,90,63,91,159,92,151,93,189,94,243,95,62,97,58,98,178,99,207,100,221,101,246,102,79,104,83,105,81,106,38,107,77,108,189,109,227,110,219,111,209,112,203,113,209,114,179,37,102,33,87,255,117,231,125,231,152,231,180,231,218,231,8,232,86,224,180,224,18,225,112,225,206,225,44,226,81,149,72,100,23,140,113,106,52,98,3,140,105,96,194,98,4,84,205,104,90,116,251,81,219,105,40,140,192,139,143,78,137,83,65,109,146,119,14,102,74,149,111,87,104,86,139,141,18,109,78,97,17,104,34,125,58,119,137,103,127,137,74,82,234,126,210,117,31,84,187,85,142,97,129,95,59,78,92,79,39,79,128,121,157,144,217,87,64,131,227,132,32,100,181,85,28,87,233,114,10,96,214,108,137,111,59,155,165,154,42,116,147,104,122,143,132,114,145,129,122,121,53,119,223,148,227,121,5,118,77,128,124,135,230,123,109,141,133,140,188,156,34,159,138,226,232,226,70,227,164,227,2,228,96,228,190,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,79,180,80,208,81,4,83,151,84,251,85,11,87,55,88,44,89,89,90,65,91,160,92,152,93,191,94,244,95,64,97,59,98,181,99,209,100,222,101,248,102,82,104,85,105,82,106,40,107,78,108,190,109,231,110,220,111,210,112,204,113,211,114,178,37,103,33,88,255,118,231,126,231,153,231,181,231,219,231,9,232,87,224,181,224,19,225,113,225,207,225,45,226,141,80,117,81,32,127,168,83,38,94,204,141,12,128,144,143,217,126,5,149,246,88,62,87,116,146,219,143,221,126,212,118,177,82,243,103,146,153,159,135,77,149,18,120,20,108,58,83,40,132,23,110,95,103,1,149,243,141,81,127,82,120,238,84,237,126,123,81,246,148,234,92,254,102,240,114,87,132,80,87,9,79,52,91,153,144,210,87,23,131,12,133,12,100,73,85,15,94,242,114,63,96,250,108,141,111,110,92,167,154,91,116,107,104,124,143,139,114,213,110,133,121,56,119,224,148,235,121,12,118,82,128,100,135,234,123,71,140,152,140,189,156,44,159,139,226,233,226,71,227,165,227,3,228,97,228,191,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,79,181,80,210,81,7,83,152,84,252,85,12,87,56,88,48,89,91,90,66,91,161,92,154,93,192,94,246,95,65,97,60,98,182,99,211,100,223,101,250,102,86,104,86,105,83,106,41,107,79,108,193,109,234,110,221,111,211,112,205,113,212,114,59,32,104,33,89,255,119,231,127,231,154,231,182,231,220,231,10,232,88,224,182,224,20,225,114,225,208,225,46,226,36,140,176,81,242,148,135,142,134,107,57,114,63,81,69,94,57,104,237,144,107,132,250,87,245,141,115,151,71,87,191,92,62,120,109,81,238,134,35,158,133,109,57,151,196,143,198,134,110,129,240,88,13,98,64,98,52,141,128,95,253,119,163,86,105,143,55,104,235,109,161,95,96,141,137,78,241,103,167,94,43,79,3,136,172,144,184,87,96,131,13,117,38,100,109,85,25,94,244,114,33,96,235,108,140,111,129,89,159,126,38,116,194,104,126,143,141,114,163,129,138,121,80,119,226,148,6,122,23,118,105,128,89,135,12,124,73,140,148,140,196,156,47,159,140,226,234,226,72,227,166,227,4,228,98,228,192,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,79,182,80,211,81,9,83,156,84,255,85,13,87,57,88,50,89,92,90,67,91,164,92,155,93,193,94,247,95,66,97,66,98,185,99,212,100,225,101,251,102,87,104,88,105,84,106,42,107,81,108,194,109,235,110,223,111,212,112,207,113,213,114,146,33,105,33,90,255,120,231,128,231,155,231,183,231,221,231,11,232,89,224,183,224,21,225,115,225,209,225,47,226,222,130,196,103,167,78,4,149,227,78,159,120,51,128,31,108,223,141,253,86,225,128,58,103,49,141,75,102,204,131,165,122,134,83,153,159,225,110,237,148,168,96,121,98,3,95,242,102,195,156,31,117,214,122,76,88,193,148,250,101,112,102,0,149,167,85,62,111,197,91,8,97,78,98,20,96,169,82,16,232,94,79,184,127,161,144,244,87,45,131,56,133,33,100,65,85,20,94,247,114,120,96,238,108,120,111,131,89,161,126,37,116,110,105,129,143,143,114,170,129,154,121,81,119,228,148,71,93,10,118,113,128,101,135,254,123,74,145,155,101,197,156,57,159,141,226,235,226,73,227,167,227,5,228,99,228,193,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,158,79,183,80,212,81,10,83,158,84,2,86,14,87,58,88,51,89,93,90,68,91,165,92,156,93,194,94,249,95,67,97,68,98,187,99,213,100,227,101,253,102,88,104,89,105,85,106,43,107,82,108,195,109,236,110,226,111,213,112,208,113,214,114,144,33,106,33,91,255,121,231,129,231,156,231,184,231,222,231,12,232,90,224,184,224,22,225,116,225,210,225,48,226,222,128,25,78,16,150,207,150,55,141,118,135,20,92,38,123,21,128,156,103,116,135,120,117,193,137,129,121,167,148,117,132,41,82,75,128,19,133,13,84,224,103,171,98,125,108,175,142,94,88,37,117,133,88,214,78,22,94,27,103,59,86,136,109,163,91,128,144,110,153,50,107,179,85,116,101,192,134,17,232,103,79,171,81,180,144,239,87,58,131,240,132,94,100,85,85,17,94,1,115,121,96,177,108,114,111,141,89,163,126,40,116,252,104,130,143,146,114,204,129,167,121,71,119,229,148,3,122,37,118,131,137,147,135,252,123,80,145,214,137,198,156,55,159,142,226,236,226,74,227,168,227,6,228,100,228,194,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,79,184,80,213,81,11,83,159,84,3,86,15,87,59,88,53,89,94,90,69,91,166,92,158,93,195,94,250,95,68,97,69,98,189,99,214,100,228,101,1,103,89,104,91,105,86,106,44,107,83,108,200,109,237,110,227,111,214,112,209,113,216,114,145,33,107,33,92,255,122,231,130,231,157,231,185,231,223,231,13,232,91,224,185,224,23,225,117,225,211,225,49,226,5,83,201,121,164,152,193,110,139,136,237,143,117,153,15,79,244,102,249,136,208,114,61,122,46,149,209,143,155,81,78,89,136,80,153,84,252,102,125,84,222,114,136,82,227,108,72,92,91,141,114,114,182,94,131,91,133,83,216,95,56,84,181,91,172,96,112,129,57,92,241,114,35,110,239,98,46,141,18,232,56,101,177,81,179,144,248,87,51,131,57,133,132,100,63,85,49,94,243,114,123,96,211,108,124,111,169,89,165,126,48,116,31,105,132,143,8,99,38,103,179,121,67,119,231,148,2,122,24,118,120,152,175,135,15,124,78,145,222,137,199,156,61,159,143,226,237,226,75,227,169,227,7,228,101,228,195,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,79,185,80,214,81,12,83,160,84,4,86,16,87,60,88,54,89,95,90,70,91,167,92,159,93,196,94,252,95,69,97,70,98,191,99,217,100,234,101,2,103,90,104,92,105,87,106,45,107,86,108,201,109,238,110,228,111,215,112,210,113,218,114,147,33,112,231,93,255,123,231,131,231,158,231,186,231,224,231,14,232,92,224,186,224,24,225,118,225,212,225,50,226,18,137,124,153,12,102,100,150,133,95,13,140,49,109,216,79,154,94,199,143,202,124,239,121,173,123,236,112,27,84,65,155,139,79,60,123,98,97,44,140,221,81,53,116,171,139,113,154,9,78,71,83,112,101,121,89,44,84,132,89,33,149,198,109,203,101,150,89,21,95,178,128,45,103,99,107,248,148,19,232,90,79,189,81,182,144,228,87,102,131,31,133,109,100,80,85,59,94,3,115,122,96,239,108,122,111,170,89,168,126,46,116,32,105,135,143,50,99,202,129,209,95,90,119,232,148,30,122,21,118,128,152,168,135,22,124,79,145,218,137,202,156,62,159,144,226,238,226,76,227,170,227,8,228,102,228,196,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,162,79,188,80,215,81,14,83,161,84,5,86,17,87,61,88,59,89,96,90,71,91,168,92,160,93,197,94,7,96,70,97,74,98,192,99,218,100,235,101,3,103,91,104,95,105,90,106,46,107,88,108,202,109,239,110,229,111,218,112,211,113,219,114,19,48,113,231,227,255,124,231,132,231,159,231,187,231,225,231,15,232,93,224,187,224,25,225,119,225,213,225,51,226,101,82,179,112,22,115,90,105,46,144,224,83,140,78,13,103,185,127,200,84,86,110,149,123,246,78,120,109,251,92,128,80,208,79,191,122,43,111,120,100,129,91,215,107,144,99,32,110,193,83,243,126,49,111,84,88,195,112,1,90,122,114,83,102,132,115,118,116,144,150,137,138,103,143,63,101,81,123,20,232,93,79,188,81,186,144,221,87,101,131,58,133,150,100,60,85,60,94,250,114,66,96,254,108,209,111,163,89,169,126,44,116,249,104,139,143,176,99,187,129,208,95,104,119,234,148,20,122,25,118,131,152,210,135,11,124,100,145,220,137,203,156,68,159,145,226,239,226,77,227,171,227,9,228,103,228,197,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}; ================================================ FILE: rlib/ralgo.h ================================================ #ifndef ralgo_h__ #define ralgo_h__ #include "rbuf.h" #include template T* r_new(int count=1) { T* p=(T*)malloc(sizeof(int)+count*sizeof(T)); if(p==null) { //这里如果调用rf::error(rstr s)会导致代码膨胀90K rf::print("memory insufficient"); exit(1); return null; } *(int*)p=count; p=(T*)((uchar*)p+sizeof(int)); T* start=p; T* end=start+count; for(;pT::T(); } return start; } template T* r_new_n(int count=1) { T* p=(T*)malloc(sizeof(int)+count*sizeof(T)); if(p==null) { rf::print("memory insufficient"); exit(1); return null; } *(int*)p=count; return (T*)((uchar*)p+sizeof(int)); } template void r_delete(T* p) { uchar* start=(uchar*)p-sizeof(int); T* end=p+*(int*)start; for(;p~T(); } free(start); } template void r_delete_n(T* p)//这里模板参数没用 { free((uchar*)p-sizeof(int)); } //模板特化放在头文件里只能包含一次 //如果注释掉这4个特化int、char等内置类型会初始化为0,效率略低 template<> uchar* r_new(int count) { return r_new_n(count); } template<> void r_delete(uchar* p) { r_delete_n(p); } template<> ushort* r_new(int count) { return r_new_n(count); } template<> void r_delete(ushort* p) { r_delete_n(p); } //binary search template int r_find_pos_b(const V& v,const T& a) { int left=0; int right=v.count()-1; int mid; while(left<=right) { mid=(left+right)/2; if(v[mid] rbool r_not_equal(const T& a,const T& b) { return a void r_swap(T& a,T& b) { T temp(r_move(a)); a=r_move(b); b=r_move(temp); } template void r_reverse(V& v,int begin=0,int end=0) { if(end<=0) { end=v.count(); } if(begin<0) { begin=0; } V temp=v.sub(begin,end); int i=end-1; int j=0; for(;i>=begin;--i,++j) v[i]=r_move(temp[j]); } template rbool r_is_all_element(const V& v,const T& a) { for(int i=0;i void r_qsort_in(rbuf& v,int left,int right) { if(left(v[i],v[j]); i++; } } r_swap(v[i],v[right]); r_qsort_in(v,left,i-1); r_qsort_in(v,i+1,right); } } template void r_qsort(rbuf& v,int begin=0,int end=0) { if(end<=0) { end=v.count(); } if(begin<0) { begin=0; } if(begin+1 T* r_find(const V& v,const T& a) { T* p; for(p=v.begin();p!=v.end();p=v.next(p)) if(*p==a) return p; return null; } template int r_find_pos(const V& v,T a,int start=0) { T* p; for(p=v.begin()+start;p!=v.end();p=v.next(p)) if(*p==a) return v.pos(p); return v.count(); } template int r_find_pos_rev(const V& v,const T& a) { for(int i=v.count()-1;i>=0;--i) if(v[i]==a) return i; return v.count(); } template int r_find_pos(const V& v,const V& m,int start=0) { if(m.empty()||start>=v.count()) { return v.count(); } for(int i=start;i=m.count()) { return i; } } return v.count(); } template rbuf r_split(const V& v,const V& m,int start=0) { rbuf result; V temp; int i; while(start=v.count()) break; temp.clear(); for(i=start;i rbuf r_split(const V& v,const T& a,int start=0) { return r_split(v,V(1,a),start); } //允许空元素 template rbuf r_split_e(const V& v,const V& m,int start=0) { rbuf result; V temp; int i; while(start=v.count()) break; temp.clear(); for(i=start;i rbuf r_split_e(const V& v,const T& a,int start=0) { return r_split_e(v,V(1,a),start); } #endif ================================================ FILE: rlib/rbase.h ================================================ #ifndef rbase_h__ #define rbase_h__ #ifdef _MSC_VER //#define _CRT_SECURE_NO_DEPRECATE //#pragma warning(disable:4127) //#pragma warning(disable:4390) //#pragma warning(disable:4710) #pragma warning(disable:4996) #pragma warning(disable:4345) #include #include #else #endif #ifndef int64 #ifdef _MSC_VER typedef __int64 int64; typedef unsigned __int64 uint64; #else typedef long long int64; typedef unsigned long long uint64; #endif typedef int64 int8; #endif #ifndef uint typedef unsigned int uint; #endif #ifndef ushort typedef unsigned short ushort; #endif #ifndef uchar typedef unsigned char uchar; #endif #ifndef rbool typedef int rbool; #endif #ifndef wchar #ifdef _MSC_VER typedef wchar_t wchar; #else typedef ushort wchar; #endif #endif //#define NEW new(nothrow) #ifndef null #if _MSC_VER >= 1700 #define null nullptr #else #define null NULL #endif #endif #include #define elif else if #define ifn(a) if(!(a)) #define r_size(a) ((int)sizeof(a)) #define r_move(a) std::move(a) #define r_max(a,b) ((a)>(b)?(a):(b)) #define r_min(a,b) ((a)>(b)?(b):(a)) #define r_cond(cond,a,b) ((cond)?(a):(b)) #define r_ceil_div(a,b) (0==(a)%(b)?(a)/(b):(a)/(b)+1) #define r_to static_cast #define r_to_int(a) ((int)(a)) #define r_to_uint(a) ((uint)(a)) #define r_to_char(a) ((char)(a)) #define r_to_uchar(a) ((uchar)(a)) #define r_to_int8(a) ((int8)(a)) #define r_to_double(a) ((double)(a)) #define r_to_pint(a) ((int*)(a)) #define r_to_puint(a) ((uint*)(a)) #define r_to_pchar(a) ((char*)(a)) #define r_to_puchar(a) ((uchar*)(a)) #define r_to_pint8(a) ((int8*)(a)) #define r_to_pdouble(a) ((double*)(a)) #define r_to_prstr(a) ((rstr*)(a)) #define AND(a,b) ((a)&(b)) #define OR(a,b) ((a)|(b)) #define XOR(a,b) ((a)^(b)) #define NOT(a) (~(a)) #endif ================================================ FILE: rlib/rbuf.h ================================================ #ifndef rbuf_h__ #define rbuf_h__ #include "rbase.h" #include #include //#define r_round(d) ((uint)(d+0.5)) //#define r_log(a,b) (log(b)/log(a)) template struct rbuf { enum { c_small=16 }; T* m_p; int m_count; int m_cmax; uchar m_block[c_small]; //当分配小内存时,m_p指向m_block,无需new可提高效率 ~rbuf() { free(); } rbuf() { init(); } rbuf(int num) { init(); alloc(num); } rbuf(int num,const T& a) { init(); alloc(num); for(int i=0;i(const rbuf& a) { init(); copy(a); } rbuf(rbuf&& a) { move(a); } void move(rbuf& a) { if(a.m_p==(T*)a.m_block) { memcpy(this,&a,sizeof(a)); m_p=(T*)m_block; } else { m_p=a.m_p; m_count=a.m_count; m_cmax=a.m_cmax; } a.init();//如果move后对象不再使用可以只置空a.m_p } //如果复制指针一定要处理好等于号,不支持自己复制自己 void operator=(const rbuf& a) { if(a.m_p==m_p) { return; } copy(a); } void operator=(rbuf&& a) { free(); move(a); } friend rbuf operator+(const rbuf& a,const rbuf& b) { int total=a.count()+b.count(); int max=r_max(a.m_cmax,b.m_cmax); rbuf ret; if(total>max) { ret.alloc_not_change(extend_num(total)); } else { ret.alloc_not_change(max); } int i; for(i=0;i& a) { int total=a.count()+count(); if(total>m_cmax) { realloc_not_change(extend_num(total)); } for(int i=count();i&& a) { int total=a.count()+count(); if(total>m_cmax) { realloc_not_change(extend_num(total)); } for(int i=count();ipush(a); } void operator+=(T&& a) { this->push(a); } T& operator[](int num) const { return m_p[num]; } friend rbool operator==(const rbuf& a,const rbuf& b) { if(a.count()!=b.count()) { return false; } for(int i=0;i& a,const rbuf& b) { return !(a==b); } void init() { m_p=null; m_count=0; m_cmax=0; } static T* next(void* p) { return ((T*)p)+1; } static T* prev(void* p) { return ((T*)p)-1; } int size() const { return m_count*r_size(T); } int count() const { return m_count; } T* pos(int num) const { return begin()+num; } int pos(void* p) const { return r_to_int((T*)p-begin()); } T* begin() const { return m_p; } T* end() const { return m_p+count(); } T* rbegin() const { if(0==m_count) { return null; } else { return m_p+count()-1; } } T* rend() const { if(0==m_count) { return null; } else { return m_p-1; } } rbool empty() const { return 0==m_count; } void clear() { m_count=0; } static int extend_num(int num) { return r_cond(num=m_cmax) { realloc_not_change(extend_num(m_count)); } m_p[count()]=a; m_count++; } void push(T&& a) { if(m_count>=m_cmax) { realloc_not_change(extend_num(m_count)); } m_p[count()]=a; m_count++; } void push_move(T& a) { push(r_move(a)); } T pop() { /*if(0==m_count) exit(0);*/ m_count--; return m_p[count()]; } T pop_front() { T ret=r_move(m_p[0]); erase(0); return r_move(ret); } //没必要增加push_front的move版本 void push_front(const T& a) { insert(0,a); } T& top() const { return m_p[count()-1]; } T& bottom() const { return m_p[0]; } T get_top() const { if(count()>0) { return m_p[count()-1]; } return T(); } T get_bottom() const { if(count()>0) { return m_p[0]; } return T(); } rbool erase(int num) { if(num>=count()||num<0) { return false; } for(int i=num;icount()||begin>=end) { return false; } for(int i=0;icount()||pos<0) { return false; } if(m_count>=m_cmax) { realloc_not_change(extend_num(m_count)); } for(int i=count();i>pos;--i) { m_p[i]=r_move(m_p[i-1]); } m_p[pos]=a; m_count++; return true; } rbool insert(int pos,const rbuf& a) { if(pos>count()||pos<0||0==a.count()) { return false; } if(m_cmax(num)); } void v_delete() { if(m_p!=(T*)m_block) r_delete(m_p); } //这里的重复代码可用宏或者模板简化 void alloc(int num) { if(m_p!=null) { return; } if(num<=0) { init(); return; } m_p=v_new(num); m_cmax=num; m_count=m_cmax; } void alloc_not_change(int num) { if(m_p!=null) { return; } if(num<=0) { init(); return; } m_p=v_new(num); m_cmax=num; } void realloc(int num) { if(null==m_p) { alloc(num); return; } if(num<=0) { free(); return; } realloc_not_change_in(num); m_count=m_cmax; } void realloc_not_change(int num) { if(null==m_p) { alloc_not_change(num); return; } if(num<=0) { free(); return; } realloc_not_change_in(num); } void realloc_not_change_in(int num) { T* p=v_new(num); int copy_size=r_min(num,m_count); for(int i=0;i& a) { if(m_cmax=(uint)count()) { return T(); } else { return m_p[i]; } } rbuf sub(int begin,int end) const { if(end>count()) { end=count(); } if(begin<0) { begin=0; } rbuf ret; int temp=end-begin; ret.alloc(temp);//alloc会判断temp<0的情况,所以不需要判断begin>=end for(int i=0;i sub(int begin) const { return sub(begin,count()); } rbool exist(const T& a) { for(int i=0;i=0;i--) { if(a==m_p[i]) { return i; } } return count(); } void print() const { for(int i=0;i #pragma comment(lib,"Ws2_32") #else #include "gbk.txt" #endif struct rclass//本类用于初始化环境,只能实例化一次(单例模式) { rclass() { #ifdef _MSC_VER std::set_new_handler(new_fail_handle); WORD wVersionRequested; WSADATA wsaData; wVersionRequested=MAKEWORD(1,1); if(0!=WSAStartup(wVersionRequested,&wsaData)) { return; } if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) { return; } #endif } ~rclass() { #ifdef _MSC_VER WSACleanup(); #endif } static void new_fail_handle() { rf::error("memory insufficient"); } }; #endif ================================================ FILE: rlib/rcode.h ================================================ #ifndef rcode_h__ #define rcode_h__ #include "rf.h" #include "rclass.h" struct rcode { static rstr gbk_to_utf8(const rstr& s) { return utf16_to_utf8(gbk_to_utf16(s)); } #ifdef _MSC_VER static rstr gbk_to_utf16(rstr s) { rstr result; //即使是英语操作系统应该也安装936代码页 int size=MultiByteToWideChar(936,0,s.cstr_t(),-1,null,0); if(size<=0) { return result; } result.set_size(size*2); size=MultiByteToWideChar(936,0,s.cstr_t(),-1,result.cstrw_t(),size); if(size<=0) { return rstr(); } result.m_buf.m_count-=2; return r_move(result); } #else static rstr gbk_to_utf16(const rstr& s) { rstr result; ushort temp; ushort wuni; for(int i=0;i=s.count()) { continue; } get_first(temp)=s[i]; get_second(temp)=s[i+1]; wuni=gbk(temp); if(wuni==0) { continue; } result+=get_first(wuni); result+=get_second(wuni); i++; } return r_move(result); } #endif static rstr utf8_to_gbk(const rstr& s) { return utf16_to_gbk(utf8_to_utf16(s)); } static rstr utf8_to_utf16(const rstr& s) { ushort temp; rstr result; for(int i=0;i=s.count()) { continue; } temp=0; temp|=(s[i]&0xef)<<12; temp|=(s[i+1]&0x3f)<<6; temp|=s[i+2]&0x3f; result.push(get_first(temp)); result.push(get_second(temp)); i+=2; } elif(is_utf8_2(s[i])) { if(i+1>=s.count()) { continue; } temp=0; temp|=(s[i]&0x1f)<<6; temp|=s[i+1]&0x3f; result.push(get_first(temp)); result.push(get_second(temp)); i++; } else { result.push(s[i]); result.push(0); } } return r_move(result); } #ifdef _MSC_VER static rstr utf16_to_gbk(rstr s) { rstr result; int size=WideCharToMultiByte(936,0,s.cstrw_t(),-1,null,0,null,null); if(size<=0) { return result; } result.set_size(size); size=WideCharToMultiByte(936,0,s.cstrw_t(),-1, (char*)result.begin(),size,null,null); if(size<=0) { return rstr(); } result.pop(); return r_move(result); } #else static rstr utf16_to_gbk(const rstr& s) { rstr result; if(s.count()%2!=0) { return result; } ushort temp; ushort wgbk; for(int i=0;i0x7f&&s[i+1]<=0x7) { result.push(uchar((temp>>6)|0xc0)); result.push(uchar((temp&0x3f)|0x80)); } else { result.push((temp>>12)|0xe0); result.push(((temp>>6)&0x3f)|0x80); result.push((temp&0x3f)|0x80); } } return r_move(result); } static rstr to_utf16_txt(const rstr& s) { if(is_utf16_txt(s)) { return s; } rstr temp; temp.push(0xff); temp.push(0xfe); if(is_utf8_txt(s)) { return temp+utf8_to_utf16(s.sub(3)); } return temp+gbk_to_utf16(s); } static rstr add_utf8_head(const rstr& s) { rstr temp; temp.push(0xef); temp.push(0xbb); temp.push(0xbf); temp+=s; return r_move(temp); } static rstr to_utf8_txt(const rstr& s) { if(is_utf8_txt(s)) { return s; } rstr temp; temp.push(0xef); temp.push(0xbb); temp.push(0xbf); if(is_utf16_txt(s)) { return temp+utf16_to_utf8(s.sub(2)); } return temp+gbk_to_utf8(s); } static rstr to_gbk_txt(const rstr& s) { if(is_utf8_txt(s)) { return utf8_to_gbk(s.sub(3)); } if(is_utf16_txt(s)) { return utf16_to_gbk(s.sub(2)); } return r_move(s); } static rbool is_utf16_txt(const rstr& s) { return s.count()>=2&& s[0]==0xff&& s[1]==0xfe; } static rbool is_utf8_txt(const rstr& s) { return s.count()>=3&& s[0]==0xef&& s[1]==0xbb&& s[2]==0xbf; } static rbool is_utf16_big_txt(const rstr& s) { return s.count()>=2&& s[0]==0xfe&& s[1]==0xff; } static rbool is_utf32_txt(const rstr& s) { if(s.count()<4) { return false; } if(s[0]==0&&s[1]==0&& s[2]==0xfe&& s[3]==0xff) { return true; } if(s[0]==0xff&& s[1]==0xfe&& s[2]==0&&s[3]==0) { return true; } return false; } //是否utf8 3个字节起始 static rbool is_utf8_3(uchar ch) { return ch>=0xe0&&ch<=0xef; } static rbool is_utf8_2(uchar ch) { return ch>=0xc0&&ch<=0xdf; } //是否unicode汉字,共20902个,+2个不常用字 static rbool is_chs(ushort w) { return w>=0x4e00&&w<0x9fa6; } //是否gbk汉字第一字节,分布范围大约 30000多 static rbool is_chs_first(uchar ch) { return ch>=0x81&&ch<=0xfd; } #ifndef _MSC_VER static ushort unicode(int index) { return *(ushort*)&g_unicode[index*2]; } static ushort gbk(int index) { return *(ushort*)&g_gbk[index*2]; } #endif static char& get_second(ushort& ch) { return *((char*)&ch+1); } static char& get_first(ushort& ch) { return *((char*)&ch); } //返回所需缓存区大小 static int gbk_to_utf8_c(uchar* src,uchar* dst) { rstr s=gbk_to_utf8(src); s.push(0); if(dst!=null) { memcpy(dst,s.begin(),s.count()); } return s.count(); } static int gbk_to_utf16_c(uchar* src,uchar* dst) { rstr s=gbk_to_utf16(src); s.push(0); s.push(0); if(dst!=null) { memcpy(dst,s.begin(),s.count()); } return s.count(); } static int utf8_to_gbk_c(uchar* src,uchar* dst) { rstr s=utf8_to_gbk(src); s.push(0); if(dst!=null) { memcpy(dst,s.begin(),s.count()); } return s.count(); } static int utf8_to_utf16_c(uchar* src,uchar* dst) { rstr s=utf8_to_utf16(src); s.push(0); s.push(0); if(dst!=null) { memcpy(dst,s.begin(),s.count()); } return s.count(); } static int utf16_to_gbk_c(uchar* src,uchar* dst) { rstr s; for(uchar* p=src;;p+=2) { if(*p==0&&*(p+1)==0) { s.set_size(p-src); memcpy(s.begin(),src,s.count()); break; } } s=utf16_to_gbk(s); s.push(0); if(dst!=null) { memcpy(dst,s.begin(),s.count()); } return s.count(); } static int utf16_to_utf8_c(uchar* src,uchar* dst) { rstr s; for(uchar* p=src;;p+=2) { if(*p==0&&*(p+1)==0) { s.set_size(p-src); memcpy(s.begin(),src,s.count()); break; } } s=utf16_to_utf8(s); s.push(0); if(dst!=null) { memcpy(dst,s.begin(),s.count()); } return s.count(); } }; #endif ================================================ FILE: rlib/rdb.h ================================================ #ifndef rdb_h__ #define rdb_h__ #include "rfile.h" #define rdbint rdb //TL是数据长度,TA是地址 template//uchar,ushort,uint,uint64 class rdb { public: rfile m_file;//use multi thread please define multi object rbuf m_index; enum { c_null,//空数据 c_real, c_cp,//压缩数据 c_error//异常数据 }; rdb() { } rdb(rstrw name,rstrw mode="r") { open(name,mode); } rbool close() { return m_file.close(); } rbool open_off(rstrw name,int off,rstrw mode="r") { if(!m_file.open(name,mode)) return false; m_file.set_off(off); TL count; if(!m_file.read(r_size(count),&count)) return false; TL cmax; if(!m_file.read(r_size(cmax),&cmax)) return false; m_index.realloc_n_not_change(cmax); if(!m_file.read(count*r_size(TA),m_index.begin())) return false; m_index.m_count=count; for(int i=0;i=m_index.count()||i<0) return false; if(m_index[i]==0) return true; char flag; TA off=m_index[i]; if(!m_file.read(off,r_size(flag),&flag)) return false; if(flag==c_null) return true; if(flag!=c_real) return false; TL len; off+=r_size(flag); if(!m_file.read(off,r_size(len),&len)) return false; data.m_buf.realloc_n(len); off+=r_size(len); if(!m_file.read(off,data.count(),data.begin())) return false; return true; } rbool write(int i,const rstr& data) { if(i>=m_index.count()||i<0) return false; char flag=c_null; TA off=m_index[i]; if(!m_file.write(off,r_size(flag),&flag)) return false; flag=c_real; off=m_file.size(); m_index[i]=off; if(!m_file.write(off,r_size(flag),&flag)) return false; off+=r_size(flag); TL len=data.count(); if(!m_file.write(off,r_size(len),&len)) return false; off+=r_size(len); if(!m_file.write(off,data.count(),data.begin())) return false; if(!m_file.write(get_index_off(i),r_size(TA),&m_index[i])) return false; return true; } rbool write_new(const rstr& data) { if(m_index.m_count>=m_index.m_cmax) if(!extend()) return false; TA off; off=m_file.size(); m_index.push(off); char flag=c_real; if(!m_file.write(off,r_size(flag),&flag)) return false; off+=r_size(flag); TL len=data.count(); if(!m_file.write(off,r_size(len),&len)) return false; off+=r_size(len); if(!m_file.write(off,data.count(),data.begin())) return false; int i=m_index.count()-1; if(!m_file.write(get_index_off(i),r_size(TA),&m_index[i])) return false; if(!m_file.write(0,r_size(TL),&m_index.m_count)) return false; return true; } rbool extend() { if(m_file.size()>=128*1024*1024) return false; rbuf temp; temp.alloc(m_file.size()-get_data_off()); if(!m_file.read(get_data_off(),temp.size(),temp.begin())) return false; int cmax=m_index.m_cmax; m_index.realloc_not_change(m_index.extend_num(m_index.count())); for(int i=0;i struct rdic_i { T val;//val必须前置 rstr key; friend rbool operator<(const rdic_i& a,const rdic_i& b) { return a.key struct rdic { rset > m_set; void clear() { m_set.clear(); } T* begin() const { return (T*)m_set.begin(); } T* end() const { return (T*)m_set.end(); } T* next(T* p) const { return (T*)m_set.next((rdic_i*)p); } rstr get_key(T* p) { return ((rdic_i*)p)->key; } rbool empty() const { return m_set.empty(); } int count() const { return m_set.count(); } rbool exist(const rstr& key) const { rdic_i item; item.key=key; return m_set.exist(item); } T* find(const rstr& key) const { rdic_i item; item.key=key; return (T*)m_set.find(item); } void insert(const rstr& key,const T& val) { rdic_i item; item.key=key; item.val=val; m_set.insert(item); } T& operator[](const rstr& key) { rdic_i item; item.key=key; m_set.insert_c(item); rdic_i* p=m_set.find(item); return p->val; } }; #endif ================================================ FILE: rlib/rdir.h ================================================ #ifndef rdir_h__ #define rdir_h__ #include "rfile.h" #include "rf.h" #include "rstrw.h" #include "rlist.h" #ifdef _MSC_VER #include #include #else //#include //#include //#include //#include #endif //todo 去掉这个结构体 struct rdir_item { rstrw path; rbool is_dir; rdir_item() { is_dir=false; } friend rbool operator<=(const rdir_item& a,const rdir_item& b) { return a.path<=b.path; } }; #ifndef MAX_PATH #define MAX_PATH 260 #endif struct rdir { static rstrw erase_suffix(const rstrw& name) { rstrw s=get_suffix(name); return name.sub(0,name.count()-s.count()-1); } static rstrw get_suffix(const rstrw& name) { ushort ch='.'; int pos=name.find_last(ch); if(pos=path.count()) return rstrw(); return path.sub(0,pos+1); } static rstrw get_name(const rstrw& path) { if(path.empty()) return rstrw(); ushort ch='/'; int pos=path.find_last(ch); if(pos>=path.count()) return rstrw(); return path.sub(pos+1); } static rstrw get_exe_name() { wchar buf[MAX_PATH+1]; if(GetModuleFileNameW(null,(wchar*)buf,MAX_PATH)==0) return rstrw(); return dir_std(rstrw(buf)); } static rstrw get_exe_dir() { rstrw ret; #ifndef __COCOS2D_H__ wchar buf[MAX_PATH+1]; if(GetModuleFileNameW(null,(wchar*)buf,MAX_PATH)==0) return ret; ret=buf; #else ret=rstr(FileUtils::getInstance()->fullPathForFilename( "rinf/key.txt").c_str()); ret=ret.sub(0,ret.count()-rstr("rinf/key.txt").count()+1); #endif ret=dir_std(ret); ret=get_prev_dir(ret); return ret; } static rstrw get_cur_dir() { rstrw ret; #ifndef __COCOS2D_H__ wchar buf[MAX_PATH+1]; if(GetCurrentDirectoryW(MAX_PATH,(wchar*)buf)==0) return ret; ret=buf; ret=dir_std(ret); ret+='/'; #else ret=rstr(FileUtils::getInstance()->fullPathForFilename( "rinf/key.txt").c_str()); ret=ret.sub(0,ret.count()-rstr("rinf/key.txt").count()+1); ret=dir_std(ret); ret=get_prev_dir(ret); #endif return ret; } //非win系统区分大小写 static rstrw dir_std(rstrw s) { for(ushort* p=s.begin();p!=s.end();++p) { if('\\'==*p) { *p='/'; } } return s; } static rbuf get_file_bfs(rstrw path) { rbuf ret; #ifndef __COCOS2D_H__ if(path.count()>4096||0==path.count())//ubuntu's max path len is 4096 { return ret; } path=dir_std(path); if(path.count()>=1&&path[path.count()-1]!='/') { path+=rstr("/"); } rlist queue; queue.push(path); while(!queue.empty()) { path=queue.pop_front(); WIN32_FIND_DATAW wfd; HANDLE handle=FindFirstFileW( (path+rstr("*.*")).cstrw_t(),&wfd); if(handle==INVALID_HANDLE_VALUE) continue; while(true) { rdir_item item; rstrw name=dir_std(wfd.cFileName); if(rstr(".")!=name&&rstr("..")!=name) { item.path=path+name; if(0!=(wfd.dwFileAttributes& FILE_ATTRIBUTE_DIRECTORY)) { item.is_dir=true; queue.push(item.path+rstr("/")); } ret.push(item); } ifn(FindNextFileW(handle,&wfd)) { break; } } FindClose(handle); } #endif return ret; } }; #endif ================================================ FILE: rlib/rf.h ================================================ #ifndef rf_h__ #define rf_h__ #include "rstr.h" #include #include #include #ifdef _MSC_VER #include #include #else #include #include #endif #include #include //#include struct rf { enum { c_block_size=(64*1024) }; static void error(rstr s=rstr()) { printf("\n%s\n",s.cstr()); getch(); exit(1); } static void printl(rstr s=rstr()) { printf("%s\n",s.cstr()); } static void print(rstr s=rstr()) { printf("%s ",s.cstr()); } static void print(const char* s) { printf("%s ",s);//必须加上%s防止字符串中出现特殊字符 } static int tick() { #ifdef _MSC_VER return GetTickCount(); #else return (int)((double)clock()/CLOCKS_PER_SEC*1000); #endif } static void sleep(int milliseconds) { if(milliseconds<50) { milliseconds=50; } #ifdef _MSC_VER Sleep(milliseconds); #else if(milliseconds>2100000000) ::sleep(milliseconds/1000); else usleep(milliseconds*1000); #endif } static int getch() { #ifdef _MSC_VER return ::getch(); #else struct termios oldt,newt; int ch; tcgetattr(STDIN_FILENO,&oldt); newt=oldt; newt.c_lflag&=~(ICANON|ECHO); tcsetattr(STDIN_FILENO,TCSANOW,&newt); ch=getchar(); tcsetattr(STDIN_FILENO,TCSANOW,&oldt); return ch; #endif } static int round(double a){ return (int)(a+0.5); } /*static int rand_n(int n){ random_device rd; return rd()%n; }*/ static void srand() { ::srand((uint)::time(null)); } static int rand() { return ::rand(); } static uchar get_bitmap(uchar bitmap[],int block) { uchar result; result=bitmap[block/8]>>(7-block%8); result&=0x1; return result; } static void set_bitmap(uchar bitmap[],int block) { bitmap[block/8]|=(1<<(7-block%8)); } static rbool execmd(const char* p) { return 0==::system(p); } #ifdef _MSC_VER #else static rbool execmd_r(const char* cmd,rstr& result) { result=rstr(); FILE* fp=popen(cmd,"r"); if(null==fp) { return false; } rbuf buf(4096+1); buf.m_p[4096]=0; int count; while(true) { count=fread(buf.m_p,1,4096,fp); if(count>0) { buf.m_p[count]=0; result+=buf.m_p; } if(count<4096) { break; } } pclose(fp); return true; } #endif }; #endif ================================================ FILE: rlib/rfile.h ================================================ #ifndef rfile_h__ #define rfile_h__ #include "rbuf.h" #include "rstr.h" #include "rf.h" #include "rcode.h" #include "rstrw.h" #ifdef _MSC_VER #else //#define _FILE_OFFSET_BITS 64 //#include #endif struct rfile { FILE* m_fp; ~rfile() { close(); } rfile() { m_fp=null; } rfile(rstrw name,rstrw mode="r") { open(name,mode); } rbool close() { if(null==m_fp) { return false; } if(0!=fclose(m_fp)) { return false; } m_fp=null; return true; } //mode: rb只读,wb重新创建写,rb+读写 //推荐用 r只读,w写,rw读写,本函数只有二进制模式 rbool open(rstrw name,rstrw mode="r") { m_fp=null; if(!exist(name)) { if(rstrw("rw")==mode) { if(!create(name)) { return false; } } else return false; } if(rstrw("r")==mode) { mode=rstrw("rb"); } elif(rstrw("w")==mode) { mode=rstrw("wb"); } elif(rstrw("rw")==mode) { mode=rstrw("rb+"); } m_fp=fopen_w(name.cstrw_t(),mode.cstrw_t()); if(null==m_fp) { return false; } return true; } //强制打开一个新文件 rbool open_n(rstrw name,rstrw mode="rw") { remove(name); return open(name,mode); } rbool read(int off,int len,void* buf) { return read((int8)off,len,buf); } rbool read(int8 off,int len,void* buf) { if(null==m_fp) { return false; } set_off8(off); return len==(int)fread(buf,1,len,m_fp); } rbool read(int len,void* buf) { if(null==m_fp) { return false; } return len==(int)fread(buf,1,len,m_fp); } //读取并返回整个文件,通常用于小文件 rstr read_all() { rstr ret; ret.set_size(size()); if(!read(0,size(),ret.begin())) { return rstr(); } return r_move(ret); } //直接读一个小文件 static rstr read_all_n(const rstrw& name) { rfile file(name); rstr ret; ret.set_size(file.size()); if(!file.read(0,file.size(),ret.begin())) { return rstr(); } return r_move(ret); } //读取一行(跳过空行) rstr read_line() { rstr ret; uchar c; while(read(1,&c)) { if('\r'==c||'\n'==c) { if(0==ret.count()) { continue; } else { return ret; } } ret+=c; } return r_move(ret); } //读取一行,仅用于utf16文件 rstrw read_line_w() { rstrw ret; ushort c; while(read(2,&c)) { if('\r'==c||'\n'==c) { if(0==ret.count()) { continue; } else { return ret; } } ret+=c; } return r_move(ret); } rbool write(int off,int len,const void* buf) { return write((int8)off,len,buf); } rbool write(int8 off,int len,const void* buf) { if(null==m_fp) { return false; } set_off8(off); return len==(int)fwrite(buf,1,len,m_fp); } rbool write(int len,const void* buf) { if(null==m_fp) { return false; } return len==(int)fwrite(buf,1,len,m_fp); } rbool write(rstr s) { return write(s.size(),s.begin()); } rbool write_line(rstr s) { return write(s.size(),s.begin())&&write(1,"\n"); } rbool write_line_w(rstrw s) { return write(s.size(),s.begin())&&write(2,rstrw("\n").cstrw_t()); } static rbool write_all_n(const rstrw& name,const rstr& cont) { rfile file; ifn(file.open_n(name)) { return false; } return file.write(cont); } int size() { return (int)size8(); } int8 size8() { if(null==m_fp) { return 0;//返回-1和返回0各有利弊 } int8 cur=get_off8(); fseek8(m_fp,0,SEEK_END); int8 ret=get_off8(); set_off8(cur); return ret; } int get_off() { return (int)get_off8(); } int8 get_off8() { if(null==m_fp) { return 0; } return ftell8(m_fp); } rbool set_off(int off) { return set_off8((int8)off); } rbool set_off8(int8 off) { return 0==fseek8(m_fp,off,SEEK_SET); } static rbool exist(rstrw name) { FILE* fp=fopen_w(name.cstrw_t(),rstrw("rb").cstrw_t()); if(null==fp) { return false; } fclose(fp); return true; } //强制创建文件 static rbool create(rstrw name,int8 size=0) { FILE* fp=fopen_w(name.cstrw_t(),rstrw("wb").cstrw_t()); if(null==fp) return false; fclose(fp); if(size>0) { rfile file(name); file.set_off8(size-1); if(!file.write(1,"\0")) { return false; } return file.close(); } return true; } static int8 ftell8(FILE* fp) { #ifdef _MSC_VER return _ftelli64(fp); #else return ftello(fp); #endif } static int fseek8(FILE* fp,int8 off,int start) { #ifdef _MSC_VER return _fseeki64(fp,off,start); #else return fseeko(fp,off,start); #endif } static FILE* fopen_w(wchar* name,wchar* mode) { #ifdef _MSC_VER return _wfopen(name,mode); #else return fopen(rstrw(name).torstr().cstr_t(), rstrw(mode).torstr().cstr_t()); #endif } static rbool remove(rstrw name) { #ifdef _MSC_VER return 0==_wremove(name.cstrw_t()); #else return 0==::remove(name.torstr().cstr_t()); #endif } static rbool rename(rstrw oldname,rstrw newname) { #ifdef _MSC_VER return 0==::_wrename(oldname.cstrw_t(),newname.cstrw_t()); #else return 0==::rename(oldname.torstr().cstr_t(), newname.torstr().cstr_t()); #endif } #ifdef _MSC_VER static int get_exe_size(char* name) { rstr temp=rfile::read_all_n(name); if(temp.empty()) { return 0; } uchar* data=temp.begin(); PIMAGE_DOS_HEADER dos_head=(PIMAGE_DOS_HEADER)data; PIMAGE_OPTIONAL_HEADER op_head=(PIMAGE_OPTIONAL_HEADER)( data+dos_head->e_lfanew+4+20); PIMAGE_FILE_HEADER file_head=(PIMAGE_FILE_HEADER)( data+dos_head->e_lfanew+4); PIMAGE_SECTION_HEADER sec=(PIMAGE_SECTION_HEADER)( data+dos_head->e_lfanew+sizeof(IMAGE_NT_HEADERS)); int size=op_head->SizeOfHeaders; for(int i=0;iNumberOfSections;i++) { size+=sec[i].SizeOfRawData; } return size; } #endif static int8 get_update_time(rstrw path) { #ifdef _MSC_VER int8 ft; HANDLE hFile = CreateFileW(path.cstrw_t(), GENERIC_READ, FILE_SHARE_READ, null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, null); if(hFile == INVALID_HANDLE_VALUE) return 0; if(!GetFileTime(hFile,null,null,(FILETIME*)&ft)) return 0; CloseHandle(hFile); return ft; #else return 0; /*struct stat buf; int ret=stat(path,&buf); if(0!=ret) { return false; } *ft=(int64)buf.st_mtime; return true;*/ #endif } static int8 get_size8(rstrw name) { rfile file(name); return file.size8(); } }; #endif ================================================ FILE: rlib/rhash.h ================================================ #ifndef rhash_h__ #define rhash_h__ #include "rstr.h" template struct rhash_i { T val; rstr name; rhash_i* pre; rhash_i* next; }; template struct rhash { rbuf*> m_hash; int m_count; ~rhash() { clear(); } rhash() { init(); } T& operator[](const rstr& name) { T* p=(T*)find(name); if(p) return *p; //找不到则插入一个空值 T a; insert(a,name); p=(T*)find(name); return *p; } void init() { //两个字节消耗256K内存,如果用3个字节需要64M内存 m_hash.realloc_n(65536); for(int i=0;i* p=m_hash[i]; while(p!=null) { rhash_i* temp=p; p=p->next; r_delete(temp); } } } init(); } rbool exist(const rstr& name) { return find(name)!=null; } T* find(const rstr& name) { int addr=get_addr(name); rhash_i* p=m_hash[addr]; while(p) { if(p->name==name) return (T*)p; p=p->next; } return null; } //如果重复则不插入 void insert_c(T& a,rstr name=rstr()) { if(exist(name)) return; insert(a,name); } void insert(T& a,rstr name=rstr()) { int addr=get_addr(name); rhash_i* p=r_new >(); p->name=name; p->next=m_hash[addr]; p->pre=null; p->val=a; if(m_hash[addr]!=null) m_hash[addr]->pre=p; m_hash[addr]=p; m_count++; } rbool erase(rstr name=rstr()) { rhash_i* p=(rhash_i*)find(name); if(p==null) return false; if(p->pre!=null) { p->pre->next=p->next; if(p->next!=null) p->next->pre=p->pre; } else { m_hash[get_addr(name)]=p->next; if(p->next!=null) p->next->pre=null; } r_delete(p); m_count--; return true; } T* begin() { for(int i=0;i=0;i--) if(m_hash[i]!=null) { rhash_i* p=m_hash[i]; while(p!=null&&p->next!=null) p=p->next; return (T*)p; } return null; } //这个next有点慢,能不能把一个桶的最后一个元素的next指向下一个桶? T* next(T* cur) { rhash_i* p=(rhash_i*)cur; if(p->next!=null) return (T*)p->next; int addr=get_addr(p->name); for(int i=addr+1;i list=rdir::get_file_bfs(path); r_qsort(list); rdbint db(filename,rstrw("rw")); for(int i=0;i struct rlist_i { T val; rlist_i* prev; rlist_i* next; }; template struct rlist { rlist_i* m_front; rlist_i* m_rear; int m_count; ~rlist() { clear(); } rlist() { init(); } void init() { m_front=null; m_rear=null; m_count=0; } void clear() { while(m_front) { m_rear=m_front->next; r_delete(m_front); m_front=m_rear; } init(); } rbool empty() const { return m_count==0; } int count() const { return m_count; } T& top() { return *(T*)m_rear; } void push(const T& a) { rlist_i* p=r_new >(); p->val=a; p->next=null; p->prev=m_rear; if(empty()) { m_front=p; m_rear=p; } else { m_rear->next=p; m_rear=p; } m_count++; } T pop() { m_count--; rlist_i* p=m_rear; T ret=p->val; m_rear=p->prev; if(m_rear) { m_rear->next=null; } if(empty()) { m_front=null; } r_delete(p); return ret; } void push_front(const T& a) { rlist_i* p=r_new >(); p->val=a; p->next=m_front; p->prev=null; if(empty()) { m_front=p; m_rear=p; } else { m_front->prev=p; m_front=p; } m_count++; } T pop_front() { m_count--; rlist_i* p=m_front; T ret=p->val; m_front=p->next; if(m_front) { m_front->prev=null; } if(empty()) { m_rear=null; } r_delete(p); return ret; } //前插 void insert(T* pos,const T& a) { if(pos==null) { push(a); return; } rlist_i* cur=(rlist_i*)pos; rlist_i* p=r_new >(); p->val=a; p->next=cur; p->prev=cur->prev; if(cur->prev) { cur->prev->next=p; } cur->prev=p; if(p->prev==null) { m_front=p; } if(p->next==null) { m_rear=p; } m_count++; } void insert(int pos,const T& a) { insert(index(pos),a); } void erase(T* pos) { if(pos==null) { return; } rlist_i* cur=(rlist_i*)pos; if(cur->prev==null) { m_front=cur->next; } if(cur->next==null) { m_rear=cur->prev; } if(cur->prev) { cur->prev->next=cur->next; } if(cur->next) { cur->next->prev=cur->prev; } r_delete(cur); m_count--; } void erase(int pos) { erase(index(pos)); } T* index(int n) { rlist_i* p=m_front; for(;n;n--) { if(p==null) { return null; } p=p->next; } return (T*)p; } T& operator[](int n) { T* p=index(n); return *p; } T* begin() { return (T*)m_front; } T* end() { return null; } T* next(void* p) { return (T*)((rlist_i*)p)->next; } T* prev(void* p) { return (T*)((rlist_i*)p)->prev; } }; #endif ================================================ FILE: rlib/rmutex.h ================================================ #ifndef rmutex_h__ #define rmutex_h__ #ifdef _MSC_VER #include #else #include #endif struct rmutex { #ifdef _MSC_VER CRITICAL_SECTION m_mutex; #else sem_t m_mutex; #endif rmutex() { #ifdef _MSC_VER InitializeCriticalSection(&m_mutex); #else sem_init(&m_mutex,0,1); #endif } ~rmutex() { #ifdef _MSC_VER DeleteCriticalSection(&m_mutex); #else #endif } void enter() { #ifdef _MSC_VER EnterCriticalSection(&m_mutex); #else sem_wait(&m_mutex); #endif } void leave() { #ifdef _MSC_VER LeaveCriticalSection(&m_mutex); #else sem_post(&m_mutex); #endif } }; //用于整个函数的局部临时mutex struct rmutex_t { rmutex* m_p; rmutex_t(rmutex& m) { m_p=&m; m_p->enter(); } ~rmutex_t() { m_p->leave(); } }; #endif ================================================ FILE: rlib/rset.h ================================================ #ifndef rset_h__ #define rset_h__ #include "rbase.h" template struct rset_i { T key; rset_i* father; rset_i* left; rset_i* right; int col; }; template struct rset { rset_i* m_root; rset_i m_nil; int m_count; enum { c_black, c_red }; ~rset() { clear(); } rset() { init(); } rset(const rset& a) { init(); //用递归拷贝更快 copy_x(&a.m_nil,a.m_root); /*for(T* p=a.begin();p!=a.end();p=a.next(p)) insert(*p);*/ } void operator=(const rset& a) { clear(); copy_x(&a.m_nil,a.m_root); /*for(T* p=a.begin();p!=a.end();p=a.next(p)) insert(*p);*/ } void copy_x(const rset_i* xnil,rset_i* x) { if(x==xnil) { return; } copy_x(xnil,x->left); copy_x(xnil,x->right); insert(x->key); } void init() { m_nil.father=&m_nil; m_nil.left=&m_nil; m_nil.right=&m_nil; m_nil.col=c_black; m_root=&m_nil; m_count=0; } void clear() { clear_x(m_root); init(); } void clear_x(rset_i* x) { if(x==&m_nil) { return; } clear_x(x->left); clear_x(x->right); r_delete(x); } rbool empty() const { return m_count==0; } int count() const { return m_count; } void left_rotate(rset_i* x) { rset_i* y; if(x->right==&m_nil) { return; } y=x->right; x->right=y->left; if(y->left!=&m_nil) { y->left->father=x; } y->father=x->father; if(x->father==&m_nil) { m_root=y; } elif(x->father->left==x) { x->father->left=y; } else { x->father->right=y; } y->left=x; x->father=y; } void right_rotate(rset_i* x) { rset_i* y; if(x->left==&m_nil) { return; } y=x->left; x->left=y->right; if(y->right!=&m_nil) { y->right->father=x; } y->father=x->father; if(x->father==&m_nil) { m_root=y; } elif(x->father->left==x) { x->father->left=y; } else { x->father->right=y; } y->right=x; x->father=y; } //重复代码需简化 void insert_fixup(rset_i* z) { rset_i* y; while(z->father->col==c_red) { if(z->father==z->father->father->left) { y=z->father->father->right; if(y->col==c_red) { z->father->col=c_black; y->col=c_black; z->father->father->col=c_red; z=z->father->father; } else { if(z==z->father->right) { z=z->father; left_rotate(z); } z->father->col=c_black; z->father->father->col=c_red; right_rotate(z->father->father); } } else { y=z->father->father->left; if(y->col==c_red) { z->father->col=c_black; y->col=c_black; z->father->father->col=c_red; z=z->father->father; } else { if(z==z->father->left) { z=z->father; right_rotate(z); } z->father->col=c_black; z->father->father->col=c_red; left_rotate(z->father->father); } } } m_root->col=c_black; } void insert_p(rset_i* z) { rset_i* y=&m_nil; rset_i* x=m_root; while(x!=&m_nil) { y=x; if(z->keykey) { x=x->left; } else { x=x->right; } } z->father=y; if(y==&m_nil) { m_root=z; } elif(z->keykey) { y->left=z; } else { y->right=z; } z->left=&m_nil; z->right=&m_nil; z->col=c_red; insert_fixup(z); } void insert(const T& a) { rset_i* p=r_new >(); p->key=a; insert_p(p); m_count++; } void insert_c(const T& a) { if(exist(a)) { return; } insert(a); } /*void test(rset_i* z) { if(z!=&m_nil) { test(z->left); z->key.printl(); test(z->right); } }*/ void erase_fixup(rset_i* x) { rset_i* w; while(x!=m_root&&x->col==c_black) { if(x==x->father->left) { w=x->father->right; if(w->col==c_red) { w->col=c_black; x->father->col=c_red; left_rotate(x->father); w=x->father->right; } if(w->left->col==c_black&&w->right->col==c_black) { w->col=c_red; x=x->father; } else { if(w->right->col==c_black) { w->left->col=c_black; w->col=c_red; right_rotate(w); w=x->father->right; } w->col=x->father->col; x->father->col=c_black; w->right->col=c_black; left_rotate(x->father); x=m_root; } } else { w=x->father->left; if(w->col==c_red) { w->col=c_black; x->father->col=c_red; right_rotate(x->father); w=x->father->left; } if(w->right->col==c_black&&w->left->col==c_black) { w->col=c_red; x=x->father; } else { if(w->left->col==c_black) { w->right->col=c_black; w->col=c_red; left_rotate(w); w=x->father->left; } w->col=x->father->col; x->father->col=c_black; w->left->col=c_black; right_rotate(x->father); x=m_root; } } } x->col=c_black; } void transplant(rset_i* u,rset_i* v) { if(u->father==&m_nil) { m_root=v; } elif(u==u->father->left) { u->father->left=v; } else { u->father->right=v; } v->father=u->father; } void erase_p(rset_i* z) { rset_i* y=z; rset_i* x; int y_original_col=y->col; if(z->left==&m_nil) { x=z->right; transplant(z,z->right); } elif(z->right==&m_nil) { x=z->left; transplant(z,z->left); } else { y=minimum(z->right); y_original_col=y->col; x=y->right; if(y->father==z) { x->father=y; } else { transplant(y,y->right); y->right=z->right; y->right->father=y; } transplant(z,y); y->left=z->left; y->left->father=y; y->col=z->col; } if(y_original_col==c_black) { erase_fixup(x); } } void erase(const T& a) { rset_i* x=search(m_root,a); if(x!=&m_nil) { erase_p(x); r_delete(x); m_count--; } } bool exist(const T& a) const { return search(m_root,a)!=&m_nil; } rset_i* successor(rset_i* x) const { rset_i* y; if(x->right!=&m_nil) { return minimum(x->right); } y=x->father; while(y!=&m_nil&&x==y->right) { x=y; y=y->father; } return y; } rset_i* predecessor(rset_i* x) const { rset_i* y; if(x->left!=&m_nil) { return maximum(x->left); } y=x->father; while(y!=&m_nil&&x==y->left) { x=y; y=y->father; } return y; } rset_i* minimum(rset_i* x) const { while(x->left!=&m_nil) { x=x->left; } return x; } rset_i* maximum(rset_i* x) const { while(x->right!=&m_nil) { x=x->right; } return x; } rset_i* search(rset_i* x,const T& a) const { while(x!=&m_nil&&r_not_equal(a,x->key)) { if(akey) { x=x->left; } else { x=x->right; } } return x; } T* find(const T& a) const { rset_i* x=search(m_root,a); if(x==&m_nil) { return null; } return (T*)x; } T* next(void* p) const { rset_i* x=successor((rset_i*)p); if(x==&m_nil) { return null; } return (T*)x; } T* prev(void* p) const { rset_i* x=predecessor((rset_i*)p); if(x==&m_nil) { return null; } return (T*)x; } T* begin() const { rset_i* x=minimum(m_root); if(x==&m_nil) { return null; } return (T*)x; } static T* end() { return null; } T* index(int n) const { T* p=begin(); for(;n;n--) { if(p==null) { return null; } p=next(p); } return p; } /*T& operator[](int n) { T* p=index(n); return *p; }*/ }; #endif ================================================ FILE: rlib/rsock.h ================================================ #ifndef rsock_h__ #define rsock_h__ #ifdef _MSC_VER #include #include typedef UINT_PTR rsocket; #else #include #include #include #include #include #include #include #include typedef int rsocket; #endif #include "rbase.h" #include "rstr.h" #include #include #include #include struct rsock//only use TCP { rsocket m_socket; enum { c_time_out=10, c_max_ip_len=15, }; rsock() { #ifdef _MSC_VER m_socket=INVALID_SOCKET; #else m_socket=-1; #endif } ~rsock() { #ifdef _MSC_VER if(m_socket!=INVALID_SOCKET) { close(); } #else if(m_socket<0) { close(); } #endif } rbool socket() { m_socket=::socket(AF_INET,SOCK_STREAM,0); #ifdef _MSC_VER return m_socket!=INVALID_SOCKET; #else return m_socket>=0; #endif } rbool connect(const char* hostname,int port) { struct hostent* hp=gethostbyname(hostname); if(null==hp) { return false; } struct sockaddr_in addr; addr.sin_family=AF_INET; #ifdef _MSC_VER memcpy(&addr.sin_addr.S_un.S_addr,hp->h_addr_list[0],hp->h_length); #else memcpy(&addr.sin_addr.s_addr,hp->h_addr_list[0],hp->h_length); #endif addr.sin_port=htons((ushort)port); int nRevTime = c_time_out*1000; setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO, (char*)&nRevTime,r_size(nRevTime)); setsockopt(m_socket,SOL_SOCKET,SO_RCVTIMEO, (char*)&nRevTime,r_size(nRevTime)); //设置非阻塞方式连接 #ifdef _MSC_VER unsigned long ul=1; if(SOCKET_ERROR==ioctlsocket(m_socket,FIONBIO,(unsigned long*)&ul)) { return false; } if(SOCKET_ERROR!=::connect(m_socket,(struct sockaddr*)&addr,r_size(addr))) { return false; } struct timeval timeout; fd_set r; FD_ZERO(&r); FD_SET(m_socket,&r); timeout.tv_sec=c_time_out;//连接超时 timeout.tv_usec=0; if(select(0,0,&r,0,&timeout)<=0) { return false; } ul=0; if(SOCKET_ERROR==ioctlsocket(m_socket,FIONBIO,(unsigned long*)&ul)) { return false; } #else /*if(0!=fcntl(m_socket, F_SETFL, fcntl(m_socket, F_GETFL) | O_NONBLOCK)) { return false; }*/ unsigned long ul=1; if(0!=ioctl(m_socket,FIONBIO,(unsigned long*)&ul)) { return false; } if(0<=::connect(m_socket,(struct sockaddr*)&addr,r_size(addr))) { return false; } struct timeval timeout; fd_set r; FD_ZERO(&r); FD_SET(m_socket,&r); timeout.tv_sec=c_time_out;//连接超时 timeout.tv_usec=0; if(select(m_socket+1,0,&r,0,&timeout)<=0) { return false; } ul=0; if(0!=ioctl(m_socket,FIONBIO,(unsigned long*)&ul)) { return false; } #endif return true; } rbool close() { #ifdef _MSC_VER int ret=closesocket(m_socket); m_socket=INVALID_SOCKET; #else int ret=::close(m_socket); m_socket=-1; #endif return 0==ret; } static rbool close(rsocket socket) { #ifdef _MSC_VER int ret=closesocket(socket); #else int ret=::close(socket); #endif return 0==ret; } int send(int size,const void* data)//failed will return -1 { #ifdef _MSC_VER int ret=::send(m_socket,(char*)data,size,0); #else int ret=::send(m_socket,(char*)data,size,MSG_NOSIGNAL); #endif /*if(ret<=0) { return -1; }*/ return ret; } int recv(int size,void* data) { #ifdef _MSC_VER int ret=::recv(m_socket,(char*)data,size,0); #else int ret=::recv(m_socket,(char*)data,size,MSG_NOSIGNAL); #endif /*if(ret<=0) { return -1; }*/ return ret; } int send_all(int size,const void* data) { int sendBytes=0; while(sendBytes=0; } rbool listen() { #ifdef _MSC_VER return ::listen(m_socket,5)>=0; #else return ::listen(m_socket,5)>=0; #endif } //clientip array at least c_max_ip_len+1 length rbool accept(rsocket* socket,char* clientip=null,int* port=null) { struct sockaddr_in addr; int len=r_size(addr); #ifdef _MSC_VER *socket=::accept(m_socket,(struct sockaddr*)&addr,&len); if(INVALID_SOCKET==*socket) { return false; } #else *socket=::accept(m_socket,(struct sockaddr*)&addr,(socklen_t*)&len); if(*socket<0) { return false; } #endif return true; } rbool listen_direct(int port) { return socket()&&bind(port)&&listen(); } rbool connect_direct(const char* hostname,int port) { return socket()&&connect(hostname,port); } rbool sends(rstr s) { if(4!=send(4,&s.m_buf.m_count)) { return false; } return s.count()==send_all(s.count(),s.begin()); } rstr recvs() { rstr ret; int size; if(recv(4,&size)!=4) { return ret; } if(size<=0) { return ret; } ret.m_buf.realloc_n(size); int recvBytes=0; while(recvBytes #else #include #endif struct rstr { rbuf m_buf; ~rstr() { } rstr() { } rstr(const void* p) { set(p); } rstr(void* p,int len) { m_buf.alloc(len); memcpy(begin(),p,len); } rstr(const void* p,const void* q) { /*if(p>=q) { error(""); }*/ int len=(int)((uchar*)q-(uchar*)p); m_buf.alloc(len); memcpy(begin(),p,len); } rstr(int i) { char tmp[20]; sprintf(tmp,"%d",i); set(tmp); } rstr(uint i) { char tmp[20]; sprintf(tmp,"%u",i); set(tmp); } rstr(double i) { char tmp[128]; sprintf(tmp,"%f",i); set(tmp); } rstr(int8 i) { char tmp[100]; #ifdef _MSC_VER sprintf(tmp,"%I64d",i); #else sprintf(tmp,"%lld",i); #endif set(tmp); } rstr(const rstr& s) { m_buf.alloc_not_change(s.m_buf.m_cmax); m_buf.m_count=s.count(); memcpy(begin(),s.begin(),s.count()); } rstr(rstr&& s) { m_buf.move(s.m_buf); } //todo:改为const int toint() { int result; sscanf(cstr_t(),"%d",&result); return result; } uint touint() { uint result; sscanf(cstr_t(),"%u",&result); return result; } double todouble() { double result; sscanf(cstr_t(),"%lf",&result); return result; } int8 toint8() { int64 result; #ifdef _MSC_VER sscanf(cstr_t(),"%I64d",&result); #else sscanf(cstr_t(),"%lld",&result); #endif return result; } rstr torstr() { return *this; } uchar* cstr() { push((uchar)0); pop(); return begin(); } char* cstr_t() { return (char*)cstr(); } ushort* cstrw() { push((uchar)0); push((uchar)0); pop(); pop(); return (ushort*)begin(); } wchar* cstrw_t() { return (wchar*)cstrw(); } //赋值函数千万不要让编译器自动生成 void operator=(const rstr& s) { m_buf.realloc_n_not_change(s.m_buf.m_cmax); m_buf.m_count=s.count(); memcpy(begin(),s.begin(),s.count()); //m_buf=a.m_buf; } void operator=(rstr&& s) { m_buf.free(); m_buf.move(s.m_buf); } uchar& operator[](int num) const { return m_buf[num]; } friend rbool operator==(const rstr& a,const rstr& b) { return a.m_buf==b.m_buf; } friend rbool operator!=(const rstr& a,const rstr& b) { return a.m_buf!=b.m_buf; } //有待优化 friend rstr operator+(const rstr& a,const rstr& b) { /*rstr ret; ret.m_buf=a.m_buf+b.m_buf; return ret;*/ int total=a.count()+b.count(); int max=r_max(a.m_buf.m_cmax,b.m_buf.m_cmax); rstr ret; if(total>max) { ret.m_buf.alloc_not_change(rbuf::extend_num(total)); } else { ret.m_buf.alloc_not_change(max); } ret.m_buf.m_count=total; memcpy(ret.begin(),a.begin(),a.m_buf.m_count); memcpy(ret.begin()+a.m_buf.m_count,b.begin(),b.m_buf.m_count); return r_move(ret); } void operator+=(const rstr& a) { m_buf+=a.m_buf; } void operator+=(rstr&& a) { m_buf+=r_move(a.m_buf); } void operator+=(uchar ch) { m_buf+=ch; } friend rbool operator<(const rstr& a,const rstr& b) { for(int i=0;i(const rstr& a,const rstr& b) { return bb); } friend rbool operator>=(const rstr& a,const rstr& b) { //return a>b||a==b; return !(a::extend_num(len)); m_buf.m_count=len; memcpy(m_buf.begin(),p,len); } void push(uchar ch) { m_buf.push(ch); } void push_front(uchar ch) { m_buf.push_front(ch); } uchar pop() { return m_buf.pop(); } uchar pop_front() { return m_buf.pop_front(); } int count() const { return m_buf.count(); } int size() const { return count(); } uchar* begin() const { return m_buf.begin(); } uchar* end() const { return m_buf.end(); } rbool empty() const { return m_buf.empty(); } void clear() { m_buf.clear(); } static uchar* next(void* p) { return ((uchar*)p)+1; } static uchar* prev(void* p) { return ((uchar*)p)-1; } uchar* pos(int num) const { return begin()+num; } int pos(void* p) const { return int((uchar*)p-begin()); } rstr sub(int begin) const { return sub(begin,count()); } rstr sub(int begin,int end) const { rstr ret; ret.m_buf=m_buf.sub(begin,end); return r_move(ret); } rbool erase(int begin,int end) { return m_buf.erase(begin,end); } rbool erase(int i) { return erase(i,i+1); } rbool insert(int pos,const rstr& a) { return m_buf.insert(pos,a.m_buf); } uchar get(int i) const { if(i>=count()) return 0; else return m_buf[i]; } uchar get_top() const { if(count()>0) { return m_buf.m_p[count()-1]; } return 0; } uchar get_bottom() const { if(count()>0) { return m_buf.m_p[0]; } return 0; } rbool is_number() const { if(empty()) { return false; } for(int i=0;i='a'&&(ch)<='z'||(ch)>='A'&&(ch)<='Z'); } static rbool is_number(uchar ch) { return ((ch)>='0'&&(ch)<='9'); } static uchar chartoup(uchar ch) { return ((ch)>='a'&&(ch)<='z'?(ch)-32:(ch)); } static int upchartonum(uchar ch) { return ((ch)>='A'?(ch)-'A'+10:(ch)-'0'); } static int chartonum(uchar ch) { return upchartonum(chartoup(ch)); } void print() { printf("%s ",cstr());//todo:多了一个空格 } void printl() { printf("%s\n",cstr()); } //todo 两个函数重复了 void format_t(const char* szFormat,...) { char szBuffer[1024]; va_list pArgList; va_start(pArgList,szFormat); #ifdef _MSC_VER _vsnprintf(szBuffer,r_size(szBuffer),szFormat,pArgList); #else vsnprintf(szBuffer,r_size(szBuffer),szFormat,pArgList); #endif va_end(pArgList); set(szBuffer); } static rstr format(const char* szFormat,...) { char szBuffer[1024]; va_list pArgList; va_start(pArgList,szFormat); #ifdef _MSC_VER _vsnprintf(szBuffer,r_size(szBuffer),szFormat,pArgList); #else vsnprintf(szBuffer,r_size(szBuffer),szFormat,pArgList); #endif va_end(pArgList); return rstr(szBuffer); } static rstr hextodec(rstr s) { uint a; sscanf(s.cstr_t(),"%x",&a); return rstr(a); } static rstr bintodec(rstr s) { uint sum=0; uint pro=1; for(int i=s.count()-1;i>=0;i--) { if(s[i]=='1') sum+=pro; pro*=2; } return rstr(sum); } template static rstr join(const rbuf& v,const rstr& s) { rstr ret; for(int i=0;i m_buf; ~rstrw() { } rstrw() { } rstrw(const wchar* p) { set(p); } rstrw(const rstrw& s) { m_buf.alloc_not_change(s.m_buf.m_cmax); m_buf.m_count=s.count(); memcpy(begin(),s.begin(),s.size()); } rstrw(const char* p) { rstr tmp=rcode::utf8_to_utf16(p); set_size(tmp.size()); memcpy(begin(),tmp.begin(),tmp.size()); } rstrw(const rstr& s) { rstr tmp=rcode::utf8_to_utf16(s); set_size(tmp.size()); memcpy(begin(),tmp.begin(),tmp.size()); } rstrw(rstrw&& s) { m_buf.move(s.m_buf); } rstr torstr() const { return rcode::utf16_to_utf8(rstr((char*)begin(),size())); } int toint() { return this->torstr().toint(); } ushort* cstrw() { push(0); pop(); return begin(); } wchar* cstrw_t() { return (wchar*)cstrw(); } void operator=(const rstrw& a) { m_buf=a.m_buf; } void operator=(rstrw&& a) { m_buf.free(); m_buf.move(a.m_buf); } ushort& operator[](int num) const { return m_buf[num]; } friend rbool operator==(const rstrw& a,const rstrw& b) { return a.m_buf==b.m_buf; } friend rbool operator!=(const rstrw& a,const rstrw& b) { return a.m_buf!=b.m_buf; } friend rstrw operator+(const rstrw& a,const rstrw& b) { rstrw ret; ret.m_buf=a.m_buf+b.m_buf; return r_move(ret); } void operator+=(const rstrw& a) { m_buf+=a.m_buf; } void operator+=(rstrw&& a) { m_buf+=r_move(a.m_buf); } void operator+=(ushort ch) { m_buf+=ch; } friend rbool operator<(const rstrw& a,const rstrw& b) { for(int i=0;i(const rstrw& a,const rstrw& b) { return bb); } friend rbool operator>=(const rstrw& a,const rstrw& b) { return !(a::extend_num(len)); m_buf.m_count=len; memcpy(m_buf.begin(),p,len*2); } int strlen_w(const wchar* p) { #ifdef _MSC_VER return (int)lstrlenW(p); #else int ret=0; while(*p!=0) { ret++; p++; } return ret; #endif } void push(ushort ch) { m_buf.push(ch); } void push_front(ushort ch) { m_buf.push_front(ch); } ushort pop() { return m_buf.pop(); } ushort pop_front() { return m_buf.pop_front(); } int count() const { return m_buf.count(); } int size() const { return count()*2; } ushort* begin() const { return m_buf.begin(); } ushort* end() const { return m_buf.end(); } rbool empty() const { return m_buf.empty(); } void clear() { m_buf.clear(); } static ushort* next(void* p) { return ((ushort*)p)+1; } static ushort* prev(void* p) { return ((ushort*)p)-1; } ushort* pos(int num) const { return begin()+num; } int pos(void* p) const { return int((ushort*)p-begin()); } rstrw sub(int begin) const { return sub(begin,count()); } rstrw sub(int begin,int end) const { rstrw ret; ret.m_buf=m_buf.sub(begin,end); return r_move(ret); } rbool erase(int begin,int end) { return m_buf.erase(begin,end); } rbool erase(int i) { return erase(i,i+1); } rbool insert(int pos,const rstrw& a) { return m_buf.insert(pos,a.m_buf); } ushort get(int i) const { if(i>=count()) return 0; else return m_buf[i]; } ushort get_top() const { if(count()>0) { return m_buf.m_p[count()-1]; } return 0; } ushort get_bottom() const { if(count()>0) { return m_buf.m_p[0]; } return 0; } rbool is_number() const { if(empty()) { return false; } for(int i=0;i='0'&&(ch)<='9'); } int find(rstrw s,int begin=0) const { return r_find_pos(*this,s,begin); } int find_last(ushort ch) const { return m_buf.find_last(ch); } }; #endif ================================================ FILE: rlib/rthread.h ================================================ #ifndef rthread_h__ #define rthread_h__ #include "rbase.h" typedef void (* rthread_start)(void*); #ifdef _MSC_VER #include #include typedef uint rthread_ret;//32 bit #define rthread_call __stdcall typedef uint (__stdcall* prthread)(void*); #else #include typedef void* rthread_ret; #define rthread_call typedef void* (* prthread)(void*); #endif typedef rthread_ret (rthread_call* thread_start)(void*); struct rthread { static int create(thread_start start,void* param=null) { int tid; #ifdef _MSC_VER tid=(int)_beginthreadex(null,0,start,param,0,null); if(0==tid||1==tid) { return 0; } else { return tid; } #else if(0!=pthread_create((pthread_t*)&tid,null,start,param)) { return 0; } else { return tid; } #endif } static void wait_exit(int tid) { #ifdef _MSC_VER WaitForSingleObject((HANDLE)tid,INFINITE); #else pthread_join((pthread_t)tid,null); #endif } }; #endif ================================================ FILE: rpp/rpp.cpp ================================================ #include "zmain.h" int main(int argc, char* argv[]) { static tvm vm; return zmain::rpp_main(vm,argc,argv); } ================================================ FILE: rpp/rpp_def.h ================================================ #ifndef rpp_def_h__ #define rpp_def_h__ //#define RANALYSE #define c_rpp_deep 150 #define c_point_size 4 #define rppkey(a) (sh.m_key[tkey::a]) #define rppoptr(a) (sh.m_optr[toptr::a]) #define rppconf(a) (sh.m_conf[tconf::a]) #define v_next_ins_js cur=(tins*)((uchar*)cur+r_size(tasm));goto next #define v_next_ins reg.eip+=r_size(tasm);goto next #define v_ato_int(a) (*r_to_pint(&(a))) #define v_pto_int(a) (*r_to_pint(a)) #define v_ato_uint(a) (*r_to_puint(&(a))) #define v_pto_uint(a) (*r_to_puint(a)) #define v_ato_char(a) (*r_to_pchar(&(a))) #define v_pto_char(a) (*r_to_pchar(a)) #define v_pto_int8(a) (*r_to_pint8(a)) #define v_pto_f8(a) (*r_to_pdouble(a)) #define v_pto_rstr(a) (*r_to_prstr(a)) #define v_pto_pchar(a) ((char*)v_pto_int(a)) #define v_pto_pvoid(a) ((void*)v_pto_int(a)) #define v_get_imme_u(a) (r_to_uint((a).val)) #define v_get_reg_u(a) v_pto_uint(r_to_puchar(®)+(a).off) #define v_get_addr_u(a) v_pto_uint(v_get_reg(a)+(a).val) #define v_get_imme(a) ((a).val) #define v_get_reg(a) v_pto_int(r_to_puchar(®)+(a).off) #define v_get_addr(a) v_pto_int(v_get_reg(a)+(a).val) #define v_get_lea(a) (v_get_reg(a)+v_get_imme(a)) #define v_get_addr_1(a) v_pto_char(v_get_reg(a)+(a).val) #define v_get_addr_8(a) v_pto_int8(v_get_reg(a)+(a).val) #define v_get_addr_f8(a) v_pto_f8(v_get_reg(a)+(a).val) #define rppja znasm::get_opnd1_v(vstr) #define rppjb znasm::get_opnd2_v(vstr) #define rppj4(a,b,c,d) (zjiti::a(build_ins(sh,rppkey(c_nop),b,c,d))) #define rppjf(a,b) sh.m_jit_f[a]=&b #define rppjcmp(a) \ if(znasm::count_mbk_l(vstr)==2) \ { \ s+=rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb); \ s+=rppj4(b_cmp,rppja,rppoptr(c_comma),rppkey(c_ecx)); \ } \ else \ { \ s+=zjiti::b_cmp(ins); \ } \ s+=rppj4(b_mov,rppkey(c_ebx),rppoptr(c_comma),"0"); \ s+=zjiti::a(); \ return r_move(s) #define rppncmp(a) \ if(count_mbk_l(vstr)==2) \ { \ result+=" mov ecx , "+get_opnd2(vstr)+"\n"; \ result+=" cmp "+get_opnd1(vstr)+" , ecx\n"; \ } \ else \ { \ result+=" cmp dword "+link_vstr(vstr.sub(1))+"\n"; \ } \ result+=" mov ebx , 0\n"; \ result+=a; \ return true #endif ================================================ FILE: rpp/rpp_win.cpp ================================================ #include "zmain.h" //#define RPP_SHOW_CONSOLE int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) { rbuf v=zmain::param_split(lpCmdLine); v.push_front(rcode::utf8_to_gbk(rdir::get_exe_name().torstr())); int argc=v.count(); if(argc>c_rpp_deep) { return 1; } char* argv[c_rpp_deep]; for(int i=0;i m_list; enum { c_page_size=4096 }; ~talloc() { #ifdef _MSC_VER for(int i=0;i=b.count; } }; struct tanalyse { static void analyse_add(uint addr) { analyse_add(((tasm*)addr)->ptfi); } static void analyse_add(tfunc* ptfi) { if(ptfi==null) { return; } ptfi->count++; } static void analyse_print(tsh& sh) { rbuf v; for(tclass* p=sh.m_class.begin(); p!=sh.m_class.end();p=sh.m_class.next(p)) { for(tfunc* q=p->vfunc.begin(); q!=p->vfunc.end();q=p->vfunc.next(q)) { if(q->count==0) { continue; } tanalyse_item item; item.count=q->count; item.name=sh.get_func_declare_name(*p,*q); v.push(item); } } r_qsort(v); rf::printl(); for(int i=0;i m_conf; int& operator[](int n) const { return m_conf[n]; } enum { c_export_rbin, c_export_rasm, c_export_rp, c_display_inf, c_warning, c_auto_addinit, c_auto_addfunc,//自动增加构造析构等函数 c_auto_import, c_auto_bbk,//是否控制结构自动加大括号 c_op_empty_func,//优化基本数据类型空构造析构函数开关 c_op_nop, c_op_zero,//优化add esp,0 c_op_merge,//同一行连续加减同一个寄存器合并为一条指令 c_op_ebp,//如果本函数未使用ebp可以不用push ebp节省3条指令 c_op_base_calc,//优化基础运算,如调用int.opreator+可变成一条add指令 c_op_pass,//优化参数传递,如传递int不需要调用拷贝构造函数 c_op_const_eval,//常量表达式求值 c_op_match,//汇编模式匹配优化 c_run, c_pause, c_stack_size }; }; struct toptr { rbuf m_optr;//编译器使用 rbuf m_optr_s;//排好序的运算符,因为词法分析是贪心的 rdic m_dic;//字典中存放的是优先级,值小的优先 int m_optr_max; toptr() { m_optr_max=0; } rstr& operator[](int n) const { return m_optr[n]; } void sort_optr() { m_optr_s=m_optr; r_qsort(m_optr_s); m_optr_max=0; for(int i=0;im_optr_max) m_optr_max=m_optr_s[i].count(); } int get_grade(const rstr& s) const { int* p=m_dic.find(s); if(p==null) { return 0; } return *p; } //比较两个运算符的优先级,true表示第一个优先于第二个,相同优先级总是从左到右计算 rbool precede(const rstr& first,const rstr& second) { return get_grade(first)<=get_grade(second); } rbool is_optr(const rstr& s) const { return r_find_pos_b(m_optr_s,s)右箭头 c_dot,//. c_domain,//::作用域运算符 c_semi,//;分号 c_colon,//:冒号 c_comma,//, c_pre,//预处理符号# c_addr,//& c_not,//! c_destruct,//~ c_plusplus,//++ c_minusminus,//-- c_negative, c_star,//* c_divide,//除 c_modulo, c_plus,//+ c_minus,//- c_lessequal, c_greatequal, c_equalequal, c_notequal, c_tbk_l, c_tbk_r,//<>尖括号 c_temp_51, c_temp_52, c_and3, c_or3, c_equal,//= c_arrow_l,//<- c_exchange,//<-> c_temp_94,//+= c_temp_95,//-= c_temp_96,//*= c_temp_97,// /= c_temp_98,// %= c_temp_99,// ^ c_temp_910,// | c_temp_911,// &= c_temp_912,// ^= c_temp_913,// |= c_exp_part,//表达式起止符号,使用一个根本不会出现的符号 c_at }; }; struct tkey { rbuf m_key; rdic m_dic; rstr& operator[](int n) const { return m_key[n]; } int count() const { return m_key.count(); } void sort_asm() { m_dic.clear(); for(int i=0;i=0&&index<=c_rn; } rbool is_asm_reg(const rstr& s) const { for(int i=c_eip;i<=c_edi;++i) if(s==m_key[i]) return true; return false; } enum { c_rjit, c_calle, c_call, c_retn, c_reti, c_push, c_pop, c_jmp, c_jebxz,//如果ebx等于0则跳转 c_jebxnz, c_halt, c_nop, c_lea, c_mov, c_mov1, c_mov8, c_add, c_sub, c_imul, c_idiv, c_imod, c_cesb, c_cnesb, c_cgsb,//cmp great set ebx带符号设置指令,大于则置1,否则置0 c_cgesb, c_clsb, c_clesb, c_add8, c_sub8, c_imul8, c_idiv8, c_imod8, c_cgsb8, c_clsb8, c_fadd8, c_fsub8, c_fmul8, c_fdiv8, c_fcgsb8, c_fclsb8, c_band, c_bor, c_bnot, c_bxor, c_bshl, c_bshr, c_bsar, c_udiv, c_umod, c_ucgsb, c_ucgesb, c_uclsb, c_uclesb, c_rn, c_rd1, c_rd2, c_rd4, c_rd8, c_rdp, c_eip, c_esp, c_ebp, c_eax, c_ebx, c_ecx, c_edx, c_esi, c_edi, c_eflags, c_void, c_char, c_int, c_uint, c_int8, c_double, c_rp, c_var, c_rbuf, c_rstr, c_rcs,//RPP代码类型 c_js_func,//JS函数 c_js_obj, c_js_findf, c_if, c_ifn,//与unless功能一样,感觉ifnot或者ifn更清晰 c_else, c_break, c_continue, c_continued, c_return, c_class, c_template, c_this, c_sizeof, c_main, c_include, c_import, c_endif, c_ifdef, c_ifndef, c_define, c_enum, c_for, c_to, c_in, c_case, c_friend, c_cfunc, c_dynamic, c_private, c_protected, c_public, c_switch, c_typename, c_typeof, c_s_ret, c_s_off, c_s_param, c_s_local, c_mac,//宏 c_export, c_lambda, c_self, c_btemp,//构造临时对象 c_pcall,//函数指针调用 c_LAMBDA, c_SELF, c_rvm, c_rvara, c_rvarb, c_temp, c_plambda, c_pmain,//全局数据的引用 c_penv,//环境指针 }; }; #endif ================================================ FILE: rpp/tsh.h ================================================ #ifndef tsh_h__ #define tsh_h__ #include "tconf.h" #include "../rlib/rstrw.h" #include "rpp_def.h" #include "tstruct.h" #include "../rlib/rset.h" #include "../rlib/rmutex.h" #include "../rlib/rdb.h" #include "../rlib/rdir.h" #include "talloc.h" //共享类 struct tsh { toptr m_optr; tkey m_key; tconf m_conf; rset m_class; rset m_classtl;//模板 rset m_file; rset m_vdefine; tclass* m_main; rstr m_main_data;//全局变量存储区 rstrw m_main_file; rmutex m_mutex; int m_mode; int m_argc; char** m_argv; rbuf m_match; rdic m_jit_f;//jit静态函数地址表 void* m_hins; int m_ret; rbool m_is_pack_read; rbool m_is_pack_mode; rbool m_is_pre_mode; rdbint m_db; rset m_addr; rclass m_rlib; rdic m_dll_func; rdic m_macro; enum { c_jit, c_rvm, c_win, c_grub }; tsh() { m_main=null; m_mode=c_rvm; m_is_pack_read=false; m_is_pack_mode=false; m_is_pre_mode=false; } void print_vclass() { for(tclass* p=m_class.begin();p!=m_class.end();p=m_class.next(p)) { p->name.printl(); } } static void print_vword(rbuf& v) { rf::printl(); for(int i=0;i get_func_declare_lisp(tsh& sh,tclass& tci,tfunc& tfi) { return get_func_declare_call(sh,tci,tfi).sub(1); } static rbuf get_func_declare_call(tsh& sh,tclass& tci,tfunc& tfi) { rbuf ret; ret+=rppkey(c_call); ret+=rppoptr(c_mbk_l); ret+=rppoptr(c_addr); ret+=rppoptr(c_comma); ret+=tci.name; ret+=rppoptr(c_comma); ret+=tfi.name_dec; ret+=rppoptr(c_mbk_r); return r_move(ret); } static void clear_word_val(rbuf& v,int begin,int end) { if(end>v.count()) end=v.count(); if(begin<0) { begin=0; } for(int i=begin;i"); elif(word.is_cstr()) return rstr("rp"); else return rstr(); } //获取类型名称,忽略引用 static rstr get_tname(const rstr& s) { if(is_quote(s)) return s.sub(0,s.count()-1); else return s; } static rstr get_ttype(rstr s) { if(is_point_quote(s)) { return s; } return s+"&"; } rbool is_optr_func(tfunc& tfi) { if(m_optr.is_optr(tfi.name)) { return true; } if(tfi.name=="[]") { return true; } return false; } rbool is_basic_type(const rstr& s) { return s==m_key[tkey::c_rd1]||s==m_key[tkey::c_rd2]|| s==m_key[tkey::c_rd4]||s==m_key[tkey::c_rd8]|| s==m_key[tkey::c_rdp]||s==m_key[tkey::c_void]; } static rbool is_point_quote(const rstr& s) { return is_quote(s)||is_point(s); } static rbool is_quote(const rstr& s) { return s.get_top()=='&'; } static rbool is_point(const rstr& s) { if(s.get_top()=='*') return true; if(s.count()>=5&&s[0]=='r'&&s[1]=='p'&&s[2]=='<'&&s.get_top()=='>') return true; return false; } void split_param(rbuf& vsent, const rbuf& v,const tsent& src) { vsent.clear(); rbuf > temp=comma_split(v); for(int i=0;i& vsent,const rbuf& v) { vsent.clear(); rbuf > temp=comma_split(v); for(int i=0;i rbuf > comma_split(rbuf v) { rbuf > result; v.push_move(T(m_optr[toptr::c_comma])); int count1=0; int count2=0; int start=0; for(int i=0;i temp; for(int j=start;j > comma_split_e(rbuf v) { rbuf > result; v.push(tword(m_optr[toptr::c_comma])); int count1=0; int count2=0; int start=0; for(int i=0;i temp; for(int j=start;j comma_split_t(rbuf v) { rbuf result; v.push(tword(m_optr[toptr::c_comma])); int count1=0; int count2=0; int count3=0; int start=0; for(int i=0;i& v,int begin=0) { return find_symm_word_e(v,m_optr[toptr::c_sbk_l], m_optr[toptr::c_sbk_r],begin); } int find_symm_sbk(const rbuf& v,int begin=0) { return find_symm_word_e(v,m_optr[toptr::c_sbk_l], m_optr[toptr::c_sbk_r],begin); } int find_symm_mbk(const rbuf& v,int begin=0) { return find_symm_word_e(v,m_optr[toptr::c_mbk_l], m_optr[toptr::c_mbk_r],begin); } int find_symm_bbk(const rbuf& v,int begin=0) { return find_symm_word_e(v,m_optr[toptr::c_bbk_l], m_optr[toptr::c_bbk_r],begin); } int find_symm_bbk(const rbuf& v,int begin=0) { return find_symm_word_e(v,m_optr[toptr::c_bbk_l], m_optr[toptr::c_bbk_r],begin); } int find_symm_tbk(const rbuf& v,int begin=0) { return find_symm_word_e(v,m_optr[toptr::c_tbk_l], m_optr[toptr::c_tbk_r],begin); } //未找到返回结束位置,应该判断count<0,但那样会降低效率 template static int find_symm_word_e(const rbuf& v,rstr& left,rstr& right, int begin=0) { int end=v.count(); if(begin<0) { begin=0; } int count=0; int i; for(i=begin;i& v,rstr& left,rstr& right, int begin,int end) { if(end>=v.count()) end=v.count(); if(begin<0) { begin=0; } int count=0; int i; for(i=end-1;i>=begin;--i) { if(left==v[i].val) --count; if(right==v[i].val) ++count; if(0==count) return i; } return v.count(); } static rbuf vword_to_vstr(const rbuf& v) { rbuf ret; for(int i=0;i& v,tword& twi,const rstr& val) { twi.val=val; v.push(twi); } rstr get_file_name(tfile* p) { if(p==null) { return rstr(); } return p->name.torstr(); } static void error(rstr e=rstr()) { #ifndef __COCOS2D_H__ rf::printl(e); #else char* p=e.cstr_t(); CCLOG("%s",p); #endif } static rstr get_src_str(const tword& word) { tpos pos=word.pos_src; if(pos.file==null) { return rstr(); } rstr ret; ret+="\nsrc_file: "+pos.file->name.torstr(); ret+="\nsrc_line: "+rstr(pos.line); ret+="\nsrc_cont: "+pos.file->line_list.get(pos.line); return r_move(ret); } void error(const tword& word,rstr e=rstr()) { error(rstr("file: ")+get_file_name(word.pos.file)+ rstr("\nline: ")+rstr(word.pos.line)+ rstr("\nword: ")+word.val+rstr("\n")+e); error(get_src_str(word)); } void error(const tsent& sent,rstr e=rstr()) { error(rstr("file: ")+get_file_name(sent.pos.file)+ rstr("\nline: ")+rstr(sent.pos.line)+rstr("\n")+e); sent.vword.print(); rf::printl(); error(get_src_str(sent.vword.get_bottom())); } void error(const tasm& oasm,rstr e=rstr()) { error(rstr("file: ")+get_file_name(oasm.pos.file)+ rstr("\nline: ")+rstr(oasm.pos.line)+rstr("\n")+e); oasm.vstr.print(); rf::printl(); } static void error(tfunc& tfi,rstr e=rstr()) { error(&tfi,e); } static void error(tfunc* ptfi,rstr e=rstr()) { if(ptfi==null) { return; } tclass* ptci=ptfi->ptci; if(ptci==null) { return; } rf::printl(get_func_declare(*ptci,*ptfi)); rf::printl(e); } }; rbool _func_to_x86(tsh& sh,tfunc& tfi,tenv env); int _find_symm_sbk(tsh& sh,const rbuf& v,int begin); #endif ================================================ FILE: rpp/tstruct.h ================================================ #ifndef tstruct_h__ #define tstruct_h__ #include "../rlib/rstr.h" #include "../rlib/rf.h" #include "../rlib/rcode.h" #include "../rlib/rset.h" #include "../rlib/rdic.h" #include "tvm_struct.h" #include "talloc.h" struct tword { rstr val;//最常用的数据成员放在首位可以略微提高效率 rbuf multi;//todo:rstr很难保存行号,用rbuf可能更好 tpos pos;//跳转定位的位置 tpos pos_src;//原始文件位置 tword() { clear(); } tword(const rstr& s) { clear(); val=s; } tword(tword&& a) { pos=a.pos; val=a.val; multi=a.multi; pos_src=a.pos_src; } void operator=(tword&& a) { val.m_buf.free(); multi.free(); val=a.val; multi=a.multi; pos=a.pos; pos_src=a.pos_src; } void clear() { pos.clear(); val.clear(); multi.clear(); pos_src.clear(); } rbool empty() const { return val.empty()&&multi.empty(); } //val和multi均不空表示sizeof rbool is_multi() const { return !multi.empty()&&val.empty(); } friend rbool operator==(const tword& a,const tword& b) { return a.val==b.val; } friend rbool operator!=(const tword& a,const tword& b) { return !(a==b); } friend rbool operator==(const tword& a,const rstr& b) { return a.val==b; } friend rbool operator!=(const tword& a,const rstr& b) { return !(a==b); } friend rbool operator==(const rstr& a,const tword& b) { return a==b.val; } friend rbool operator!=(const rstr& a,const tword& b) { return !(a==b); } void print() { val.print(); } rbool is_name() const { if(val.empty()) return false; int i=0; if(rstr::is_alpha(val.get(i))||'_'==val.get(i)) i++; elif(rcode::is_utf8_3(val.get(i))&&val.get(i+1)&&val.get(i+2)) { i+=3; } elif(rcode::is_utf8_2(val.get(i))&&val.get(i+1)) { i+=2; } else return false; for(;i param; rbuf vstr; rbool is_super; tmac() { is_super=false; } tmac(const rstr& a) { name=a; is_super=false; } friend rbool operator<(const tmac& a,const tmac& b) { return a.name vword; rbuf line_list; rbuf tab_list;//前面tab个数,1个tab等于4个空格(todo:改成8个空格) tfile() { } tfile(const rstrw& name) { this->name=name; } friend rbool operator<(const tfile& a,const tfile& b) { return a.name param;//默认参数 tdata() { clear(); } tdata(const rstr& type) { clear(); this->type=type; } tdata(const rstr& type,const rstr& name) { clear(); this->type=type; this->name=name; } void clear() { type.clear(); name.clear(); size=0; count=0; off=0; param.clear(); } void print() { type.print(); name.print(); } friend rbool operator==(const tdata& a,const tdata& b) { return a.name==b.name; } }; //表达式和语句几乎没有区别 struct tsent { rbuf vword; rstr type;//表达式类型,也可以理解为语句返回值的类型 tpos pos; tsent() { clear(); } tsent(tsent&& a) { pos=a.pos; type=a.type; vword=a.vword; } void operator=(tsent&& a) { type.m_buf.free(); vword.free(); pos=a.pos; type=a.type; vword=a.vword; } void clear() { pos.clear(); type.clear(); vword.clear(); } tsent sub(int begin,int end) const { tsent ret; ret.pos=pos; ret.vword=vword.sub(begin,end);//类型信息为空 return r_move(ret); } rbool empty() const { return vword.empty(); } void print() { vword.print(); } }; struct tdynamic { int key; rbuf > vparam; tdynamic() { } friend rbool operator<(const tdynamic& a,const tdynamic& b) { return a.key vtl; rbuf param;//参数列表 rbuf local;//局部变量表 rbuf vword;//函数内容的词表 rbuf vsent;//语句表 rbuf vasm; tpos first_pos;//first_pos似乎没用 tpos last_pos; int8 count; tclass* ptci;//反射到tclass,不用初始化 uchar* code;//jit代码段 rset sdynamic; tfunc() { clear(); } ~tfunc() { if(code!=null) { talloc::free_v(code);//注意jit以后不能直接调用默认的拷贝构造函数 } } void clear() { is_macro=false; is_cfunc=false; is_dynamic=false; is_friend=false; lambda_data.clear(); retval.clear(); name.clear(); name_dec.clear(); vtl.clear(); param.clear(); local.clear(); vword.clear(); vsent.clear(); vasm.clear(); first_pos.clear(); last_pos.clear(); count=0; //ptci=null; code=null; sdynamic.clear(); } rstr get_dec() const { rstr s; s+=name+"("; for(int j=0;j vmac;//宏列表 rbuf vdata;//数据成员列表 rset vfunc;//函数成员列表 rset vfunctl;//模板函数列表 rbuf vword; rbuf vtl; rbuf vfather;//父类表 int size; rbool is_friend; void clear() { name.clear(); vmac.clear(); vdata.clear(); vfunc.clear(); vfunctl.clear(); vword.clear(); vtl.clear(); vfather.clear(); size=0; is_friend=false; } tclass() { clear(); } friend rbool operator<(const tclass& a,const tclass& b) { return a.namestart=start; this->end=end; this->ptfi=ptfi; } friend rbool operator<(const taddr& a,const taddr& b) { return a.end<=b.start; } }; struct tenv { tfunc* ptfi; uint v_ebp; tenv() { ptfi=null; v_ebp=0; } }; #endif ================================================ FILE: rpp/tvm.h ================================================ #ifndef tvm_h__ #define tvm_h__ #include "zjit.h" #include "../rlib/rthread.h" #include "../rlib/rsock.h" #include "tanalyse.h" #include "../rlib/rdic.h" #include "../rlib/rlist.h" struct tvm; //虚拟机的一个线程 struct tvm_t { treg m_reg; rbuf m_stack; int m_thread; rbuf m_vasm;//一组初始化指令 rdic m_func;//外部函数字典,每个线程一个则不需要使用互斥体 tvm* m_pvm; }; struct tvm { rlist m_list; tsh m_sh; static rbool other_call(int index,tsh* sh,tvm_t* pvmt,treg& reg) { if(index<2000) { return false;//cocos_call } return false; } //为了提高效率将1条指令分解为6条 static rbool qrun(tsh& sh,tvm_t* pvmt,treg reg,treg* poldreg=null) { tins* cur; next: cur=(tins*)(reg.eip); //m_bin.print_reg(reg); //((tasm*)cur)->vstr.print(); //rf::printl(); //rf::getch(); switch(cur->type) { case tins::c_rjit_n: if(!zbin::cp_call_asm(sh,*(tasm*)cur)) { sh.error(((tasm*)cur)->ptfi); return false; } goto next; case tins::c_rjit_n+1: case tins::c_rjit_n+2: case tins::c_rjit_n+3: case tins::c_rjit_n+4: case tins::c_rjit_n+5: return false; case tins::c_calle_i: switch(v_get_imme(cur->first)) { case tins::c_eval_txt: return false; case tins::c_cp_txt: return false; case tins::c_find_meta: return false; case tins::c_find_func: v_pto_uint(reg.esp+4)=zbin::find_func_bin(sh, (char*)v_pto_uint(reg.esp)); reg.esp+=4; v_next_ins; case tins::c_find_dll: v_pto_uint(reg.esp+4)=(uint)find_dll( pvmt,(char*)v_pto_uint(reg.esp)); reg.esp+=4; v_next_ins; case tins::c_stdcall_func: stdcall_func(reg); v_next_ins; case tins::c_cdecl_func: cdecl_func(reg); v_next_ins; case tins::c_get_vclass: v_pto_uint(reg.esp)=(uint)&sh.m_class; v_next_ins; case tins::c_thr_create: v_pto_uint(reg.esp+8)=pvmt->m_pvm->create_thr(sh, (void*)v_pto_uint(reg.esp), (void*)v_pto_uint(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_thr_wait: if(v_pto_uint(reg.esp)!=0) rthread::wait_exit(v_pto_uint(reg.esp)); reg.esp+=4; v_next_ins; case tins::c_mu_init: v_pto_int(reg.esp)=(int)(r_new()); v_next_ins; case tins::c_mu_del: r_delete((rmutex*)v_pto_int(reg.esp)); reg.esp+=4; v_next_ins; case tins::c_mu_enter: ((rmutex*)v_pto_int(reg.esp))->enter(); reg.esp+=4; v_next_ins; case tins::c_mu_leave: ((rmutex*)v_pto_int(reg.esp))->leave(); reg.esp+=4; v_next_ins; case tins::c_execmd: v_pto_uint(reg.esp+4)=rf::execmd( (char*)v_pto_uint(reg.esp)); reg.esp+=4; v_next_ins; case tins::c_srand: rf::srand(); v_next_ins; case tins::c_rand: v_pto_int(reg.esp)=rf::rand(); v_next_ins; case tins::c_gettick: v_pto_int(reg.esp)=rf::tick(); v_next_ins; case tins::c_sleep: rf::sleep(v_pto_int(reg.esp)); reg.esp+=4; v_next_ins; case tins::c_puts: printf("%s",r_to_pchar(v_pto_int(reg.esp))); reg.esp+=4; v_next_ins; case tins::c_puts_l: printf("%s",rstr(r_to_pchar(v_pto_int(reg.esp)), v_pto_int(reg.esp+4)).cstr()); reg.esp+=8; v_next_ins; case tins::c_getch: v_pto_int(reg.esp)=rf::getch(); v_next_ins; case tins::c_getstdin: v_pto_int(reg.esp)=(int)stdin; v_next_ins; case tins::c_getstdout: v_pto_int(reg.esp)=(int)stdout; v_next_ins; case tins::c_get_argc: v_pto_int(reg.esp)=sh.m_argc; v_next_ins; case tins::c_get_argv: v_pto_int(reg.esp)=(int)sh.m_argv; v_next_ins; case tins::c_sprintf: sprintf(r_to_pchar(v_pto_int(reg.esp)), r_to_pchar(v_pto_int(reg.esp+4)), v_pto_int(reg.esp+8)); reg.esp+=12; v_next_ins; case tins::c_sprintf8: sprintf((char*)v_pto_int(reg.esp), (char*)v_pto_int(reg.esp+4), v_pto_int8(reg.esp+8)); reg.esp+=16; v_next_ins; case tins::c_sscanf: sscanf((char*)v_pto_int(reg.esp), (char*)v_pto_int(reg.esp+4), v_pto_int(reg.esp+8)); reg.esp+=12; v_next_ins; case tins::c_malloc: v_pto_uint(reg.esp+4)=r_to_uint( malloc(v_pto_uint(reg.esp))); reg.esp+=4; v_next_ins; case tins::c_mfree: free(r_to_pchar(v_pto_uint(reg.esp))); reg.esp+=4; v_next_ins; case tins::c_memset: memset((char*)v_pto_uint(reg.esp), v_pto_int(reg.esp+4), v_pto_uint(reg.esp+8)); reg.esp+=12; v_next_ins; case tins::c_memcpy: memcpy((char*)v_pto_uint(reg.esp), (char*)v_pto_uint(reg.esp+4), v_pto_uint(reg.esp+8)); reg.esp+=12; v_next_ins; case tins::c_strcpy: strcpy((char*)v_pto_uint(reg.esp), (char*)v_pto_uint(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_strcmp: v_pto_int(reg.esp+8)=strcmp( (char*)v_pto_uint(reg.esp), (char*)v_pto_uint(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_strlen: v_pto_uint(reg.esp+4)= strlen((char*)v_pto_uint(reg.esp)); reg.esp+=4; v_next_ins; case tins::c_fopen_w: v_pto_uint(reg.esp+8)=(int)rfile::fopen_w( (wchar*)v_pto_uint(reg.esp), (wchar*)v_pto_uint(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_fopen: v_pto_uint(reg.esp+8)=(uint)fopen( (char*)v_pto_uint(reg.esp), (char*)v_pto_uint(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_fclose: v_pto_int(reg.esp+4)=fclose( (FILE*)v_pto_uint(reg.esp)); reg.esp+=4; v_next_ins; case tins::c_fread: v_pto_uint(reg.esp+16)=fread( (void*)v_pto_uint(reg.esp), v_pto_uint(reg.esp+4), v_pto_uint(reg.esp+8), (FILE*)v_pto_uint(reg.esp+12)); reg.esp+=16; v_next_ins; case tins::c_fwrite: v_pto_uint(reg.esp+16)=fwrite( (void*)v_pto_uint(reg.esp), v_pto_uint(reg.esp+4), v_pto_uint(reg.esp+8), (FILE*)v_pto_uint(reg.esp+12)); reg.esp+=16; v_next_ins; case tins::c_fseek: fseek((FILE*)v_pto_uint(reg.esp), v_pto_int(reg.esp+4), v_pto_int(reg.esp+8)); reg.esp+=12; v_next_ins; case tins::c_fseek8: rfile::fseek8((FILE*)v_pto_uint(reg.esp), v_pto_int8(reg.esp+4), v_pto_int(reg.esp+12)); reg.esp+=16; v_next_ins; case tins::c_ftell: v_pto_uint(reg.esp+4)=ftell( (FILE*)v_pto_uint(reg.esp)); reg.esp+=4; v_next_ins; case tins::c_ftell8: v_pto_int8(reg.esp+4)=rfile::ftell8( (FILE*)v_pto_uint(reg.esp)); reg.esp+=4; v_next_ins; case tins::c_s_socket: v_pto_int(reg.esp+12)=rsock::s_socket( v_pto_int(reg.esp), v_pto_int(reg.esp+4), v_pto_int(reg.esp+8)); reg.esp+=12; v_next_ins; case tins::c_s_connect: v_pto_int(reg.esp+12)=rsock::s_connect( v_pto_int(reg.esp), (void*)v_pto_int(reg.esp+4), v_pto_int(reg.esp+8)); reg.esp+=12; v_next_ins; case tins::c_s_close: v_pto_int(reg.esp+4)=rsock::s_close( v_pto_int(reg.esp)); reg.esp+=4; v_next_ins; case tins::c_s_send: v_pto_int(reg.esp+16)=rsock::s_send( v_pto_int(reg.esp), (void*)v_pto_int(reg.esp+4), v_pto_int(reg.esp+8), v_pto_int(reg.esp+12)); reg.esp+=16; v_next_ins; case tins::c_s_recv: v_pto_int(reg.esp+16)=rsock::s_recv( v_pto_int(reg.esp), (void*)v_pto_int(reg.esp+4), v_pto_int(reg.esp+8), v_pto_int(reg.esp+12)); reg.esp+=16; v_next_ins; case tins::c_s_bind: v_pto_int(reg.esp+12)=rsock::s_bind( v_pto_int(reg.esp), (void*)v_pto_int(reg.esp+4), v_pto_int(reg.esp+8)); reg.esp+=12; v_next_ins; case tins::c_s_listen: v_pto_int(reg.esp+8)=rsock::s_listen( v_pto_int(reg.esp), v_pto_int(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_s_accept: v_pto_int(reg.esp+12)=rsock::s_accept( v_pto_int(reg.esp), (void*)v_pto_int(reg.esp+4), (int*)v_pto_int(reg.esp+8)); reg.esp+=12; v_next_ins; case tins::c_gbk_to_utf8: v_pto_int(reg.esp+8)=rcode::gbk_to_utf8_c( (uchar*)v_pto_uint(reg.esp), (uchar*)v_pto_uint(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_gbk_to_utf16: v_pto_int(reg.esp+8)=rcode::gbk_to_utf16_c( (uchar*)v_pto_uint(reg.esp), (uchar*)v_pto_uint(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_utf8_to_gbk: v_pto_int(reg.esp+8)=rcode::utf8_to_gbk_c( (uchar*)v_pto_uint(reg.esp), (uchar*)v_pto_uint(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_utf8_to_utf16: v_pto_int(reg.esp+8)=rcode::utf8_to_utf16_c( (uchar*)v_pto_uint(reg.esp), (uchar*)v_pto_uint(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_utf16_to_gbk: v_pto_int(reg.esp+8)=rcode::utf16_to_gbk_c( (uchar*)v_pto_uint(reg.esp), (uchar*)v_pto_uint(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_utf16_to_utf8: v_pto_int(reg.esp+8)=rcode::utf16_to_utf8_c( (uchar*)v_pto_uint(reg.esp), (uchar*)v_pto_uint(reg.esp+4)); reg.esp+=8; v_next_ins; case tins::c_CloseHandle: #ifdef _MSC_VER v_pto_int(reg.esp+4)=CloseHandle( (HANDLE)v_pto_int(reg.esp)); #endif reg.esp+=4; v_next_ins; case tins::c_MessageBoxA: #ifdef _MSC_VER MessageBoxA(0,"","",0); #endif v_next_ins; case tins::c_itof8: v_pto_f8(reg.esp+4)=(double)v_pto_int(reg.esp); reg.esp+=4; v_next_ins; default: ifn(other_call(v_get_imme(cur->first),&sh,pvmt,reg)) { return false; } v_next_ins; } case tins::c_calle_i+1: case tins::c_calle_i+2: case tins::c_calle_i+3: case tins::c_calle_i+4: case tins::c_calle_i+5: return false; case tins::c_call_i: #ifdef RANALYSE tanalyse::analyse_add(v_get_imme(cur->first)); #endif reg.esp-=4; v_pto_uint(reg.esp)=reg.eip+r_size(tasm); reg.eip=v_get_imme(cur->first); goto next; case tins::c_call_r: reg.esp-=4; v_pto_uint(reg.esp)=reg.eip+r_size(tasm); reg.eip=v_get_reg(cur->first); goto next; case tins::c_call_a: reg.esp-=4; v_pto_uint(reg.esp)=reg.eip+r_size(tasm); reg.eip=v_get_addr(cur->first); goto next; case tins::c_call_a+1: case tins::c_call_a+2: case tins::c_call_a+3: return false; case tins::c_ret_n: reg.eip=v_pto_uint(reg.esp); reg.esp+=4; goto next; case tins::c_ret_n+1: case tins::c_ret_n+2: case tins::c_ret_n+3: case tins::c_ret_n+4: case tins::c_ret_n+5: return false; case tins::c_ret_i: reg.eip=v_pto_uint(reg.esp); reg.esp+=4+v_get_imme(cur->first); goto next; case tins::c_ret_r: reg.eip=v_pto_uint(reg.esp); reg.esp+=4+v_get_reg(cur->first); goto next; case tins::c_ret_a: reg.eip=v_pto_uint(reg.esp); reg.esp+=4; reg.esp+=v_get_addr(cur->first); goto next; case tins::c_ret_a+1: case tins::c_ret_a+2: case tins::c_ret_a+3: return false; case tins::c_push_i: reg.esp-=4; v_pto_uint(reg.esp)=v_get_imme(cur->first); v_next_ins; case tins::c_push_r: reg.esp-=4; v_pto_uint(reg.esp)=v_get_reg(cur->first); v_next_ins; case tins::c_push_a: reg.esp-=4; v_pto_uint(reg.esp)=v_get_addr(cur->first); v_next_ins; case tins::c_push_a+1: case tins::c_push_a+2: case tins::c_push_a+3: return false; case tins::c_pop_i: return false; case tins::c_pop_r: v_get_reg(cur->first)=v_pto_uint(reg.esp); reg.esp+=4; v_next_ins; case tins::c_pop_a: v_get_addr(cur->first)=v_pto_uint(reg.esp); reg.esp+=4; v_next_ins; case tins::c_pop_a+1: case tins::c_pop_a+2: case tins::c_pop_a+3: return false; case tins::c_jmp_i: reg.eip=v_get_imme(cur->first); goto next; case tins::c_jmp_r: reg.eip=v_get_reg(cur->first); goto next; case tins::c_jmp_a: reg.eip=v_get_addr(cur->first); goto next; case tins::c_jmp_a+1: case tins::c_jmp_a+2: case tins::c_jmp_a+3: return false; case tins::c_jebxz_i: if(reg.ebx) reg.eip+=r_size(tasm); else reg.eip=v_get_imme(cur->first); goto next; case tins::c_jebxz_r: if(reg.ebx) reg.eip+=r_size(tasm); else reg.eip=v_get_reg(cur->first); goto next; case tins::c_jebxz_a: if(reg.ebx) reg.eip+=r_size(tasm); else reg.eip=v_get_addr(cur->first); goto next; case tins::c_jebxz_a+1: case tins::c_jebxz_a+2: case tins::c_jebxz_a+3: return false; case tins::c_jebxnz_i: if(reg.ebx) reg.eip=v_get_imme(cur->first); else reg.eip+=r_size(tasm); goto next; case tins::c_jebxnz_r: if(reg.ebx) reg.eip=v_get_reg(cur->first); else reg.eip+=r_size(tasm); goto next; case tins::c_jebxnz_a: if(reg.ebx) reg.eip=v_get_addr(cur->first); else reg.eip+=r_size(tasm); goto next; case tins::c_jebxnz_a+1: case tins::c_jebxnz_a+2: case tins::c_jebxnz_a+3: return false; case tins::c_halt_n: break; case tins::c_halt_n+1: case tins::c_halt_n+2: case tins::c_halt_n+3: case tins::c_halt_n+4: case tins::c_halt_n+5: return false; case tins::c_nop_n: v_next_ins; case tins::c_nop_n+1: case tins::c_nop_n+2: case tins::c_nop_n+3: case tins::c_nop_n+4: case tins::c_nop_n+5: return false; case tins::c_lea_ri: return false; case tins::c_lea_ai: return false; case tins::c_lea_rr: return false; case tins::c_lea_ar: return false; case tins::c_lea_ra: v_get_reg(cur->first)=v_get_lea(cur->second); v_next_ins; case tins::c_lea_aa: v_get_addr(cur->first)=v_get_lea(cur->second); v_next_ins; case tins::c_mov_ri: v_get_reg(cur->first)=v_get_imme(cur->second); v_next_ins; case tins::c_mov_ai: v_get_addr(cur->first)=v_get_imme(cur->second); v_next_ins; case tins::c_mov_rr: v_get_reg(cur->first)=v_get_reg(cur->second); v_next_ins; case tins::c_mov_ar: v_get_addr(cur->first)=v_get_reg(cur->second); v_next_ins; case tins::c_mov_ra: v_get_reg(cur->first)=v_get_addr(cur->second); v_next_ins; case tins::c_mov_aa: v_get_addr(cur->first)=v_get_addr(cur->second); v_next_ins; case tins::c_mov1_ri: case tins::c_mov1_ai: case tins::c_mov1_rr: case tins::c_mov1_ar: case tins::c_mov1_ra: return false; case tins::c_mov1_aa: v_get_addr_1(cur->first)=v_get_addr_1(cur->second); v_next_ins; case tins::c_mov8_ri: case tins::c_mov8_ai: case tins::c_mov8_rr: case tins::c_mov8_ar: case tins::c_mov8_ra: return false; case tins::c_mov8_aa: v_get_addr_8(cur->first)=v_get_addr_8(cur->second); v_next_ins; case tins::c_add_ri: v_get_reg(cur->first)+=v_get_imme(cur->second); v_next_ins; case tins::c_add_ai: v_get_addr(cur->first)+=v_get_imme(cur->second); v_next_ins; case tins::c_add_rr: v_get_reg(cur->first)+=v_get_reg(cur->second); v_next_ins; case tins::c_add_ar: v_get_addr(cur->first)+=v_get_reg(cur->second); v_next_ins; case tins::c_add_ra: v_get_reg(cur->first)+=v_get_addr(cur->second); v_next_ins; case tins::c_add_aa: v_get_addr(cur->first)+=v_get_addr(cur->second); v_next_ins; case tins::c_sub_ri: v_get_reg(cur->first)-=v_get_imme(cur->second); v_next_ins; case tins::c_sub_ai: v_get_addr(cur->first)-=v_get_imme(cur->second); v_next_ins; case tins::c_sub_rr: v_get_reg(cur->first)-=v_get_reg(cur->second); v_next_ins; case tins::c_sub_ar: v_get_addr(cur->first)-=v_get_reg(cur->second); v_next_ins; case tins::c_sub_ra: v_get_reg(cur->first)-=v_get_addr(cur->second); v_next_ins; case tins::c_sub_aa: v_get_addr(cur->first)-=v_get_addr(cur->second); v_next_ins; case tins::c_imul_ri: v_get_reg(cur->first)*=v_get_imme(cur->second); v_next_ins; case tins::c_imul_ai: v_get_addr(cur->first)*=v_get_imme(cur->second); v_next_ins; case tins::c_imul_rr: v_get_reg(cur->first)*=v_get_reg(cur->second); v_next_ins; case tins::c_imul_ar: v_get_addr(cur->first)*=v_get_reg(cur->second); v_next_ins; case tins::c_imul_ra: v_get_reg(cur->first)*=v_get_addr(cur->second); v_next_ins; case tins::c_imul_aa: v_get_addr(cur->first)*=v_get_addr(cur->second); v_next_ins; case tins::c_idiv_ri: v_get_reg(cur->first)/=v_get_imme(cur->second); v_next_ins; case tins::c_idiv_ai: v_get_addr(cur->first)/=v_get_imme(cur->second); v_next_ins; case tins::c_idiv_rr: v_get_reg(cur->first)/=v_get_reg(cur->second); v_next_ins; case tins::c_idiv_ar: v_get_addr(cur->first)/=v_get_reg(cur->second); v_next_ins; case tins::c_idiv_ra: v_get_reg(cur->first)/=v_get_addr(cur->second); v_next_ins; case tins::c_idiv_aa: v_get_addr(cur->first)/=v_get_addr(cur->second); v_next_ins; case tins::c_imod_ri: v_get_reg(cur->first)%=v_get_imme(cur->second); v_next_ins; case tins::c_imod_ai: v_get_addr(cur->first)%=v_get_imme(cur->second); v_next_ins; case tins::c_imod_rr: v_get_reg(cur->first)%=v_get_reg(cur->second); v_next_ins; case tins::c_imod_ar: v_get_addr(cur->first)%=v_get_reg(cur->second); v_next_ins; case tins::c_imod_ra: v_get_reg(cur->first)%=v_get_addr(cur->second); v_next_ins; case tins::c_imod_aa: v_get_addr(cur->first)%=v_get_addr(cur->second); v_next_ins; case tins::c_cesb_ri: reg.ebx=v_get_reg(cur->first)==v_get_imme(cur->second); v_next_ins; case tins::c_cesb_ai: reg.ebx=v_get_addr(cur->first)==v_get_imme(cur->second); v_next_ins; case tins::c_cesb_rr: reg.ebx=v_get_reg(cur->first)==v_get_reg(cur->second); v_next_ins; case tins::c_cesb_ar: reg.ebx=v_get_addr(cur->first)==v_get_reg(cur->second); v_next_ins; case tins::c_cesb_ra: reg.ebx=v_get_reg(cur->first)==v_get_addr(cur->second); v_next_ins; case tins::c_cesb_aa: reg.ebx=v_get_addr(cur->first)==v_get_addr(cur->second); v_next_ins; case tins::c_cnesb_ri: reg.ebx=v_get_reg(cur->first)!=v_get_imme(cur->second); v_next_ins; case tins::c_cnesb_ai: reg.ebx=v_get_addr(cur->first)!=v_get_imme(cur->second); v_next_ins; case tins::c_cnesb_rr: reg.ebx=v_get_reg(cur->first)!=v_get_reg(cur->second); v_next_ins; case tins::c_cnesb_ar: reg.ebx=v_get_addr(cur->first)!=v_get_reg(cur->second); v_next_ins; case tins::c_cnesb_ra: reg.ebx=v_get_reg(cur->first)!=v_get_addr(cur->second); v_next_ins; case tins::c_cnesb_aa: reg.ebx=v_get_addr(cur->first)!=v_get_addr(cur->second); v_next_ins; case tins::c_cgsb_ri: reg.ebx=v_get_reg(cur->first)>v_get_imme(cur->second); v_next_ins; case tins::c_cgsb_ai: reg.ebx=v_get_addr(cur->first)>v_get_imme(cur->second); v_next_ins; case tins::c_cgsb_rr: reg.ebx=v_get_reg(cur->first)>v_get_reg(cur->second); v_next_ins; case tins::c_cgsb_ar: reg.ebx=v_get_addr(cur->first)>v_get_reg(cur->second); v_next_ins; case tins::c_cgsb_ra: reg.ebx=v_get_reg(cur->first)>v_get_addr(cur->second); v_next_ins; case tins::c_cgsb_aa: reg.ebx=v_get_addr(cur->first)>v_get_addr(cur->second); v_next_ins; case tins::c_cgesb_ri: reg.ebx=v_get_reg(cur->first)>=v_get_imme(cur->second); v_next_ins; case tins::c_cgesb_ai: reg.ebx=v_get_addr(cur->first)>=v_get_imme(cur->second); v_next_ins; case tins::c_cgesb_rr: reg.ebx=v_get_reg(cur->first)>=v_get_reg(cur->second); v_next_ins; case tins::c_cgesb_ar: reg.ebx=v_get_addr(cur->first)>=v_get_reg(cur->second); v_next_ins; case tins::c_cgesb_ra: reg.ebx=v_get_reg(cur->first)>=v_get_addr(cur->second); v_next_ins; case tins::c_cgesb_aa: reg.ebx=v_get_addr(cur->first)>=v_get_addr(cur->second); v_next_ins; case tins::c_clsb_ri: reg.ebx=v_get_reg(cur->first)second); v_next_ins; case tins::c_clsb_ai: reg.ebx=v_get_addr(cur->first)second); v_next_ins; case tins::c_clsb_rr: reg.ebx=v_get_reg(cur->first)second); v_next_ins; case tins::c_clsb_ar: reg.ebx=v_get_addr(cur->first)second); v_next_ins; case tins::c_clsb_ra: reg.ebx=v_get_reg(cur->first)second); v_next_ins; case tins::c_clsb_aa: reg.ebx=v_get_addr(cur->first)second); v_next_ins; case tins::c_clesb_ri: reg.ebx=v_get_reg(cur->first)<=v_get_imme(cur->second); v_next_ins; case tins::c_clesb_ai: reg.ebx=v_get_addr(cur->first)<=v_get_imme(cur->second); v_next_ins; case tins::c_clesb_rr: reg.ebx=v_get_reg(cur->first)<=v_get_reg(cur->second); v_next_ins; case tins::c_clesb_ar: reg.ebx=v_get_addr(cur->first)<=v_get_reg(cur->second); v_next_ins; case tins::c_clesb_ra: reg.ebx=v_get_reg(cur->first)<=v_get_addr(cur->second); v_next_ins; case tins::c_clesb_aa: reg.ebx=v_get_addr(cur->first)<=v_get_addr(cur->second); v_next_ins; case tins::c_clesb_aa+1: case tins::c_clesb_aa+2: case tins::c_clesb_aa+3: case tins::c_clesb_aa+4: case tins::c_clesb_aa+5: return false; case tins::c_add8_aa: v_get_addr_8(cur->first)+=v_get_addr_8(cur->second); v_next_ins; case tins::c_add8_aa+1: case tins::c_add8_aa+2: case tins::c_add8_aa+3: case tins::c_add8_aa+4: case tins::c_add8_aa+5: return false; case tins::c_sub8_aa: v_get_addr_8(cur->first)-=v_get_addr_8(cur->second); v_next_ins; case tins::c_sub8_aa+1: case tins::c_sub8_aa+2: case tins::c_sub8_aa+3: case tins::c_sub8_aa+4: case tins::c_sub8_aa+5: return false; case tins::c_imul8_aa: v_get_addr_8(cur->first)*=v_get_addr_8(cur->second); v_next_ins; case tins::c_imul8_aa+1: case tins::c_imul8_aa+2: case tins::c_imul8_aa+3: case tins::c_imul8_aa+4: case tins::c_imul8_aa+5: return false; case tins::c_idiv8_aa: v_get_addr_8(cur->first)/=v_get_addr_8(cur->second); v_next_ins; case tins::c_idiv8_aa+1: case tins::c_idiv8_aa+2: case tins::c_idiv8_aa+3: case tins::c_idiv8_aa+4: case tins::c_idiv8_aa+5: return false; case tins::c_imod8_aa: v_get_addr_8(cur->first)%=v_get_addr_8(cur->second); v_next_ins; case tins::c_imod8_aa+1: case tins::c_imod8_aa+2: case tins::c_imod8_aa+3: case tins::c_imod8_aa+4: case tins::c_imod8_aa+5: return false; case tins::c_cgsb8_aa: reg.ebx=v_get_addr_8(cur->first)>v_get_addr_8(cur->second); v_next_ins; case tins::c_cgsb8_aa+1: case tins::c_cgsb8_aa+2: case tins::c_cgsb8_aa+3: case tins::c_cgsb8_aa+4: case tins::c_cgsb8_aa+5: return false; case tins::c_clsb8_aa: reg.ebx=v_get_addr_8(cur->first)second); v_next_ins; case tins::c_clsb8_aa+1: case tins::c_clsb8_aa+2: case tins::c_clsb8_aa+3: case tins::c_clsb8_aa+4: case tins::c_clsb8_aa+5: return false; case tins::c_fadd8_aa: v_get_addr_f8(cur->first)+=v_get_addr_f8(cur->second); v_next_ins; case tins::c_fadd8_aa+1: case tins::c_fadd8_aa+2: case tins::c_fadd8_aa+3: case tins::c_fadd8_aa+4: case tins::c_fadd8_aa+5: return false; case tins::c_fsub8_aa: v_get_addr_f8(cur->first)-=v_get_addr_f8(cur->second); v_next_ins; case tins::c_fsub8_aa+1: case tins::c_fsub8_aa+2: case tins::c_fsub8_aa+3: case tins::c_fsub8_aa+4: case tins::c_fsub8_aa+5: return false; case tins::c_fmul8_aa: v_get_addr_f8(cur->first)*=v_get_addr_f8(cur->second); v_next_ins; case tins::c_fmul8_aa+1: case tins::c_fmul8_aa+2: case tins::c_fmul8_aa+3: case tins::c_fmul8_aa+4: case tins::c_fmul8_aa+5: return false; case tins::c_fdiv8_aa: v_get_addr_f8(cur->first)/=v_get_addr_f8(cur->second); v_next_ins; case tins::c_fdiv8_aa+1: case tins::c_fdiv8_aa+2: case tins::c_fdiv8_aa+3: case tins::c_fdiv8_aa+4: case tins::c_fdiv8_aa+5: return false; case tins::c_fcgsb8_aa: reg.ebx=v_get_addr_f8(cur->first)>v_get_addr_f8(cur->second); v_next_ins; case tins::c_fcgsb8_aa+1: case tins::c_fcgsb8_aa+2: case tins::c_fcgsb8_aa+3: case tins::c_fcgsb8_aa+4: case tins::c_fcgsb8_aa+5: return false; case tins::c_fclsb8_aa: reg.ebx=v_get_addr_f8(cur->first)second); v_next_ins; case tins::c_band_ri: v_get_reg_u(cur->first)&=v_get_imme_u(cur->second); v_next_ins; case tins::c_band_ai: v_get_addr_u(cur->first)&=v_get_imme_u(cur->second); v_next_ins; case tins::c_band_rr: v_get_reg_u(cur->first)&=v_get_reg_u(cur->second); v_next_ins; case tins::c_band_ar: v_get_addr_u(cur->first)&=v_get_reg_u(cur->second); v_next_ins; case tins::c_band_ra: v_get_reg_u(cur->first)&=v_get_addr_u(cur->second); v_next_ins; case tins::c_band_aa: v_get_addr_u(cur->first)&=v_get_addr_u(cur->second); v_next_ins; case tins::c_bor_ri: v_get_reg_u(cur->first)|=v_get_imme_u(cur->second); v_next_ins; case tins::c_bor_ai: v_get_addr_u(cur->first)|=v_get_imme_u(cur->second); v_next_ins; case tins::c_bor_rr: v_get_reg_u(cur->first)|=v_get_reg_u(cur->second); v_next_ins; case tins::c_bor_ar: v_get_addr_u(cur->first)|=v_get_reg_u(cur->second); v_next_ins; case tins::c_bor_ra: v_get_reg_u(cur->first)|=v_get_addr_u(cur->second); v_next_ins; case tins::c_bor_aa: v_get_addr_u(cur->first)|=v_get_addr_u(cur->second); v_next_ins; case tins::c_bnot_i: return false; case tins::c_bnot_r: v_get_reg(cur->first)=~v_get_reg(cur->first); v_next_ins; case tins::c_bnot_a: v_get_addr(cur->first)=~v_get_addr(cur->first); v_next_ins; case tins::c_bnot_a+1: case tins::c_bnot_a+2: case tins::c_bnot_a+3: return false; case tins::c_bxor_ri: v_get_reg_u(cur->first)^=v_get_imme_u(cur->second); v_next_ins; case tins::c_bxor_ai: v_get_addr_u(cur->first)^=v_get_imme_u(cur->second); v_next_ins; case tins::c_bxor_rr: v_get_reg_u(cur->first)^=v_get_reg_u(cur->second); v_next_ins; case tins::c_bxor_ar: v_get_addr_u(cur->first)^=v_get_reg_u(cur->second); v_next_ins; case tins::c_bxor_ra: v_get_reg_u(cur->first)^=v_get_addr_u(cur->second); v_next_ins; case tins::c_bxor_aa: v_get_addr_u(cur->first)^=v_get_addr_u(cur->second); v_next_ins; case tins::c_bshl_ri: v_get_reg_u(cur->first)<<=v_get_imme_u(cur->second); v_next_ins; case tins::c_bshl_ai: v_get_addr_u(cur->first)<<=v_get_imme_u(cur->second); v_next_ins; case tins::c_bshl_rr: v_get_reg_u(cur->first)<<=v_get_reg_u(cur->second); v_next_ins; case tins::c_bshl_ar: v_get_addr_u(cur->first)<<=v_get_reg_u(cur->second); v_next_ins; case tins::c_bshl_ra: v_get_reg_u(cur->first)<<=v_get_addr_u(cur->second); v_next_ins; case tins::c_bshl_aa: v_get_addr_u(cur->first)<<=v_get_addr_u(cur->second); v_next_ins; case tins::c_bshr_ri: v_get_reg_u(cur->first)>>=v_get_imme_u(cur->second); v_next_ins; case tins::c_bshr_ai: v_get_addr_u(cur->first)>>=v_get_imme_u(cur->second); v_next_ins; case tins::c_bshr_rr: v_get_reg_u(cur->first)>>=v_get_reg_u(cur->second); v_next_ins; case tins::c_bshr_ar: v_get_addr_u(cur->first)>>=v_get_reg_u(cur->second); v_next_ins; case tins::c_bshr_ra: v_get_reg_u(cur->first)>>=v_get_addr_u(cur->second); v_next_ins; case tins::c_bshr_aa: v_get_addr_u(cur->first)>>=v_get_addr_u(cur->second); v_next_ins; case tins::c_bsar_ri: v_get_reg(cur->first)>>=v_get_imme(cur->second); v_next_ins; case tins::c_bsar_ai: v_get_addr(cur->first)>>=v_get_imme(cur->second); v_next_ins; case tins::c_bsar_rr: v_get_reg(cur->first)>>=v_get_reg(cur->second); v_next_ins; case tins::c_bsar_ar: v_get_addr(cur->first)>>=v_get_reg(cur->second); v_next_ins; case tins::c_bsar_ra: v_get_reg(cur->first)>>=v_get_addr(cur->second); v_next_ins; case tins::c_bsar_aa: v_get_addr(cur->first)>>=v_get_addr(cur->second); v_next_ins; case tins::c_udiv_ri: v_get_reg_u(cur->first)/=v_get_imme_u(cur->second); v_next_ins; case tins::c_udiv_ai: v_get_addr_u(cur->first)/=v_get_imme_u(cur->second); v_next_ins; case tins::c_udiv_rr: v_get_reg_u(cur->first)/=v_get_reg_u(cur->second); v_next_ins; case tins::c_udiv_ar: v_get_addr_u(cur->first)/=v_get_reg_u(cur->second); v_next_ins; case tins::c_udiv_ra: v_get_reg_u(cur->first)/=v_get_addr_u(cur->second); v_next_ins; case tins::c_udiv_aa: v_get_addr_u(cur->first)/=v_get_addr_u(cur->second); v_next_ins; case tins::c_umod_ri: v_get_reg_u(cur->first)%=v_get_imme_u(cur->second); v_next_ins; case tins::c_umod_ai: v_get_addr_u(cur->first)%=v_get_imme_u(cur->second); v_next_ins; case tins::c_umod_rr: v_get_reg_u(cur->first)%=v_get_reg_u(cur->second); v_next_ins; case tins::c_umod_ar: v_get_addr_u(cur->first)%=v_get_reg_u(cur->second); v_next_ins; case tins::c_umod_ra: v_get_reg_u(cur->first)%=v_get_addr_u(cur->second); v_next_ins; case tins::c_umod_aa: v_get_addr_u(cur->first)%=v_get_addr_u(cur->second); v_next_ins; case tins::c_ucgsb_ri: reg.ebx=v_get_reg_u(cur->first)>v_get_imme_u(cur->second); v_next_ins; case tins::c_ucgsb_ai: reg.ebx=v_get_addr_u(cur->first)>v_get_imme_u(cur->second); v_next_ins; case tins::c_ucgsb_rr: reg.ebx=v_get_reg_u(cur->first)>v_get_reg_u(cur->second); v_next_ins; case tins::c_ucgsb_ar: reg.ebx=v_get_addr_u(cur->first)>v_get_reg_u(cur->second); v_next_ins; case tins::c_ucgsb_ra: reg.ebx=v_get_reg_u(cur->first)>v_get_addr_u(cur->second); v_next_ins; case tins::c_ucgsb_aa: reg.ebx=v_get_addr_u(cur->first)>v_get_addr_u(cur->second); v_next_ins; case tins::c_ucgesb_ri: reg.ebx=v_get_reg_u(cur->first)>=v_get_imme_u(cur->second); v_next_ins; case tins::c_ucgesb_ai: reg.ebx=v_get_addr_u(cur->first)>=v_get_imme_u(cur->second); v_next_ins; case tins::c_ucgesb_rr: reg.ebx=v_get_reg_u(cur->first)>=v_get_reg_u(cur->second); v_next_ins; case tins::c_ucgesb_ar: reg.ebx=v_get_addr_u(cur->first)>=v_get_reg_u(cur->second); v_next_ins; case tins::c_ucgesb_ra: reg.ebx=v_get_reg_u(cur->first)>=v_get_addr_u(cur->second); v_next_ins; case tins::c_ucgesb_aa: reg.ebx=v_get_addr_u(cur->first)>=v_get_addr_u(cur->second); v_next_ins; case tins::c_uclsb_ri: reg.ebx=v_get_reg_u(cur->first)second); v_next_ins; case tins::c_uclsb_ai: reg.ebx=v_get_addr_u(cur->first)second); v_next_ins; case tins::c_uclsb_rr: reg.ebx=v_get_reg_u(cur->first)second); v_next_ins; case tins::c_uclsb_ar: reg.ebx=v_get_addr_u(cur->first)second); v_next_ins; case tins::c_uclsb_ra: reg.ebx=v_get_reg_u(cur->first)second); v_next_ins; case tins::c_uclsb_aa: reg.ebx=v_get_addr_u(cur->first)second); v_next_ins; case tins::c_uclesb_ri: reg.ebx=v_get_reg_u(cur->first)<=v_get_imme_u(cur->second); v_next_ins; case tins::c_uclesb_ai: reg.ebx=v_get_addr_u(cur->first)<=v_get_imme_u(cur->second); v_next_ins; case tins::c_uclesb_rr: reg.ebx=v_get_reg_u(cur->first)<=v_get_reg_u(cur->second); v_next_ins; case tins::c_uclesb_ar: reg.ebx=v_get_addr_u(cur->first)<=v_get_reg_u(cur->second); v_next_ins; case tins::c_uclesb_ra: reg.ebx=v_get_reg_u(cur->first)<=v_get_addr_u(cur->second); v_next_ins; case tins::c_uclesb_aa: reg.ebx=v_get_addr_u(cur->first)<=v_get_addr_u(cur->second); v_next_ins; default: return false; } if(poldreg!=null) { *poldreg=reg; } return true; } //查找DLL中的函数 static void* find_dll(tvm_t* pvmt,const char* name) { if(pvmt->m_func.exist(name)) { return pvmt->m_func[name]; } void* ret=zjitf::find_dll_full(name); if(ret!=null) { pvmt->m_func[name]=ret; } return ret; } //调用外部函数 static void stdcall_func(treg& reg) { #ifdef _MSC_VER #ifndef _WIN64 uint addr=v_pto_uint(reg.esp); int count=v_pto_int(reg.esp+4); int tmp; for(int i=count-1;i>=0;i--) { tmp=v_pto_int(reg.esp+8+i*4); _asm push tmp } _asm call addr _asm mov tmp,eax v_pto_int(reg.esp+8+count*4)=tmp; reg.esp+=8+count*4; #endif #endif } //调用外部函数 static void cdecl_func(treg& reg) { #ifdef _MSC_VER #ifndef _WIN64 uint addr=v_pto_uint(reg.esp); int count=v_pto_int(reg.esp+4); int tmp; for(int i=count-1;i>=0;i--) { tmp=v_pto_int(reg.esp+8+i*4); _asm push tmp } _asm call addr _asm mov tmp,eax _asm mov eax,count _asm imul eax,4 _asm add esp,eax v_pto_int(reg.esp+8+count*4)=tmp; reg.esp+=8+count*4; #endif #endif } rbool run(tsh& sh) { if(!init(sh)) { rf::printl("main func init failed"); return false; } if(!qrun(sh,&m_list[0],m_list[0].m_reg)) { rstr("undefined ins").print(); return false; } #ifdef RANALYSE tanalyse::analyse_print(sh); #endif return true; } static void init_reg(tsh& sh,tvm_t* pitem) { pitem->m_stack.realloc_n(rppconf(c_stack_size)); pitem->m_reg.esp=r_to_uint(pitem->m_stack.end()); pitem->m_reg.eip=r_to_uint(pitem->m_vasm.begin()); } rbool init(tsh& sh) { tvm_t item; m_list.push(item); tvm_t* pitem=&m_list.top(); ifn(main_init(sh,pitem->m_vasm)) return false; init_reg(sh,pitem); pitem->m_pvm=this; pitem->m_thread=0; return true; } static rbool main_init(tsh& sh,rbuf& vasm) { zasm::push_asm(vasm,"sub","esp",",","4"); zasm::push_asm(vasm,"call",rppoptr(c_mbk_l),rppoptr(c_addr), rppoptr(c_comma),"main",rppoptr(c_comma),"main()", rppoptr(c_mbk_r)); zasm::push_asm(vasm,"add","esp",",","4"); zasm::push_asm(vasm,"halt"); return zbin::proc_vasm(sh,vasm); } static rbool init_thr_ins(tsh& sh,rbuf& vasm,void* start,void* param) { vasm.clear(); zasm::push_asm(vasm,"push",rstr((uint)param)); zasm::push_asm(vasm,"call",rstr((uint)start)); zasm::push_asm(vasm,"halt"); return zbin::proc_vasm(sh,vasm); } int create_thr(tsh& sh,void* start,void* param) { rmutex_t mutex_t(sh.m_mutex); tvm_t item; m_list.push(item); tvm_t* pitem=&m_list.top(); ifn(init_thr_ins(sh,pitem->m_vasm,start,param)) { return 0; } init_reg(sh,pitem); pitem->m_pvm=this; pitem->m_thread=rthread::create(thread,pitem); return pitem->m_thread; } //这里必须用裸线程 static rthread_ret rthread_call thread(void* param) { tvm_t* pvmt=(tvm_t*)param; tvm* pvm=pvmt->m_pvm; ifn(qrun(pvm->m_sh,pvmt,pvmt->m_reg)) { tsh::error("undefined ins"); } pvm->m_sh.m_mutex.enter(); pvm->m_list.erase(pvmt); pvm->m_sh.m_mutex.leave(); return 0; } }; #endif ================================================ FILE: rpp/tvm_struct.h ================================================ #ifndef tvm_struct_h__ #define tvm_struct_h__ #include "../rlib/rstr.h" #include "rpp_def.h" #pragma pack(4) struct treg { union { //int64 rip; uint eip; }; union { //int64 rsp; uint esp; }; union { //int64 rbp; uint ebp; }; union { //int64 rsi; uint esi; }; union { //int64 rdi; uint edi; }; union { //int64 rax; uint eax; }; union { //int64 rbx; uint ebx; }; union { //int64 rcx; uint ecx; }; union { //int64 rdx; uint edx; }; enum { c_esp=4, c_ebp=8, c_esi=12, c_edi=16, c_eax=20, c_ebx=24, c_ecx=28, c_edx=32 }; }; struct topnd { int type; int off; int val; enum { c_null, c_reg,//ebp c_imme,//4 c_addr,//[ebp+4] }; topnd() { clear(); } void clear() { type=c_null; off=0; val=0; } rbool empty() { return type==c_null; } }; struct tins { int type; topnd first; topnd second; tins() { clear(); } void clear() { type=c_rjit_n; first.clear(); second.clear(); } rbool empty() { return type==c_rjit_n; } enum { c_rjit_n, c_calle_i=c_rjit_n+6, c_call_i=c_calle_i+6, c_call_r, c_call_a, c_ret_n=c_call_i+6, c_ret_i=c_ret_n+6, c_ret_r, c_ret_a, c_push_i=c_ret_i+6, c_push_r, c_push_a, c_pop_i=c_push_i+6, c_pop_r, c_pop_a, c_jmp_i=c_pop_i+6, c_jmp_r, c_jmp_a, c_jebxz_i=c_jmp_i+6, c_jebxz_r, c_jebxz_a, c_jebxnz_i=c_jebxz_i+6, c_jebxnz_r, c_jebxnz_a, c_halt_n=c_jebxnz_i+6, c_nop_n=c_halt_n+6, c_lea_ri=c_nop_n+6, c_lea_ai, c_lea_rr, c_lea_ar, c_lea_ra, c_lea_aa, c_mov_ri, c_mov_ai, c_mov_rr, c_mov_ar, c_mov_ra, c_mov_aa, c_mov1_ri, c_mov1_ai, c_mov1_rr, c_mov1_ar, c_mov1_ra, c_mov1_aa, c_mov8_ri, c_mov8_ai, c_mov8_rr, c_mov8_ar, c_mov8_ra, c_mov8_aa, c_add_ri, c_add_ai, c_add_rr, c_add_ar, c_add_ra, c_add_aa, c_sub_ri, c_sub_ai, c_sub_rr, c_sub_ar, c_sub_ra, c_sub_aa, c_imul_ri, c_imul_ai, c_imul_rr, c_imul_ar, c_imul_ra, c_imul_aa, c_idiv_ri, c_idiv_ai, c_idiv_rr, c_idiv_ar, c_idiv_ra, c_idiv_aa, c_imod_ri, c_imod_ai, c_imod_rr, c_imod_ar, c_imod_ra, c_imod_aa, c_cesb_ri, c_cesb_ai, c_cesb_rr, c_cesb_ar, c_cesb_ra, c_cesb_aa, c_cnesb_ri, c_cnesb_ai, c_cnesb_rr, c_cnesb_ar, c_cnesb_ra, c_cnesb_aa, c_cgsb_ri, c_cgsb_ai, c_cgsb_rr, c_cgsb_ar, c_cgsb_ra, c_cgsb_aa, c_cgesb_ri, c_cgesb_ai, c_cgesb_rr, c_cgesb_ar, c_cgesb_ra, c_cgesb_aa, c_clsb_ri, c_clsb_ai, c_clsb_rr, c_clsb_ar, c_clsb_ra, c_clsb_aa, c_clesb_ri, c_clesb_ai, c_clesb_rr, c_clesb_ar, c_clesb_ra, c_clesb_aa, c_add8_aa=c_clesb_ri+6+5, c_sub8_aa=c_add8_aa+6, c_imul8_aa=c_sub8_aa+6, c_idiv8_aa=c_imul8_aa+6, c_imod8_aa=c_idiv8_aa+6, c_cgsb8_aa=c_imod8_aa+6, c_clsb8_aa=c_cgsb8_aa+6, c_fadd8_aa=c_clsb8_aa+6, c_fsub8_aa=c_fadd8_aa+6, c_fmul8_aa=c_fsub8_aa+6, c_fdiv8_aa=c_fmul8_aa+6, c_fcgsb8_aa=c_fdiv8_aa+6, c_fclsb8_aa=c_fcgsb8_aa+6, c_band_ri, c_band_ai, c_band_rr, c_band_ar, c_band_ra, c_band_aa, c_bor_ri, c_bor_ai, c_bor_rr, c_bor_ar, c_bor_ra, c_bor_aa, c_bnot_i, c_bnot_r, c_bnot_a, c_bxor_ri=c_bnot_i+6, c_bxor_ai, c_bxor_rr, c_bxor_ar, c_bxor_ra, c_bxor_aa, c_bshl_ri, c_bshl_ai, c_bshl_rr, c_bshl_ar, c_bshl_ra, c_bshl_aa, c_bshr_ri, c_bshr_ai, c_bshr_rr, c_bshr_ar, c_bshr_ra, c_bshr_aa, c_bsar_ri, c_bsar_ai, c_bsar_rr, c_bsar_ar, c_bsar_ra, c_bsar_aa, c_udiv_ri, c_udiv_ai, c_udiv_rr, c_udiv_ar, c_udiv_ra, c_udiv_aa, c_umod_ri, c_umod_ai, c_umod_rr, c_umod_ar, c_umod_ra, c_umod_aa, c_ucgsb_ri, c_ucgsb_ai, c_ucgsb_rr, c_ucgsb_ar, c_ucgsb_ra, c_ucgsb_aa, c_ucgesb_ri, c_ucgesb_ai, c_ucgesb_rr, c_ucgesb_ar, c_ucgesb_ra, c_ucgesb_aa, c_uclsb_ri, c_uclsb_ai, c_uclsb_rr, c_uclsb_ar, c_uclsb_ra, c_uclsb_aa, c_uclesb_ri, c_uclesb_ai, c_uclesb_rr, c_uclesb_ar, c_uclesb_ra, c_uclesb_aa, }; enum { c_eval_txt, c_cp_txt, c_find_meta, c_find_func, c_find_dll, c_stdcall_func, c_cdecl_func, c_get_vclass, c_thr_create, c_thr_wait, c_mu_init, c_mu_del, c_mu_enter, c_mu_leave, c_execmd, c_srand, c_rand, c_gettick, c_sleep, c_puts, c_puts_l, c_getch, c_getstdin, c_getstdout, c_get_argc, c_get_argv, c_sprintf, c_sprintf8, c_sscanf, c_malloc, c_mfree, c_memset, c_memcpy, c_strcpy, c_strcmp, c_strlen, c_fopen_w, c_fopen, c_fclose, c_fread, c_fwrite, c_fseek, c_fseek8, c_ftell, c_ftell8, c_s_socket, c_s_connect, c_s_close, c_s_send, c_s_recv, c_s_bind, c_s_listen, c_s_accept, c_gbk_to_utf8, c_gbk_to_utf16, c_utf8_to_gbk, c_utf8_to_utf16, c_utf16_to_gbk, c_utf16_to_utf8, c_CloseHandle, c_MessageBoxA, c_itof8, }; enum { c_cc_set_effect_volume=1000, c_cc_set_music_volume, c_cc_play_effect, c_cc_play_music, c_cc_add_animations, c_cc_get_animation, c_cc_animate_create, c_cc_get_key, c_cc_set_key, c_cc_add_cache, c_cc_rand, c_cc_set_design_size, c_cc_set_display_state, c_cc_jump_scene, c_cc_touch_call, c_cc_sprite_create, c_cc_bmf_create, c_cc_bmf_set, c_cc_get_size, c_cc_set_tag, c_cc_get_tag, c_cc_add_child, c_cc_remove_from_parent, c_cc_set_pos, c_cc_get_pos, c_cc_set_scale, c_cc_run_ac, c_cc_stop_ac, c_cc_schedule, c_cc_ac_move_to, c_cc_ac_move_by, c_cc_ac_rotate_to, c_cc_ac_rotate_by, c_cc_ac_scale_to, c_cc_ac_scale_by, c_cc_ac_delay, c_cc_ac_repeat, c_cc_ac_repeat_times, c_cc_ac_sequence, c_cc_ac_spawn, c_cc_ac_call, c_cc_ac_ease_in, c_cc_ac_ease_out, c_cc_ac_elastic_in, c_cc_ac_elastic_out, c_cc_phy_apply_impulse, c_cc_phy_get_body, c_cc_phy_set_body, c_cc_phy_box, c_cc_phy_box_edge, c_cc_phy_call, c_cc_label_create, c_cc_set_color, }; }; struct tfile; struct tpos { tfile* file; int line; tpos() { clear(); } void clear() { file=null; line=0; } rbool empty() { return file==null; } friend rbool operator==(const tpos& a,const tpos& b) { return a.file==b.file&&a.line==b.line; } friend rbool operator!=(const tpos& a,const tpos& b) { return a.file!=b.file||a.line!=b.line; } void printl() { rstr((uint)file).printl(); rstr(line).printl(); } }; struct tfunc; struct tasm { tins ins;//tins放在最前面便于把指针转换为tasm* rbuf vstr; tpos pos; tfunc* ptfi;//反射到tfunc,不用初始化 uchar* start;//jit地址 tasm() { clear(); } tasm(tasm&& a) { ins=a.ins; vstr=a.vstr; pos=a.pos; ptfi=a.ptfi; start=a.start; } void operator=(tasm&& a) { ins=a.ins; vstr=a.vstr; pos=a.pos; ptfi=a.ptfi; start=a.start; } void clear() { ins.clear(); vstr.clear(); pos.clear(); ptfi=null; start=null; } void print() { vstr.print(); } }; //优化节点 struct top_node { rbuf src; rbuf dst; void clear() { src.clear(); dst.clear(); } }; #endif ================================================ FILE: rpp/zadd.h ================================================ #ifndef zadd_h__ #define zadd_h__ #include "zcontrol.h" //增加局部变量和成员变量构造及析构 struct zadd { static void add_local_and_memb(tsh& sh,tfunc& tfi) { tclass& tci=*tfi.ptci; //增加局部变量构造和析构 //注意增加的这些语句type为空 tsent temp=add_local_init(sh,tfi); if(!temp.empty()) tfi.vsent.push_front(temp); temp=add_local_free(sh,tfi); if(!temp.empty()) tfi.vsent.push(temp); zcontrol::part_vsent(tfi); if(rppconf(c_auto_addinit)) { if(tci.name==rppkey(c_main)&&tfi.name==rppkey(c_main)) { add_member_struct(sh,tfi); add_member_destruct(sh,tfi);//全局变量在main中构造和析构 } elif(tfi.name==tci.name&& tfi.retval.type==rppkey(c_void)&& !tfi.is_friend) { add_member_struct(sh,tfi); } elif(zfind::is_destruct(sh,tfi)) { add_member_destruct(sh,tfi); } } } static tsent add_local_free(tsh& sh,tfunc& tfi) { tsent sent; sent.pos=tfi.last_pos; for(int i=0;i& v) { if(sh.is_quote(tdi.type)) return; if(rppconf(c_op_empty_func)&&zfind::is_empty_struct_type(sh,tdi.type)) return; v+=rppoptr(c_mbk_l); v+=tdi.type; v+=rppoptr(c_comma); v+=tdi.type; v+=rppoptr(c_comma); v+=rppoptr(c_mbk_l); v+=tdi.name; v+=rppoptr(c_mbk_r); v+=rppoptr(c_mbk_r); v+=rppoptr(c_semi); } static void add_destructor_func(tsh& sh,tdata& tdi,rbuf& v) { if(sh.is_quote(tdi.type)) return; if(rppconf(c_op_empty_func)&&zfind::is_empty_struct_type(sh,tdi.type)) return; v+=rppoptr(c_mbk_l); v+=tdi.type; v+=rppoptr(c_comma); v+=rppoptr(c_destruct)+tdi.type; v+=rppoptr(c_comma); v+=rppoptr(c_mbk_l); v+=tdi.name; v+=rppoptr(c_mbk_r); v+=rppoptr(c_mbk_r); v+=rppoptr(c_semi); } static void add_structor_func_m(tsh& sh,tdata& tdi,rbuf& v) { if(sh.is_quote(tdi.type)) return; if(tdi.param.empty()&&rppconf(c_op_empty_func)&& zfind::is_empty_struct_type(sh,tdi.type)) return; v.push(tword(tdi.type)); v.push(tword(rppoptr(c_dot))); v.push(tword(tdi.type)); v.push(tword(rppoptr(c_sbk_l))); v.push(tword(tdi.name)); if(!tdi.param.empty()) { v.push(tword(rppoptr(c_comma))); v+=tdi.param; } v.push(tword(rppoptr(c_sbk_r))); v.push(tword(rppoptr(c_semi))); } static void add_member_destruct(tsh& sh,tfunc& tfi) { tclass& tci=*tfi.ptci; tsent sent; sent.pos=tfi.last_pos; sent.type=rppkey(c_void); for(int i=tci.vdata.count()-1;i>=0;i--) { if(sh.is_quote(tci.vdata[i].type)) continue; tclass* ptci=zfind::class_search(sh,tci.vdata[i].type); if(null==ptci) continue; if(zfind::destruct_search(*ptci)==null) continue; add_destructor_func(sh,tci.vdata[i],sent.vword); } if(!sent.vword.empty()) { tfi.vsent.push_move(sent); zcontrol::part_vsent(tfi.vsent); } } static void add_member_struct(tsh& sh,tfunc& tfi) { tclass& tci=*tfi.ptci; tsent sent; sent.type=rppkey(c_void); for(int i=0;ivasm //返回指针或引用或int的表达式需要放入ebx中 //指针或int的引用是对本身的值进行判断 //其它类型的引用是对引用进行判断 struct zasm { static rbool proc_func(tsh& sh,tfunc& tfi) { for(int i=0;i vasm; if(!proc_ret(sh,tfi.vsent[i],vasm,tfi)) { sh.error(tfi.vsent[i],"build asm error"); return false; } if(rppconf(c_op_match)) { zopt::op_match(sh,vasm); } if(rppconf(c_op_merge)) zopt::op_add_sub(sh,vasm); for(int j=0;j& vasm,double dval) { push_asm(vasm,rppkey(c_push),rstr(*((uint*)&dval+1))); push_asm(vasm,rppkey(c_push),rstr(*((uint*)&dval))); } static rbool add_asm_ebp(tsh& sh,tfunc& tfi) { rbuf vasm; tasm item; item.pos=tfi.first_pos; int size=zfind::get_func_local_size(tfi); ifn(rppconf(c_op_zero)&&size==0) { item.vstr.clear(); item.vstr.push(rppkey(c_sub)); item.vstr.push(rppkey(c_esp)); item.vstr.push(rppoptr(c_comma)); item.vstr.push(rstr(size)); vasm.push(item); } rbool b_use_ebp=use_ebp(sh,tfi.vasm); if(b_use_ebp) { item.vstr.clear(); item.vstr.push(rppkey(c_push)); item.vstr.push(rppkey(c_ebp)); vasm.push(item); item.vstr.clear(); item.vstr.push(rppkey(c_mov)); item.vstr.push(rppkey(c_ebp)); item.vstr.push(rppoptr(c_comma)); item.vstr.push(rppkey(c_esp)); vasm.push(item); } if(tfi.is_cfunc) { //todo 如果ebx、esi、edi未修改则不用保护 item.vstr.clear(); item.vstr.push(rppkey(c_push)); item.vstr.push(rppkey(c_ebx)); vasm.push(item); item.vstr.clear(); item.vstr.push(rppkey(c_push)); item.vstr.push(rppkey(c_esi)); vasm.push(item); item.vstr.clear(); item.vstr.push(rppkey(c_push)); item.vstr.push(rppkey(c_edi)); vasm.push(item); } vasm+=tfi.vasm; item.pos=tfi.last_pos; if(tfi.is_cfunc) { item.vstr.clear(); item.vstr.push(rppkey(c_pop)); item.vstr.push(rppkey(c_edi)); vasm.push(item); item.vstr.clear(); item.vstr.push(rppkey(c_pop)); item.vstr.push(rppkey(c_esi)); vasm.push(item); item.vstr.clear(); item.vstr.push(rppkey(c_pop)); item.vstr.push(rppkey(c_ebx)); vasm.push(item); } if(b_use_ebp) { item.vstr.clear(); item.vstr.push(rppkey(c_pop)); item.vstr.push(rppkey(c_ebp)); vasm.push(item); } ifn(rppconf(c_op_zero)&&size==0) { item.vstr.clear(); item.vstr.push(rppkey(c_add)); item.vstr.push(rppkey(c_esp)); item.vstr.push(rppoptr(c_comma)); item.vstr.push(rstr(size)); vasm.push(item); } size=zfind::get_func_param_size(tfi); if(size>0) { item.vstr.clear(); item.vstr.push(rppkey(c_reti)); item.vstr.push(rstr(size)); vasm.push(item); } else { item.vstr.clear(); item.vstr.push(rppkey(c_retn)); vasm.push(item); } tfi.vasm=r_move(vasm); return true; } static rbool use_ebp(tsh& sh,rbuf& vasm) { if(!rppconf(c_op_ebp)) return true; for(int i=0;i& vasm, tfunc& tfi,int level=0) { rstr name=src.vword.get_bottom().val; if(sh.m_key.is_asm_ins(name)) { push_asm(vasm,sh.vword_to_vstr(src.vword)); return true; } //返回常量 if(src.vword.count()==1) { if(src.vword[0].is_cint()) { //经测试如果是小程序rppkey(c_mov)比"mov"效率高 push_asm(vasm,rppkey(c_mov),rppkey(c_ebx), rppoptr(c_comma),src.vword[0].val); return true; } elif(sh.m_key.is_asm_reg(src.vword[0].val)) { push_asm(vasm,rppkey(c_mov),rppkey(c_ebx), rppoptr(c_comma),src.vword[0].val); return true; } elif(src.vword[0].is_cpoint()) { if(src.vword[0].is_caddr()) { push_asm(vasm,rppkey(c_mov), rppkey(c_ebx),rppoptr(c_comma), src.vword[0].val); } else { push_asm(vasm,rppkey(c_mov), rppkey(c_ebx),rppoptr(c_comma), get_int(src.vword[0].val)); } return true; } } if(src.vword.count()==7&&src.vword[1].val==rppoptr(c_addr)) { push_asm(vasm,rppkey(c_mov),rppkey(c_ebx),rppoptr(c_comma), rppoptr(c_mbk_l),rppoptr(c_addr),rppoptr(c_comma), src.vword[3].val,rppoptr(c_comma),src.vword[5].val, rppoptr(c_mbk_r)); return true; } //返回变量 tdata* ptdi=zfind::local_search(tfi, get_src_in(sh,src).vword.get(0).val); if(ptdi!=null) { if(zfind::is_type_mebx(sh,src.type)) { push_asm(vasm,rppkey(c_lea),rppkey(c_esi), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_ebp),rppoptr(c_plus), rstr(ptdi->off),rppoptr(c_mbk_r)); //这里还可以优化 if(!add_esi(sh,ptdi->type,vasm,src)) return false; push_asm(vasm,rppkey(c_mov),rppkey(c_ebx), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_esi),rppoptr(c_mbk_r)); if(sh.is_quote(src.type)&& (sh.get_tname(src.type)==rppkey(c_int)|| sh.is_point(sh.get_tname(src.type)))) { push_asm(vasm,rppkey(c_mov),rppkey(c_ebx), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_ebx),rppoptr(c_mbk_r)); } } return true; } //返回函数 return proc_ret_func(sh,src,vasm,tfi,level); } static rbool proc_ret_func(tsh& sh,tsent& src,rbuf& vasm, tfunc& tfi,int level) { tdata retval; if(!a_exp(sh,get_src_in(sh,src),vasm,retval,tfi,level)) { return false; } int size; //多数函数返回void,因此加上这句判断可以提高效率 if(src.type!=rppkey(c_void)&&zfind::is_type_mebx(sh,src.type)) { push_asm(vasm,rppkey(c_mov),rppkey(c_esi), rppoptr(c_comma),rppkey(c_esp)); int cur=vasm.count(); if(!add_esi(sh,retval.type,vasm,src)) return false; if(cur==vasm.count()) { vasm.pop(); push_asm(vasm,rppkey(c_mov),rppkey(c_ebx), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_esp),rppoptr(c_mbk_r)); } else { push_asm(vasm,rppkey(c_mov),rppkey(c_ebx), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_esi),rppoptr(c_mbk_r)); } if(sh.is_quote(src.type)&& (sh.get_tname(src.type)==rppkey(c_int)|| sh.is_point(sh.get_tname(src.type)))) { push_asm(vasm,rppkey(c_mov),rppkey(c_ebx), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_ebx),rppoptr(c_mbk_r)); } } if(!destruct_ret(sh,retval,vasm)) { return false; } size=zfind::get_ceil_space(retval); push_asm(vasm,rppkey(c_add),rppkey(c_esp),rppoptr(c_comma),size); return true; } //解析表达式生成汇编代码 static rbool a_exp(tsh& sh,const tsent& src,rbuf& vasm,tdata& retval, tfunc& tfi,int level=0) { if(level>c_rpp_deep) { return false; } level++; if(src.vword.get_bottom().val!=rppoptr(c_mbk_l)|| src.vword.get_top().val!=rppoptr(c_mbk_r)) { return false; } if(src.vword.get(1).val==rppoptr(c_dot)) { return false; } int size; rbuf > vlisp; zexp::get_vlisp(sh,src.vword,vlisp); if(src.vword.get(1).val==rppkey(c_pcall)) { if(vlisp.count()!=4) { return false; } retval.type=vlisp[1].get(0).val; retval.size=zfind::get_type_size(sh,retval.type); size=zfind::get_ceil_space(retval); push_asm(vasm,rppkey(c_sub),rppkey(c_esp), rppoptr(c_comma),size); rbuf > temp_v; zexp::get_vlisp(sh,vlisp[3],temp_v); rbuf vsent; zexp::get_vsent(temp_v,vsent,src); for(int i=vsent.count()-1;i>=0;i--) { if(!zexp::p_exp(sh,vsent[i],tfi,level,tenv())) { return false; } } for(int i=vsent.count()-1;i>=0;i--) { tdata tdi; tdi.type=sh.get_tname(vsent[i].type); tdi.size=zfind::get_type_size(sh,tdi.type); if(!pass_param(sh,vsent[i],tdi,vasm,tfi,level)) return false; } tsent sent=src; sent.vword=vlisp[2]; if(!zexp::p_exp(sh,sent,tfi,level,tenv())) { return false; } if(!proc_ret(sh,sent,vasm,tfi,level)) return false; if(sent.type==rstr("rp")) { push_asm(vasm,rppkey(c_call),rppkey(c_ebx)); } else return false; return true; } if(vlisp.count()!=3) { return false; } zexp::get_vlisp(sh,vlisp[2],vlisp); rbuf vsent; zexp::get_vsent(vlisp,vsent,src); for(int i=vsent.count()-1;i>=0;i--) { if(!zexp::p_exp(sh,vsent[i],tfi,level,tenv())) { return false; } } rstr cname=src.vword.get(1).val; rstr fname=src.vword.get(3).val;//p_exp已经合并了name_dec tclass* ptci=zfind::class_search(sh,cname); if(null==ptci) { return false; } tfunc* ptfi=zfind::func_search_dec(*ptci,fname); if(ptfi==null) { return false; } retval=ptfi->retval; if(rppconf(c_op_empty_func)&& zfind::is_empty_struct_type(sh,ptci->name)&& (zfind::is_destruct(sh,*ptfi)|| zfind::is_emptystruct(sh,*ptfi))) return true; if(ptfi->param.count()!=vsent.count()) { return false; } size=zfind::get_ceil_space(retval); push_asm(vasm,rppkey(c_sub),rppkey(c_esp),rppoptr(c_comma),size); for(int i=vsent.count()-1;i>=0;i--) { if(!pass_param(sh,vsent[i],ptfi->param[i],vasm,tfi,level)) { return false; } } push_asm(vasm,sh.get_func_declare_call(sh,*ptci,*ptfi)); return true; } static rbool pass_param(tsh& sh,tsent& src,tdata& dst,rbuf& vasm, tfunc& tfi,int level) { if(src.vword.empty()) return false; int size; tsent src_in=get_src_in(sh,src); if(src_in.vword.get(1).val==rppkey(c_pcall)|| zfind::is_class(sh,src_in.vword.get(1).val)) { //先申请参数空间 size=zfind::get_ceil_space(dst); push_asm(vasm,rppkey(c_sub),rppkey(c_esp), rppoptr(c_comma),size); //递归处理子表达式 tdata retval; if(!a_exp(sh,src_in,vasm,retval,tfi,level)) return false; //获取传递参数的地址分别放入esi和edi中, //包括函数返回后再dot,如int.get().m_in if(!obtain_var_addr_f(sh,retval,src,vasm)) return false; //传递参数 if(!copy_param(sh,src.type,dst.type,vasm)) return false; //析构返回值 if(!destruct_ret(sh,retval,vasm)) { return false; } //释放栈 size=zfind::get_ceil_space(retval); push_asm(vasm,rppkey(c_add),rppkey(c_esp), rppoptr(c_comma),size); } elif(src.vword[0].is_cint()) { push_asm(vasm,rppkey(c_push),src.vword[0].val); } elif(src.vword[0].is_cuint()) { push_asm(vasm,rppkey(c_push),get_int(src.vword[0].val)); } elif(src.vword[0].is_cdouble()) { double dval=src.vword[0].val.todouble(); push_double(sh,vasm,dval); } elif(src.vword.count()==7&& src.vword.get(1).val==rppoptr(c_addr)&& src.vword[0].val==rppoptr(c_mbk_l)) { rbuf vtemp=sh.vword_to_vstr(src.vword); vtemp.push_front(rppkey(c_push)); push_asm(vasm,vtemp); } elif(src.vword[0].is_cpoint()) { if(src.vword.get_bottom().is_caddr()) push_asm(vasm,rppkey(c_push),src.vword[0].val); else push_asm(vasm,rppkey(c_push),get_int(src.vword[0].val)); } elif(src.vword[0].is_cstr()) { push_asm(vasm,rppkey(c_push),src.vword[0].val); } elif(sh.m_key.is_asm_reg(src.vword[0].val)) { push_asm(vasm,rppkey(c_push),src.vword[0].val); } else { rstr name=src_in.vword.get(0).val; tdata* ptdi=zfind::local_search(tfi,name); if(ptdi==null) return false; int cur=vasm.count()+3; if(!obtain_var_addr_var(sh,src,dst,ptdi,vasm)) return false; if(cur==vasm.count()&&rppconf(c_op_pass)) { if(zfind::is_op_pass_type(sh,dst.type)&& dst.type==src.type) { vasm.m_count-=3; push_asm(vasm,rppkey(c_push),rppoptr(c_mbk_l), rppkey(c_ebp),rppoptr(c_plus), rstr(ptdi->off),rppoptr(c_mbk_r)); return true; } if(sh.is_quote(dst.type)&&sh.is_quote(src.type)) { vasm.m_count-=3; push_asm(vasm,rppkey(c_push),rppoptr(c_mbk_l), rppkey(c_ebp),rppoptr(c_plus), rstr(ptdi->off),rppoptr(c_mbk_r)); return true; } if(sh.is_quote(dst.type)) { vasm.m_count-=3; push_asm(vasm,rppkey(c_lea),rppkey(c_esi), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_ebp),rppoptr(c_plus), rstr(ptdi->off),rppoptr(c_mbk_r)); push_asm(vasm,rppkey(c_push),rppkey(c_esi)); return true; } } //调用拷贝构造函数时还可以优化 if(!copy_param(sh,src.type,dst.type,vasm)) return false; return true; } return true; } static rbool obtain_var_addr_var(tsh& sh,tsent& src,tdata& dst, tdata* ptdi,rbuf& vasm) { int size=zfind::get_ceil_space(dst); push_asm(vasm,rppkey(c_sub),rppkey(c_esp),rppoptr(c_comma),size); push_asm(vasm,rppkey(c_mov),rppkey(c_edi),rppoptr(c_comma), rppkey(c_esp)); push_asm(vasm,rppkey(c_lea),rppkey(c_esi),rppoptr(c_comma), rppoptr(c_mbk_l),rppkey(c_ebp),rppoptr(c_plus), rstr(ptdi->off),rppoptr(c_mbk_r)); if(!add_esi(sh,ptdi->type,vasm,src)) return false; return true; } static rbool obtain_var_addr_f(tsh& sh,tdata& retval, tsent& src,rbuf& vasm) { int size=zfind::get_ceil_space(retval); push_asm(vasm,rppkey(c_lea),rppkey(c_edi),rppoptr(c_comma), rppoptr(c_mbk_l),rppkey(c_esp),rppoptr(c_plus), rstr(size),rppoptr(c_mbk_r)); push_asm(vasm,rppkey(c_mov),rppkey(c_esi),rppoptr(c_comma), rppkey(c_esp)); if(!add_esi(sh,retval.type,vasm,src)) return false; return true; } static tsent get_src_in(tsh& sh,tsent& src) { if(src.vword.get(1).val!=rppoptr(c_dot)) { return src; } tsent temp=src; int start=0; rbuf& v=src.vword; while(start+2& vasm,tsent& src) { int start=0; rbuf& v=src.vword; if(v.get(1).val!=rppoptr(c_dot)) { return true; } while(start+2=v.count()) { return false; } right+=2; } for(int i=0;ioff!=0) { push_asm(vasm,rppkey(c_add),rppkey(c_esi), rppoptr(c_comma),ptdi->off); } type=ptdi->type; right+=3; } return true; } //src的真实地址已经存储在esi中,dst的地址在edi中 static rbool copy_param(tsh& sh,const rstr& src, const rstr& dst,rbuf& vasm) { //指针可以随意转换 if(sh.is_point(dst)&&sh.is_point(src)|| dst==rppkey(c_rd4)&&zfind::get_type_size(sh,src)==4|| dst==rppkey(c_rcs)&&sh.is_point(src)) { push_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l), rppkey(c_edi),rppoptr(c_mbk_r), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_esi),rppoptr(c_mbk_r)); return true; } //目标是引用 if(sh.is_quote(dst)) { if(sh.is_quote(src)) { //源是引用 push_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l), rppkey(c_edi),rppoptr(c_mbk_r), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_esi),rppoptr(c_mbk_r)); } else { //源是对象 push_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l), rppkey(c_edi),rppoptr(c_mbk_r), rppoptr(c_comma),rppkey(c_esi)); } return true; } if(rppconf(c_op_pass)) { if(zfind::is_op_pass_type(sh,dst)) { if(sh.is_quote(src)) { //源是引用 push_asm(vasm,rppkey(c_mov),rppkey(c_esi), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_esi),rppoptr(c_mbk_r)); } push_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l), rppkey(c_edi),rppoptr(c_mbk_r), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_esi),rppoptr(c_mbk_r)); return true; } if(dst==rppkey(c_double)||dst==rppkey(c_int8)) { if(sh.is_quote(src)) { push_asm(vasm,rppkey(c_mov),rppkey(c_esi), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_esi),rppoptr(c_mbk_r)); } push_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l), rppkey(c_edi),rppoptr(c_mbk_r), rppoptr(c_comma),rppoptr(c_mbk_l), rppkey(c_esi),rppoptr(c_mbk_r)); push_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l), rppkey(c_edi),rppoptr(c_plus),"4", rppoptr(c_mbk_r),rppoptr(c_comma), rppoptr(c_mbk_l),rppkey(c_esi), rppoptr(c_plus),"4",rppoptr(c_mbk_r)); return true; } } //目标是对象需要调用拷贝构造函数 if(sh.is_quote(src)) { //源是引用 push_asm(vasm,rppkey(c_push),rppoptr(c_mbk_l), rppkey(c_esi),rppoptr(c_mbk_r)); } else { //源是对象 push_asm(vasm,rppkey(c_push),rppkey(c_esi)); } push_asm(vasm,rppkey(c_push),rppkey(c_edi)); tclass* ptci=zfind::class_search_t(sh,src); if(ptci==null) return false; tfunc* pcopystruct=zfind::copystruct_search(*ptci); if(pcopystruct==null) return false; push_asm(vasm,sh.get_func_declare_call(sh,*ptci,*pcopystruct)); return true; } static rbool destruct_ret(tsh& sh,tdata& retval,rbuf& vasm) { rstr type=retval.type; if(sh.is_quote(type)) return true; if(type==rppkey(c_void)) return true; tclass* ptci=zfind::class_search(sh,type); if(ptci==null) return false; tfunc* pdestruct=zfind::destruct_search(*ptci); if(pdestruct==null) return false; if(rppconf(c_op_empty_func)&&zfind::is_empty_struct_type(sh,type)) return true; push_asm(vasm,rppkey(c_mov),rppkey(c_esi), rppoptr(c_comma),rppkey(c_esp)); push_asm(vasm,rppkey(c_push),rppkey(c_esi)); push_asm(vasm,sh.get_func_declare_call(sh,*ptci,*pdestruct)); return true; } static rstr get_int(rstr& s) { return s.sub(0,s.count()-1); } static void push_asm(rbuf& vasm,const rbuf& vstr) { tasm item; item.vstr=vstr; vasm.push_move(item); } //todo 这里无法使用变参函数,可以使用变参宏或模板元简化代码 static void push_asm(rbuf& vasm, const rstr& s1,const rstr& s2,const rstr& s3,const rstr& s4, const rstr& s5,const rstr& s6,const rstr& s7,const rstr& s8, const rstr& s9,const rstr& s10,const rstr& s11,const rstr& s12) { tasm item; item.vstr.push(s1); item.vstr.push(s2); item.vstr.push(s3); item.vstr.push(s4); item.vstr.push(s5); item.vstr.push(s6); item.vstr.push(s7); item.vstr.push(s8); item.vstr.push(s9); item.vstr.push(s10); item.vstr.push(s11); item.vstr.push(s12); vasm.push_move(item); } static void push_asm(rbuf& vasm, const rstr& s1,const rstr& s2,const rstr& s3,const rstr& s4, const rstr& s5,const rstr& s6,const rstr& s7,const rstr& s8, const rstr& s9,const rstr& s10) { tasm item; item.vstr.push(s1); item.vstr.push(s2); item.vstr.push(s3); item.vstr.push(s4); item.vstr.push(s5); item.vstr.push(s6); item.vstr.push(s7); item.vstr.push(s8); item.vstr.push(s9); item.vstr.push(s10); vasm.push_move(item); } static void push_asm(rbuf& vasm,const rstr& s1,const rstr& s2, const rstr& s3,const rstr& s4,const rstr& s5,const rstr& s6, const rstr& s7,const rstr& s8) { tasm item; item.vstr.push(s1); item.vstr.push(s2); item.vstr.push(s3); item.vstr.push(s4); item.vstr.push(s5); item.vstr.push(s6); item.vstr.push(s7); item.vstr.push(s8); vasm.push_move(item); } static void push_asm(rbuf& vasm,const rstr& s1,const rstr& s2, const rstr& s3,const rstr& s4,const rstr& s5,const rstr& s6, const rstr& s7) { tasm item; item.vstr.push(s1); item.vstr.push(s2); item.vstr.push(s3); item.vstr.push(s4); item.vstr.push(s5); item.vstr.push(s6); item.vstr.push(s7); vasm.push_move(item); } static void push_asm(rbuf& vasm,const rstr& s1,const rstr& s2, const rstr& s3,const rstr& s4,const rstr& s5,const rstr& s6) { tasm item; item.vstr.push(s1); item.vstr.push(s2); item.vstr.push(s3); item.vstr.push(s4); item.vstr.push(s5); item.vstr.push(s6); vasm.push_move(item); } static void push_asm(rbuf& vasm,const rstr& s1,const rstr& s2, const rstr& s3,const rstr& s4) { tasm item; item.vstr.push(s1); item.vstr.push(s2); item.vstr.push(s3); item.vstr.push(s4); vasm.push_move(item); } static void push_asm(rbuf& vasm,const rstr& s1,const rstr& s2) { tasm item; item.vstr.push(s1); item.vstr.push(s2); vasm.push_move(item); } static void push_asm(rbuf& vasm,const rstr& s1) { tasm item; item.vstr.push(s1); vasm.push_move(item); } }; #endif ================================================ FILE: rpp/zautof.h ================================================ #ifndef zautof_h__ #define zautof_h__ #include "zfind.h" //自动增加类成员函数 struct zautof { static rbool auto_add_func(tsh& sh,tclass& tci) { if(!rppconf(c_auto_addfunc)) return true; if(sh.is_basic_type(tci.name)|| tci.is_friend) return true; rbool added=false; tpos pos; pos.line=1; pos.file=0; if(!tci.vfunc.empty()) { pos=tci.vfunc.begin()->first_pos; } if(zfind::destruct_search(tci)==null) { tfunc tfi; tfi.ptci=&tci; tfi.first_pos=pos; tfi.last_pos=pos; tfi.last_pos.line++; tfi.name=rppoptr(c_destruct)+tci.name; tfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_this))); tfi.retval=tdata(rppkey(c_void),rstr()); tfi.name_dec=tfi.get_dec(); tci.vfunc.insert(tfi); added=true; } if(zfind::emptystruct_search(tci)==null) { tfunc tfi; tfi.ptci=&tci; tfi.first_pos=pos; tfi.last_pos=pos; tfi.last_pos.line++; tfi.name=tci.name; tfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_this))); tfi.retval=tdata(rppkey(c_void),rstr()); tfi.name_dec=tfi.get_dec(); tci.vfunc.insert(tfi); added=true; } if(zfind::copystruct_search(tci)==null) { tfunc tfi; tfi.ptci=&tci; tfi.first_pos=pos; tfi.last_pos=pos; tfi.last_pos.line++; tfi.name=tci.name; tfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_this))); tfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_rvara))); tfi.retval=tdata(rppkey(c_void),rstr()); add_copy_sent(sh,tfi); tfi.name_dec=tfi.get_dec(); tci.vfunc.insert(tfi); added=true; } if(zfind::func_search(tci,tci.name, tci.name+rppoptr(c_addr),tci.name)==null) { tfunc tfi=*zfind::copystruct_search(tci); tfi.ptci=&tci; tfi.param[1].type=tci.name; tfi.name_dec=tfi.get_dec(); tci.vfunc.insert(tfi); added=true; } if(zfind::func_search(tci,rppoptr(c_equal),tci.name+rppoptr(c_addr), tci.name+rppoptr(c_addr))==null) { tfunc tfi; tfi.ptci=&tci; tfi.first_pos=pos; tfi.last_pos=pos; tfi.last_pos.line++; tfi.name=rppoptr(c_equal); tfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_this))); tfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_rvara))); tfi.retval=tdata(rppkey(c_void),rstr()); add_copy_sent(sh,tfi); tfi.name_dec=tfi.get_dec(); tci.vfunc.insert(tfi); added=true; } if(zfind::func_search(tci,rppoptr(c_equal), tci.name+rppoptr(c_addr),tci.name)==null) { tfunc tfi=*zfind::func_search( tci,rppoptr(c_equal),tci.name+rppoptr(c_addr), tci.name+rppoptr(c_addr)); tfi.ptci=&tci; tfi.param[1].type=tci.name; tfi.name_dec=tfi.get_dec(); tci.vfunc.insert(tfi); added=true; } if(zfind::func_search(tci,rppoptr(c_addr))==null) { tfunc tfi; tfi.ptci=&tci; tfi.first_pos=pos; tfi.last_pos=pos; tfi.last_pos.line++; tfi.name=rppoptr(c_addr); tfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_this))); tfi.retval=tdata("rp<"+tci.name+">",rppkey(c_s_ret)); tword twi; twi.pos=tfi.first_pos; twi.pos_src=tfi.first_pos; sh.push_twi(tfi.vword,twi,rppkey(c_mov)); sh.push_twi(tfi.vword,twi,rppkey(c_s_ret)); sh.push_twi(tfi.vword,twi,rppoptr(c_comma)); sh.push_twi(tfi.vword,twi,rppkey(c_this)); tfi.name_dec=tfi.get_dec(); if(zfind::is_class(sh,tfi.retval.type)) tci.vfunc.insert(tfi); added=true; } return true; } static void add_copy_sent(tsh& sh,tfunc& tfi) { tclass& tci=*tfi.ptci; tword twi; twi.pos_src=tfi.first_pos; twi.pos=tfi.first_pos; for(int i=0;i"); if(p!=null) { op_rstr(sh,p->vword); } } static void op_rstr(tsh& sh,rbuf& v) { for(int i=0;i=item.vstr.count()) { return false; } int addr_pos=i; i+=2; tclass* ptci=zfind::class_search(sh,item.vstr.get(i)); if(ptci==null) { return false; } i+=2; rstr fname=item.vstr.get(i); tfunc* ptfi=zfind::func_search_dec(*ptci,fname); if(ptfi==null) { item.vstr.print(); rf::printl(); sh.error("can't find "+fname); return false; } if(!proc_func(sh,*ptfi)) { return false; } item.vstr=item.vstr.sub(0,addr_pos-1); item.vstr+=rstr(r_to_uint(ptfi->vasm.begin())); if(!proc_asm(sh,item)) { return false; } return true; } //从函数的词表编译到vasm static rbool cp_vword_to_vasm(tsh& sh,tfunc& tfi,tenv env) { if(!zsent::proc_func(sh,tfi,env)) { sh.error(tfi,"sent error"); return false; } if(!zasm::proc_func(sh,tfi)) { sh.error(tfi,"asm error"); return false; } return true; } static rbool proc_vasm(tsh& sh,rbuf& vasm) { for(int i=0;i vasm; return proc_asm(sh,vasm,oasm); } //将汇编代码翻译成二进制代码 static rbool proc_asm(tsh& sh,rbuf& vasm,tasm& oasm) { oasm.ins.type=sh.m_key.get_key_index(oasm.vstr.get_bottom()); if(oasm.ins.type>tkey::c_rn) { sh.error(oasm); return false; } if(oasm.vstr.count()==2&& is_jmp_ins(oasm.ins.type)&& oasm.vstr[1].is_number()) { int line=oasm.vstr[1].toint(); int i; for(i=0;i=line) { break; } } if(i>=vasm.count()) { sh.error(oasm); return false; } oasm.ins.type*=6; oasm.ins.first.type=topnd::c_imme; oasm.ins.first.val=r_to_uint(&vasm[i]); return true; } oasm.ins.type*=6; if(!a_asm(sh,oasm)) { sh.error(oasm); return false; } return true; } static int find_comma(tsh& sh,rbuf& v) { int count1=0; int count2=0; int i; for(i=1;i& v,topnd& o) { if(v.empty()) { return true; } if(v.count()==1) { if(v.top().is_number()) { //123 o.type=topnd::c_imme; o.val=v.top().touint(); } elif(v[0].get_bottom()=='"') { //"abc" trans_cstr(v[0]); if(index>=item.vstr.count()) { return false; } item.vstr[index]=v[0]; o.type=topnd::c_imme; o.val=r_to_uint(item.vstr[index].begin()); } else { //ebp o.type=topnd::c_reg; o.off=get_reg_off(sh,v.top()); } } elif(v.count()==3) { if(v.bottom()==rppoptr(c_mbk_l)&& v.top()==rppoptr(c_mbk_r)) { //[ebp] o.type=topnd::c_addr; o.off=get_reg_off(sh,v[1]); o.val=0; } else return false; } elif(v.count()==5) { //[ebp+2] o.type=topnd::c_addr; o.off=get_reg_off(sh,v[1]); o.val=v[3].touint(); if(v[2]==rppoptr(c_minus)) o.val=-o.val; } elif(v.count()==7&&v[1]==rppoptr(c_addr)) { item.ins.clear(); return true; } elif(v.count()==0) return true; else return false; if(o.off>=r_size(treg)) return false; return true; } static void trans_cstr(rstr& src) { if(src.count()<2) { return; } rstr dst; for(int i=1;i vword; if(!zread::word_analyse(sh,name,vword,null)) return 0; zctl::combine_quote(sh,vword); combine_template(sh,vword); combine_mbk(sh,vword); rbuf vstr=sh.vword_to_vstr(vword); tclass* ptci; rbuf param; rstr fname; if(vstr.get(1)==rppoptr(c_dot)) { ptci=zfind::class_search(sh,vstr.get(0)); param=vstr.sub(4,vstr.count()-1); fname=vstr.get(2); } else { ptci=sh.m_main; param=vstr.sub(2,vstr.count()-1); fname=vstr.get(0); } if(ptci==null) return null; rbuf > temp=r_split(param,rstr(",")); param.clear(); for(int i=0;i(temp[i],rstr())); } if(param.empty()) return zfind::func_search(*ptci,fname); else return zfind::func_search_same(*ptci,fname,param); } //查找内部函数 static uint find_func_bin(tsh& sh,rstr name) { tfunc* ptfi=find_func(sh,name); if(ptfi==null) { return 0; } if(!proc_func(sh,*ptfi)) { return 0; } return (uint)ptfi->vasm.begin(); } static void combine_mbk(tsh& sh,rbuf& v) { for(int i=1;i& v) { for(int i=1;i=v.count()) { continue; } for(int j=i;j<=right;j++) { v[i-1].val+=v[j].val; v[j].clear(); } i=right; } zpre::arrange(v); } }; #endif ================================================ FILE: rpp/zclass.h ================================================ #ifndef zclass_h__ #define zclass_h__ #include "tsh.h" #include "zpre.h" #include "zfind.h" //提取所有类 //m_file.vword->m_class.vword struct zclass { static rbool process(tsh& sh) { basic_type_add(sh); for(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p)) if(!find_class(sh,p->vword)) return false; main_add(sh); for(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p)) if(!proc_class_again(sh,p->vword)) return false; if(!inherit_proc_all(sh)) return false; for(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p)) { p->cont.m_buf.free(); p->vword.free(); } return true; } static void combine_multi_class_name(tsh& sh,rbuf& v) { for(int i=0;i& v) { rbool ret=false; for(int i=1;i=v.count()) { continue; } rstr full=v[i-1].val+v[i].val+v[i+1].val; ifn(zfind::is_class(sh,full)) { continue; } ret=true; v[i-1].val=full; v[i].val.clear(); v[i+1].val.clear(); } return ret; } static void main_add(tsh& sh) { sh.m_main=zfind::class_search(sh,rppkey(c_main)); if(sh.m_main==null) { tclass item; item.name=rppkey(c_main); sh.m_class.insert(item); sh.m_main=zfind::class_search(sh,rppkey(c_main)); } sh.m_main->is_friend=true; } static rbool proc_class_again(tsh& sh,rbuf& v) { for(int i=0;ivword.push(v[i]); return true; } static void arrange_format(tsh& sh,rbuf& v,tfunc* ptfi) { zclass::arrange_format_bbk(sh,v,ptfi); zclass::arrange_format_ctrl(sh,v,ptfi); } //双重循环有待优化 static void arrange_format_bbk(tsh& sh,rbuf& v,tfunc* ptfi=null) { for(int i=0;ilast_pos.line+=2; } } static void arrange_format_ctrl(tsh& sh,rbuf& v,tfunc* ptfi) { for(int i=1;ilast_pos.line++; } } static rbool is_bbk_prev(tsh& sh,const rstr& s) { return s==rppoptr(c_comma)||s==rppoptr(c_equal)|| s==rppoptr(c_sbk_l)||s==rppoptr(c_mbk_l)||s==rppoptr(c_bbk_l); } static void arrange_format_l(tsh& sh,rbuf& v,tfunc* ptfi=null) { for(int i=0;ilast_pos.line+=2; } } static rbool name_part(tsh& sh,tclass& tci,rbuf& name_w) { rbuf father; int colonpos=r_find_pos(name_w,tword(rppoptr(c_colon))); if(colonpos result=r_split(temp,rppoptr(c_comma)); if(result.empty()) { sh.error(tci.vword.get(0),"template >error"); return false; } for(int i=0;i& v,int i,rbuf& name_w) { int right=i-1; if(v.get(right)!=rppoptr(c_tbk_r)) return true; int left=sh.find_symm_word_rev(v,rppoptr(c_tbk_l),rppoptr(c_tbk_r),0,i); if(left>=v.count()) return true; if(v.get(left-1)!=rppkey(c_template)) { return true; } rbuf > temp; temp=sh.comma_split(v.sub(left+1,right)); if(temp.empty()) { return true; } for(int j=0;j vtl; vtl+=rppoptr(c_tbk_l); for(int j=0;j& v) { for(int i=0;i=v.count()) { sh.error(v.get(i),"miss {"); return false; } tclass item; rbuf name_w; for(int j=i+1;j=v.count()) { sh.error(v.get(i),"miss {"); return false; } if(v.get(i-1).val==rppkey(c_friend)) { v[i-1].clear(); item.is_friend=true; } for(int j=left+1;j& name_w) { if(!name_part(sh,tci,name_w)) return false; if(zfind::is_class(sh,tci.name)||zfind::is_classtl(sh,tci.name)) { sh.error(name_w.get_bottom(),"type redefined"); return false; } if(tci.vtl.empty()) { sh.m_class.insert(tci); } else { sh.m_classtl.insert(tci); } return true; } static void insert_type(tsh& sh,const rstr& name,int size) { tclass item; item.name=name; item.size=size; if(!zfind::is_class(sh,item.name)) sh.m_class.insert(item); } static void basic_type_add(tsh& sh) { insert_type(sh,rppkey(c_void),0); insert_type(sh,rppkey(c_rd1),1); insert_type(sh,rppkey(c_rd2),2); insert_type(sh,rppkey(c_rd4),4); insert_type(sh,rppkey(c_rd8),8); insert_type(sh,rppkey(c_rdp),c_point_size); insert_type(sh,rppkey(c_rcs),c_point_size); } static rbool inherit_proc_all(tsh& sh) { for(tclass* p=sh.m_class.begin(); p!=sh.m_class.end();p=sh.m_class.next(p)) if(!inherit_proc(sh,*p)) return false; return true; } //模板继承模板如 A:B //模板继承非模板 A:C,D //非模板继承非模板 E:C //模板实例暂时不能继承如 C:A //如果定义同名函数会调用子类的函数,所以不要用覆盖和隐藏 //后面自动生成构造、析构、拷贝构造、operator=不会继承,但用户定义的会继承 static rbool inherit_proc(tsh& sh,tclass& tci,int level=0) { if(level>c_rpp_deep) { sh.error("inherit too deep"); return false; } level++; if(tci.vfather.empty()) return true; rbuf v; for(int i=0;ivword; } v+=tci.vword; tci.vword=r_move(v); return true; } }; #endif ================================================ FILE: rpp/zcontrol.h ================================================ #ifndef zcontrol_h__ #define zcontrol_h__ #include "tsh.h" #include "zctl.h" #include "zclass.h" //替换控制结构并生成语句表,包括return //tfunc.vword->vsent struct zcontrol { static rbool proc_func(tsh& sh,tfunc& tfi) { zclass::arrange_format(sh,tfi.vword,&tfi); insert_end_statement(sh,tfi,tfi.vword); if(!ifn_replace(sh,tfi.vword)) return false; if(!switch_replace(sh,tfi.vword)) return false; if(!auto_bbk(sh,tfi.vword,tfi)) return false; if(!replace_for_to(sh,tfi.vword)) return false; if(!proc_continue(sh,tfi.vword)) return false; if(!proc_break(sh,tfi.vword)) return false; if(!proc_for(sh,tfi.vword)) return false; if(!proc_if(sh,tfi.vword)) return false; if(!proc_bbk(sh,tfi.vword)) return false; if(!obtain_sent(sh,tfi.vword,tfi.vsent)) return false; proc_return(sh,tfi.vsent,tfi); part_vsent(tfi); tag_replace(sh,tfi); return true; } static rbool ifn_replace(tsh& sh,rbuf& v) { for(int i=0;i vcond; int pos=get_condition_end(sh,v,i,&vcond); if(pos>=v.count()) { sh.error(v[i]); return false; } sh.clear_word_val(v,i,pos); v[i].multi.push("if"); v[i].multi.push("!"); v[i].multi.push("("); v[i].multi+=sh.vword_to_vstr(vcond); v[i].multi.push(")"); } zpre::arrange(v); return true; } static rbool switch_replace(tsh& sh,rbuf& v) { for(int i=0;i vcond; int pos=get_condition_end(sh,v,i,&vcond); if(pos>=v.count()) { sh.error(v[i]); return false; } sh.clear_word_val(v,i,pos); if(v[pos]==rppoptr(c_bbk_l))//只跳过不清除 pos++; rbool first=true; int left; int right; for(;pos=v.count()) { sh.error(v[pos]); return false; } if(v.get(left)==rppoptr(c_bbk_l)) { right=sh.find_symm_bbk(v,left); if(right>=v.count()) { sh.error(v[pos]); return false; } } else { right=get_low_end(v,left,pos); if(right>=v.count()) { sh.error(v[pos]); return false; } right--; if(left>right) { sh.error(v[pos]); return false; } } rbuf val; if(v[left-1]==rppoptr(c_colon)) { val=v.sub(pos+1,left-1); } else val=v.sub(pos+1,left); if(v[pos]==rppkey(c_case)) { if(first) { v[pos].multi.push(rppkey(c_if)); first=false; } else { v[pos].multi.push(rppkey(c_else)); v[pos].multi.push(rppkey(c_if)); } v[pos].multi+=sh.vword_to_vstr(val); v[pos].multi.push(rppoptr(c_equalequal)); v[pos].multi.push(rppoptr(c_sbk_l)); v[pos].multi+=sh.vword_to_vstr(vcond); v[pos].multi.push(rppoptr(c_sbk_r)); } else { v[pos].multi.push(rppkey(c_else)); } sh.clear_word_val(v,pos,left); pos=right+1; } } zpre::arrange(v); return true; } static rbool auto_bbk(tsh& sh,rbuf& v,tfunc& tfi) { if(!rppconf(c_auto_bbk)) { v.top().pos.line=tfi.last_pos.line;//what? return true; } for(int i=0;i& v) { for(int i=0;i=v.count()) { sh.error(v[i],"miss { or miss tab"); return false; } if(v[begin].val==rppoptr(c_bbk_l)) continue; int end=get_low_end(v,begin,i); if(end>=v.count()) { sh.error(v[i],"miss { or miss tab"); return false; } if(begin>=end) { sh.error(v[i],"miss { or miss tab"); return false; } v[begin].multi.push(rppoptr(c_bbk_l)); v[begin].multi.push(v[begin].val); v[begin].val.clear(); v[end].multi.push(rppoptr(c_bbk_r)); v[end].multi.push(v[end].val); v[end].val.clear(); return true; } return true; } static void tag_replace(tsh& sh,tfunc& tfi) { rbuf vtag; for(int i=0;i& vtag) { for(int i=0;i& vsent) { if(!need_part(vsent)) return; rbuf result(vsent.count()*2); result.m_count=0; for(int i=0;i > temp=r_split( vsent[i].vword,tword(rstr(";"))); if(temp.empty()) { continue; } tsent sent; sent.pos=vsent[i].pos; for(int j=0;j& v) { for(int i=0;i& vsent,tfunc& tfi) { for(int i=0;i& v,tfunc& tfi) { if(v.get_bottom().val!=rppkey(c_return)) return; tword twi; twi.pos_src=tfi.last_pos; twi.pos=tfi.last_pos; if(1==v.count()) { v.clear(); sh.push_twi(v,twi,rppkey(c_jmp)); sh.push_twi(v,twi,tfi.last_pos.line); return; } if(sh.is_quote(tfi.retval.type)) { rbuf vtemp; sh.push_twi(vtemp,twi,rppoptr(c_addr)); sh.push_twi(vtemp,twi,rppoptr(c_sbk_l)); vtemp+=v.sub(1); sh.push_twi(vtemp,twi,rppoptr(c_sbk_r)); sh.push_twi(vtemp,twi,rppoptr(c_semi)); sh.push_twi(vtemp,twi,rppkey(c_mov)); sh.push_twi(vtemp,twi,rppoptr(c_mbk_l)); sh.push_twi(vtemp,twi,rppkey(c_ebp)); sh.push_twi(vtemp,twi,rppoptr(c_plus)); sh.push_twi(vtemp,twi,rppkey(c_s_off)); sh.push_twi(vtemp,twi,tfi.retval.name); sh.push_twi(vtemp,twi,rppoptr(c_mbk_r)); sh.push_twi(vtemp,twi,rppoptr(c_comma)); sh.push_twi(vtemp,twi,rppkey(c_ebx)); sh.push_twi(vtemp,twi,rppoptr(c_semi)); sh.push_twi(vtemp,twi,rppkey(c_jmp)); sh.push_twi(vtemp,twi,tfi.last_pos.line); v=r_move(vtemp); } else { rbuf vtemp; sh.push_twi(vtemp,twi,tfi.retval.name); sh.push_twi(vtemp,twi,rppoptr(c_sbk_l)); sh.push_twi(vtemp,twi,rppoptr(c_sbk_l)); vtemp+=v.sub(1); sh.push_twi(vtemp,twi,rppoptr(c_sbk_r)); sh.push_twi(vtemp,twi,rppoptr(c_sbk_r)); sh.push_twi(vtemp,twi,rppoptr(c_semi)); sh.push_twi(vtemp,twi,rppkey(c_jmp)); sh.push_twi(vtemp,twi,tfi.last_pos.line); v=r_move(vtemp); } } static rbool obtain_sent(tsh& sh,rbuf& v,rbuf& vsent) { int start=0; for(int i=0;i0&&v[i-1].pos.line!=v[i].pos.line) { tsent sent; sent.vword=v.sub(start,i); if(!sent.vword.empty()) { sent.pos=sent.vword.get_bottom().pos; vsent.push_move(sent); } v[i-1].pos.line=v[i].pos.line; start=i; --i; } } return true; } static rbool proc_bbk(tsh& sh,rbuf& v) { for(int i=0;i=v.count()) { sh.error(v.get(i),"miss }"); return false; } v[left].val.clear(); v[right].val.clear(); v[right].multi.push(rppoptr(c_semi)); v[right].multi.push(rppkey(c_nop)); } zpre::arrange(v); return true; } static int find_else_end(tsh& sh,rbuf& v,int begin) { while(true) { if(begin>=v.count()) return v.count(); if(v.get(begin).val==rppkey(c_else)&& v.get(begin+1).val==rppkey(c_if)) { int left=r_find_pos(v,tword(rppoptr(c_bbk_l)),begin+2); if(left==v.count()) return v.count(); int right=sh.find_symm_bbk(v,left); if(right>=v.count()) return v.count(); begin=right+1; } elif(v.get(begin).val==rppkey(c_else)) { int left=r_find_pos(v,tword(rppoptr(c_bbk_l)),begin+1); if(left==v.count()) return v.count(); int right=sh.find_symm_bbk(v,left); if(right>=v.count()) return v.count(); return right+1; } else return begin; } } static rbool proc_if(tsh& sh,rbuf& v) { for(int i=0;i vcond; cond_end=get_condition_end(sh,v,i,&vcond); if(vcond.empty()) { sh.error(v.get(i),"miss cond"); return false; } int left=cond_end; if(v.get(left).val!=rppoptr(c_bbk_l)) { sh.error(v.get(i),"miss {"); return false; } int right=sh.find_symm_bbk(v,left); if(right>=v.count()) { sh.error(v.get(i),"miss }"); return false; } int else_end=find_else_end(sh,v,right+1); if(else_end==v.count()) { sh.error(v.get(i),"miss else end"); return false; } if(v.get(right+1).val==rppkey(c_else)) { insert_jmp_asm(sh,v[right],v[else_end]); v[right+1].val.clear(); } v[left].multi=sh.vword_to_vstr(vcond); insert_cond_false_asm(sh,v[left].multi,v.get(right+1)); sh.clear_word_val(v,i,cond_end); v[left].val.clear(); v[right].val.clear(); v[right].multi.push(rppoptr(c_semi)); v[right].multi.push(rppkey(c_nop)); } return true; } static rbool proc_for(tsh& sh,rbuf& v) { for(int i=0;i vcond; cond_end=get_condition_end(sh,v,i,&vcond); if(vcond.empty()) { tword twi=v[i]; twi.val=1; vcond.push(twi); } rbool is_for=true; if(r_find_pos(vcond,tword(rppoptr(c_semi)))>=vcond.count()) { is_for=false; } int left=cond_end; if(v.get(left).val!=rppoptr(c_bbk_l)) { sh.error(v.get(i),"miss {"); return false; } int right=sh.find_symm_bbk(v,left); if(right>=v.count()) { sh.error(v.get(i),"miss }"); return false; } if(is_for) { rbuf > forcond=r_split_e( vcond,tword(rppoptr(c_semi))); if(forcond.count()!=3) { sh.error(v.get(i),"miss for cond"); return false; } if(forcond[1].empty()) { tword twi=v[i]; twi.val=1; forcond[1].push(twi); } v[i].val.clear(); v[i].multi=sh.vword_to_vstr(forcond[0]); v[left].val.clear(); v[left].multi=sh.vword_to_vstr(forcond[1]); insert_cond_false_asm(sh,v[left].multi,v.get(right+1)); v[right].val.clear(); v[right].multi=sh.vword_to_vstr(forcond[2]); insert_jmp_asm(sh,v[right],v[left]); sh.clear_word_val(v,i,cond_end); } else { v[left].multi=sh.vword_to_vstr(vcond); insert_cond_false_asm(sh,v[left].multi,v.get(right+1)); v[left].val.clear(); insert_jmp_asm(sh,v[right],v[left]); v[right].val.clear(); sh.clear_word_val(v,i,cond_end); } } return true; } static void insert_jmp_asm(tsh& sh,tword& word,const tword& posword) { word.multi.push(rppoptr(c_semi)); word.multi.push(rppkey(c_jmp)); word.multi.push(rstr(posword.pos.line)); } static void insert_cond_true_asm(tsh& sh,rbuf& multi, const tword& posword) { multi.push(rppoptr(c_semi)); multi.push(rppkey(c_jebxnz)); multi.push(rstr(posword.pos.line)); } static void insert_cond_false_asm(tsh& sh,rbuf& multi, const tword& posword) { multi.push(rppoptr(c_semi)); multi.push(rppkey(c_jebxz)); multi.push(rstr(posword.pos.line)); } static int find_jump_out(tsh& sh,rbuf& v,int i) { int j; for(j=i-1;j>=0;--j) { if(v[j].val!=rppkey(c_for)) { continue; } int left=get_condition_end(sh,v,j); if(left>=v.count()) return -2; if(v[left]!=rppoptr(c_bbk_l)) return -2; int right=sh.find_symm_bbk(v,left); if(right>=v.count()) return -2; if(i>left&&i& v) { for(int i=0;i vcond; int cond_end=get_condition_end(sh,v,j,&vcond); rbool is_for=true; if(r_find_pos(vcond,tword(rppoptr(c_semi)))>=vcond.count()) { is_for=false; } int left=r_find_pos(v,tword(rppoptr(c_bbk_l)),cond_end); if(left>=v.count()) { sh.error(v.get(j),"miss {"); return false; } int right=sh.find_symm_bbk(v,left); if(right==0||right+1>=v.count()) { sh.error(v.get(j),"miss }"); return false; } if(is_for) { if(v[i].val==rppkey(c_continue)) { insert_jmp_asm(sh,v[i],v[right]); v[i].val.clear(); } else { insert_jmp_asm(sh,v[i],v[left]); v[i].val.clear(); } } else { insert_jmp_asm(sh,v[i],v[left]); v[i].val.clear(); } } return true; } static rbool proc_break(tsh& sh,rbuf& v) { for(int i=0;i=v.count()) { sh.error(v.get(j),"miss { or }"); return false; } insert_jmp_asm(sh,v[i],v[right+1]); v[i].val.clear(); } return true; } static int get_word_tab(tword& word) { tpos pos=word.pos_src; if(pos.file==null) { rf::printl("pos file null"); return -1; } if(pos.line>=pos.file->tab_list.count()) { rf::printl("pos file null"); return -1; } return pos.file->tab_list[pos.line]; } //获取低一层结尾语句的位置 static int get_low_end(rbuf& v,int begin,int head) { if(v.get(begin).val.empty()) return v.count(); for(int i=begin;i& v, int begin,rbuf* pret=null) { if(v.get(begin).val.empty()) return v.count(); int i; for(i=begin+1;i ret; if(i>=v.count()) { if(pret!=null) { *pret=r_move(ret); } return v.count(); } if(pret!=null) { ret=v.sub(begin+1,i); if(ret.get_bottom()==rppoptr(c_sbk_l)&& ret.get_top()==rppoptr(c_sbk_r)) { ret.pop_front(); ret.pop(); } *pret=r_move(ret); } return i; } //fixme fot..to条件带括号有问题 static rbool replace_for_to(tsh& sh,rbuf& v) { for(int i=0;i vcond; int cond_end=get_condition_end(sh,v,i,&vcond); int topos=r_find_pos(vcond,tword(rppkey(c_to))); if(topos vset=sh.vword_to_vstr(vcond.sub(2)); if(var.empty()||vset.empty()) { sh.error(v.get(i),"for in miss name or set"); return false; } sh.clear_word_val(v,i,cond_end); v[i].multi.push(rstr("for")); v[i].multi.push(rstr("(")); v[i].multi+=var; v[i].multi+=rstr("="); v[i].multi+=rstr("0"); v[i].multi+=rstr(";"); v[i].multi+=var; v[i].multi+=rstr("<"); v[i].multi+=vset; v[i].multi+=rstr("."); v[i].multi+=rstr("count"); v[i].multi+=rstr("("); v[i].multi+=rstr(")"); v[i].multi+=rstr(";"); v[i].multi+=rstr("++"); v[i].multi+=var; v[i].multi+=rstr(")"); } } zpre::arrange(v); return true; } static void insert_end_statement(tsh& sh,tfunc& tfi,rbuf& v) { tword item; item.pos=tfi.last_pos; item.pos_src=tfi.last_pos; item.pos_src.line=0; item.val=rppoptr(c_semi); v.push_move(item); } }; #endif ================================================ FILE: rpp/zctl.h ================================================ #ifndef zctl_h__ #define zctl_h__ #include "tsh.h" #include "zpre.h" #include "zfind.h" #include "zclass.h" #include "zmac.h" #include "zautof.h" #include "zmemb.h" //进行类模板替换,增加了一些新类 struct zctl { static rbool process(tsh& sh) { rbuf vtmp; for(tclass* p=sh.m_class.begin(); p!=sh.m_class.end();p=sh.m_class.next(p)) { zclass::combine_multi_class_name(sh,p->vword); vtmp.push(p); } for(int i=0;ivword,0)) { return false; } } vtmp.clear(); zautof::op_rstr(sh); for(tclass* p=sh.m_class.begin(); p!=sh.m_class.end();p=sh.m_class.next(p)) { vtmp.push(p); } for(int i=0;iname==rppkey(c_main)) { sh.m_main_data.set_size(p->size); } } //简便起见,重复获取参数大小也没关系 for(tclass* p=sh.m_class.begin(); p!=sh.m_class.end();p=sh.m_class.next(p)) zmemb::obtain_size_func(sh,*p); return true; } static rbool add_point_declare(tsh& sh,tclass& tci) { if(sh.is_basic_type(tci.name)||tci.is_friend||sh.is_point(tci.name)) return true; rbuf temp; temp+=rppkey(c_rp); temp+=rppoptr(c_tbk_l); temp+=tci.name; temp+=rppoptr(c_tbk_r); if(!type_replace(sh,temp)) { return false; } return true; } //解析一个类 static rbool a_class(tsh& sh,tclass& tci) { if(tci.vword.empty()) { return true; } sbk_line_proc(sh,tci.vword,true); if(!zmemb::analyse(sh,tci)) { return false; } ifn(zautof::auto_add_func(sh,tci)) { return false; } tci.vword.free(); return true; } static rbool type_replace(tsh& sh,rbuf& v,int level=0) { if(level>c_rpp_deep) { sh.error("type level overflow"); return false; } level++; rbool need; point_replace(sh,v,need); for(int i=1;i=v.count()) { sh.error(v[i-1],"miss >"); return false; } rbuf > vparam=sh.comma_split(v.sub(left+1,right)); if(vparam.count()!=pctl->vtl.count()) { sh.error(v[i-1],"template not match"); return false; } ifn(is_type(sh,vparam)) { continue; } for(int j=left;j<=right;j++) { v[left-1].val+=v[j].val; v[j].val.clear(); } i=right; if(zfind::is_class(sh,v[left-1].val)) { continue; } tclass item=*pctl; item.name=v[left-1].val; item.vtl.clear(); vtl_replace(item.vword,pctl->vtl,vparam); sh.m_class.insert(item); tclass* ptci=zfind::class_search(sh,item.name); if(ptci==null) { sh.error(v.get(i),"can't find class "+item.name); return false; } ifn(type_replace(sh,ptci->vword,level)) { return false; } } zpre::arrange(v); point_replace(sh,v,need); if(need) { if(!type_replace(sh,v,level)) { return false; } } combine_quote(sh,v); zclass::arrange_format_l(sh,v);//匿名函数要在这里处理大括号换行 if(!zpre::op_const_eval(sh,v,false)) { return false; } return true; } //todo 这里应该跳过匿名函数 static void sbk_line_proc(tsh& sh,rbuf& v,rbool jump_bbk=false) { for(int i=0;i=v.count()) { continue; } if(v[right].pos==v[left].pos) { continue; } for(int j=left+1;j<=right;j++) { //必须归于一行,导致提示行号不准确 v[j].pos_src=v[left].pos_src; v[j].pos=v[left].pos; } i=right; } } //类模板只能替换类型,否则与函数模板冲突 static rbool is_type(tsh& sh,rbuf >& vparam) { for(int i=0;i& v) { return zfind::is_class_t(sh,v.get_bottom().val)|| v.get(1)==rppoptr(c_tbk_l)&& zfind::is_classtl(sh,v.get_bottom().val)|| v.count()==1&&v[0].val.is_number();//todo } static void vtl_replace(rbuf& result,rbuf& vtl, rbuf >& vparam) { for(int j=0;j& v,const rstr& src,const rbuf& vstr) { for(int i=0;i& v,rbool& need) { for(int i=0;i vword; tword word; word.pos=v[i].pos; word.pos_src=v[i].pos_src; sh.push_twi(vword,word,rppkey(c_rp)); sh.push_twi(vword,word,rppoptr(c_tbk_l)); sh.push_twi(vword,word,rppkey(c_rp)); sh.push_twi(vword,word,rppoptr(c_tbk_l)); sh.push_twi(vword,word,v[i].val); sh.push_twi(vword,word,rppoptr(c_tbk_r)); sh.push_twi(vword,word,rppoptr(c_tbk_r)); v[i].multi=sh.vword_to_vstr(vword); v[i].val.clear(); v[i+1].val.clear(); v[i+2].val.clear(); } else { if(v.get(i+2)==rppoptr(c_sbk_l)) { continue; } rbuf vword; tword word; word.pos=v[i].pos; word.pos_src=v[i].pos_src; sh.push_twi(vword,word,rppkey(c_rp)); sh.push_twi(vword,word,rppoptr(c_tbk_l)); sh.push_twi(vword,word,v[i].val); sh.push_twi(vword,word,rppoptr(c_tbk_r)); v[i].multi=sh.vword_to_vstr(vword); v[i].val.clear(); v[i+1].val.clear(); } } zpre::arrange(v,&need); } static void combine_quote(tsh& sh,rbuf& v) { for(int i=0;iis_friend) { if(!p_call(sh,src,null,outopnd,tfi,level,i,ptci,env)) return false; } else { tsent first; first.type=ptci->name+rppoptr(c_addr); first.vword+=rppkey(c_this); if(!p_call(sh,src,&first,outopnd,tfi,level,i,ptci,env)) return false; } return true; } //处理[]函数指针直接调用 static rbool p_point_call(tsh& sh,tsent& src,tsent& outopnd, tfunc& tfi,int level,int& i,tenv env) { int left=i+1; int right=sh.find_symm_mbk(src.vword,left); if(right>=src.vword.count()) { sh.error(src,"call miss ]"); return false; } outopnd.type=src.vword[i].val; outopnd.vword+=rppoptr(c_mbk_l); outopnd.vword+=rppkey(c_pcall); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=outopnd.type; outopnd.vword+=rppoptr(c_comma); rbuf vsent; sh.split_param(vsent,src.vword.sub(left+1,right),src); if(vsent.empty()) { sh.error(src,"call miss func"); return false; } for(int j=0;j=src.vword.count()) { sh.error(src,"class name miss ("); return false; } rbuf vsent; sh.split_param(vsent,src.vword.sub(left+1,right),src); if(!vsent.empty()) { for(int j=0;j vsent; sh.split_param(vsent,second.vword,first); for(int j=0;j > vlisp; get_vlisp(sh,src.vword,vlisp); rstr fname=rstr::join(sh.vword_to_vstr(vlisp.get(1)),""); ptci=zfind::class_search(sh,cname); if(ptci!=null) { if(vlisp.count()!=3) { sh.error(src,"lisp exp miss"); return false; } ptfi=zfind::func_search_dec(*ptci,fname); rbuf vsent; tsent sent; sent.pos=src.pos; rbuf > vparam; get_vlisp(sh,vlisp[2],vparam); for(int j=0;jtype; return true; } if(cname==rppoptr(c_addr)) { outopnd.vword=src.vword; outopnd.type="rp"; return true; } sh.error(src,"lisp exp miss"); return false; } static void get_vsent(rbuf >& vlisp,rbuf& vsent, const tsent& src) { vsent.clear(); for(int i=0;i v,rbuf >& vlisp) { vlisp=sh.comma_split(v.sub(1,v.count()-1)); } //处理变参中括号调用,变参不能重载 static rbool p_mbk_param(tsh& sh,tsent& src,tsent* pfirst,tsent& outopnd, tfunc& tfi,int level,int& i,tclass* ptci,tenv env) { rstr cname=ptci->name; rstr fname=src.vword[i].val; int left=i+1; int right; right=sh.find_symm_mbk(src.vword,left); if(right>=src.vword.count()) { sh.error(src,"call miss )"); return false; } tfunc* ptfi=zfind::func_search(*ptci,fname); if(null==ptfi) { sh.error(src,"can't find call"); return false; } rbuf vsent; sh.split_param(vsent,src.vword.sub(left+1,right),src); for(int j=0;jtype)) { vsent[0].vword.push_front(tword(rppoptr(c_addr))); if(!p_exp(sh,vsent[0],tfi,level,env)) { return false; } } } tmp.vword.clear(); tmp.vword+=tword(rppoptr(c_mbk_l)); tmp.vword+=tword(rppoptr(c_addr)); tmp.vword+=rppoptr(c_comma); tmp.vword+=tword(ptci->name); tmp.vword+=rppoptr(c_comma); tmp.vword+=tword(ptfi->name_dec); tmp.vword+=tword(rppoptr(c_mbk_r)); outopnd.type=ptfi->retval.type; outopnd.vword+=tword(rppoptr(c_mbk_l)); outopnd.vword+=tword(rppkey(c_pcall)); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=tword(outopnd.type); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=tmp.vword; outopnd.vword+=rppoptr(c_comma); outopnd.vword+=tword(rppoptr(c_mbk_l)); for(int j=0;jname; rstr fname=src.vword[i].val; tfunc* ptfi; int left=i; int right=left+1; if(i+1==src.vword.count()-1|| zfind::is_end_part_optr(sh,src.vword.get(i+1).val)) { ptfi=zfind::func_search_empty_param_m( *ptci,fname,pfirst==null); if(ptfi==null) { sh.error(src,"can't find call"); return false; } } else { ptfi=zfind::func_search_multi_param_m( *ptci,fname,pfirst==null); if(ptfi==null) ptfi=zfind::func_search_empty_param_m( *ptci,fname,pfirst==null); else right=src.vword.count()-1; if(ptfi==null) { sh.error(src,"can't find call"); return false; } } tsent param=src.sub(left+1,right); outopnd.vword.push(tword(cname)); outopnd.vword.push(tword(rppoptr(c_dot))); outopnd.vword.push(tword(fname)); outopnd.vword.push(tword(rppoptr(c_sbk_l))); if(pfirst!=null&&!ptfi->is_friend) { outopnd.vword+=pfirst->vword; if(!param.empty()) { outopnd.vword.push(tword(rppoptr(c_comma))); outopnd.vword+=r_move(param.vword); } } else { if(!param.empty()) { outopnd.vword+=r_move(param.vword); } } outopnd.vword.push(tword(rppoptr(c_sbk_r))); //无括号调用添加括号递归处理 if(!p_exp(sh,outopnd,tfi,level,env)) return false; i=right-1; return true; } static rbool p_ftl(tsh& sh,tsent src,tsent* pfirst,tsent& outopnd, tfunc& tfi,int level,int& i,tclass* ptci,tenv env) { int left=i+1; if(src.vword.get(left)!=rppoptr(c_tbk_l)) { sh.error(src,"call miss <"); return false; } int right=sh.find_symm_tbk(src.vword,left); if(right>=src.vword.count()) { sh.error(src,"call miss >"); return false; } rbuf temp=src.vword.sub(i,right+1); if(!zftl::ftl_replace(sh,*tfi.ptci,temp,ptci)) { return false; } src.vword[right]=temp.get_bottom(); i=right; return p_call(sh,src,pfirst,outopnd,tfi,level,i,ptci,env); } static rbool set_vsent(tsh& sh,tpos pos,rbuf& vsent, tfunc& tfi,int level,tenv env) { tsent sent; tword word; word.pos=pos; word.pos_src=pos; sent.pos=pos; tdynamic item; item.key=tfi.sdynamic.count(); for(int k=0;kvparam)); vsent.push(sent); sent.vword.clear(); sh.push_twi(sent.vword,word,rstr((uint)&tfi)); vsent.push(sent); sent.vword.clear(); sh.push_twi(sent.vword,word,rstr("_EBP")); vsent.push(sent); return true; } static rbool p_call(tsh& sh,tsent& src,tsent* pfirst,tsent& outopnd, tfunc& tfi,int level,int& i,tclass* ptci,tenv env) { rstr cname=ptci->name; rstr fname=src.vword[i].val; if(src.vword.get(i+1).val==rppoptr(c_mbk_l)) { return p_mbk_param(sh,src,pfirst,outopnd,tfi,level,i,ptci,env); } if(pfirst!=null&&sh.get_tname(pfirst->type)==rppkey(c_var)&& null==zfind::func_search(*ptci,fname)) { return false; //a.test -> a["test"] } if(src.vword.get(i+1).val!=rppoptr(c_sbk_l)) { return p_call_n(sh,src,pfirst,outopnd,tfi,level,i,ptci,env); } int left=i+1; int right; right=sh.find_symm_sbk(src.vword,left); if(right>=src.vword.count()) { sh.error(src,"call miss )"); return false; } rbuf vsent; sh.split_param(vsent,src.vword.sub(left+1,right),src); for(int j=0;jis_dynamic) { ifn(set_vsent(sh,src.vword[i].pos,vsent,tfi,level,env)) return false; if(pfirst!=null) vsent.push_front(*pfirst); set_func(sh,outopnd,r_move(vsent),ptfi); i=right; return true; } if(pfirst!=null) vsent.push_front(*pfirst);//插入DOT前的对象 ptfi=zmatch::find_replace(sh,*ptci,fname,vsent); if(null==ptfi) { if(pfirst==null) { sh.error(src,"can't find call"); return false; } vsent.pop_front(); ptfi=zmatch::find_replace(sh,*ptci,fname,vsent); if(ptfi==null||!ptfi->is_friend) { sh.error(src,"can't find call"); return false; } } set_func(sh,outopnd,r_move(vsent),ptfi); i=right; return true; } static rbool p_exp_all(tsh& sh,tfunc& tfi,tenv env) { for(int i=0;i& v,tfunc& tfi, int level,tenv env) { tsent sent; sent.vword=v; sent.pos.line=1; ifn(p_exp(sh,sent,tfi,level,env)) return false; v=sent.vword; return true; } static rbool p_exp(tsh& sh,tsent& src,tfunc& tfi, int level,tenv env) { return p_exp(sh,src,src,tfi,level,env); } //表达式标准化,并设置dst.type static rbool p_exp(tsh& sh,tsent src,tsent& dst,tfunc& tfi, int level,tenv env) { tclass& tci=*tfi.ptci; if(level>c_rpp_deep) { sh.error(src,"expression too deep"); return false; } level++; dst.clear(); rbuf soptr; rbuf sopnd; soptr.push(rppoptr(c_exp_part)); src.vword.push(tword(rppoptr(c_exp_part))); for(int i=0;i=src.vword.count()) { sh.error(src,"miss )"); return false; } tsent outopnd; outopnd.pos=src.pos; if(!p_exp(sh,src.sub(i+1,right),outopnd,tfi,level,env)) return false; sopnd.push_move(outopnd); i=right; } elif(src.vword.get(i+1)==rppoptr(c_mbk_l)&& zfind::is_class_t(sh,src.vword[i].val)) { //[]函数指针调用 tsent outopnd; outopnd.pos=src.pos; if(!p_point_call(sh,src,outopnd,tfi,level,i,env)) return false; sopnd.push_move(outopnd); } elif(src.vword[i].val==rppoptr(c_mbk_l)) { int right=sh.find_symm_mbk(src.vword,i); if(right>=src.vword.count()) { sh.error(src,"miss ]"); return false; } tsent outopnd; outopnd.pos=src.pos; if(sopnd.empty()|| src.vword.get(i+1).val==rppoptr(c_addr)&& zfind::is_class(sh,src.vword.get(i+3).val)) { if(!p_lisp(sh,src.sub( i,right+1),outopnd,tfi,level,env)) return false; } else { if(!p_mbk(sh,sopnd.pop(),src.sub(i+1,right), outopnd,tfi,level,env)) return false; } sopnd.push_move(outopnd); i=right; } elif(src.vword[i].val==rppoptr(c_dot)) { if(sopnd.empty()) { sh.error(src,". miss opnd"); return false; } i++; rstr name=src.vword.get(i).val; tsent first=sopnd.pop(); tclass* ptci=zfind::class_search_t(sh,first.type); if(null==ptci) { sh.error(src,". can't find class name"); return false; } tsent outopnd; outopnd.pos=src.pos; //数据成员和函数成员不可以同名 tdata* ptdi=zfind::data_member_search(*ptci,name); if(ptdi!=null) { outopnd.type=ptdi->type; outopnd.vword+=tword(rppoptr(c_mbk_l)); outopnd.vword+=tword(rppoptr(c_dot)); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=first.vword; outopnd.vword+=rppoptr(c_comma); outopnd.vword+=tword(name); outopnd.vword+=tword(rppoptr(c_mbk_r)); sopnd.push(outopnd); continue; } if(src.vword.get(i+1)==rppoptr(c_tbk_l)&& zfind::ftl_search(*ptci,name)!=null) { if(!p_ftl(sh,src,&first, outopnd,tfi,level,i,ptci,env)) return false; } else { if(!p_call(sh,src,&first, outopnd,tfi,level,i,ptci,env)) return false; } sopnd.push_move(outopnd); } elif(src.vword[i].val==rppoptr(c_arrow_r)) { if(sopnd.empty()) { sh.error(src,". miss opnd"); return false; } tsent first=sopnd.pop(); first.vword.push_front(tword(rppoptr(c_star))); if(!p_exp(sh,first,tfi,level,env)) return false; sopnd.push_move(first); src.vword[i].val=rppoptr(c_dot); i--; } elif(sh.m_optr.is_optr(src.vword[i].val)) { if(soptr.empty()) { sh.error(src,"exp miss optr"); return false; } rstr cur=src.vword[i].val; if(!sh.m_optr.precede(soptr.top(),cur)) { soptr.push(cur); continue; } rstr theta=soptr.pop(); if(sopnd.empty()) { sh.error(src,"exp miss opnd"); return false; } rbuf vsent; vsent.push(sopnd.pop()); tclass* ptci=zfind::class_search_t(sh,vsent[0].type); tfunc* ptfi; tsent outopnd; outopnd.pos=src.pos; if(ptci!=null) { ptfi=zmatch::find_replace(sh, *ptci,theta,vsent); if(ptfi!=null) { set_func(sh,outopnd, r_move(vsent),ptfi); sopnd.push_move(outopnd); i--; continue; } } if(sopnd.empty()) { sh.error(src,"exp miss opnd"); return false; } vsent.push_front(sopnd.pop()); ptci=zfind::class_search_t(sh,vsent[0].type); if(ptci!=null) { ptfi=zmatch::find_replace(sh, *ptci,theta,vsent); if(ptfi!=null) { set_func(sh,outopnd, r_move(vsent),ptfi); sopnd.push_move(outopnd); i--; continue; } } ptci=zfind::class_search_t(sh,vsent[1].type); if(ptci!=null) { ptfi=zmatch::find_replace(sh, *ptci,theta,vsent); if(ptfi!=null) { set_func(sh,outopnd, r_move(vsent),ptfi); sopnd.push_move(outopnd); i--; continue; } } sh.error(src,"exp miss opnd 2"); return false; } elif(zfind::is_class(sh,src.vword[i].val)) { tsent outopnd; outopnd.pos=src.pos; if(src.vword.get(i+1).val==rppoptr(c_sbk_l)) { //临时变量 if(!p_temp_var(sh,src,outopnd,tfi,level,i,env)) { return false; } } else { //类名直接调用 if(!p_class_call(sh,src,outopnd,tfi,level,i,env)) return false; } sopnd.push_move(outopnd); } else { rstr name=src.vword[i].val; tsent outopnd; outopnd.pos=src.pos; tdata* ptdi=zfind::local_search(tfi,name); if(ptdi!=null) { outopnd.vword+=src.vword[i]; outopnd.type=ptdi->type; sopnd.push_move(outopnd); continue; } if(!tci.is_friend) { ptdi=zfind::data_member_search(tci,name); if(ptdi!=null) { //类成员变量增加this //如 m_a -> this.m_a outopnd.vword+=tword(rppoptr(c_mbk_l)); outopnd.vword+=tword(rppoptr(c_dot)); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=tword(rppkey(c_this)); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=src.vword[i]; outopnd.vword+=tword(rppoptr(c_mbk_r)); outopnd.type=ptdi->type; sopnd.push_move(outopnd); continue; } } ptdi=zfind::data_member_search(*sh.m_main,name); if(ptdi!=null) { //全局变量 outopnd.vword+=tword(rppoptr(c_mbk_l)); outopnd.vword+=tword(rppoptr(c_dot)); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=tword(rppkey(c_pmain)); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=src.vword[i]; outopnd.vword+=tword(rppoptr(c_mbk_r)); outopnd.type=ptdi->type; sopnd.push_move(outopnd); continue; } if(env.ptfi!=null) { ptdi=zfind::local_search(*env.ptfi,name); if(ptdi!=null) { //环境变量 outopnd.vword+=tword(rppoptr(c_mbk_l)); outopnd.vword+=tword(rppoptr(c_dot)); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=tword(rppkey(c_penv)); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=src.vword[i]; outopnd.vword+=tword(rppoptr(c_mbk_r)); outopnd.type=ptdi->type; sopnd.push_move(outopnd); continue; } } if(!p_func_call(sh,src,outopnd,tfi,level,i,env)) return false; sopnd.push_move(outopnd); } } if(sopnd.count()!=1) { src.vword.print(); sh.error(src,"expression error"); return false; } dst=r_move(sopnd[0]); if(dst.vword.empty()||dst.type.empty()||dst.pos.line==0) { sh.error(src,"expression error"); return false; } return true; } static void set_func(tsh& sh,tsent& outopnd,rbuf&& vsent,tfunc* ptfi) { tclass* ptci=ptfi->ptci; outopnd.type=ptfi->retval.type; outopnd.vword+=tword(rppoptr(c_mbk_l)); outopnd.vword+=tword(ptci->name); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=tword(ptfi->name_dec); outopnd.vword+=rppoptr(c_comma); outopnd.vword+=tword(rppoptr(c_mbk_l)); for(int i=0;isize; return 0; } static int get_func_local_size(const tfunc& tfi) { int ret=0; for(int i=0;iname&& !p->is_friend&& p->param.count()>=2&& p->param[0].type==tci.name+rstr("&")) return p; } return null; } //搜索非友元空参函数(类成员空参函数) static tfunc* func_search_empty_param_n(tclass& tci,const rstr& fname) { for(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p)) { if(fname==p->name&& !p->is_friend&& p->param.count()==1&& p->param[0].type==tci.name+rstr("&")) return p; } return null; } //搜索友元参数大于等于1个的函数 static tfunc* func_search_multi_param_f(tclass& tci,const rstr& fname) { for(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p)) { if(fname==p->name&& p->is_friend&& p->param.count()>=1) return p; } return null; } //搜索友元空参函数 static tfunc* func_search_empty_param_f(tclass& tci,const rstr& fname) { for(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p)) { if(fname==p->name&& p->is_friend&& p->param.empty()) return p; } return null; } //类型完全相同 static tfunc* func_search_same(tclass& tci,const rstr& fname, const rbuf& vtype) { tfunc tfi; tfi.name=fname; for(int i=0;iname) return p; } return null; } static tfunc* func_search(tclass& tci,const rstr& fname, const rstr& a,const rstr& b) { tfunc item; item.name=fname; item.param.push(a); item.param.push(b); item.name_dec=item.get_dec(); return tci.vfunc.find(item); } static tfunc* func_search(tclass& tci,const rstr& fname,const rstr& a) { tfunc item; item.name=fname; item.param.push(a); item.name_dec=item.get_dec(); return tci.vfunc.find(item); } static tfunc* ftl_search(tclass& tci,rstr& name) { tfunc item; item.name=name; item.name_dec=item.get_dec(); return tci.vfunctl.find(item); } static tfunc* destruct_search(tclass& tci) { return func_search(tci,"~"+tci.name,tci.name+"&"); } static rbool is_destruct(tsh& sh,tfunc& tfi) { tclass& tci=*tfi.ptci; return rppoptr(c_destruct)+tci.name==tfi.name&& tfi.param.count()==1&& tfi.param[0].type==tci.name+rppoptr(c_addr)&& tfi.retval.type==rppkey(c_void); } static tfunc* emptystruct_search(tclass& tci) { return func_search(tci,tci.name,tci.name+"&"); } static rbool is_emptystruct(tsh& sh,tfunc& tfi) { tclass& tci=*tfi.ptci; return tci.name==tfi.name&& tfi.param.count()==1&& tfi.param[0].type==tci.name+rppoptr(c_addr)&& tfi.retval.type==rppkey(c_void); } static tfunc* copystruct_search(tclass& tci) { return func_search(tci,tci.name,tci.name+"&",tci.name+"&"); } static tdata* data_member_search(const tclass& tci,const rstr& name) { for(int i=0;i& v,tclass* ptci) { for(int i=0;i=v.count()) { sh.error(v[left-1],"func template miss >"); return false; } rbuf > vparam=sh.comma_split(v.sub(left+1,right)); if(vparam.count()!=ptfi->vtl.count()) { sh.error(v[left-1],"func template not match"); return false; } for(int j=left;j<=right;j++) { v[left-1].val+=v[j].val; v[j].val.clear(); } //模板函数不可能重载,因此只要判断一下函数名是否相同即可 if(zfind::func_search(*ptci,v[left-1].val)!=null) { continue; } tfunc item=*ptfi; item.vtl.free(); zctl::vtl_replace(item.vword,ptfi->vtl,vparam); if(!f_type_replace(sh,item.vword)) { return false; } if(!combine_ftl_name(sh,item.vword,ptfi->name)) { return false; } if(!zmemb::func_add(sh,*ptci,item.vword,false)) { return false; } i=right; } zpre::arrange(v); return true; } //处理函数模板中又出现新类型的情况 static rbool f_type_replace(tsh& sh,rbuf& v) { int cur=sh.m_class.count(); if(!zctl::type_replace(sh,v)) { return false; } if(sh.m_class.count()>cur) { for(tclass* p=sh.m_class.begin(); p!=sh.m_class.end();p=sh.m_class.next(p)) { if(!f_proc_class(sh,*p)) { return false; } } } return true; } static rbool f_proc_class(tsh& sh,tclass& tci) { if(!zctl::a_class(sh,tci)) { return false; } if(!zmemb::recursion_get_size(sh,tci)) { return false; } zmemb::obtain_size_func(sh,tci); return true; } static rbool combine_ftl_name(tsh& sh,rbuf& v,rstr& name) { for(int i=1;i=v.count()) { sh.error(v[left-1],"miss >"); return false; } for(int j=left;j<=right;j++) { v[left-1].val+=v[j].val; v[j].val.clear(); } i=right; } zpre::arrange(v); return true; } }; #endif ================================================ FILE: rpp/zjit.h ================================================ #ifndef zjit_h__ #define zjit_h__ #include "zjiti.h" #include "znasm.h" #include "zjitf.h" struct zjit { static rbool run(tsh& sh) { init_addr_list(sh); #ifdef _MSC_VER tfunc* ptfi=zfind::func_search(*sh.m_main,"__declare"); if(ptfi!=null) { func_to_x86(sh,*ptfi,tenv()); } ptfi=zfind::func_search(*sh.m_main,"main_c"); if(ptfi==null) { rf::printl("main not find"); return false; } ifn(func_to_x86(sh,*ptfi,tenv())) { return false; } ((void (*)())(ptfi->code))(); return true; #else return false; #endif } //将一个函数翻译成X86代码 static rbool func_to_x86(tsh& sh,tfunc& tfi,tenv env) { #ifdef _MSC_VER if(!tfi.vasm.empty()) return true; if(!zbin::cp_vword_to_vasm(sh,tfi,env)) { return false; } int size=tfi.vasm.count()*6;//todo 估算法并不是最好的方法 size=r_ceil_div(size,4096)*4096; if(tfi.code==null) { tfi.code=talloc::alloc_v(size); if(tfi.code==null) { return false; } sh.m_addr.insert(taddr( (uint)tfi.code,(uint)(tfi.code+size),&tfi)); } int cur=0; for(int i=0;isize) { sh.error(tfi,"func too big"); return false; } memcpy(tfi.code+cur,s.begin(),s.count()); cur+=s.count(); } for(int i=0;i& vasm) { ifn(oasm.vstr.count()==2&& zbin::is_jmp_ins(oasm.ins.type)&& oasm.vstr[1].is_number()) { return true; } int line=oasm.vstr[1].toint(); int i; for(i=0;i=line) { break; } } if(i>=vasm.count()) { sh.error(oasm); return false; } ifn(a_asm(sh,oasm)) { return false; } oasm.ins.first.type=topnd::c_imme; oasm.ins.first.val=r_to_uint(vasm[i].start); uchar* real=oasm.start; rstr s=asm_to_x86(sh,oasm,real); if(s.empty()) { return false; } memcpy(real,s.begin(),s.count()); return true; } static rstr asm_to_x86(tsh& sh,tasm& item,uchar* start) { tins& ins=item.ins; rbuf& vstr=item.vstr; rstr s; switch(ins.type) { case tkey::c_calle: return p_calle(sh,ins,start); case tkey::c_call: return zjiti::b_call(ins,start); case tkey::c_retn: return zjiti::b_retn(); case tkey::c_reti: return zjiti::b_reti(ins); case tkey::c_push: return zjiti::b_push(ins); case tkey::c_pop: return zjiti::b_pop(ins); case tkey::c_jmp: return zjiti::b_jmp(ins,start); case tkey::c_jebxz: return rppj4(b_cmp,rppkey(c_ebx),rppoptr(c_comma),"0")+ zjiti::b_jz(ins,start+6); case tkey::c_jebxnz: return rppj4(b_cmp,rppkey(c_ebx),rppoptr(c_comma),"0")+ zjiti::b_jnz(ins,start+6); case tkey::c_nop: return zjiti::b_nop(); case tkey::c_lea: if(znasm::count_mbk_l(vstr)!=2) return zjiti::b_lea(ins); //应该检查b_lea是否返回空串 return rppj4(b_lea,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_ecx)); case tkey::c_mov: if(znasm::count_mbk_l(vstr)!=2) return zjiti::b_mov(ins); return rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_ecx)); case tkey::c_mov1: return rppj4(b_mov1_cl_addr,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_mov1_addr_cl,rppja,rppoptr(c_comma),rppkey(c_ecx)); case tkey::c_mov8: s+=rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb); s+=rppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_ecx)); ins.first.val+=4; ins.second.val+=4; s+=rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb); s+=rppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_ecx)); return r_move(s); case tkey::c_add: if(znasm::count_mbk_l(vstr)!=2) return zjiti::b_add(ins); return rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_add,rppja,rppoptr(c_comma),rppkey(c_ecx)); case tkey::c_sub: if(znasm::count_mbk_l(vstr)!=2) return zjiti::b_sub(ins); return rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_sub,rppja,rppoptr(c_comma),rppkey(c_ecx)); case tkey::c_imul: return rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppja)+ rppj4(b_imul,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_ecx)); case tkey::c_idiv: return rppj4(b_mov,rppkey(c_eax),rppoptr(c_comma),rppja)+ zjiti::b_cdq()+ rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_idiv,rppkey(c_ecx),rppoptr(c_comma),"0")+ rppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_eax)); case tkey::c_imod: return rppj4(b_mov,rppkey(c_eax),rppoptr(c_comma),rppja)+ zjiti::b_cdq()+ rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_idiv,rppkey(c_ecx),rppoptr(c_comma),"0")+ rppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_edx)); case tkey::c_udiv: return rppj4(b_mov,rppkey(c_eax),rppoptr(c_comma),rppja)+ rppj4(b_xor,rppkey(c_edx),rppoptr(c_comma),rppkey(c_edx))+ rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_udiv,rppkey(c_ecx),rppoptr(c_comma),"0")+ rppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_eax)); case tkey::c_umod: return rppj4(b_mov,rppkey(c_eax),rppoptr(c_comma),rppja)+ rppj4(b_xor,rppkey(c_edx),rppoptr(c_comma),rppkey(c_edx))+ rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_udiv,rppkey(c_ecx),rppoptr(c_comma),"0")+ rppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_edx)); case tkey::c_cesb: rppjcmp(b_sete_bl); case tkey::c_cnesb: rppjcmp(b_setne_bl); case tkey::c_cgsb: rppjcmp(b_setg_bl); case tkey::c_cgesb: rppjcmp(b_setge_bl); case tkey::c_clsb: rppjcmp(b_setl_bl); case tkey::c_clesb: rppjcmp(b_setle_bl); case tkey::c_ucgsb: rppjcmp(b_seta_bl); case tkey::c_ucgesb: rppjcmp(b_setae_bl); case tkey::c_uclsb: rppjcmp(b_setb_bl); case tkey::c_uclesb: rppjcmp(b_setbe_bl); case tkey::c_band: if(znasm::count_mbk_l(vstr)!=2) return zjiti::b_and(ins); return rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_and,rppja,rppoptr(c_comma),rppkey(c_ecx)); case tkey::c_bor: if(znasm::count_mbk_l(vstr)!=2) return zjiti::b_or(ins); return rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_or,rppja,rppoptr(c_comma),rppkey(c_ecx)); case tkey::c_bxor: if(znasm::count_mbk_l(vstr)!=2) return zjiti::b_xor(ins); return rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+ rppj4(b_xor,rppja,rppoptr(c_comma),rppkey(c_ecx)); case tkey::c_bnot: return zjiti::b_not(ins); } return rstr(); } static rstr p_calle(tsh& sh,tins& ins,uchar* start) { char* name=(char*)ins.first.val; void* temp=null; if(sh.m_jit_f.find(name)!=null) { temp=sh.m_jit_f[name]; } if(temp==null) { temp=zjitf::find_dll_full(name); } if(temp==null) { return rstr(); } ins.first.val=(int)temp; return zjiti::b_call(ins,start); } static rbool a_asm(tsh& sh,tasm& item) { int i=zbin::find_comma(sh,item.vstr); if(!a_opnd(sh,item,i-1,item.vstr.sub(1,i),item.ins.first)) return false; if(!a_opnd(sh,item,i+1,item.vstr.sub(i+1),item.ins.second)) return false; item.ins.type=sh.m_key.get_key_index(item.vstr.get_bottom()); return true; } static rbool a_opnd(tsh& sh,tasm& item,int index,const rbuf& v,topnd& o) { if(v.count()==7&&v[1]==rppoptr(c_addr)) { tfunc* ptfi=znasm::call_find(sh,item); if(ptfi==null) { return false; } ifn(func_to_x86(sh,*ptfi,tenv())) { return false; } o.type=topnd::c_imme; o.val=r_to_uint(ptfi->code); return true; } return zbin::a_opnd(sh,item,index,v,o); } static tins build_ins(tsh& sh,rstr s1,rstr s2,rstr s3,rstr s4) { tasm item; item.vstr+=s1; item.vstr+=s2; item.vstr+=s3; item.vstr+=s4; a_asm(sh,item); return item.ins; } static tins build_ins(tsh& sh,rstr s1,rstr s2,rstr s3,rbuf s4) { tasm item; item.vstr+=s1; item.vstr+=s2; item.vstr+=s3; item.vstr+=s4; a_asm(sh,item); return item.ins; } static tins build_ins(tsh& sh,rstr s1,rbuf s2,rstr s3,rstr s4) { tasm item; item.vstr+=s1; item.vstr+=s2; item.vstr+=s3; item.vstr+=s4; a_asm(sh,item); return item.ins; } //非多线程安全 static void* find_func(char* name) { tfunc* ptfi=zbin::find_func(*zjitf::get_psh(),name); if(ptfi==null) { return null; } ifn(func_to_x86(*zjitf::get_psh(),*ptfi,tenv())) { return null; } return ptfi->code; } static void init_addr_list(tsh& sh) { rppjf("add8",zjitf::add8); rppjf("sub8",zjitf::sub8); rppjf("imul8",zjitf::imul8); rppjf("idiv8",zjitf::idiv8); rppjf("imod8",zjitf::imod8); rppjf("cgsb8",zjitf::cgsb8); rppjf("clsb8",zjitf::clsb8); rppjf("fadd8",zjitf::fadd8); rppjf("fsub8",zjitf::fsub8); rppjf("fmul8",zjitf::fmul8); rppjf("fdiv8",zjitf::fdiv8); rppjf("fcgsb8",zjitf::fcgsb8); rppjf("fclsb8",zjitf::fclsb8); rppjf("bshl",zjitf::bshl); rppjf("bshr",zjitf::bshr); rppjf("bsar",zjitf::bsar); rppjf("get_argc",zjitf::get_argc); rppjf("get_argv",zjitf::get_argv); rppjf("get_hins",zjitf::get_hins); rppjf("set_main_ret",zjitf::set_main_ret); rppjf("find_func",find_func); rppjf("find_dll",zjitf::find_dll_q); rppjf("utf8_to_gbk",rcode::utf8_to_gbk_c); rppjf("get_cur_func",zjitf::get_cur_func); rppjf("get_vclass",zjitf::get_vclass); rppjf("eval",eval); rppjf("eval_vstr",eval_vstr); rppjf("_float_to_double",zjitf::_float_to_double); rppjf("sin",zjitf::sin); rppjf("cos",zjitf::cos); rppjf("sqrt",zjitf::sqrt); rppjf("set_dll_list",zjitf::set_dll_list); rppjf("find_symm_sbk",_find_symm_sbk); rppjf("get_psh",zjitf::get_psh); //必须在这里注册否则malloc与从DLL中找到的不一致 rppjf("malloc",::malloc); rppjf("free",::free); } static rbool eval_vstr(rbuf& vstr,tenv env) { rbuf v; for(int i=0;i& v,tenv env) { tsh& sh=*zjitf::get_psh(); zpre::def_replace(sh,sh.m_vdefine,v); if(!zctl::type_replace(sh,v)) { sh.error("type_replace"); return false; } tfunc tfi; tfi.ptci=sh.m_main; tfi.vword=v; tfi.first_pos.line=1; tfi.last_pos.line=tfi.vword.get_top().pos.line+10; tfi.retval.type=rppkey(c_int); tfi.retval.name=rppkey(c_s_ret); tfi.is_cfunc=true; if(!func_to_x86(sh,tfi,env)) { sh.error("func_to_x86"); return false; } uchar* temp=tfi.code; __asm sub esp,4 __asm call temp __asm mov esi,[esp] __asm mov temp,esi __asm add esp,4 return (int)temp; } static rbool eval(uchar* s,tenv env) { tsh& sh=*zjitf::get_psh(); rbuf v; if(!zpre::str_analyse(sh,rstr(s),v,null)) { return false; } return eval_v(v,env); } }; #endif ================================================ FILE: rpp/zjitb.h ================================================ #ifndef zjitb_h__ #define zjitb_h__ #include "znasm.h" //jit基础类 struct zjitb { static rstr build_one(int one) { rstr s; s.set_size(1); s[0]=one; return r_move(s); } static rstr build_two(int one,int two) { rstr s; s.set_size(2); s[0]=one; s[1]=two; return r_move(s); } static rstr build_three(int one,int two,int three) { rstr s; s.set_size(3); s[0]=one; s[1]=two; s[2]=three; return r_move(s); } static rstr build_i(const tins& ins,int one) { rstr s; s.set_size(5); s[0]=one; *(int*)&s[1]=ins.first.val; return r_move(s); } static rstr build_r(const tins& ins,int one) { rstr s; s.set_size(1); s[0]=one; set_reg_bit(ins.first.off,&s[0]); return r_move(s); } static rstr build_r(const tins& ins,int one,int two) { rstr s; s.set_size(2); s[0]=one; s[1]=two; set_reg_bit(ins.first.off,&s[1]); return r_move(s); } static rstr build_a(const tins& ins,int one,int two) { rstr s; if(ins.first.off==treg::c_esp) { s.set_size(7); } else { s.set_size(6); } s[0]=one; s[1]=two; set_addr_bit(ins.first.off,&s[1],ins.first.val); return r_move(s); } static rstr build_relative(const tins& ins,uchar* start,int one) { rstr s; s.set_size(5); s[0]=one; *(int*)&s[1]=ins.first.val-((int)start+s.count()); return r_move(s); } static rstr build_relative(const tins& ins,uchar* start,int one,int two) { rstr s; s.set_size(6); s[0]=one; s[1]=two; *(int*)&s[2]=ins.first.val-((int)start+s.count()); return r_move(s); } static rstr build_ri(const tins& ins,int one) { rstr s; s.set_size(5); s[0]=one; set_reg_bit(ins.first.off,&s[0]); *(int*)&s[1]=ins.second.val; return r_move(s); } static rstr build_ri(const tins& ins,int one,int two) { rstr s; s.set_size(6); s[0]=one; s[1]=two; set_reg_bit(ins.first.off,&s[1]); *(int*)&s[2]=ins.second.val; return r_move(s); } static rstr build_rr(const tins& ins,int one,int two) { rstr s; s.set_size(2); s[0]=one; s[1]=two; set_reg_bit_center(ins.first.off,&s[1]); set_reg_bit(ins.second.off,&s[1]); return r_move(s); } static rstr build_ra(const tins& ins,int one,int two) { rstr s; if(ins.second.off==treg::c_esp) { s.set_size(7); } else { s.set_size(6); } s[0]=one; s[1]=two; set_reg_bit_center(ins.first.off,&s[1]); set_addr_bit(ins.second.off,&s[1],ins.second.val); return r_move(s); } static rstr build_ai(const tins& ins,int one,int two) { rstr s; if(ins.first.off==treg::c_esp) { s.set_size(11); *(int*)&s[7]=ins.second.val; } else { s.set_size(10); *(int*)&s[6]=ins.second.val; } s[0]=one; s[1]=two; set_addr_bit(ins.first.off,&s[1],ins.first.val); return r_move(s); } static rstr build_ar(const tins& ins,int one,int two) { rstr s; if(ins.first.off==treg::c_esp) { s.set_size(7); } else { s.set_size(6); } s[0]=one; s[1]=two; set_addr_bit(ins.first.off,&s[1],ins.first.val); set_reg_bit_center(ins.second.off,&s[1]); return r_move(s); } static rstr build_ra(const tins& ins,int one,int two,int three) { rstr s; if(ins.second.off==treg::c_esp) { s.set_size(8); } else { s.set_size(7); } s[0]=one; s[1]=two; s[2]=three; set_reg_bit_center(ins.first.off,&s[2]); set_addr_bit(ins.second.off,&s[2],ins.second.val); return r_move(s); } //设置寄存器相对寻址位 static void set_addr_bit(int off,uchar* start,int val) { if(off==treg::c_esp) { *start|=0x4; *(start+1)=0x24; *(int*)(start+2)=val; return; } *(int*)(start+1)=val; if(off==treg::c_ebp) { *start|=0x5; } elif(off==treg::c_esi) { *start|=0x6; } elif(off==treg::c_edi) { *start|=0x7; } elif(off==treg::c_eax) { *start|=0x0; } elif(off==treg::c_ebx) { *start|=0x3; } elif(off==treg::c_ecx) { *start|=0x1; } elif(off==treg::c_edx) { *start|=0x2; } } static void set_reg_bit(int off,uchar* start) { if(off==treg::c_esp) { *start|=0x4; } elif(off==treg::c_ebp) { *start|=0x5; } elif(off==treg::c_esi) { *start|=0x6; } elif(off==treg::c_edi) { *start|=0x7; } elif(off==treg::c_eax) { *start|=0x0; } elif(off==treg::c_ebx) { *start|=0x3; } elif(off==treg::c_ecx) { *start|=0x1; } elif(off==treg::c_edx) { *start|=0x2; } } static void set_reg_bit_center(int off,uchar* start) { if(off==treg::c_esp) { *start|=0x4<<3; } elif(off==treg::c_ebp) { *start|=0x5<<3; } elif(off==treg::c_esi) { *start|=0x6<<3; } elif(off==treg::c_edi) { *start|=0x7<<3; } elif(off==treg::c_eax) { *start|=0x0<<3; } elif(off==treg::c_ebx) { *start|=0x3<<3; } elif(off==treg::c_ecx) { *start|=0x1<<3; } elif(off==treg::c_edx) { *start|=0x2<<3; } } }; #endif ================================================ FILE: rpp/zjitf.h ================================================ #ifndef zjitf_h__ #define zjitf_h__ #include "znasm.h" //jit函数 struct zjitf { static tsh*& get_psh() { static tsh* g_psh; return g_psh; } static void add8(int8* a,int8* b) { *a+=*b; } static void sub8(int8* a,int8* b) { *a-=*b; } static void imul8(int8* a,int8* b) { *a*=*b; } static void idiv8(int8* a,int8* b) { *a/=*b; } static void imod8(int8* a,int8* b) { *a%=*b; } static rbool cgsb8(int8* a,int8* b) { return *a>*b; } static rbool clsb8(int8* a,int8* b) { return *a<*b; } static void fadd8(double* a,double* b) { *a+=*b; } static void fsub8(double* a,double* b) { *a-=*b; } static void fmul8(double* a,double* b) { *a*=*b; } static void fdiv8(double* a,double* b) { *a/=*b; } static rbool fcgsb8(double* a,double* b) { return *a>*b; } static rbool fclsb8(double* a,double* b) { return *a<*b; } static uint bshl(uint a,uint b) { return a<>b; } static int bsar(int a,int b) { return a>>b; } static void _float_to_double(float a,double* b) { *b=a; } //当返回double时X86的ABI是通过xmm返回 static void sin(double a,double* b) { *b=::sin(a); } static void cos(double a,double* b) { *b=::cos(a); } static void sqrt(double a,double* b) { *b=::sqrt(a); } static int get_argc() { return get_psh()->m_argc; } static char** get_argv() { return get_psh()->m_argv; } static void* get_hins() { return get_psh()->m_hins; } static void set_main_ret(int a) { get_psh()->m_ret=a; } static tfunc* get_cur_func(uchar* pasm) { taddr* p=get_psh()->m_addr.find(taddr((uint)pasm,(uint)pasm+1,null)); if(p==null) { return null; } return p->ptfi; } static rset* get_vclass() { return &get_psh()->m_class; } //fixme _ftelli64必须要加载msvcr110.dll才能使用 static void ftell8(int8* ret,FILE* fp) { *ret=rfile::ftell8(fp); } static void* find_dll_q(const char* name) { tsh& sh=*get_psh(); if(sh.m_dll_func.exist(name)) { return sh.m_dll_func[name]; } if(sh.m_jit_f.exist(name)) { return sh.m_jit_f[name]; } return find_dll_full(name); } static void* find_dll_full(const char* name) { PBYTE pb=null; MEMORY_BASIC_INFORMATION mbi; while(VirtualQuery(pb,&mbi,r_size(mbi))==r_size(mbi)) { if(mbi.State==MEM_FREE) mbi.AllocationBase=mbi.BaseAddress; if(mbi.AllocationBase==mbi.BaseAddress&& mbi.AllocationBase!=null) { void* ret=GetProcAddress( (HINSTANCE)mbi.AllocationBase,name); if(ret!=null) { return ret; } } pb+=mbi.RegionSize; } return null; } //非多线程安全 static void set_dll_list() { tsh& sh=*get_psh(); PBYTE pb=null; MEMORY_BASIC_INFORMATION mbi; while(VirtualQuery(pb,&mbi,r_size(mbi))==r_size(mbi)) { if(mbi.State==MEM_FREE) mbi.AllocationBase=mbi.BaseAddress; if(mbi.AllocationBase==mbi.BaseAddress&& mbi.AllocationBase!=null) { //todo 去掉GetProcAddress void* ret=GetProcAddress( (HINSTANCE)mbi.AllocationBase,"glutSpecialFunc"); if(ret!=null) { set_dll_list_one( sh,(HINSTANCE)mbi.AllocationBase); } ret=GetProcAddress( (HINSTANCE)mbi.AllocationBase,"glBegin"); if(ret!=null) { set_dll_list_one( sh,(HINSTANCE)mbi.AllocationBase); } } pb+=mbi.RegionSize; } } static void set_dll_list_one(tsh& sh,HINSTANCE hModule) { char *pRet=null; PIMAGE_DOS_HEADER pImageDosHeader=NULL; PIMAGE_NT_HEADERS pImageNtHeader=NULL; PIMAGE_EXPORT_DIRECTORY pImageExportDirectory=null; pImageDosHeader=(PIMAGE_DOS_HEADER)hModule; pImageNtHeader=(PIMAGE_NT_HEADERS)(( DWORD)hModule+pImageDosHeader->e_lfanew); pImageExportDirectory=(PIMAGE_EXPORT_DIRECTORY)( (DWORD)hModule+pImageNtHeader->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); DWORD dwExportRVA=pImageNtHeader->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; DWORD dwExportSize=pImageNtHeader->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT].Size; DWORD* pAddressOfFunction=(DWORD*)( pImageExportDirectory->AddressOfFunctions+(DWORD)hModule); DWORD* pAddressOfNames=(DWORD*)( pImageExportDirectory->AddressOfNames+(DWORD)hModule); DWORD dwNumberOfNames=(DWORD)( pImageExportDirectory->NumberOfNames); DWORD dwBase=(DWORD)(pImageExportDirectory->Base); WORD* pAddressOfNameOrdinals=(WORD*)( pImageExportDirectory->AddressOfNameOrdinals+(DWORD)hModule); for(int i=0;i<(int)dwNumberOfNames;i++) { char *strFunction=(char*)(pAddressOfNames[i]+(DWORD)hModule); if(*strFunction==0) { continue; } pRet=(char*)(pAddressOfFunction[ pAddressOfNameOrdinals[i]]+(DWORD)hModule); if((DWORD)pRetdwExportRVA+(DWORD)hModule+dwExportSize) { sh.m_dll_func[strFunction]=(void*)pRet; } } } }; #endif ================================================ FILE: rpp/zjiti.h ================================================ #ifndef zjiti_h__ #define zjiti_h__ #include "zjitb.h" //jit指令类 struct zjiti { static rstr b_call(const tins& ins,uchar* start) { if(ins.first.type==topnd::c_imme) { return zjitb::build_relative(ins,start,0xe8); } elif(ins.first.type==topnd::c_reg) { return zjitb::build_r(ins,0xff,0xd0); } elif(ins.first.type==topnd::c_addr) { return zjitb::build_a(ins,0xff,0x90); } return rstr(); } static rstr b_retn() { return zjitb::build_one(0xc3); } static rstr b_reti(const tins& ins) { rstr s; s.set_size(3); s[0]=0xc2; if(ins.first.val>65535) { return rstr(); } *(ushort*)&s[1]=(ushort)ins.first.val;//只有16位的reti,截断 return r_move(s); } static rstr b_push(const tins& ins) { if(ins.first.type==topnd::c_imme) { return zjitb::build_i(ins,0x68); } elif(ins.first.type==topnd::c_reg) { return zjitb::build_r(ins,0x50); } elif(ins.first.type==topnd::c_addr) { return zjitb::build_a(ins,0xff,0xb0); } return rstr(); } static rstr b_pop(const tins& ins) { if(ins.first.type==topnd::c_reg) { return zjitb::build_r(ins,0x58); } return rstr(); } static rstr b_jmp(const tins& ins,uchar* start) { if(ins.first.type==topnd::c_imme) { return zjitb::build_relative(ins,start,0xe9); } elif(ins.first.type==topnd::c_reg) { return zjitb::build_r(ins,0xff,0xe0); } elif(ins.first.type==topnd::c_addr) { return zjitb::build_a(ins,0xff,0xa0); } return rstr(); } static rstr b_jz(const tins& ins,uchar* start) { if(ins.first.type==topnd::c_imme) { return zjitb::build_relative(ins,start,0x0f,0x84); } return rstr(); } static rstr b_jnz(const tins& ins,uchar* start) { if(ins.first.type==topnd::c_imme) { return zjitb::build_relative(ins,start,0x0f,0x85); } return rstr(); } static rstr b_nop() { return zjitb::build_one(0x90); } static rstr b_lea(const tins& ins) { if(ins.first.type==topnd::c_reg&&ins.second.type==topnd::c_addr) { return zjitb::build_ra(ins,0x8d,0x80); } return rstr(); } static rstr b_mov(const tins& ins) { if(ins.first.type==topnd::c_reg) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ri(ins,0xb8); } elif(ins.second.type==topnd::c_reg) { return zjitb::build_rr(ins,0x8b,0xc0); } elif(ins.second.type==topnd::c_addr) { return zjitb::build_ra(ins,0x8b,0x80); } } elif(ins.first.type==topnd::c_addr) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ai(ins,0xc7,0x80); } elif(ins.second.type==topnd::c_reg) { return zjitb::build_ar(ins,0x89,0x80); } } return rstr(); } static rstr b_mov1_cl_addr(const tins& ins) { rstr s; if(ins.second.off==treg::c_esp) { s.set_size(7); } else { s.set_size(6); } s[0]=0x8a; s[1]=0x88; zjitb::set_addr_bit(ins.second.off,&s[1],ins.second.val); return r_move(s); } static rstr b_mov1_addr_cl(const tins& ins) { rstr s; if(ins.first.off==treg::c_esp) { s.set_size(7); } else { s.set_size(6); } s[0]=0x88; s[1]=0x88; zjitb::set_addr_bit(ins.first.off,&s[1],ins.first.val); return r_move(s); } static rstr b_add(const tins& ins) { if(ins.first.type==topnd::c_reg) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ri(ins,0x81,0xc0); } if(ins.second.type==topnd::c_reg) { return zjitb::build_rr(ins,0x03,0xc0); } if(ins.second.type==topnd::c_addr) { return zjitb::build_ra(ins,0x03,0x80); } } if(ins.first.type==topnd::c_addr) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ai(ins,0x81,0x80); } if(ins.second.type==topnd::c_reg) { return zjitb::build_ar(ins,0x01,0x80); } } return rstr(); } static rstr b_sub(const tins& ins) { if(ins.first.type==topnd::c_reg) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ri(ins,0x81,0xe8); } if(ins.second.type==topnd::c_reg) { return zjitb::build_rr(ins,0x2b,0xc0); } if(ins.second.type==topnd::c_addr) { return zjitb::build_ra(ins,0x2b,0x80); } } if(ins.first.type==topnd::c_addr) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ai(ins,0x81,0xa8); } if(ins.second.type==topnd::c_reg) { return zjitb::build_ar(ins,0x29,0x80); } } return rstr(); } static rstr b_imul(const tins& ins) { if(ins.first.type==topnd::c_reg&&ins.second.type==topnd::c_addr) { return zjitb::build_ra(ins,0x0f,0xaf,0x80); } return rstr(); } static rstr b_idiv(const tins& ins) { if(ins.first.type==topnd::c_reg) { return zjitb::build_r(ins,0xf7,0xf8); } return rstr(); } static rstr b_udiv(const tins& ins) { if(ins.first.type==topnd::c_reg) { return zjitb::build_r(ins,0xf7,0xf0); } return rstr(); } static rstr b_cdq() { return zjitb::build_one(0x99); } static rstr b_sete_bl() { return zjitb::build_three(0x0f,0x94,0xc3); } static rstr b_setne_bl() { return zjitb::build_three(0x0f,0x95,0xc3); } static rstr b_setg_bl() { return zjitb::build_three(0x0f,0x9f,0xc3); } static rstr b_setge_bl() { return zjitb::build_three(0x0f,0x9d,0xc3); } static rstr b_setl_bl() { return zjitb::build_three(0x0f,0x9c,0xc3); } static rstr b_setle_bl() { return zjitb::build_three(0x0f,0x9e,0xc3); } static rstr b_seta_bl() { return zjitb::build_three(0x0f,0x97,0xc3); } static rstr b_setae_bl() { return zjitb::build_three(0x0f,0x93,0xc3); } static rstr b_setb_bl() { return zjitb::build_three(0x0f,0x92,0xc3); } static rstr b_setbe_bl() { return zjitb::build_three(0x0f,0x96,0xc3); } static rstr b_cmp(const tins& ins) { if(ins.first.type==topnd::c_reg) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ri(ins,0x81,0xf8); } if(ins.second.type==topnd::c_reg) { return zjitb::build_rr(ins,0x3b,0xc0); } if(ins.second.type==topnd::c_addr) { return zjitb::build_ra(ins,0x3b,0x80); } } if(ins.first.type==topnd::c_addr) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ai(ins,0x81,0xb8); } if(ins.second.type==topnd::c_reg) { return zjitb::build_ar(ins,0x39,0x80); } } return rstr(); } static rstr b_and(const tins& ins) { if(ins.first.type==topnd::c_reg) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ri(ins,0x81,0xe0); } if(ins.second.type==topnd::c_reg) { return zjitb::build_rr(ins,0x23,0xc0); } if(ins.second.type==topnd::c_addr) { return zjitb::build_ra(ins,0x23,0x80); } } if(ins.first.type==topnd::c_addr) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ai(ins,0x81,0xa0); } if(ins.second.type==topnd::c_reg) { return zjitb::build_ar(ins,0x21,0x80); } } return rstr(); } static rstr b_or(const tins& ins) { if(ins.first.type==topnd::c_reg) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ri(ins,0x81,0xc8); } if(ins.second.type==topnd::c_reg) { return zjitb::build_rr(ins,0x0b,0xc0); } if(ins.second.type==topnd::c_addr) { return zjitb::build_ra(ins,0x0b,0x80); } } if(ins.first.type==topnd::c_addr) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ai(ins,0x81,0x88); } if(ins.second.type==topnd::c_reg) { return zjitb::build_ar(ins,0x09,0x80); } } return rstr(); } static rstr b_xor(const tins& ins) { if(ins.first.type==topnd::c_reg) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ri(ins,0x81,0xf0); } if(ins.second.type==topnd::c_reg) { return zjitb::build_rr(ins,0x33,0xc0); } if(ins.second.type==topnd::c_addr) { return zjitb::build_ra(ins,0x33,0x80); } } if(ins.first.type==topnd::c_addr) { if(ins.second.type==topnd::c_imme) { return zjitb::build_ai(ins,0x81,0xb0); } if(ins.second.type==topnd::c_reg) { return zjitb::build_ar(ins,0x31,0x80); } } return rstr(); } static rstr b_not(const tins& ins) { if(ins.first.type==topnd::c_reg) { return zjitb::build_r(ins,0xf7,0xd0); } elif(ins.first.type==topnd::c_addr) { return zjitb::build_a(ins,0xf7,0x90); } return rstr(); } static rstr b_shl_eax_cl() { return zjitb::build_two(0xd3,0xe0); } static rstr b_shr_eax_cl() { return zjitb::build_two(0xd3,0xe8); } static rstr b_sar_eax_cl() { return zjitb::build_two(0xd3,0xf8); } }; #endif ================================================ FILE: rpp/zlambda.h ================================================ #ifndef zlambda_h__ #define zlambda_h__ #include "zexp.h" #include "zsrep.h" #include "zftl.h" struct zlambda { //闭包处理,todo:闭包暂时不能使用类型推断,不是线程安全 static void lambda_pack(tsh& sh,const rbuf& vhead, const rbuf& vbody,tfunc& tfi,tfunc& lambda) { tclass item; for(int i=0;i=vhead.count()||pos==0) { continue; } ifn(zfind::is_class_t(sh,vhead[pos-1].val)) { continue; } ptdi=&tdi; ptdi->type=vhead[pos-1].val; } else { tdi.type=ptdi->type; ptdi=&tdi; } ptdi->name=vbody[i].val; ptdi->count=1; ptdi->size=zfind::get_type_size(sh,ptdi->type); if(ptdi->size==0) { continue; } item.vdata.push(*ptdi); } if(item.vdata.empty()) { return; } item.is_friend=true; item.name=lambda.name+"_C"; for(int i=0;i& v=tfi.vword; for(int i=0;i=v.count()) { continue; } int left=right+1; if(v.get(left)!=rppoptr(c_bbk_l)) { continue; } right=sh.find_symm_bbk(v,left); if(right>=v.count()) { continue; } v[i].val=rstr("_LAMBDA")+tci.vfunc.count(); ifn(zmemb::func_add(sh,tci,v.sub(i,right+1),false)) { return false; } tfunc* ptfi=zfind::func_search(tci,v[i].val); if(ptfi!=null) { lambda_pack(sh,v.sub(0,i), v.sub(left+1,right),tfi,*ptfi); } v[i].multi.push("("); v[i].multi.push("&"); v[i].multi.push(tci.name); v[i].multi.push("."); v[i].multi.push(v[i].val); v[i].multi.push(")"); sh.clear_word_val(v,i,right+1); i=right; } zpre::arrange(v); return true; } static rstr lambda_get(rbuf& v) { for(int i=0;i& v=tfi.vsent; for(int i=0;ilambda_data.empty()) { continue; } tclass* ptci=zfind::class_search(sh,name+"_C"); if(ptci==null||ptci->vdata.empty()) { continue; } rstr data_name=name+"_C_P"; lambda_push_type(name,tfi); tword word; word.pos_src=v[i].vword.get_bottom().pos_src; word.pos=v[i].vword.get_bottom().pos; rbuf vtemp; sh.push_twi(vtemp,word,"mov"); sh.push_twi(vtemp,word,data_name); sh.push_twi(vtemp,word,","); if(sh.m_mode==tsh::c_rvm||sh.m_mode==tsh::c_jit) { sh.push_twi(vtemp,word, rstr((uint)ptfi->lambda_data.begin())); } else { sh.push_twi(vtemp,word,ptfi->name+"_C_P_A"); } sh.push_twi(vtemp,word,";"); for(int j=0;jvdata.count();j++) { sh.push_twi(vtemp,word,data_name); sh.push_twi(vtemp,word,"."); sh.push_twi(vtemp,word,ptci->vdata[j].name); sh.push_twi(vtemp,word,"="); sh.push_twi(vtemp,word,ptci->vdata[j].name); sh.push_twi(vtemp,word,";"); } vtemp+=v[i].vword; v[i].vword=r_move(vtemp); } zcontrol::part_vsent(v); } static void lambda_add_init_asm(tsh& sh,tfunc& tfi) { if(tfi.lambda_data.empty()) { return; } tsent sent; sent.pos=tfi.first_pos; sent.vword.push(tword("mov"));//tword没有设置pos sent.vword.push(tword(tfi.name+"_C_P")); sent.vword.push(tword(",")); if(sh.m_mode==tsh::c_rvm||sh.m_mode==tsh::c_jit) { sent.vword.push(tword(rstr((uint)tfi.lambda_data.begin()))); } else { sent.vword.push(tword(tfi.name+"_C_P_A")); } tfi.vsent.push_front(r_move(sent)); } static void lambda_var_replace(tsh& sh,tfunc& tfi) { if(tfi.lambda_data.empty()) { return; } tclass* ptci=zfind::class_search(sh,tfi.name+"_C"); if(ptci==null) { return; } lambda_push_type(tfi.name,tfi); rstr data_name=tfi.name+"_C_P"; rbuf& v=tfi.vword; for(int i=0;i& v) { for(int i=0;i& vsent) { for(int i=0;i& v) { if(v.get(0)!=rppoptr(c_pre)) { return true; } int right=v.find_last(tword(rppoptr(c_sbk_r))); if(right>=v.count()) { return false; } int left=sh.find_symm_word_rev(v,rppoptr(c_sbk_l),rppoptr(c_sbk_r), 0,right+1); if(left>=v.count()) { return false; } rbuf > temp; temp=sh.comma_split_e(v.sub(left+1,right)); rbuf head=v.sub(1,left+1); rbuf result; if(temp.count()==1&&zfind::is_class(sh,temp[0].get_top().val)) { tclass* ptci=zfind::class_search(sh,temp[0].get_top().val); if(ptci==null) { return false; } if(temp[0].count()==1) { for(int i=0;ivdata.count();i++) { result+=head; result+=ptci->vdata[i].name; result+=tword(rppoptr(c_sbk_r)); result+=tword(rppoptr(c_semi)); //todo 单词没有行号 } } else { for(tfunc* p=ptci->vfunc.begin();p!=ptci->vfunc.end(); p=ptci->vfunc.next(p)) { result+=head; result+=tword(rppoptr(c_addr)); result+=ptci->name; result+=tword(rppoptr(c_dot)); result+=p->name; result+=tword(rppoptr(c_sbk_l)); for(int j=0;jparam.count();j++) { if(j!=0) { result+=tword(rppoptr(c_comma)); } result+=p->param[j].type; } result+=tword(rppoptr(c_sbk_r)); result+=tword(rppoptr(c_sbk_r)); result+=tword(rppoptr(c_semi)); } } } else { for(int i=0;i& v) { for(int i=0;i& v) { for(int i=0;ivmac.exist(item)) { ifn(i>1&&v.get(i-1).val==rppoptr(c_dot)) { if(!replace_param(sh,v,i, *ptci->vmac.find(item),right)) { return false; } i=right; continue; } } ptci=sh.m_main; if(ptci->vmac.exist(item)) { ifn(i>1&&v.get(i-1).val==rppoptr(c_dot)) { if(!replace_param(sh,v,i, *ptci->vmac.find(item),right)) { return false; } i=right; continue; } } if(i==0||v[i].val!=rppoptr(c_dot)||i==v.count()-1) continue; if(i>=2&&v[i-2].val==rppoptr(c_dot)) continue; ptci=zfind::class_search(sh,v[i-1].val); if(null==ptci) continue; i++; item.name=v.get(i).val; if(ptci->vmac.exist(item)) { if(!replace_param(sh,v,i,*ptci->vmac.find(item),right)) { return false; } v[i-1].clear(); v[i-2].clear(); i=right; } } return true; } static rbool replace_param(tsh& sh,rbuf& v,int& i, tmac& mitem,int& right) { if(mitem.is_super) { return zsuper::replace_item(sh,v,right,mitem); } else { return replace_param_common(sh,v,i,mitem,right); } } static rbool replace_param_common(tsh& sh,rbuf& v,int& i, tmac& mitem,int& right) { int left=i+1; rbuf > param; if(v.get(left).val==rppoptr(c_sbk_l)) { right=sh.find_symm_sbk(v,left); if(right>=v.count()) { sh.error(v.get(i),"miss )"); return false; } rbuf > temp; temp=sh.comma_split(v.sub(left+1,right)); for(int j=0;j >& param,tmac& mitem) { if(param.count()!=mitem.param.count()) return false; word.val.clear(); if(param.empty()) { word.multi=mitem.vstr; return true; } for(int i=0;iname.torstr())) { return false; } ifn(sh.m_db.write_new(p->cont)) { return false; } } ifn(write_inf(sh,"rinf/conf.txt")) { return false; } ifn(write_inf(sh,"rinf/key.txt")) { return false; } ifn(write_inf(sh,"rinf/match.txt")) { return false; } ifn(write_inf(sh,"rinf/optr.txt")) { return false; } sh.m_db.close(); ifn(rfile::write_all_n(name,rfile::read_all_n( rdir::get_exe_name())+rfile::read_all_n(name))) { return false; } return true; } static rbuf param_split(rstr s) { rbuf v; int j; for(int i=0;iname!=sh.m_main_file) { continue; } rbuf& v=p->vword; for(int i=0;ireal_size; if(sh.m_is_pack_read) { sh.m_mode=tsh::c_jit; ifn(sh.m_db.open_off(exe_name,real_size)) { return 1; } } } if(argc>=3) { name=argv[2]; if(argv[1]==rstr("-jit")) { sh.m_mode=tsh::c_jit; } elif(argv[1]==rstr("-win")) { sh.m_mode=tsh::c_win; } elif(argv[1]==rstr("-grub")) { sh.m_mode=tsh::c_grub; } elif(argv[1]==rstr("-pack")) { sh.m_mode=tsh::c_jit; sh.m_is_pack_mode=true; } elif(argv[1]==rstr("-pre")) { sh.m_is_pre_mode=true; } else { name=argv[1]; } } elif(argc>=2) { name=argv[1]; } #ifdef _MSC_VER name=rcode::gbk_to_utf8(name); #endif sh.m_ret=0; if(!compile(sh,vm,name)) { sh.m_ret=1; } if(rppconf(c_pause)) rf::getch(); return sh.m_ret; } }; //todo C++不支持mixin,只能这么写 rbool _func_to_x86(tsh& sh,tfunc& tfi,tenv env) { return zjit::func_to_x86(sh,tfi,env); } int _find_symm_sbk(tsh& sh,const rbuf& v,int begin) { return sh.find_symm_sbk(v,begin); } #endif ================================================ FILE: rpp/zmatch.h ================================================ #ifndef zmatch_h__ #define zmatch_h__ #include "zfind.h" struct zmatch { //可构造转换传递 static rbool is_construct_pass(tsh& sh,tsent& src,rstr& dst) { if(dst==rppkey(c_rcs)) { return true; } tclass* ptci=zfind::class_search_t(sh,dst); if(ptci==null) { return false; } tfunc* ptfi=zfind::func_search(*ptci,sh.get_tname(dst), sh.get_tname(dst)+rppoptr(c_addr), sh.get_tname(src.type)+rppoptr(c_addr)); if(ptfi!=null) { return true; } ptfi=zfind::func_search(*ptci,sh.get_tname(dst), sh.get_tname(dst)+rppoptr(c_addr),sh.get_tname(src.type)); return ptfi!=null; } //可直接传递,返回对象可传递引用 static rbool is_direct_pass(tsh& sh,tsent& src,rstr& dst) { if(sh.is_point(src.type)&&sh.is_point(dst)) return true; if(dst==rppkey(c_rcs)) { return true; } if(dst==rppkey(c_rd4)&&zfind::get_type_size(sh,src.type)==4) return true; if(sh.get_tname(src.type)!=sh.get_tname(dst)) return false; return true; } //是否直接传递或构造转换传递 static rbool is_direct_construct_pass_m(tsh& sh,rbuf& vsent, rbuf& vparam) { if(vsent.count()!=vparam.count()) { return false; } for(int i=0;i& vsent) { for(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p)) { if(fname!=p->name) continue; if(is_direct_construct_pass_m(sh,vsent,p->param)) return p; } return null; } //可完全传递,临时对象可传递引用,常量和返回对象不可传递引用 static rbool is_full_pass(tsh& sh,tsent& src,rstr& dst) { if(!is_direct_pass(sh,src,dst)) return false; if(src.vword.count()==1&& (src.vword[0].is_const()|| sh.m_key.is_asm_reg(src.vword[0].val))&& sh.is_quote(dst)) { return false; } if(src.vword.count()==7&& sh.is_quote(dst)&& src.vword[1].val==rppoptr(c_addr)&& src.vword[0].val==rppoptr(c_mbk_l)) { return false; } if(is_temp_var(sh,src)) { return true; } return !sh.is_quote(dst)||!is_ret_obj(sh,src.vword); } static rbool is_full_pass_m(tsh& sh,rbuf& vsent,rbuf& vparam) { if(vsent.count()!=vparam.count()) { return false; } for(int i=0;i& vsent) { for(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p)) { if(fname!=p->name) continue; if(is_full_pass_m(sh,vsent,p->param)) return p; } return null; } static rbool is_temp_var(tsh& sh,tsent& sent) { return !tsh::is_quote(sent.type)&& sent.vword.count()>=3&&sent.type==sent.vword[2].val&& sent.vword[1].val==rppkey(c_btemp); } //重载的友元属性和返回值类型必须相同 static rbool is_ret_obj(tsh& sh,rbuf& v) { if(v.count()<3) { return false; } int start=0; while(start+2=v.count()) { return false; } if(v[start].val==rppkey(c_pcall)) { return !sh.is_quote(v[start+2].val); } tclass* ptci=zfind::class_search(sh,v[start].val); if(ptci==null) { return false; } tfunc* ptfi=zfind::func_search_dec(*ptci,v[start+2].val); if(ptfi==null) { return false; } return !sh.is_quote(ptfi->retval.type); } static void insert_type(tsh& sh,tsent& sent,const rstr& type) { rbuf result; result+=rppoptr(c_mbk_l); result+=rppkey(c_btemp); result+=rppoptr(c_comma); result+=type; result+=rppoptr(c_comma); result+=rppoptr(c_mbk_l); result+=sent.vword; result+=rppoptr(c_mbk_r); result+=rppoptr(c_mbk_r); sent.vword=r_move(result); sent.type=type; } //先完全传递,找不到再尝试替换单词 static tfunc* find_replace(tsh& sh,tclass& tci,const rstr& fname, rbuf& vsent) { tfunc* ptfi=find_full_pass(sh,tci,fname,vsent); if(ptfi!=null) { return ptfi; } //可能找到多个,只取第一个 ptfi=find_direct_construct_pass(sh,tci,fname,vsent); if(ptfi==null) { return null; } for(int i=0;iparam[i].type)) { insert_type(sh,vsent[i], sh.get_tname(ptfi->param[i].type)); } } return ptfi; } }; #endif ================================================ FILE: rpp/zmemb.h ================================================ #ifndef zmemb_h__ #define zmemb_h__ //提取类内部的成员,函数默认参数处理 //zclass::vword->vdata,vfunc,vmac struct zmemb { static rbool recursion_get_size(tsh& sh,tclass& tci,int level=0) { if(level>c_rpp_deep) { sh.error(rstr("level overflow ")+tci.name); return false; } level++; if(tci.size>0||tci.size==0&&tci.vdata.empty()) { return true; } int size=0; for(int i=0;isize; size+=tci.vdata[i].size*tci.vdata[i].count; } } tci.size=size; return true; } static rbool analyse(tsh& sh,tclass& tci) { rbuf& v=tci.vword; int start=0; int i; for(i=0;i0&&v[i-1].pos!=v[i].pos) { if(v[i].val==rppoptr(c_bbk_l)) { int right=sh.find_symm_bbk(v,i); if(right>=v.count()) { sh.error(v.get(start),"miss }"); return false; } if(!func_add(sh,tci,v.sub(start,right+1))) { return false; } i=right; start=right+1; } else { if(!data_add(sh,tci,v.sub(start,i))) { return false; } start=i; v[i-1].pos=v[i].pos; i--; } } elif(v[i].val==rppoptr(c_bbk_l)) { int right=sh.find_symm_bbk(v,i); if(right>=v.count()) { sh.error(v.get(start),"miss }"); return false; } ifn(func_add(sh,tci,v.sub(start,right+1))) { return false; } i=right; start=right+1; } elif(v[i].val==rppoptr(c_semi)) { if(!data_add(sh,tci,v.sub(start,i))) { return false; } start=i+1; } elif(v[i].val==rppkey(c_enum)) { int left=i+1; if(v.get(left).val!=rppoptr(c_bbk_l)) { sh.error(v.get(i),"miss {"); return false; } int right=sh.find_symm_bbk(v,left); if(right>=v.count()) { sh.error(v.get(i),"miss }"); return false; } ifn(enum_add(sh,tci,v.sub(left+1,right))) { return false; } i=right; start=right+1; } elif(v[i].val==rppkey(c_mac)) { int right; if(!mac_add(sh,tci,v,i,right)) return false; i=right; start=right+1; } } return true; } static rbool enum_add(tsh& sh,tclass& tci,const rbuf& v) { uint enum_val=0; for(int j=0;j& v,int i,int& right) { if(v.get(i+1).val=="$") { ifn(zsuper::add_super_mac(sh,v,i,tci.vmac)) { return false; } right=i; return true; } tmac mitem; int left=i+2; mitem.name=v.get(left-1).val; if(mitem.name.empty()) { sh.error(v.get(i),"mac miss name"); return false; } if(v.get(left).val==rppoptr(c_sbk_l)) { right=sh.find_symm_sbk(v,left); if(right>=v.count()) { sh.error(v.get(i),"miss )"); return false; } rbuf > temp=r_split,rstr>( sh.vword_to_vstr(v.sub(left+1,right)), rppoptr(c_comma)); for(int j=0;j=v.count()) { sh.error(v.get(i),"miss }"); return false; } for(int j=left+1;j=v.count()) { sh.error(v.get(i),"miss mac"); return false; } if(mitem.param.empty()) { for(int j=left;j<=right;j++) mitem.vstr.push(v[j].val); } else { mitem.vstr.push(rppoptr(c_sbk_l)); for(int j=left;j<=right;j++) { if(mitem.param.exist(v[j].val)) { mitem.vstr.push(rppoptr(c_sbk_l)); mitem.vstr.push(v[j].val); mitem.vstr.push(rppoptr(c_sbk_r)); } else mitem.vstr.push(v[j].val); } mitem.vstr.push(rppoptr(c_sbk_r)); } } if(tci.vmac.exist(mitem)) { sh.error(v.get_bottom(),"mac redefined"); return false; } tci.vmac.insert(mitem); return true; } static rbool a_data_define(tsh& sh,tdata& item,const rbuf& vword) { int pos=vword.find(tword(rppoptr(c_equal))); if(pos=vword.count()) { sh.error(vword.get(0),"miss >"); return false; } for(int i=0;i& v) { if(v.get(1)!=rppoptr(c_sbk_l)) { sh.error(v.get(0),"miss ("); return false; } item.name=v.get(0).val; int right=sh.find_symm_sbk(v,1); if(right>=v.count()) { sh.error(v.get(0),"miss )"); return false; } rbuf param=v.sub(2,right); rbuf > list=sh.comma_split(param); int i=0; //如果第一个参数只有类型,则表明是返回值 if(!list.empty()&&list[0].count()==1&& zfind::is_class_t(sh,list[0].get_bottom().val)) { item.retval.type=list[0].get_bottom().val; i++; } else { item.retval.type=rppkey(c_void); } item.retval.name=rppkey(c_s_ret); for(;i& v, rbool lambda=false) { item.name.clear(); if(v.get_bottom().val.sub(0,7)=="_LAMBDA") { return lambda_a_func_define(sh,item,v); } int start=0; if(v.get(start).val=="macro") { item.is_macro=true; item.is_cfunc=true; start++; } if(v.get(start).val==rppkey(c_cfunc)) { item.is_cfunc=true; start++; } if(v.get(start).val==rppkey(c_dynamic)) { item.is_dynamic=true; start++; } if(v.get(start).val==rppkey(c_friend)) { item.is_friend=true; start++; } if(lambda) { if(zfind::is_class_t(sh,v.get(start).val)) { item.retval.type=v.get(start).val; start++; } else item.retval.type=rppkey(c_void); } else { if(zfind::is_class_t(sh,v.get(start).val) &&v.get(start+1).val!=rppoptr(c_sbk_l) &&!v.get(start+1).val.empty()) { item.retval.type=v.get(start).val; start++; } else item.retval.type=rppkey(c_void); } if(item.retval.type.empty()) { sh.error(v.get(0),"miss ret type"); return false; } item.retval.name=rppkey(c_s_ret); if(v.get(start).val==rppoptr(c_destruct)) { item.name+=v.get(start).val; start++; item.name+=v.get(start).val; start++; } elif(lambda&&( v.get(start)==rppoptr(c_bbk_l)|| v.get(start)==rppoptr(c_sbk_l))) { item.name+="_SELF"; } elif(sh.m_optr.is_optr(v.get(start).val)) { item.name=v.get(start).val; if(v.get(start).val==rppoptr(c_mbk_l)) { start++; item.name+=v.get(start).val; } start++; } else { item.name+=v.get(start).val; start++; } if(item.name.empty()) { sh.error(v.get(0),"miss func name"); return false; } rbuf > list; int right; if(v.get(start).val==rppoptr(c_sbk_l)) { right=sh.find_symm_sbk(v,start); if(right>=v.count()) { sh.error(v.get(0),"miss )"); return false; } list=sh.comma_split(v.sub(start+1,right)); } else { list=sh.comma_split(v.sub(start)); } for(int i=0;i& v) { if(v.empty()) { return true; } tdata item; if(!a_data_define(sh,item,v)) { return false; } if(tci.vdata.exist(item)) { v.print(); sh.error(v.get_bottom(),"data member redefined"); return false; } tci.vdata.push(item); return true; } //tl表示是否检查模板 static rbool func_add(tsh& sh,tclass& tci,const rbuf& v,rbool tl=true) { tfunc item; int left=v.find(tword(rppoptr(c_bbk_l))); if(left>=v.count()) { sh.error(v.get_bottom(),"miss {"); return false; } int right=v.count()-1; item.first_pos=v[left].pos; item.last_pos=v.get(right).pos; item.ptci=&tci;//反射 rbuf vhead=v.sub(0,left); if(tl) { func_tl_part(sh,item,vhead); } if(item.vtl.empty()) { if(!a_func_define(sh,item,vhead)) { return false; } if(item.name.sub(0,7)!="_LAMBDA") { add_this_func(sh,tci,item); } obtain_size_func(sh,item); item.name_dec=item.get_dec(); if(tci.vfunc.exist(item)) { if(tl) { sh.error(v.get_bottom(),"func redefined"); return false; } else return true; } item.vword=v.sub(left+1,right); tci.vfunc.insert(item); if(item.is_macro) { sh.m_macro[item.name]=tci.vfunc.find(item); } if(!default_param_proc(sh,*tci.vfunc.find(item))) { return false; } } else { item.name_dec=item.get_dec(); if(tci.vfunctl.exist(item)) { sh.error(v.get_bottom(),"functl redefined"); return false; } item.vword=v; tci.vfunctl.insert(item); } return true; } static void obtain_size_func(tsh& sh,tclass& tci) { for(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p)) { obtain_size_func(sh,*p); } } static void obtain_size_func(tsh& sh,tfunc& tfi) { tfi.retval.size=zfind::get_type_size(sh,tfi.retval.type); for(int i=0;i& v) { int left=v.count(); if(v.get_top()!=rppoptr(c_tbk_r)) { if(v.get_top()!=rppoptr(c_sbk_r)) { return; } left=sh.find_symm_word_rev(v, rppoptr(c_sbk_l),rppoptr(c_sbk_r), 0,v.count()); if(left>=v.count()) { return; } } if(v.get(left-1)!=rppoptr(c_tbk_r)) return; rbuf temp=v.sub(0,left); left=sh.find_symm_word_rev(temp, rppoptr(c_tbk_l),rppoptr(c_tbk_r), 0,temp.count()); if(left>=temp.count()) return; item.name=temp.get(left-1).val; if(item.name.empty()) return; rbuf > vdst; rbuf vsrc=sh.vword_to_vstr( temp.sub(left+1,temp.count()-1)); vdst=r_split(vsrc,rppoptr(c_comma)); if(vdst.empty()) return; for(int i=0;i=tfi.param.count()) return true; for(int j=i;j vtemp; tword twi; twi.pos_src=tfi.first_pos; twi.pos=tfi.first_pos; for(int j=i;jvfunc.exist(ftemp)) { sh.error(tfi.vword.get_bottom(),"func redefined"); return false; } tfi.ptci->vfunc.insert(ftemp); } for(i=0;i vconst; ifn(proc_func(sh,*ptfi,result,vconst)) { return false; } rstr head; head+="%include '"+rcode::utf8_to_gbk( rdir::get_exe_dir().torstr())+"nasm/windemos.inc'\n"; head+="%include '"+rcode::utf8_to_gbk( rdir::get_exe_dir().torstr())+"nasm/dec.inc'\n"; //head+="IMPORT _getch\n"; nasm的一个bug? head+="entry demo11\n"; head+="\n"; head+="[section .bss]\n"; head+="align 32\n"; head+="_ARGC: resb 4\n"; head+="_ARGV: resb 4\n"; head+=rstr("_PMAIN_A: resb ")+sh.m_main_data.size()+"\n"; add_lambda(sh,head); head+="\n"; head+="[section .data]\n"; head+="align 32\n"; head+="db 0,0,0,0\n";//防止数据段为空 add_str(sh,head,vconst); head+="\n"; head+="[section .text]\n"; head+="proc demo11, ptrdiff_t argcount, ptrdiff_t cmdline\n"; head+="locals none\n"; head+=" mov ecx , [ argv(.argcount) ]\n"; head+=" mov [ _ARGC ] , ecx\n"; head+=" mov ecx , [ argv(.cmdline) ]\n"; head+=" mov [ _ARGV ] , ecx\n"; head+=" sub esp , 4\n"; head+=" call main2Emain2829\n"; head+=" add esp , 4\n"; head+=" xor eax , eax\n"; head+="endproc\n"; head+="proc _rpp_main\n"; head+="locals none\n"; head+=result; head+="\n"; head+="endproc\n"; rstrw name=tsh::get_main_name(sh)+".asm"; rfile file; ifn(file.open_n(name,"rw")) { rf::printl("file open error"); return false; } ifn(file.write(head.size(),head.begin())) { rf::printl("file write error"); return false; } return true; } static rbool proc_grub(tsh& sh) { tfunc* ptfi=zfind::func_search(*sh.m_main,"main"); if(ptfi==null) { rf::printl("main not find"); return false; } rstr result; rbuf vconst; ifn(proc_func(sh,*ptfi,result,vconst)) { return false; } rstr head; head+="org 4194304\n"; head+="MODULEALIGN equ 1<<0\n"; head+="MEMINFO equ 1<<1\n"; head+="FLAGS equ MODULEALIGN|MEMINFO|(1<<16)\n"; head+="MAGIC equ 0x1BADB002\n"; head+="CHECKSUM equ-(MAGIC+FLAGS)\n"; head+="bits 32\n"; head+="\n"; head+="section .text\n"; head+="align 4\n"; head+="MultiBootHeader:\n"; head+=" dd MAGIC\n"; head+=" dd FLAGS\n"; head+=" dd CHECKSUM\n"; head+=" dd MultiBootHeader\n"; head+=" dd MultiBootHeader\n"; head+=" dd MultiBootEnd\n"; head+=" dd _stack_end\n"; head+=" dd _loader\n"; head+="\n"; head+="STACKSIZE equ 1024*1024\n"; head+="_loader:\n"; head+=" mov esp,_stack_start+STACKSIZE\n"; head+=" finit\n"; head+=" cli\n"; head+=" call rf2Einit5Fheap2829\n"; head+=" sub esp,4\n"; head+=" call main2Emain2829\n"; head+=" add esp,4\n"; head+="_hang:\n"; head+=" hlt\n"; head+=" jmp _hang\n"; head+=result; head+="\n"; head+="MultiBootEnd:\n"; head+="section .data\n"; head+="align 32\n"; head+="db 0,0,0,0\n";//防止数据段为空 add_str(sh,head,vconst); head+="\n"; head+="section .bss\n"; head+="align 32\n"; head+="_stack_start:\n"; head+=" resb STACKSIZE\n"; head+="_stack_end:\n"; head+="\n"; head+="_ARGC: resb 4\n"; head+="_ARGV: resb 4\n"; head+=rstr("_PMAIN_A: resb ")+sh.m_main_data.size()+"\n"; add_lambda(sh,head); rstrw name=tsh::get_main_name(sh)+".asm"; rfile file; ifn(file.open_n(name,"rw")) { rf::printl("file open error"); return false; } ifn(file.write(head.size(),head.begin())) { rf::printl("file write error"); return false; } return true; } static void add_str(tsh& sh,rstr& result,rbuf& vconst) { for(int i=0;ilambda_data.empty()) { continue; } result+=p->name+"_C_P_A: resb "+p->lambda_data.size()+"\n"; } } static tfunc* call_find(tsh& sh,tasm& item) { int i; for(i=1;i=item.vstr.count()) { return null; } i+=2; tclass* ptci=zfind::class_search(sh,item.vstr.get(i)); if(ptci==null) { return null; } i+=2; rstr fname=item.vstr.get(i); return zfind::func_search_dec(*ptci,fname); } static rstr symbol_trans(const rstr& s) { rstr ret; for(int i=0;iname+"."+tfi.name_dec); } static rbool is_jmp_ins_nasm(const rstr& s) { return s=="call"||s=="je"||s=="jne"||s=="jg"||s=="jge"|| s=="jl"||s=="jle"||s=="ja"||s=="jae"||s=="jb"||s=="jbe"; } static rbool line_update(tsh& sh,rbuf& vasm,rbuf& vline) { for(int j=0;jtkey::c_rn) { sh.error(vasm[j]); return false; } ifn(zbin::is_jmp_ins(type)|| type==tkey::c_rn&&is_jmp_ins_nasm(vasm[j].vstr[1])) { continue; } int line=vasm[j].vstr.top().toint(); int i; for(i=0;i=line) { break; } } if(i>=vasm.count()) { sh.error(vasm[j]); return false; } vasm[j].vstr.top()=rstr(vasm[i].pos.line); vline[i]=1; } return true; } //将一个函数翻译成NASM汇编代码 static rbool proc_func(tsh& sh,tfunc& tfi,rstr& result, rbuf& vconst,int level=0) { if(level>300) { sh.error(tfi,"nasm level overflow"); return false; } level++; if(tfi.count==1) { return true; } tfi.count=1; if(tfi.vasm.empty()) { if(!zbin::cp_vword_to_vasm(sh,tfi,tenv())) { return false; } } rbuf vline(tfi.vasm.count()); memset(vline.begin(),0,vline.count()); ifn(line_update(sh,tfi.vasm,vline)) { sh.error(tfi); return false; } rstr symbol=get_nasm_symbol(tfi); result+="\n"+symbol+":\n"; for(int i=0;i& vstr,rbuf& vconst) { for(int i=0;i=2) { vconst.push(vstr[i]); vstr[i]="_RC_"+rstr(vconst.count()-1); } } } static rbool have_single_esp(tsh& sh,tasm& item) { for(int i=0;i=2) { return true; } } return false; } static void fix_esp(tsh& sh,tasm& item) { for(int i=0;ii+2&&item.vstr[i+2].is_number()) { item.vstr[i+2]=item.vstr[i+2].toint()-4; } } } static rbool proc_inline(tsh& sh,rstr& result,tfunc* ptfi,rbool& is_inline) { is_inline=false; rbuf& vasm=ptfi->vasm; if(vasm.empty()) { if(!zbin::cp_vword_to_vasm(sh,*ptfi,tenv())) { return false; } } if(vasm.count()>10) { return true; } for(int i=0;itkey::c_rn) { sh.error(vasm[i]); return false; } if(zbin::is_jmp_ins(type)|| type==tkey::c_rn&&is_jmp_ins_nasm(vasm[i].vstr.get(1))) { return true; } //加入call会陷入无限递归 if(type==tkey::c_reti||tkey::c_retn==type||type==tkey::c_call) { return true; } if(have_single_esp(sh,vasm[i])) { return true; } } rbuf temp=vasm; rbuf vconst;//实际上这个vconst没用 for(int i=0;i=1&&temp.top().vstr.get(0)==rppkey(c_reti)&& temp.top().vstr.get(1).toint()!=0) { result+=" add esp,"+temp.top().vstr.get(1)+"\n"; } is_inline=true; return true; } static rbool proc_asm(tsh& sh,tfunc& tfi,tasm& item, rstr& result,rbuf& vconst) { rbuf& vstr=item.vstr; proc_const_str(vstr,vconst); if(vstr.empty()) { return false; } int type=sh.m_key.get_key_index(vstr[0]); tfunc* ptfi; switch(type) { case tkey::c_call: ptfi=call_find(sh,item); if(ptfi==null) { result+=" call dword "+ link_vstr(vstr.sub(1))+"\n"; return true; } result+=" call "+get_nasm_symbol(*ptfi)+"\n"; return true; case tkey::c_retn: result+=" ret\n"; return true; case tkey::c_reti: result+=" ret "+vstr.get(1)+"\n"; return true; case tkey::c_push: ptfi=call_find(sh,item); if(ptfi==null) { result+=" push dword "+link_vstr(vstr.sub(1))+"\n"; } else { result+=" push "+get_nasm_symbol(*ptfi)+"\n"; } return true; case tkey::c_pop: result+=" pop dword "+link_vstr(vstr.sub(1))+"\n"; return true; case tkey::c_jmp: result+=" jmp "+get_nasm_symbol(tfi)+"_"+vstr.get(1)+"\n"; return true; case tkey::c_jebxz: result+=" cmp ebx , 0\n"; result+=" jz "+get_nasm_symbol(tfi)+"_"+vstr.get(1)+"\n"; return true; case tkey::c_jebxnz: result+=" cmp ebx , 0\n"; result+=" jnz "+get_nasm_symbol(tfi)+"_"+vstr.get(1)+"\n"; return true; case tkey::c_nop: result+=" nop\n"; return true; case tkey::c_lea: if(count_mbk_l(vstr)==2) { result+=" lea ecx , "+get_opnd2(vstr)+"\n"; result+=" mov "+get_opnd1(vstr)+" , ecx\n"; } else { result+=" lea dword "+link_vstr(vstr.sub(1))+"\n"; } return true; case tkey::c_mov: if(count_mbk_l(vstr)==2) { result+=" mov ecx , "+get_opnd2(vstr)+"\n"; result+=" mov "+get_opnd1(vstr)+" , ecx\n"; return true; } ptfi=call_find(sh,item); if(ptfi==null) { result+=" mov dword "+link_vstr(vstr.sub(1))+"\n"; } else { result+=" mov dword "+get_opnd1(vstr)+" , "+ get_nasm_symbol(*ptfi)+"\n"; } return true; case tkey::c_mov1: result+=" mov cl , "+get_opnd2(vstr)+"\n"; result+=" mov "+get_opnd1(vstr)+" , cl\n"; return true; case tkey::c_mov8: return false; case tkey::c_add: if(count_mbk_l(vstr)==2) { result+=" mov ecx , "+get_opnd2(vstr)+"\n"; result+=" add "+get_opnd1(vstr)+" , ecx\n"; } else { result+=" add dword "+ link_vstr(vstr.sub(1))+"\n"; } return true; case tkey::c_sub: if(count_mbk_l(vstr)==2) { result+=" mov ecx , "+get_opnd2(vstr)+"\n"; result+=" sub "+get_opnd1(vstr)+" , ecx\n"; } else { result+=" sub dword "+link_vstr(vstr.sub(1))+"\n"; } return true; case tkey::c_imul: result+=" mov ecx , "+get_opnd1(vstr)+"\n"; result+=" imul ecx , "+get_opnd2(vstr)+"\n"; result+=" mov "+get_opnd1(vstr)+" , ecx\n"; return true; case tkey::c_idiv: result+=" mov eax , "+get_opnd1(vstr)+"\n"; result+=" cdq\n"; result+=" mov ecx , "+get_opnd2(vstr)+"\n"; result+=" idiv ecx\n"; result+=" mov "+get_opnd1(vstr)+" , eax\n"; return true; case tkey::c_imod: result+=" mov eax , "+get_opnd1(vstr)+"\n"; result+=" cdq\n"; result+=" mov ecx , "+get_opnd2(vstr)+"\n"; result+=" idiv ecx\n"; result+=" mov "+get_opnd1(vstr)+" , edx\n"; return true; case tkey::c_cesb: rppncmp(" sete bl\n"); case tkey::c_cnesb: rppncmp(" setne bl\n"); case tkey::c_cgsb: rppncmp(" setg bl\n"); case tkey::c_cgesb: rppncmp(" setge bl\n"); case tkey::c_clsb: rppncmp(" setl bl\n"); case tkey::c_clesb: rppncmp(" setle bl\n"); case tkey::c_add8: return false; case tkey::c_sub8: return false; case tkey::c_imul8: return false; case tkey::c_idiv8: return false; case tkey::c_imod8: return false; case tkey::c_cgsb8: return false; case tkey::c_clsb8: return false; case tkey::c_fadd8: return false; case tkey::c_fsub8: return false; case tkey::c_fmul8: return false; case tkey::c_fdiv8: return false; case tkey::c_fcgsb8: return false; case tkey::c_fclsb8: return false; case tkey::c_band: if(count_mbk_l(vstr)==2) { result+=" mov ecx , "+get_opnd2(vstr)+"\n"; result+=" and "+get_opnd1(vstr)+" , ecx\n"; } else { result+=" and dword "+link_vstr(vstr.sub(1))+"\n"; } return true; case tkey::c_bor: if(count_mbk_l(vstr)==2) { result+=" mov ecx , "+get_opnd2(vstr)+"\n"; result+=" or "+get_opnd1(vstr)+" , ecx\n"; } else { result+=" or dword "+link_vstr(vstr.sub(1))+"\n"; } return true; case tkey::c_bnot: result+=" not dword "+link_vstr(vstr.sub(1))+"\n"; return true; case tkey::c_bxor: if(count_mbk_l(vstr)==2) { result+=" mov ecx , "+get_opnd2(vstr)+"\n"; result+=" xor "+get_opnd1(vstr)+" , ecx\n"; } else { result+=" xor dword "+link_vstr(vstr.sub(1))+"\n"; } return true; case tkey::c_bshl: return false; case tkey::c_bshr: return false; case tkey::c_bsar: return false; case tkey::c_udiv: result+=" mov eax , "+get_opnd1(vstr)+"\n"; result+=" xor edx , edx\n"; result+=" mov ecx , "+get_opnd2(vstr)+"\n"; result+=" div ecx\n"; result+=" mov "+get_opnd1(vstr)+" , eax\n"; return true; case tkey::c_umod: result+=" mov eax , "+get_opnd1(vstr)+"\n"; result+=" xor edx , edx\n"; result+=" mov ecx , "+get_opnd2(vstr)+"\n"; result+=" div ecx\n"; result+=" mov "+get_opnd1(vstr)+" , edx\n"; return true; case tkey::c_ucgsb: rppncmp(" seta bl\n"); case tkey::c_ucgesb: rppncmp(" setae bl\n"); case tkey::c_uclsb: rppncmp(" setb bl\n"); case tkey::c_uclesb: rppncmp(" setbe bl\n"); case tkey::c_rn: if(vstr.count()==3&&vstr.top().is_number()&& is_jmp_ins_nasm(vstr[1])) { result+=" "+vstr[1]+" "+get_nasm_symbol(tfi)+"_"+ vstr.top()+"\n"; } else { result+=" "+link_vstr(vstr.sub(1))+"\n"; } return true; } return false; } static rstr link_vstr(const rbuf& v) { return rstr::join(v," "); } static rstr get_opnd1(rbuf& vstr) { return link_vstr(get_opnd1_v(vstr)); } static rbuf get_opnd1_v(rbuf& vstr) { int i; int count=0; for(i=1;i& vstr) { return link_vstr(get_opnd2_v(vstr)); } static rbuf get_opnd2_v(rbuf& vstr) { int i; int count=0; for(i=1;i& vstr) { int sum=0; for(int i=0;i& v) { return v.count()==4&&is_add_sub(sh,v[0])&& v[2]==rppoptr(c_comma)&&v[3].is_number(); } static rbool op_add_sub(tsh& sh,rbuf& vasm) { rbuf result; for(int i=0;i& item,rbuf& pick) { if(item.count()!=pick.count()) { return false; } for(int i=0;i& item,rbuf& pick,rbuf& dst) { rbuf temp; for(int i=0;i=temp.count()) { return false; } dst[i].vstr[j]=temp[num]; } } } return true; } static rbool op_match(tsh& sh,rbuf& vasm) { rbuf result; for(int i=0;ivasm.count()) { continue; } int k; for(k=i;k temp=sh.m_match[j].dst; ifn(replace(vasm.sub(i,i+len),sh.m_match[j].src,temp)) { return false; } result+=r_move(temp); i=i+len-1; break; } if(j>=sh.m_match.count()) { result+=vasm[i]; } } vasm=r_move(result); return true; } }; #endif ================================================ FILE: rpp/zpre.h ================================================ #ifndef zpre_h__ #define zpre_h__ #include "tsh.h" #include "../rlib/ralgo.h" #include "zread.h" #include "zfind.h" //词法分析、预处理、获取所有文件 //词表->m_file.vword struct zpre { static rbool process(tsh& sh) { if(sh.m_mode==tsh::c_jit) { sh.m_vdefine.insert_c(tmac(rstr("_JIT"))); } elif(sh.m_mode==tsh::c_rvm) { sh.m_vdefine.insert_c(tmac(rppkey(c_rvm))); } elif(sh.m_mode==tsh::c_win) { sh.m_vdefine.insert_c(tmac(rstr("_WIN"))); } elif(sh.m_mode==tsh::c_grub) { sh.m_vdefine.insert_c(tmac(rstr("_GRUB"))); } #ifdef _MSC_VER sh.m_vdefine.insert_c(tmac(rstr("_WIN32"))); #endif if(!obtain_all_file(sh)) return false; for(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p)) if(!obtain_def(sh,sh.m_vdefine,p->vword)) return false; for(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p)) if(!ifdef_replace(sh,sh.m_vdefine,p->vword)) return false; for(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p)) { ifn(def_replace(sh,sh.m_vdefine,p->vword)) { return false; } } return true; } static rbool str_analyse(tsh& sh,rstr& src,rbuf& dst,tfile* pfile) { if(!zread::word_analyse(sh,src,dst,pfile)) { return false; } const_replace(dst); combine_double(dst); combine_float(dst); key_replace(sh,dst); return true; } static rbool obtain_all_file(tsh& sh) { while(true) { int cur=sh.m_file.count(); rbuf vname; for(tfile* p=sh.m_file.begin(); p!=sh.m_file.end();p=sh.m_file.next(p)) { count_tab(*p); if(!str_analyse(sh,p->cont,p->vword,p)) { return false; } //仅编译器内部使用 ifn(ifdef_replace(sh,sh.m_vdefine,p->vword)) { return false; } if(!obtain_name(sh,vname,p->vword,*p)) { sh.error(rstr("obtain error ")+ sh.get_file_name(p)); return false; } } if(!sh.m_is_pack_read) { if(!import_file(sh,vname)) { sh.error("import error"); return false; } } if(cur==sh.m_file.count()) return true; } } static rbool import_file(tsh& sh,rbuf& vname) { for(int i=0;i& vname,rbuf& v,tfile& f) { rstrw exe_dir=rdir::get_exe_dir(); for(int i=0;i temp=r_split(name,rstrw("/")); if(temp.empty()) return rstrw(); for(int i=0;i& v) { for(int i=0;i& v,rset& vmac) { tmac item; for(int i=0;iis_super) { ifn(zsuper::replace_item(sh,v,i,*p)) { return false; } } else { v[i].val.clear(); v[i].multi=p->vstr; } } return true; } static rbool def_replace(tsh& sh,rset& vdefine,rbuf& v) { for(int i=0;i& v) { for(int i=0;i& src,rbool* pneed=null) { if(!need_arrange(src)) { if(pneed!=null) *pneed=false; return; } if(pneed!=null) *pneed=true; rbuf wlist(src.count()*2); wlist.m_count=0; for(int i=0;i& vdefine,rbuf& v) { for(int i=0;i& vdefine,rbuf& v) { tmac item; for(int i=v.count()-1;i>=0;i--) { if(v[i]!=rppoptr(c_pre)) { continue; } rstr key=v.get(i+1).val; if(key!=rppkey(c_ifdef)&& key!=rppkey(c_ifndef)) continue; if(i+2>=v.count()) { sh.error(v[i],"ifdef"); return false; } item.name=v[i+2].val; int endpos=r_find_pos(v,tword(rppkey(c_endif)),i+3); if(endpos>=v.count()) { sh.error(v[i],"ifdef"); return false; } int elsepos=endpos; for(int j=i+3;j& v) { for(int i=1;i& v) { for(int i=0;i& v) { for(int i=0;i0&&rstr::is_number(word.val[0])) { if(r_find_pos(word.val,'_')2) { if(word.val[0]=='0'&&word.val[1]=='x') { word.val=rstr::hextodec(word.val.sub(2)); } if(word.val[0]=='0'&&word.val[1]=='b') { word.val=rstr::bintodec(word.val.sub(2)); } } } static int count_tab_line(rstr& s) { int i; for(i=0;i& v,rbool clear_sbk) { if(!rppconf(c_op_const_eval)) return true; for(int i=0;i=v.count()) continue; int pos=i+1; if(pos+1>=right) continue; if(!zread::is_const_str(sh,v,pos,right)) continue; int dst; if(!zread::const_eval(sh, sh.vword_to_vstr(v.sub(pos,right)),dst)) { sh.error(v[i],"const_eval"); return false; } v[pos].val=rstr((uint)dst); sh.clear_word_val(v,pos+1,right); if(clear_sbk) { v[i].val.clear(); v[right].val.clear(); } } arrange(v); return true; } }; #endif ================================================ FILE: rpp/zread.h ================================================ #ifndef zread_h__ #define zread_h__ #include "tsh.h" #include "zsuper.h" #include "../rlib/rdir.h" //读取基本配置信息和主文件 struct zread { static rbool process(tsh& sh) { if(!read_inf(sh)) return false; if(sh.m_is_pack_read) { for(int i=0;i get_op_vasm(tsh& sh,const rbuf& v) { rbuf result; tasm item; rbuf vword; rbuf& vstr=item.vstr; for(int i=0;i vstr=r_split_e(data,rstr("\r\n")); top_node item; int start=0; for(int i=0;i vstr=r_split(data,rstr("\r\n")); for(int i=0;i vword; ifn(word_analyse(sh,vstr[i],vword,null)) { sh.error("can't read conf file "+name.torstr()); return false; } int dst; if(!const_eval(sh,sh.vword_to_vstr(vword),dst)) return false; udst=(uint)dst; } else udst=vstr[i].touint(); sh.m_conf.m_conf.push(udst); } if(sh.m_conf.m_conf.count()<=tconf::c_stack_size) return false; if(rppconf(c_stack_size)<1024*1024) rppconf(c_stack_size)=1024*1024; return true; } static rbool read_optr(tsh& sh,const rstrw& name) { rstr data=get_file_data(sh,name); if(data.count()<2) { sh.error("can't read optr file "+name.torstr()); return false; } ifn(rcode::is_utf16_txt(data)) { sh.error("can't read optr file "+name.torstr()); return false; } rbuf vstr; vstr=r_split(data.sub(2),rstr((void*)"\r\x00\n\x00",4)); for(int i=0;itoptr::c_exp_part; } static rbool read_key(tsh& sh,const rstrw& name) { rstr data=get_file_data(sh,name); if(data.empty()) { sh.error("can't read key file "+name.torstr()); return false; } rbuf vstr=r_split(data,rstr("\r\n")); for(int i=0;itkey::c_pmain; } static rbool exist(tsh& sh,const rstrw& name) { return sh.m_file.exist(tfile(name)); } static rbool read_file_pack(tsh& sh,const rstrw& name) { tfile item; item.name=name; item.cont=get_file_data(sh,name);//写入时已经是utf8,不用转换 if(item.cont.empty()) { return false; } sh.m_file.insert(item); return true; } static rbool read_file(tsh& sh,const rstrw& name) { if(name.empty()) return false; ifn(file_exist(name)) { return false; } tfile item; item.name=name; if(sh.m_file.exist(item)) return true; if(rdir::get_suffix(name)==rstrw("rp")) { return false; } #ifndef __COCOS2D_H__ if((int)rfile::get_size8(name)>200*1024*1024) { return false; } #endif item.cont=get_file_data(sh,name); if(item.cont.empty()) { return false; } item.cont=rcode::to_utf8_txt(item.cont).sub(3); sh.m_file.insert(item); return true; } static rbool const_eval(tsh& sh,rbuf src,int& dst,int level=0) { if(level>c_rpp_deep) { sh.error("const eval level overflow"); return false; } level++; rbuf soptr; rbuf sopnd; soptr+=rppoptr(c_exp_part); src+=rppoptr(c_exp_part); for(int i=0;i=src.count()) { sh.error("const eval miss )"); return false; } int outopnd; if(!const_eval(sh,src.sub(i+1,right),outopnd,level)) return false; sopnd.push(outopnd); i=right; } elif(sh.m_optr.is_optr(src[i])) { if(soptr.empty()) { sh.error("const eval miss soptr"); return false; } rstr cur=src[i]; if(!sh.m_optr.precede(soptr.top(),cur)) { soptr.push(cur); continue; } rstr theta=soptr.pop(); if(sopnd.empty()) { sh.error("const eval miss sopnd"); return false; } int second=sopnd.pop(); if(sopnd.empty()) { if(theta==rppoptr(c_plus)) { } elif(theta==rppoptr(c_minus)) { second=-second; } else { sh.error("const eval miss sopnd"); return false; } sopnd.push(second); i--; continue; } int first=sopnd.pop(); int outopnd; if(!calc(sh,first,second,theta,outopnd)) { sh.error("const eval calc error"); return false; } sopnd.push(outopnd); i--; } } if(sopnd.count()!=1) { return false; } dst=sopnd[0]; return true; } static rbool calc(tsh& sh,int first,int second,rstr& theta,int& outopnd) { if(theta==rppoptr(c_plus)) { outopnd=first+second; } elif(theta==rppoptr(c_minus)) { outopnd=first-second; } elif(theta==rppoptr(c_star)) { outopnd=first*second; } elif(theta==rppoptr(c_divide)) { if(second==0) return false; outopnd=first/second; } else return false; return true; } static rbool word_analyse(tsh& sh,rstr& src,rbuf& result,tfile* pfile) { result.clear(); tword cur_word; cur_word.pos.file=pfile; cur_word.pos.line=1; int len; uchar* start; uchar* p; rstr stemp; stemp.set_size(sh.m_optr.m_optr_max); for(p=src.cstr();*p;++p) { start=p; if(*p=='/') { //为了效率这里使用了过多的缩进 if(*(p+1)=='*') { p+=2; int count=1; for(;*p&&*(p+1);p++) { if('\n'==*p) ++cur_word.pos.line; if(*p&&*(p+1)&&*p=='/'&&*(p+1)=='*') { ++count; } if(*p&&*(p+1)&&*p=='*'&&*(p+1)=='/') { --count; } if(0==count) { break; } } if(count) { sh.error(rstr(cur_word.pos.line)+ rstr("miss */")); return false; } p++; continue; } elif(*(p+1)=='/') { p+=2; for(;*p&&*p!='\n';p++) { ; } if(*p==0) return true; ++cur_word.pos.line; continue; } } len=get_optr_s_len(sh,p,src.end()-p,stemp); if(len) { cur_word.val=rstr(p,p+len); push_word(result,cur_word); p+=len; p--; } elif(rstr::is_alpha(*p)||'_'==*p|| rcode::is_utf8_3(*p)&&*(p+1)&&*(p+2)|| rcode::is_utf8_2(*p)&&*(p+1)) { for(;*p;++p) { if(rstr::is_number(*p)|| rstr::is_alpha(*p)||'_'==*p) continue; elif(rcode::is_utf8_3(*p)&&*(p+1)&&*(p+2)) { //todo //应该只能以汉字开头不能以特殊符号开头 p+=2; continue; } elif(rcode::is_utf8_2(*p)&&*(p+1)) { p++; continue; } else break; } cur_word.val=rstr(start,p); push_word(result,cur_word); p--; } elif(rstr::is_number(*p)) { for(++p;*p&&(rstr::is_number(*p)||'_'==*p|| rstr::is_alpha(*p));++p) ; cur_word.val=rstr(start,p); push_word(result,cur_word); p--; } elif('"'==*p) { int line=cur_word.pos.line; for(++p;*p;++p) { if('\n'==*p) ++cur_word.pos.line; if(*p=='\\') { if(*(p+1)=='x'&&*(p+2)&&*(p+3)) { p+=3; } elif(*(p+1)) { p++; } continue; } if(*p=='\"') { break; } } cur_word.pos.line=line; if(*p) { cur_word.val=rstr(start,p+1); push_word(result,cur_word); } else { sh.error(rstr(cur_word.pos.line)+ rstr("miss \"")); return false; } } elif('\''==*p) { int line=cur_word.pos.line; for(++p;*p;++p) { if('\n'==*p) ++cur_word.pos.line; if(*p=='\\') { if(*(p+1)=='x'&&*(p+2)&&*(p+3)) { p+=3; } elif(*(p+1)) { p++; } continue; } if(*p=='\'') { break; } } cur_word.pos.line=line; if(*p) { cur_word.val=rstr(start,p+1); if(cur_word.val.count()<2) { sh.error(rstr(cur_word.pos.line)+ rstr("miss '")); return false; } cur_word.val[0]='"'; cur_word.val[cur_word.val.count()-1]='"'; add_rstr(sh,result,cur_word); } else { sh.error(rstr(cur_word.pos.line)+ rstr("miss '")); return false; } } elif('\n'==*p) { ++cur_word.pos.line; } elif('\\'==*p&&'\\'==*(p+1)) { p+=2; for(;*p&&*p!='\n'&&*p!=0xd;p++) { ; } cur_word.val=zsuper::add_quote(rstr(start+2,p)); add_rstr(sh,result,cur_word); if(*p==0) return true; if(*p=='\n') ++cur_word.pos.line; } elif('`'==*p) { if(*(p+1)==0) { sh.error(rstr(cur_word.pos.line)+ rstr("miss `")); return false; } p++; cur_word.val=rstr((uint)*(p)); push_word(result,cur_word); } } return true; } static void push_word(rbuf& result,tword word) { word.pos_src=word.pos; result.push_move(word); } static int get_optr_s_len(tsh& sh,const uchar* s,int len,rstr& stemp) { for(int i=sh.m_optr.m_optr_max;i>0;i--) { if(len& result,const tword& word) { if(result.get_top()==rppkey(c_import)|| result.get_top()==rppkey(c_include)) { push_word(result,word); return; } tword temp; temp.pos=word.pos; temp.val=rppkey(c_rstr); push_word(result,temp); temp.val=rppoptr(c_sbk_l); push_word(result,temp); push_word(result,word); temp.val=rppoptr(c_sbk_r); push_word(result,temp); } static rbool is_const_str(tsh& sh,const rstr& s) { return s.is_number()||s==rppoptr(c_sbk_l)||s==rppoptr(c_sbk_r)|| s==rppoptr(c_plus)||s==rppoptr(c_minus)||s==rppoptr(c_star)|| s==rppoptr(c_divide); } static rbool is_const_str(tsh& sh,rbuf& v,int begin,int end) { for(int i=begin;igetFileData( name.torstr().cstr_t(),"rb",(ssize_t*)&size); if(pbuf==null||size<=0) { return rstr(); } rstr ret=rstr(pbuf,size); delete[] pbuf; return r_move(ret); } #else static rstr get_file_data(tsh& sh,const rstrw& name) { if(sh.m_is_pack_read) { for(int i=0;i int(0).toint // "abc"+a -> rstr("abc")+a zsrep::const_replace(sh,tfi.vsent); //找到直接定义的局部变量 zsrep::local_var_replace(sh,tfi); int tid=0; //函数指针常量替换 zsrep::fpoint_replace(sh,tfi); //sizeof s_off替换成0,稍后处理 if(!zsrep::size_off_to_zero(sh,tfi)) return false; //进行类型推断 if(!proc_type_infer(sh,tfi,env)) return false; if(!zsrep::typeof_replace(sh,tfi,env)) return false; //变量构造函数替换如a(1) -> int.int(a,1) //这个变量必须是已定义的,不能是类型推断 if(!zsrep::var_struct_replace(sh,tfi)) return false; //表达式标准化 if(!zexp::p_exp_all(sh,tfi,env)) { return false; } //临时变量替换,替换后有些表达式类型会变空 if(!replace_temp_var(sh,tfi,tid)) return false; ifn(tfi.sdynamic.empty()) { tdata tdi; tdi.type=rppkey(c_int); tdi.name="_EBP"; tfi.local+=tdi; tsent sent; sent.pos=tfi.first_pos; sent.vword.push(tword("mov"));//tword没有设置pos sent.vword.push(tword("_EBP")); sent.vword.push(tword(",")); sent.vword.push(tword("ebp")); tfi.vsent.push_front(r_move(sent)); } if(env.ptfi!=null) { tsent sent; sent.pos=tfi.first_pos; sent.vword.push(tword("mov"));//tword没有设置pos sent.vword.push(tword("_PENV")); sent.vword.push(tword(",")); sent.vword.push(tword(rstr(env.v_ebp))); tfi.vsent.push_front(r_move(sent)); } //获取局部变量偏移 obtain_local_off(sh,tfi.local); obtain_param_off(tfi); //增加局部变量和成员变量的构造和析构 zadd::add_local_and_memb(sh,tfi); //增加全局变量初始化汇编 add_main_init_asm(sh,tfi); zlambda::lambda_add_init_asm(sh,tfi); //sizeof s_off替换成实际值 if(!zsrep::size_off_to_zero(sh,tfi)) return false; if(!zsrep::size_off_replace(sh,tfi)) return false; //汇编语句常量求值 if(!asm_const_eval(sh,tfi)) return false; if(!zmac::replace(sh,*tfi.ptci,tfi.vword)) return false; //成员变量里有sizeof s_off的情况需要再次替换 //注意成员变量初始化的时候不能使用临时变量 //再处理一次,获取所有表达式的类型 if(!zexp::p_exp_all(sh,tfi,tenv())) return false; return true; } static rbool macro_replace(tsh& sh,tfunc& tfi) { rbuf& v=tfi.vword; for(int i=0;i&,int))(ptfi->code))(v,i); } } zpre::arrange(v); return true; } static void add_class(tsh& sh,tfunc& tfi,tenv env) { rstr name="_func_class_"+env.ptfi->name_dec; if(!zfind::is_class(sh,name)) { tclass item; item.name=name; for(int i=0;ilocal.count();i++) { item.vdata.push(env.ptfi->local[i]); } for(int i=0;iparam.count();i++) { item.vdata.push(env.ptfi->param[i]); } sh.m_class.insert(item); } tdata tdi; tdi.type=name+"&"; tdi.name=rppkey(c_penv); tdi.size=4; tdi.count=1; tfi.local.push(tdi); } //增加全局变量引用的初始化汇编语句 static void add_main_init_asm(tsh& sh,tfunc& tfi) { if(tfi.name!="main") { int i; for(i=0;i=tfi.local.count()) { return; } } tsent sent; sent.pos=tfi.first_pos; sent.vword.push(tword("mov"));//tword没有设置pos sent.vword.push(tword(rppkey(c_pmain))); sent.vword.push(tword(",")); if(sh.m_mode==tsh::c_rvm||sh.m_mode==tsh::c_jit) { sent.vword.push(tword(rstr((uint)sh.m_main_data.begin()))); } else { sent.vword.push(tword("_PMAIN_A")); } tfi.vsent.push_front(r_move(sent)); } //全局变量和成员变量都不能使用类型推断 //全局变量必须用g_开头 static void add_main_quote(tsh& sh,tfunc& tfi) { ifn(tfi.ptci->name==rppkey(c_main)&&tfi.name==rppkey(c_main)) { int i; for(i=0;i=tfi.vword.count()) { return; } } tdata tdi; tdi.type="main&"; tdi.name=rppkey(c_pmain); tdi.size=4; tdi.count=1; tfi.local.push(tdi); } static rbool asm_const_eval(tsh& sh,tfunc& tfi) { for(int i=0;i& local) { int off=c_point_size; for(int i=0;i=3&& sent.vword[1].val==rppoptr(c_equal)&& sent.vword[0].is_name()) { //处理类型推断 rstr name=sent.vword[0].val; if(null!=zfind::local_search(tfi,name)) return true; if(env.ptfi!=null&&null!=zfind::local_search(*env.ptfi,name)) { return true; } if(null!=zfind::data_member_search(tci,name)) return true; if(null!=zfind::data_member_search(*sh.m_main,name)) return true; tsent temp=sent.sub(2,sent.vword.count()); if(!zsrep::typeof_replace(sh,tfi,temp,env)) { return false; } if(!zexp::p_exp(sh,temp,tfi,0,env)) return false; tdata tdi; tdi.name=name; tdi.type=sh.get_tname(temp.type);//引用推断为对象 tfi.local.push(tdi); rbuf vtemp; zadd::add_destructor_func(sh,tdi,vtemp); zadd::add_structor_func(sh,tdi,vtemp); vtemp+=r_move(sent.vword); sent.vword=r_move(vtemp); } return true; } static rbool replace_temp_var_v(tsh& sh,tfunc& tfi,rbuf& v,int& tid) { rbuf result; for(int i=1;i=v.count()) { return false; } tdata tdi; tdi.type=ptci->name; tdi.name=rppkey(c_temp)+rstr(tid); tid++; //先析构后构造 zadd::add_destructor_func(sh,tdi,result); result+=rppoptr(c_mbk_l); result+=tdi.type; result+=rppoptr(c_comma); result+=tdi.type; result+=rppoptr(c_comma); result+=rppoptr(c_mbk_l); result+=tdi.name; rbuf vparam=v.sub(left+6,right-1); ifn(vparam.empty()) { result+=rppoptr(c_comma); result+=vparam; } result+=rppoptr(c_mbk_r); result+=rppoptr(c_mbk_r); result+=rppoptr(c_semi); tfi.local.push(tdi); for(int j=left;j<=right;j++) { v[j].clear(); } v[left].val=tdi.name; i=right; } zpre::arrange(v); result+=r_move(v); v=r_move(result); return true; } static rbool replace_temp_var(tsh& sh,tfunc& tfi,int& tid) { for(int i=0;i& v=sent.vword; for(int i=0;i=v.count()) { sh.error(sent,"miss )"); return false; } tsent dst; dst.pos=sent.pos; dst.vword=v.sub(left+1,right); if(dst.vword.count()==1&&zfind::is_class(sh,dst.vword[0].val)) { dst.type=dst.vword[0].val; } else { if(!zexp::p_exp(sh,dst,tfi,0,env)) { return false; } } sh.clear_word_val(v,i,right+1); v[i].val=zsuper::add_quote(dst.type); } zpre::arrange(v); return true; } static void fpoint_replace(tsh& sh,tfunc& tfi) { for(int i=0;i& v) { for(int i=0;i=v.count()) { continue; } rbuf vsent; sh.split_param(vsent,v.sub(left+1,right)); rbuf vtype; for(int j=0;j& vsent) { for(int i=0;i& v) { for(int i=0;i& vsent) { for(int i=0;i& v) { for(int i=0;i& v) { for(int i=0;i=v.count()) { return false; } if(v.get(i+1).val!=rppoptr(c_sbk_l)) { v[i].multi.push(v[i].val); v[i].multi.push(v.get(i+1).val); v[i+1].clear(); v[i].val=rstr("0"); i++; } else { int right=sh.find_symm_sbk(v,i+1); if(right>=v.count()) return false; v[i].multi.push(v[i].val); v[i].multi+=sh.vword_to_vstr(v.sub(i+2,right)); sh.clear_word_val(v,i+1,right+1); v[i].val=rstr("0"); i=right; } } zpre::arrange(v); return true; } static rbool size_off_replace(tsh& sh,tfunc& tfi) { for(int i=0;i& v,tfunc& tfi) { for(int i=0;isize); } } elif(v[i].multi[0]==rppkey(c_s_off)) { tdata* ptdi=zfind::local_search(tfi,name); if(null==ptdi) return false; v[i].val=rstr(ptdi->off); } else continue; v[i].multi.clear(); } ifn(sh.m_key.is_asm_ins(v.get_bottom().val)) { return true; } for(int i=1;i vdst; if(v.get(i-1).val==rppoptr(c_addr)) { vdst.push(rstr("ebp")); vdst.push(rstr("+")); vdst.push(rstr(ptdi->off)); v[i-1].clear(); } else { vdst.push(rstr(rppoptr(c_mbk_l))); vdst.push(rstr("ebp")); vdst.push(rstr("+")); vdst.push(rstr(ptdi->off)); vdst.push(rstr(rppoptr(c_mbk_r))); } v[i].clear(); v[i].multi=r_move(vdst); } zpre::arrange(v); return true; } static rbool local_var_replace(tsh& sh,tfunc& tfi) { for(int i=0;i& v,tfunc& tfi) { if(v.count()<2|| !zfind::is_class_t(sh,v.get(0).val)|| !v.get(1).is_name()) return true; tdata tdi; if(!zmemb::a_data_define(sh,tdi,v)) return false; v[0].val.clear(); if(v.count()==2) v[1].val.clear();//清除未初始化的变量定义 //如int a(1)这样的定义千万不能重复调用构造函数 rbool bstruct=v.count()>2&&v[2].val==rppoptr(c_sbk_l); zpre::arrange(v); //排除重复定义的 tdata* ptdi=zfind::local_search(tfi,tdi.name); if(null==ptdi) tfi.local.push(tdi); else { if(ptdi->type!=tdi.type) { sh.error(v.get(0),"diff type local var redefined"); return false; } } rbuf vtemp; zadd::add_destructor_func(sh,tdi,vtemp); if(!bstruct) zadd::add_structor_func(sh,tdi,vtemp); vtemp+=r_move(v); v=r_move(vtemp); return true; } static rbool var_struct_replace(tsh& sh,tfunc& tfi) { for(int i=0;i& v,tfunc& tfi) { //暂时只处理a(1),忽略this.a(1) int left=1; if(v.get(left).val!=rppoptr(c_sbk_l)) return true; tdata* ptdi=zfind::local_search(tfi,v.get(0).val); if(ptdi==null) return true; if(sh.is_quote(ptdi->type)) return true; int right=sh.find_symm_sbk(v,left); if(right>=v.count()) { return false; } if(right!=v.count()-1) return true; //动态类型和构造函数有歧义 rbuf vtemp; vtemp.push(tword(ptdi->type)); vtemp.push(tword(rppoptr(c_dot))); vtemp.push(tword(ptdi->type)); vtemp.push(tword(rppoptr(c_sbk_l))); vtemp+=v.sub(0,left); rbuf vsub=v.sub(left+1,right); if(!vsub.empty()) { vtemp.push(tword(rppoptr(c_comma))); vtemp+=vsub; } vtemp.push(tword(rppoptr(c_sbk_r))); v=r_move(vtemp); return true; } }; #endif ================================================ FILE: rpp/zsuper.h ================================================ #ifndef zsuper_h__ #define zsuper_h__ #include "tsh.h" //超级宏 struct zsuper { static rbool add_super_mac(tsh& sh,rbuf& v,int& i,rset& vmac) { tmac mitem; mitem.is_super=true; mitem.name=v.get(i+2).val; int left=i+3; int right=left; for(;right=v.count()) { sh.error(v.get(i),"miss mac"); return false; } if(v[right]!=rppoptr(c_bbk_l)) { sh.error(v.get(i),"miss mac $ {"); return false; } mitem.param=sh.vword_to_vstr(v.sub(left,right)); left=right; right=sh.find_symm_bbk(v,left); if(right>=v.count()) { sh.error(v.get(i),"miss mac $ }"); return false; } mitem.vstr=sh.vword_to_vstr(v.sub(left+1,right)); if(vmac.exist(mitem)) { vmac.erase(mitem); /*sh.error(v.get_bottom(),"mac redefined"); return false;*/ } vmac.insert(mitem); i=right; return true; } static rbool replace_item(tsh& sh,rbuf& v,int& i,tmac& mitem) { for(int j=i+2;j<=v.count();j++) { rbuf arr; rbuf src=sh.vword_to_vstr(v.sub(i+1,j)); if(match_here(sh,mitem.param,src,arr)) { ifn(replace_super_word(v[i],mitem.vstr,arr)) { sh.error(v.get(i)); return false; } sh.clear_word_val(v,i,j); i=j-1; break; } } return true; } //todo 限制递归深度 static rbool match_here(tsh& sh,const rbuf& reg, const rbuf& src,rbuf& arr) { if(reg.empty()) { return src.empty(); } if(reg[0]=="_mword") { return match_multi(sh,reg.sub(1),src,arr); } if(!src.empty()) { if(reg[0]=="_word") { tword temp; temp.multi+=src[0]; arr.push_move(temp); if(match_here(sh,reg.sub(1),src.sub(1),arr)) { return true; } arr.pop(); return false; } if(reg[0]!=src[0]) { return false; } if(src[0]==rppoptr(c_sbk_l)) { int right_r=sh.find_symm_sbk(reg,0); if(right_r>=reg.count()) { return false; } int right_s=sh.find_symm_sbk(src,0); if(right_s>=src.count()) { return false; } return match_here(sh,reg.sub(1,right_r), src.sub(1,right_s),arr)&& match_here(sh,reg.sub(right_r+1), src.sub(right_s+1),arr); } return match_here(sh,reg.sub(1),src.sub(1),arr); } return false; } static rbool match_multi(tsh& sh,const rbuf& reg, const rbuf& src,rbuf& arr) { for(int i=0;i<=src.count();i++) { tword temp; temp.multi=src.sub(0,i); arr.push_move(temp); if(match_here(sh,reg,src.sub(i),arr)) { return true; } else { arr.pop(); } } return false; } static rbool replace_super_word(tword& word,rbuf& vstr,rbuf& arr) { word.val.clear(); for(int i=0;i=arr.count()) { return false; } if(vstr.get(i+2)=="=>"&&vstr.get(i+3).is_number()) { int index=vstr.get(i+3).toint(); if(index>=arr[num].multi.count()) { return false; } word.multi+=arr[num].multi[index]; i+=3; } else { word.multi+=arr[num].multi; i++; } } else { word.multi+=vstr[i]; } } link_sharp(word.multi); return true; } static rstr del_quote(rstr s) { if(s.get_bottom()=='"') { return s.sub(1,s.count()-1); } return r_move(s); } static rstr add_quote(const rstr& s) { //return "\""+s+"\""; rstr result; result+='"'; for(int i=0;i& v) { for(int i=0;i& v) { rbuf dst; rbool ret=false; for(int i=0;i