diff --git a/Net.xcodeproj/project.pbxproj b/Net.xcodeproj/project.pbxproj index 597459f..94d5891 100644 --- a/Net.xcodeproj/project.pbxproj +++ b/Net.xcodeproj/project.pbxproj @@ -20,6 +20,8 @@ 92C34C272205C63A00AB38D3 /* server.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9277A15821FD725F009C5F11 /* server.cpp */; }; 92C34C282205C94600AB38D3 /* addr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9277A15221FD725F009C5F11 /* addr.cpp */; }; 92C34C292205C95F00AB38D3 /* socket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9277A15321FD725F009C5F11 /* socket.cpp */; }; + 92C34C37220747A200AB38D3 /* sha1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92C34C36220747A200AB38D3 /* sha1.cpp */; }; + 92C34C3B22074B6500AB38D3 /* rsa.c in Sources */ = {isa = PBXBuildFile; fileRef = 92C34C3A22074B6500AB38D3 /* rsa.c */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -63,6 +65,10 @@ 9277A18D22007758009C5F11 /* sql.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sql.h; path = include/sql.h; sourceTree = ""; }; 9277A18E220077CC009C5F11 /* cproj.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cproj.h; path = include/cproj.h; sourceTree = ""; }; 9277A18F220079DB009C5F11 /* cproj_proj.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = cproj_proj.cpp; path = src/cproj_proj.cpp; sourceTree = ""; }; + 92C34C36220747A200AB38D3 /* sha1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sha1.cpp; path = src/sha1.cpp; sourceTree = ""; }; + 92C34C38220747B300AB38D3 /* sha1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sha1.h; path = include/sha1.h; sourceTree = ""; }; + 92C34C3922074B5B00AB38D3 /* rsa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rsa.h; path = include/rsa.h; sourceTree = ""; }; + 92C34C3A22074B6500AB38D3 /* rsa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rsa.c; path = src/rsa.c; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -106,11 +112,13 @@ 925A13AA21EC989500CBD427 /* include */ = { isa = PBXGroup; children = ( + 92C34C3922074B5B00AB38D3 /* rsa.h */, 9277A18E220077CC009C5F11 /* cproj.h */, 9277A18D22007758009C5F11 /* sql.h */, 9277A14C21FD7246009C5F11 /* clock.h */, 9277A14621FD7246009C5F11 /* cmap.h */, 9277A14921FD7246009C5F11 /* compute.h */, + 92C34C38220747B300AB38D3 /* sha1.h */, 9277A14B21FD7246009C5F11 /* cpart.h */, 9277A14A21FD7246009C5F11 /* cthread.h */, 9277A14D21FD7246009C5F11 /* md5.h */, @@ -126,11 +134,13 @@ 9277A15121FD724C009C5F11 /* src */ = { isa = PBXGroup; children = ( + 92C34C3A22074B6500AB38D3 /* rsa.c */, 9277A15221FD725F009C5F11 /* addr.cpp */, 9277A15C21FD725F009C5F11 /* clock.cpp */, 9277A15921FD725F009C5F11 /* cmap.cpp */, 9277A15A21FD725F009C5F11 /* cpart.cpp */, 9277A15521FD725F009C5F11 /* cproj_cpt.cpp */, + 92C34C36220747A200AB38D3 /* sha1.cpp */, 9277A15721FD725F009C5F11 /* cthread.cpp */, 9277A15621FD725F009C5F11 /* main.cpp */, 9277A15421FD725F009C5F11 /* md5.cpp */, @@ -213,7 +223,9 @@ 9277A16621FD725F009C5F11 /* cpart.cpp in Sources */, 9277A16121FD725F009C5F11 /* cproj_cpt.cpp in Sources */, 9277A190220079DB009C5F11 /* cproj_proj.cpp in Sources */, + 92C34C37220747A200AB38D3 /* sha1.cpp in Sources */, 9277A16021FD725F009C5F11 /* md5.cpp in Sources */, + 92C34C3B22074B6500AB38D3 /* rsa.c in Sources */, 9277A16521FD725F009C5F11 /* cmap.cpp in Sources */, 9277A16221FD725F009C5F11 /* main.cpp in Sources */, 92C34C272205C63A00AB38D3 /* server.cpp in Sources */, diff --git a/data/primes.txt b/data/primes.txt new file mode 100755 index 0000000..60fc250 --- /dev/null +++ b/data/primes.txt @@ -0,0 +1,8771 @@ +10007 +10009 +10037 +10039 +10061 +10067 +10069 +10079 +10091 +10093 +10099 +10103 +10111 +10133 +10139 +10141 +10151 +10159 +10163 +10169 +10177 +10181 +10193 +10211 +10223 +10243 +10247 +10253 +10259 +10267 +10271 +10273 +10289 +10301 +10303 +10313 +10321 +10331 +10333 +10337 +10343 +10357 +10369 +10391 +10399 +10427 +10429 +10433 +10453 +10457 +10459 +10463 +10477 +10487 +10499 +10501 +10513 +10529 +10531 +10559 +10567 +10589 +10597 +10601 +10607 +10613 +10627 +10631 +10639 +10651 +10657 +10663 +10667 +10687 +10691 +10709 +10711 +10723 +10729 +10733 +10739 +10753 +10771 +10781 +10789 +10799 +10831 +10837 +10847 +10853 +10859 +10861 +10867 +10883 +10889 +10891 +10903 +10909 +10937 +10939 +10949 +10957 +10973 +10979 +10987 +10993 +11003 +11027 +11047 +11057 +11059 +11069 +11071 +11083 +11087 +11093 +11113 +11117 +11119 +11131 +11149 +11159 +11161 +11171 +11173 +11177 +11197 +11213 +11239 +11243 +11251 +11257 +11261 +11273 +11279 +11287 +11299 +11311 +11317 +11321 +11329 +11351 +11353 +11369 +11383 +11393 +11399 +11411 +11423 +11437 +11443 +11447 +11467 +11471 +11483 +11489 +11491 +11497 +11503 +11519 +11527 +11549 +11551 +11579 +11587 +11593 +11597 +11617 +11621 +11633 +11657 +11677 +11681 +11689 +11699 +11701 +11717 +11719 +11731 +11743 +11777 +11779 +11783 +11789 +11801 +11807 +11813 +11821 +11827 +11831 +11833 +11839 +11863 +11867 +11887 +11897 +11903 +11909 +11923 +11927 +11933 +11939 +11941 +11953 +11959 +11969 +11971 +11981 +11987 +12007 +12011 +12037 +12041 +12043 +12049 +12071 +12073 +12097 +12101 +12107 +12109 +12113 +12119 +12143 +12149 +12157 +12161 +12163 +12197 +12203 +12211 +12227 +12239 +12241 +12251 +12253 +12263 +12269 +12277 +12281 +12289 +12301 +12323 +12329 +12343 +12347 +12373 +12377 +12379 +12391 +12401 +12409 +12413 +12421 +12433 +12437 +12451 +12457 +12473 +12479 +12487 +12491 +12497 +12503 +12511 +12517 +12527 +12539 +12541 +12547 +12553 +12569 +12577 +12583 +12589 +12601 +12611 +12613 +12619 +12637 +12641 +12647 +12653 +12659 +12671 +12689 +12697 +12703 +12713 +12721 +12739 +12743 +12757 +12763 +12781 +12791 +12799 +12809 +12821 +12823 +12829 +12841 +12853 +12889 +12893 +12899 +12907 +12911 +12917 +12919 +12923 +12941 +12953 +12959 +12967 +12973 +12979 +12983 +13001 +13003 +13007 +13009 +13033 +13037 +13043 +13049 +13063 +13093 +13099 +13103 +13109 +13121 +13127 +13147 +13151 +13159 +13163 +13171 +13177 +13183 +13187 +13217 +13219 +13229 +13241 +13249 +13259 +13267 +13291 +13297 +13309 +13313 +13327 +13331 +13337 +13339 +13367 +13381 +13397 +13399 +13411 +13417 +13421 +13441 +13451 +13457 +13463 +13469 +13477 +13487 +13499 +13513 +13523 +13537 +13553 +13567 +13577 +13591 +13597 +13613 +13619 +13627 +13633 +13649 +13669 +13679 +13681 +13687 +13691 +13693 +13697 +13709 +13711 +13721 +13723 +13729 +13751 +13757 +13759 +13763 +13781 +13789 +13799 +13807 +13829 +13831 +13841 +13859 +13873 +13877 +13879 +13883 +13901 +13903 +13907 +13913 +13921 +13931 +13933 +13963 +13967 +13997 +13999 +14009 +14011 +14029 +14033 +14051 +14057 +14071 +14081 +14083 +14087 +14107 +14143 +14149 +14153 +14159 +14173 +14177 +14197 +14207 +14221 +14243 +14249 +14251 +14281 +14293 +14303 +14321 +14323 +14327 +14341 +14347 +14369 +14387 +14389 +14401 +14407 +14411 +14419 +14423 +14431 +14437 +14447 +14449 +14461 +14479 +14489 +14503 +14519 +14533 +14537 +14543 +14549 +14551 +14557 +14561 +14563 +14591 +14593 +14621 +14627 +14629 +14633 +14639 +14653 +14657 +14669 +14683 +14699 +14713 +14717 +14723 +14731 +14737 +14741 +14747 +14753 +14759 +14767 +14771 +14779 +14783 +14797 +14813 +14821 +14827 +14831 +14843 +14851 +14867 +14869 +14879 +14887 +14891 +14897 +14923 +14929 +14939 +14947 +14951 +14957 +14969 +14983 +15013 +15017 +15031 +15053 +15061 +15073 +15077 +15083 +15091 +15101 +15107 +15121 +15131 +15137 +15139 +15149 +15161 +15173 +15187 +15193 +15199 +15217 +15227 +15233 +15241 +15259 +15263 +15269 +15271 +15277 +15287 +15289 +15299 +15307 +15313 +15319 +15329 +15331 +15349 +15359 +15361 +15373 +15377 +15383 +15391 +15401 +15413 +15427 +15439 +15443 +15451 +15461 +15467 +15473 +15493 +15497 +15511 +15527 +15541 +15551 +15559 +15569 +15581 +15583 +15601 +15607 +15619 +15629 +15641 +15643 +15647 +15649 +15661 +15667 +15671 +15679 +15683 +15727 +15731 +15733 +15737 +15739 +15749 +15761 +15767 +15773 +15787 +15791 +15797 +15803 +15809 +15817 +15823 +15859 +15877 +15881 +15887 +15889 +15901 +15907 +15913 +15919 +15923 +15937 +15959 +15971 +15973 +15991 +16001 +16007 +16033 +16057 +16061 +16063 +16067 +16069 +16073 +16087 +16091 +16097 +16103 +16111 +16127 +16139 +16141 +16183 +16187 +16189 +16193 +16217 +16223 +16229 +16231 +16249 +16253 +16267 +16273 +16301 +16319 +16333 +16339 +16349 +16361 +16363 +16369 +16381 +16411 +16417 +16421 +16427 +16433 +16447 +16451 +16453 +16477 +16481 +16487 +16493 +16519 +16529 +16547 +16553 +16561 +16567 +16573 +16603 +16607 +16619 +16631 +16633 +16649 +16651 +16657 +16661 +16673 +16691 +16693 +16699 +16703 +16729 +16741 +16747 +16759 +16763 +16787 +16811 +16823 +16829 +16831 +16843 +16871 +16879 +16883 +16889 +16901 +16903 +16921 +16927 +16931 +16937 +16943 +16963 +16979 +16981 +16987 +16993 +17011 +17021 +17027 +17029 +17033 +17041 +17047 +17053 +17077 +17093 +17099 +17107 +17117 +17123 +17137 +17159 +17167 +17183 +17189 +17191 +17203 +17207 +17209 +17231 +17239 +17257 +17291 +17293 +17299 +17317 +17321 +17327 +17333 +17341 +17351 +17359 +17377 +17383 +17387 +17389 +17393 +17401 +17417 +17419 +17431 +17443 +17449 +17467 +17471 +17477 +17483 +17489 +17491 +17497 +17509 +17519 +17539 +17551 +17569 +17573 +17579 +17581 +17597 +17599 +17609 +17623 +17627 +17657 +17659 +17669 +17681 +17683 +17707 +17713 +17729 +17737 +17747 +17749 +17761 +17783 +17789 +17791 +17807 +17827 +17837 +17839 +17851 +17863 +17881 +17891 +17903 +17909 +17911 +17921 +17923 +17929 +17939 +17957 +17959 +17971 +17977 +17981 +17987 +17989 +18013 +18041 +18043 +18047 +18049 +18059 +18061 +18077 +18089 +18097 +18119 +18121 +18127 +18131 +18133 +18143 +18149 +18169 +18181 +18191 +18199 +18211 +18217 +18223 +18229 +18233 +18251 +18253 +18257 +18269 +18287 +18289 +18301 +18307 +18311 +18313 +18329 +18341 +18353 +18367 +18371 +18379 +18397 +18401 +18413 +18427 +18433 +18439 +18443 +18451 +18457 +18461 +18481 +18493 +18503 +18517 +18521 +18523 +18539 +18541 +18553 +18583 +18587 +18593 +18617 +18637 +18661 +18671 +18679 +18691 +18701 +18713 +18719 +18731 +18743 +18749 +18757 +18773 +18787 +18793 +18797 +18803 +18839 +18859 +18869 +18899 +18911 +18913 +18917 +18919 +18947 +18959 +18973 +18979 +19001 +19009 +19013 +19031 +19037 +19051 +19069 +19073 +19079 +19081 +19087 +19121 +19139 +19141 +19157 +19163 +19181 +19183 +19207 +19211 +19213 +19219 +19231 +19237 +19249 +19259 +19267 +19273 +19289 +19301 +19309 +19319 +19333 +19373 +19379 +19381 +19387 +19391 +19403 +19417 +19421 +19423 +19427 +19429 +19433 +19441 +19447 +19457 +19463 +19469 +19471 +19477 +19483 +19489 +19501 +19507 +19531 +19541 +19543 +19553 +19559 +19571 +19577 +19583 +19597 +19603 +19609 +19661 +19681 +19687 +19697 +19699 +19709 +19717 +19727 +19739 +19751 +19753 +19759 +19763 +19777 +19793 +19801 +19813 +19819 +19841 +19843 +19853 +19861 +19867 +19889 +19891 +19913 +19919 +19927 +19937 +19949 +19961 +19963 +19973 +19979 +19991 +19993 +19997 +20011 +20021 +20023 +20029 +20047 +20051 +20063 +20071 +20089 +20101 +20107 +20113 +20117 +20123 +20129 +20143 +20147 +20149 +20161 +20173 +20177 +20183 +20201 +20219 +20231 +20233 +20249 +20261 +20269 +20287 +20297 +20323 +20327 +20333 +20341 +20347 +20353 +20357 +20359 +20369 +20389 +20393 +20399 +20407 +20411 +20431 +20441 +20443 +20477 +20479 +20483 +20507 +20509 +20521 +20533 +20543 +20549 +20551 +20563 +20593 +20599 +20611 +20627 +20639 +20641 +20663 +20681 +20693 +20707 +20717 +20719 +20731 +20743 +20747 +20749 +20753 +20759 +20771 +20773 +20789 +20807 +20809 +20849 +20857 +20873 +20879 +20887 +20897 +20899 +20903 +20921 +20929 +20939 +20947 +20959 +20963 +20981 +20983 +21001 +21011 +21013 +21017 +21019 +21023 +21031 +21059 +21061 +21067 +21089 +21101 +21107 +21121 +21139 +21143 +21149 +21157 +21163 +21169 +21179 +21187 +21191 +21193 +21211 +21221 +21227 +21247 +21269 +21277 +21283 +21313 +21317 +21319 +21323 +21341 +21347 +21377 +21379 +21383 +21391 +21397 +21401 +21407 +21419 +21433 +21467 +21481 +21487 +21491 +21493 +21499 +21503 +21517 +21521 +21523 +21529 +21557 +21559 +21563 +21569 +21577 +21587 +21589 +21599 +21601 +21611 +21613 +21617 +21647 +21649 +21661 +21673 +21683 +21701 +21713 +21727 +21737 +21739 +21751 +21757 +21767 +21773 +21787 +21799 +21803 +21817 +21821 +21839 +21841 +21851 +21859 +21863 +21871 +21881 +21893 +21911 +21929 +21937 +21943 +21961 +21977 +21991 +21997 +22003 +22013 +22027 +22031 +22037 +22039 +22051 +22063 +22067 +22073 +22079 +22091 +22093 +22109 +22111 +22123 +22129 +22133 +22147 +22153 +22157 +22159 +22171 +22189 +22193 +22229 +22247 +22259 +22271 +22273 +22277 +22279 +22283 +22291 +22303 +22307 +22343 +22349 +22367 +22369 +22381 +22391 +22397 +22409 +22433 +22441 +22447 +22453 +22469 +22481 +22483 +22501 +22511 +22531 +22541 +22543 +22549 +22567 +22571 +22573 +22613 +22619 +22621 +22637 +22639 +22643 +22651 +22669 +22679 +22691 +22697 +22699 +22709 +22717 +22721 +22727 +22739 +22741 +22751 +22769 +22777 +22783 +22787 +22807 +22811 +22817 +22853 +22859 +22861 +22871 +22877 +22901 +22907 +22921 +22937 +22943 +22961 +22963 +22973 +22993 +23003 +23011 +23017 +23021 +23027 +23029 +23039 +23041 +23053 +23057 +23059 +23063 +23071 +23081 +23087 +23099 +23117 +23131 +23143 +23159 +23167 +23173 +23189 +23197 +23201 +23203 +23209 +23227 +23251 +23269 +23279 +23291 +23293 +23297 +23311 +23321 +23327 +23333 +23339 +23357 +23369 +23371 +23399 +23417 +23431 +23447 +23459 +23473 +23497 +23509 +23531 +23537 +23539 +23549 +23557 +23561 +23563 +23567 +23581 +23593 +23599 +23603 +23609 +23623 +23627 +23629 +23633 +23663 +23669 +23671 +23677 +23687 +23689 +23719 +23741 +23743 +23747 +23753 +23761 +23767 +23773 +23789 +23801 +23813 +23819 +23827 +23831 +23833 +23857 +23869 +23873 +23879 +23887 +23893 +23899 +23909 +23911 +23917 +23929 +23957 +23971 +23977 +23981 +23993 +24001 +24007 +24019 +24023 +24029 +24043 +24049 +24061 +24071 +24077 +24083 +24091 +24097 +24103 +24107 +24109 +24113 +24121 +24133 +24137 +24151 +24169 +24179 +24181 +24197 +24203 +24223 +24229 +24239 +24247 +24251 +24281 +24317 +24329 +24337 +24359 +24371 +24373 +24379 +24391 +24407 +24413 +24419 +24421 +24439 +24443 +24469 +24473 +24481 +24499 +24509 +24517 +24527 +24533 +24547 +24551 +24571 +24593 +24611 +24623 +24631 +24659 +24671 +24677 +24683 +24691 +24697 +24709 +24733 +24749 +24763 +24767 +24781 +24793 +24799 +24809 +24821 +24841 +24847 +24851 +24859 +24877 +24889 +24907 +24917 +24919 +24923 +24943 +24953 +24967 +24971 +24977 +24979 +24989 +25013 +25031 +25033 +25037 +25057 +25073 +25087 +25097 +25111 +25117 +25121 +25127 +25147 +25153 +25163 +25169 +25171 +25183 +25189 +25219 +25229 +25237 +25243 +25247 +25253 +25261 +25301 +25303 +25307 +25309 +25321 +25339 +25343 +25349 +25357 +25367 +25373 +25391 +25409 +25411 +25423 +25439 +25447 +25453 +25457 +25463 +25469 +25471 +25523 +25537 +25541 +25561 +25577 +25579 +25583 +25589 +25601 +25603 +25609 +25621 +25633 +25639 +25643 +25657 +25667 +25673 +25679 +25693 +25703 +25717 +25733 +25741 +25747 +25759 +25763 +25771 +25793 +25799 +25801 +25819 +25841 +25847 +25849 +25867 +25873 +25889 +25903 +25913 +25919 +25931 +25933 +25939 +25943 +25951 +25969 +25981 +25997 +25999 +26003 +26017 +26021 +26029 +26041 +26053 +26083 +26099 +26107 +26111 +26113 +26119 +26141 +26153 +26161 +26171 +26177 +26183 +26189 +26203 +26209 +26227 +26237 +26249 +26251 +26261 +26263 +26267 +26293 +26297 +26309 +26317 +26321 +26339 +26347 +26357 +26371 +26387 +26393 +26399 +26407 +26417 +26423 +26431 +26437 +26449 +26459 +26479 +26489 +26497 +26501 +26513 +26539 +26557 +26561 +26573 +26591 +26597 +26627 +26633 +26641 +26647 +26669 +26681 +26683 +26687 +26693 +26699 +26701 +26711 +26713 +26717 +26723 +26729 +26731 +26737 +26759 +26777 +26783 +26801 +26813 +26821 +26833 +26839 +26849 +26861 +26863 +26879 +26881 +26891 +26893 +26903 +26921 +26927 +26947 +26951 +26953 +26959 +26981 +26987 +26993 +27011 +27017 +27031 +27043 +27059 +27061 +27067 +27073 +27077 +27091 +27103 +27107 +27109 +27127 +27143 +27179 +27191 +27197 +27211 +27239 +27241 +27253 +27259 +27271 +27277 +27281 +27283 +27299 +27329 +27337 +27361 +27367 +27397 +27407 +27409 +27427 +27431 +27437 +27449 +27457 +27479 +27481 +27487 +27509 +27527 +27529 +27539 +27541 +27551 +27581 +27583 +27611 +27617 +27631 +27647 +27653 +27673 +27689 +27691 +27697 +27701 +27733 +27737 +27739 +27743 +27749 +27751 +27763 +27767 +27773 +27779 +27791 +27793 +27799 +27803 +27809 +27817 +27823 +27827 +27847 +27851 +27883 +27893 +27901 +27917 +27919 +27941 +27943 +27947 +27953 +27961 +27967 +27983 +27997 +28001 +28019 +28027 +28031 +28051 +28057 +28069 +28081 +28087 +28097 +28099 +28109 +28111 +28123 +28151 +28163 +28181 +28183 +28201 +28211 +28219 +28229 +28277 +28279 +28283 +28289 +28297 +28307 +28309 +28319 +28349 +28351 +28387 +28393 +28403 +28409 +28411 +28429 +28433 +28439 +28447 +28463 +28477 +28493 +28499 +28513 +28517 +28537 +28541 +28547 +28549 +28559 +28571 +28573 +28579 +28591 +28597 +28603 +28607 +28619 +28621 +28627 +28631 +28643 +28649 +28657 +28661 +28663 +28669 +28687 +28697 +28703 +28711 +28723 +28729 +28751 +28753 +28759 +28771 +28789 +28793 +28807 +28813 +28817 +28837 +28843 +28859 +28867 +28871 +28879 +28901 +28909 +28921 +28927 +28933 +28949 +28961 +28979 +29009 +29017 +29021 +29023 +29027 +29033 +29059 +29063 +29077 +29101 +29123 +29129 +29131 +29137 +29147 +29153 +29167 +29173 +29179 +29191 +29201 +29207 +29209 +29221 +29231 +29243 +29251 +29269 +29287 +29297 +29303 +29311 +29327 +29333 +29339 +29347 +29363 +29383 +29387 +29389 +29399 +29401 +29411 +29423 +29429 +29437 +29443 +29453 +29473 +29483 +29501 +29527 +29531 +29537 +29567 +29569 +29573 +29581 +29587 +29599 +29611 +29629 +29633 +29641 +29663 +29669 +29671 +29683 +29717 +29723 +29741 +29753 +29759 +29761 +29789 +29803 +29819 +29833 +29837 +29851 +29863 +29867 +29873 +29879 +29881 +29917 +29921 +29927 +29947 +29959 +29983 +29989 +30011 +30013 +30029 +30047 +30059 +30071 +30089 +30091 +30097 +30103 +30109 +30113 +30119 +30133 +30137 +30139 +30161 +30169 +30181 +30187 +30197 +30203 +30211 +30223 +30241 +30253 +30259 +30269 +30271 +30293 +30307 +30313 +30319 +30323 +30341 +30347 +30367 +30389 +30391 +30403 +30427 +30431 +30449 +30467 +30469 +30491 +30493 +30497 +30509 +30517 +30529 +30539 +30553 +30557 +30559 +30577 +30593 +30631 +30637 +30643 +30649 +30661 +30671 +30677 +30689 +30697 +30703 +30707 +30713 +30727 +30757 +30763 +30773 +30781 +30803 +30809 +30817 +30829 +30839 +30841 +30851 +30853 +30859 +30869 +30871 +30881 +30893 +30911 +30931 +30937 +30941 +30949 +30971 +30977 +30983 +31013 +31019 +31033 +31039 +31051 +31063 +31069 +31079 +31081 +31091 +31121 +31123 +31139 +31147 +31151 +31153 +31159 +31177 +31181 +31183 +31189 +31193 +31219 +31223 +31231 +31237 +31247 +31249 +31253 +31259 +31267 +31271 +31277 +31307 +31319 +31321 +31327 +31333 +31337 +31357 +31379 +31387 +31391 +31393 +31397 +31469 +31477 +31481 +31489 +31511 +31513 +31517 +31531 +31541 +31543 +31547 +31567 +31573 +31583 +31601 +31607 +31627 +31643 +31649 +31657 +31663 +31667 +31687 +31699 +31721 +31723 +31727 +31729 +31741 +31751 +31769 +31771 +31793 +31799 +31817 +31847 +31849 +31859 +31873 +31883 +31891 +31907 +31957 +31963 +31973 +31981 +31991 +32003 +32009 +32027 +32029 +32051 +32057 +32059 +32063 +32069 +32077 +32083 +32089 +32099 +32117 +32119 +32141 +32143 +32159 +32173 +32183 +32189 +32191 +32203 +32213 +32233 +32237 +32251 +32257 +32261 +32297 +32299 +32303 +32309 +32321 +32323 +32327 +32341 +32353 +32359 +32363 +32369 +32371 +32377 +32381 +32401 +32411 +32413 +32423 +32429 +32441 +32443 +32467 +32479 +32491 +32497 +32503 +32507 +32531 +32533 +32537 +32561 +32563 +32569 +32573 +32579 +32587 +32603 +32609 +32611 +32621 +32633 +32647 +32653 +32687 +32693 +32707 +32713 +32717 +32719 +32749 +32771 +32779 +32783 +32789 +32797 +32801 +32803 +32831 +32833 +32839 +32843 +32869 +32887 +32909 +32911 +32917 +32933 +32939 +32941 +32957 +32969 +32971 +32983 +32987 +32993 +32999 +33013 +33023 +33029 +33037 +33049 +33053 +33071 +33073 +33083 +33091 +33107 +33113 +33119 +33149 +33151 +33161 +33179 +33181 +33191 +33199 +33203 +33211 +33223 +33247 +33287 +33289 +33301 +33311 +33317 +33329 +33331 +33343 +33347 +33349 +33353 +33359 +33377 +33391 +33403 +33409 +33413 +33427 +33457 +33461 +33469 +33479 +33487 +33493 +33503 +33521 +33529 +33533 +33547 +33563 +33569 +33577 +33581 +33587 +33589 +33599 +33601 +33613 +33617 +33619 +33623 +33629 +33637 +33641 +33647 +33679 +33703 +33713 +33721 +33739 +33749 +33751 +33757 +33767 +33769 +33773 +33791 +33797 +33809 +33811 +33827 +33829 +33851 +33857 +33863 +33871 +33889 +33893 +33911 +33923 +33931 +33937 +33941 +33961 +33967 +33997 +34019 +34031 +34033 +34039 +34057 +34061 +34123 +34127 +34129 +34141 +34147 +34157 +34159 +34171 +34183 +34211 +34213 +34217 +34231 +34253 +34259 +34261 +34267 +34273 +34283 +34297 +34301 +34303 +34313 +34319 +34327 +34337 +34351 +34361 +34367 +34369 +34381 +34403 +34421 +34429 +34439 +34457 +34469 +34471 +34483 +34487 +34499 +34501 +34511 +34513 +34519 +34537 +34543 +34549 +34583 +34589 +34591 +34603 +34607 +34613 +34631 +34649 +34651 +34667 +34673 +34679 +34687 +34693 +34703 +34721 +34729 +34739 +34747 +34757 +34759 +34763 +34781 +34807 +34819 +34841 +34843 +34847 +34849 +34871 +34877 +34883 +34897 +34913 +34919 +34939 +34949 +34961 +34963 +34981 +35023 +35027 +35051 +35053 +35059 +35069 +35081 +35083 +35089 +35099 +35107 +35111 +35117 +35129 +35141 +35149 +35153 +35159 +35171 +35201 +35221 +35227 +35251 +35257 +35267 +35279 +35281 +35291 +35311 +35317 +35323 +35327 +35339 +35353 +35363 +35381 +35393 +35401 +35407 +35419 +35423 +35437 +35447 +35449 +35461 +35491 +35507 +35509 +35521 +35527 +35531 +35533 +35537 +35543 +35569 +35573 +35591 +35593 +35597 +35603 +35617 +35671 +35677 +35729 +35731 +35747 +35753 +35759 +35771 +35797 +35801 +35803 +35809 +35831 +35837 +35839 +35851 +35863 +35869 +35879 +35897 +35899 +35911 +35923 +35933 +35951 +35963 +35969 +35977 +35983 +35993 +35999 +36007 +36011 +36013 +36017 +36037 +36061 +36067 +36073 +36083 +36097 +36107 +36109 +36131 +36137 +36151 +36161 +36187 +36191 +36209 +36217 +36229 +36241 +36251 +36263 +36269 +36277 +36293 +36299 +36307 +36313 +36319 +36341 +36343 +36353 +36373 +36383 +36389 +36433 +36451 +36457 +36467 +36469 +36473 +36479 +36493 +36497 +36523 +36527 +36529 +36541 +36551 +36559 +36563 +36571 +36583 +36587 +36599 +36607 +36629 +36637 +36643 +36653 +36671 +36677 +36683 +36691 +36697 +36709 +36713 +36721 +36739 +36749 +36761 +36767 +36779 +36781 +36787 +36791 +36793 +36809 +36821 +36833 +36847 +36857 +36871 +36877 +36887 +36899 +36901 +36913 +36919 +36923 +36929 +36931 +36943 +36947 +36973 +36979 +36997 +37003 +37013 +37019 +37021 +37039 +37049 +37057 +37061 +37087 +37097 +37117 +37123 +37139 +37159 +37171 +37181 +37189 +37199 +37201 +37217 +37223 +37243 +37253 +37273 +37277 +37307 +37309 +37313 +37321 +37337 +37339 +37357 +37361 +37363 +37369 +37379 +37397 +37409 +37423 +37441 +37447 +37463 +37483 +37489 +37493 +37501 +37507 +37511 +37517 +37529 +37537 +37547 +37549 +37561 +37567 +37571 +37573 +37579 +37589 +37591 +37607 +37619 +37633 +37643 +37649 +37657 +37663 +37691 +37693 +37699 +37717 +37747 +37781 +37783 +37799 +37811 +37813 +37831 +37847 +37853 +37861 +37871 +37879 +37889 +37897 +37907 +37951 +37957 +37963 +37967 +37987 +37991 +37993 +37997 +38011 +38039 +38047 +38053 +38069 +38083 +38113 +38119 +38149 +38153 +38167 +38177 +38183 +38189 +38197 +38201 +38219 +38231 +38237 +38239 +38261 +38273 +38281 +38287 +38299 +38303 +38317 +38321 +38327 +38329 +38333 +38351 +38371 +38377 +38393 +38431 +38447 +38449 +38453 +38459 +38461 +38501 +38543 +38557 +38561 +38567 +38569 +38593 +38603 +38609 +38611 +38629 +38639 +38651 +38653 +38669 +38671 +38677 +38693 +38699 +38707 +38711 +38713 +38723 +38729 +38737 +38747 +38749 +38767 +38783 +38791 +38803 +38821 +38833 +38839 +38851 +38861 +38867 +38873 +38891 +38903 +38917 +38921 +38923 +38933 +38953 +38959 +38971 +38977 +38993 +39019 +39023 +39041 +39043 +39047 +39079 +39089 +39097 +39103 +39107 +39113 +39119 +39133 +39139 +39157 +39161 +39163 +39181 +39191 +39199 +39209 +39217 +39227 +39229 +39233 +39239 +39241 +39251 +39293 +39301 +39313 +39317 +39323 +39341 +39343 +39359 +39367 +39371 +39373 +39383 +39397 +39409 +39419 +39439 +39443 +39451 +39461 +39499 +39503 +39509 +39511 +39521 +39541 +39551 +39563 +39569 +39581 +39607 +39619 +39623 +39631 +39659 +39667 +39671 +39679 +39703 +39709 +39719 +39727 +39733 +39749 +39761 +39769 +39779 +39791 +39799 +39821 +39827 +39829 +39839 +39841 +39847 +39857 +39863 +39869 +39877 +39883 +39887 +39901 +39929 +39937 +39953 +39971 +39979 +39983 +39989 +40009 +40013 +40031 +40037 +40039 +40063 +40087 +40093 +40099 +40111 +40123 +40127 +40129 +40151 +40153 +40163 +40169 +40177 +40189 +40193 +40213 +40231 +40237 +40241 +40253 +40277 +40283 +40289 +40343 +40351 +40357 +40361 +40387 +40423 +40427 +40429 +40433 +40459 +40471 +40483 +40487 +40493 +40499 +40507 +40519 +40529 +40531 +40543 +40559 +40577 +40583 +40591 +40597 +40609 +40627 +40637 +40639 +40693 +40697 +40699 +40709 +40739 +40751 +40759 +40763 +40771 +40787 +40801 +40813 +40819 +40823 +40829 +40841 +40847 +40849 +40853 +40867 +40879 +40883 +40897 +40903 +40927 +40933 +40939 +40949 +40961 +40973 +40993 +41011 +41017 +41023 +41039 +41047 +41051 +41057 +41077 +41081 +41113 +41117 +41131 +41141 +41143 +41149 +41161 +41177 +41179 +41183 +41189 +41201 +41203 +41213 +41221 +41227 +41231 +41233 +41243 +41257 +41263 +41269 +41281 +41299 +41333 +41341 +41351 +41357 +41381 +41387 +41389 +41399 +41411 +41413 +41443 +41453 +41467 +41479 +41491 +41507 +41513 +41519 +41521 +41539 +41543 +41549 +41579 +41593 +41597 +41603 +41609 +41611 +41617 +41621 +41627 +41641 +41647 +41651 +41659 +41669 +41681 +41687 +41719 +41729 +41737 +41759 +41761 +41771 +41777 +41801 +41809 +41813 +41843 +41849 +41851 +41863 +41879 +41887 +41893 +41897 +41903 +41911 +41927 +41941 +41947 +41953 +41957 +41959 +41969 +41981 +41983 +41999 +42013 +42017 +42019 +42023 +42043 +42061 +42071 +42073 +42083 +42089 +42101 +42131 +42139 +42157 +42169 +42179 +42181 +42187 +42193 +42197 +42209 +42221 +42223 +42227 +42239 +42257 +42281 +42283 +42293 +42299 +42307 +42323 +42331 +42337 +42349 +42359 +42373 +42379 +42391 +42397 +42403 +42407 +42409 +42433 +42437 +42443 +42451 +42457 +42461 +42463 +42467 +42473 +42487 +42491 +42499 +42509 +42533 +42557 +42569 +42571 +42577 +42589 +42611 +42641 +42643 +42649 +42667 +42677 +42683 +42689 +42697 +42701 +42703 +42709 +42719 +42727 +42737 +42743 +42751 +42767 +42773 +42787 +42793 +42797 +42821 +42829 +42839 +42841 +42853 +42859 +42863 +42899 +42901 +42923 +42929 +42937 +42943 +42953 +42961 +42967 +42979 +42989 +43003 +43013 +43019 +43037 +43049 +43051 +43063 +43067 +43093 +43103 +43117 +43133 +43151 +43159 +43177 +43189 +43201 +43207 +43223 +43237 +43261 +43271 +43283 +43291 +43313 +43319 +43321 +43331 +43391 +43397 +43399 +43403 +43411 +43427 +43441 +43451 +43457 +43481 +43487 +43499 +43517 +43541 +43543 +43573 +43577 +43579 +43591 +43597 +43607 +43609 +43613 +43627 +43633 +43649 +43651 +43661 +43669 +43691 +43711 +43717 +43721 +43753 +43759 +43777 +43781 +43783 +43787 +43789 +43793 +43801 +43853 +43867 +43889 +43891 +43913 +43933 +43943 +43951 +43961 +43963 +43969 +43973 +43987 +43991 +43997 +44017 +44021 +44027 +44029 +44041 +44053 +44059 +44071 +44087 +44089 +44101 +44111 +44119 +44123 +44129 +44131 +44159 +44171 +44179 +44189 +44201 +44203 +44207 +44221 +44249 +44257 +44263 +44267 +44269 +44273 +44279 +44281 +44293 +44351 +44357 +44371 +44381 +44383 +44389 +44417 +44449 +44453 +44483 +44491 +44497 +44501 +44507 +44519 +44531 +44533 +44537 +44543 +44549 +44563 +44579 +44587 +44617 +44621 +44623 +44633 +44641 +44647 +44651 +44657 +44683 +44687 +44699 +44701 +44711 +44729 +44741 +44753 +44771 +44773 +44777 +44789 +44797 +44809 +44819 +44839 +44843 +44851 +44867 +44879 +44887 +44893 +44909 +44917 +44927 +44939 +44953 +44959 +44963 +44971 +44983 +44987 +45007 +45013 +45053 +45061 +45077 +45083 +45119 +45121 +45127 +45131 +45137 +45139 +45161 +45179 +45181 +45191 +45197 +45233 +45247 +45259 +45263 +45281 +45289 +45293 +45307 +45317 +45319 +45329 +45337 +45341 +45343 +45361 +45377 +45389 +45403 +45413 +45427 +45433 +45439 +45481 +45491 +45497 +45503 +45523 +45533 +45541 +45553 +45557 +45569 +45587 +45589 +45599 +45613 +45631 +45641 +45659 +45667 +45673 +45677 +45691 +45697 +45707 +45737 +45751 +45757 +45763 +45767 +45779 +45817 +45821 +45823 +45827 +45833 +45841 +45853 +45863 +45869 +45887 +45893 +45943 +45949 +45953 +45959 +45971 +45979 +45989 +46021 +46027 +46049 +46051 +46061 +46073 +46091 +46093 +46099 +46103 +46133 +46141 +46147 +46153 +46171 +46181 +46183 +46187 +46199 +46219 +46229 +46237 +46261 +46271 +46273 +46279 +46301 +46307 +46309 +46327 +46337 +46349 +46351 +46381 +46399 +46411 +46439 +46441 +46447 +46451 +46457 +46471 +46477 +46489 +46499 +46507 +46511 +46523 +46549 +46559 +46567 +46573 +46589 +46591 +46601 +46619 +46633 +46639 +46643 +46649 +46663 +46679 +46681 +46687 +46691 +46703 +46723 +46727 +46747 +46751 +46757 +46769 +46771 +46807 +46811 +46817 +46819 +46829 +46831 +46853 +46861 +46867 +46877 +46889 +46901 +46919 +46933 +46957 +46993 +46997 +47017 +47041 +47051 +47057 +47059 +47087 +47093 +47111 +47119 +47123 +47129 +47137 +47143 +47147 +47149 +47161 +47189 +47207 +47221 +47237 +47251 +47269 +47279 +47287 +47293 +47297 +47303 +47309 +47317 +47339 +47351 +47353 +47363 +47381 +47387 +47389 +47407 +47417 +47419 +47431 +47441 +47459 +47491 +47497 +47501 +47507 +47513 +47521 +47527 +47533 +47543 +47563 +47569 +47581 +47591 +47599 +47609 +47623 +47629 +47639 +47653 +47657 +47659 +47681 +47699 +47701 +47711 +47713 +47717 +47737 +47741 +47743 +47777 +47779 +47791 +47797 +47807 +47809 +47819 +47837 +47843 +47857 +47869 +47881 +47903 +47911 +47917 +47933 +47939 +47947 +47951 +47963 +47969 +47977 +47981 +48017 +48023 +48029 +48049 +48073 +48079 +48091 +48109 +48119 +48121 +48131 +48157 +48163 +48179 +48187 +48193 +48197 +48221 +48239 +48247 +48259 +48271 +48281 +48299 +48311 +48313 +48337 +48341 +48353 +48371 +48383 +48397 +48407 +48409 +48413 +48437 +48449 +48463 +48473 +48479 +48481 +48487 +48491 +48497 +48523 +48527 +48533 +48539 +48541 +48563 +48571 +48589 +48593 +48611 +48619 +48623 +48647 +48649 +48661 +48673 +48677 +48679 +48731 +48733 +48751 +48757 +48761 +48767 +48779 +48781 +48787 +48799 +48809 +48817 +48821 +48823 +48847 +48857 +48859 +48869 +48871 +48883 +48889 +48907 +48947 +48953 +48973 +48989 +48991 +49003 +49009 +49019 +49031 +49033 +49037 +49043 +49057 +49069 +49081 +49103 +49109 +49117 +49121 +49123 +49139 +49157 +49169 +49171 +49177 +49193 +49199 +49201 +49207 +49211 +49223 +49253 +49261 +49277 +49279 +49297 +49307 +49331 +49333 +49339 +49363 +49367 +49369 +49391 +49393 +49409 +49411 +49417 +49429 +49433 +49451 +49459 +49463 +49477 +49481 +49499 +49523 +49529 +49531 +49537 +49547 +49549 +49559 +49597 +49603 +49613 +49627 +49633 +49639 +49663 +49667 +49669 +49681 +49697 +49711 +49727 +49739 +49741 +49747 +49757 +49783 +49787 +49789 +49801 +49807 +49811 +49823 +49831 +49843 +49853 +49871 +49877 +49891 +49919 +49921 +49927 +49937 +49939 +49943 +49957 +49991 +49993 +49999 +50021 +50023 +50033 +50047 +50051 +50053 +50069 +50077 +50087 +50093 +50101 +50111 +50119 +50123 +50129 +50131 +50147 +50153 +50159 +50177 +50207 +50221 +50227 +50231 +50261 +50263 +50273 +50287 +50291 +50311 +50321 +50329 +50333 +50341 +50359 +50363 +50377 +50383 +50387 +50411 +50417 +50423 +50441 +50459 +50461 +50497 +50503 +50513 +50527 +50539 +50543 +50549 +50551 +50581 +50587 +50591 +50593 +50599 +50627 +50647 +50651 +50671 +50683 +50707 +50723 +50741 +50753 +50767 +50773 +50777 +50789 +50821 +50833 +50839 +50849 +50857 +50867 +50873 +50891 +50893 +50909 +50923 +50929 +50951 +50957 +50969 +50971 +50989 +50993 +51001 +51031 +51043 +51047 +51059 +51061 +51071 +51109 +51131 +51133 +51137 +51151 +51157 +51169 +51193 +51197 +51199 +51203 +51217 +51229 +51239 +51241 +51257 +51263 +51283 +51287 +51307 +51329 +51341 +51343 +51347 +51349 +51361 +51383 +51407 +51413 +51419 +51421 +51427 +51431 +51437 +51439 +51449 +51461 +51473 +51479 +51481 +51487 +51503 +51511 +51517 +51521 +51539 +51551 +51563 +51577 +51581 +51593 +51599 +51607 +51613 +51631 +51637 +51647 +51659 +51673 +51679 +51683 +51691 +51713 +51719 +51721 +51749 +51767 +51769 +51787 +51797 +51803 +51817 +51827 +51829 +51839 +51853 +51859 +51869 +51871 +51893 +51899 +51907 +51913 +51929 +51941 +51949 +51971 +51973 +51977 +51991 +52009 +52021 +52027 +52051 +52057 +52067 +52069 +52081 +52103 +52121 +52127 +52147 +52153 +52163 +52177 +52181 +52183 +52189 +52201 +52223 +52237 +52249 +52253 +52259 +52267 +52289 +52291 +52301 +52313 +52321 +52361 +52363 +52369 +52379 +52387 +52391 +52433 +52453 +52457 +52489 +52501 +52511 +52517 +52529 +52541 +52543 +52553 +52561 +52567 +52571 +52579 +52583 +52609 +52627 +52631 +52639 +52667 +52673 +52691 +52697 +52709 +52711 +52721 +52727 +52733 +52747 +52757 +52769 +52783 +52807 +52813 +52817 +52837 +52859 +52861 +52879 +52883 +52889 +52901 +52903 +52919 +52937 +52951 +52957 +52963 +52967 +52973 +52981 +52999 +53003 +53017 +53047 +53051 +53069 +53077 +53087 +53089 +53093 +53101 +53113 +53117 +53129 +53147 +53149 +53161 +53171 +53173 +53189 +53197 +53201 +53231 +53233 +53239 +53267 +53269 +53279 +53281 +53299 +53309 +53323 +53327 +53353 +53359 +53377 +53381 +53401 +53407 +53411 +53419 +53437 +53441 +53453 +53479 +53503 +53507 +53527 +53549 +53551 +53569 +53591 +53593 +53597 +53609 +53611 +53617 +53623 +53629 +53633 +53639 +53653 +53657 +53681 +53693 +53699 +53717 +53719 +53731 +53759 +53773 +53777 +53783 +53791 +53813 +53819 +53831 +53849 +53857 +53861 +53881 +53887 +53891 +53897 +53899 +53917 +53923 +53927 +53939 +53951 +53959 +53987 +53993 +54001 +54011 +54013 +54037 +54049 +54059 +54083 +54091 +54101 +54121 +54133 +54139 +54151 +54163 +54167 +54181 +54193 +54217 +54251 +54269 +54277 +54287 +54293 +54311 +54319 +54323 +54331 +54347 +54361 +54367 +54371 +54377 +54401 +54403 +54409 +54413 +54419 +54421 +54437 +54443 +54449 +54469 +54493 +54497 +54499 +54503 +54517 +54521 +54539 +54541 +54547 +54559 +54563 +54577 +54581 +54583 +54601 +54617 +54623 +54629 +54631 +54647 +54667 +54673 +54679 +54709 +54713 +54721 +54727 +54751 +54767 +54773 +54779 +54787 +54799 +54829 +54833 +54851 +54869 +54877 +54881 +54907 +54917 +54919 +54941 +54949 +54959 +54973 +54979 +54983 +55001 +55009 +55021 +55049 +55051 +55057 +55061 +55073 +55079 +55103 +55109 +55117 +55127 +55147 +55163 +55171 +55201 +55207 +55213 +55217 +55219 +55229 +55243 +55249 +55259 +55291 +55313 +55331 +55333 +55337 +55339 +55343 +55351 +55373 +55381 +55399 +55411 +55439 +55441 +55457 +55469 +55487 +55501 +55511 +55529 +55541 +55547 +55579 +55589 +55603 +55609 +55619 +55621 +55631 +55633 +55639 +55661 +55663 +55667 +55673 +55681 +55691 +55697 +55711 +55717 +55721 +55733 +55763 +55787 +55793 +55799 +55807 +55813 +55817 +55819 +55823 +55829 +55837 +55843 +55849 +55871 +55889 +55897 +55901 +55903 +55921 +55927 +55931 +55933 +55949 +55967 +55987 +55997 +56003 +56009 +56039 +56041 +56053 +56081 +56087 +56093 +56099 +56101 +56113 +56123 +56131 +56149 +56167 +56171 +56179 +56197 +56207 +56209 +56237 +56239 +56249 +56263 +56267 +56269 +56299 +56311 +56333 +56359 +56369 +56377 +56383 +56393 +56401 +56417 +56431 +56437 +56443 +56453 +56467 +56473 +56477 +56479 +56489 +56501 +56503 +56509 +56519 +56527 +56531 +56533 +56543 +56569 +56591 +56597 +56599 +56611 +56629 +56633 +56659 +56663 +56671 +56681 +56687 +56701 +56711 +56713 +56731 +56737 +56747 +56767 +56773 +56779 +56783 +56807 +56809 +56813 +56821 +56827 +56843 +56857 +56873 +56891 +56893 +56897 +56909 +56911 +56921 +56923 +56929 +56941 +56951 +56957 +56963 +56983 +56989 +56993 +56999 +57037 +57041 +57047 +57059 +57073 +57077 +57089 +57097 +57107 +57119 +57131 +57139 +57143 +57149 +57163 +57173 +57179 +57191 +57193 +57203 +57221 +57223 +57241 +57251 +57259 +57269 +57271 +57283 +57287 +57301 +57329 +57331 +57347 +57349 +57367 +57373 +57383 +57389 +57397 +57413 +57427 +57457 +57467 +57487 +57493 +57503 +57527 +57529 +57557 +57559 +57571 +57587 +57593 +57601 +57637 +57641 +57649 +57653 +57667 +57679 +57689 +57697 +57709 +57713 +57719 +57727 +57731 +57737 +57751 +57773 +57781 +57787 +57791 +57793 +57803 +57809 +57829 +57839 +57847 +57853 +57859 +57881 +57899 +57901 +57917 +57923 +57943 +57947 +57973 +57977 +57991 +58013 +58027 +58031 +58043 +58049 +58057 +58061 +58067 +58073 +58099 +58109 +58111 +58129 +58147 +58151 +58153 +58169 +58171 +58189 +58193 +58199 +58207 +58211 +58217 +58229 +58231 +58237 +58243 +58271 +58309 +58313 +58321 +58337 +58363 +58367 +58369 +58379 +58391 +58393 +58403 +58411 +58417 +58427 +58439 +58441 +58451 +58453 +58477 +58481 +58511 +58537 +58543 +58549 +58567 +58573 +58579 +58601 +58603 +58613 +58631 +58657 +58661 +58679 +58687 +58693 +58699 +58711 +58727 +58733 +58741 +58757 +58763 +58771 +58787 +58789 +58831 +58889 +58897 +58901 +58907 +58909 +58913 +58921 +58937 +58943 +58963 +58967 +58979 +58991 +58997 +59009 +59011 +59021 +59023 +59029 +59051 +59053 +59063 +59069 +59077 +59083 +59093 +59107 +59113 +59119 +59123 +59141 +59149 +59159 +59167 +59183 +59197 +59207 +59209 +59219 +59221 +59233 +59239 +59243 +59263 +59273 +59281 +59333 +59341 +59351 +59357 +59359 +59369 +59377 +59387 +59393 +59399 +59407 +59417 +59419 +59441 +59443 +59447 +59453 +59467 +59471 +59473 +59497 +59509 +59513 +59539 +59557 +59561 +59567 +59581 +59611 +59617 +59621 +59627 +59629 +59651 +59659 +59663 +59669 +59671 +59693 +59699 +59707 +59723 +59729 +59743 +59747 +59753 +59771 +59779 +59791 +59797 +59809 +59833 +59863 +59879 +59887 +59921 +59929 +59951 +59957 +59971 +59981 +59999 +60013 +60017 +60029 +60037 +60041 +60077 +60083 +60089 +60091 +60101 +60103 +60107 +60127 +60133 +60139 +60149 +60161 +60167 +60169 +60209 +60217 +60223 +60251 +60257 +60259 +60271 +60289 +60293 +60317 +60331 +60337 +60343 +60353 +60373 +60383 +60397 +60413 +60427 +60443 +60449 +60457 +60493 +60497 +60509 +60521 +60527 +60539 +60589 +60601 +60607 +60611 +60617 +60623 +60631 +60637 +60647 +60649 +60659 +60661 +60679 +60689 +60703 +60719 +60727 +60733 +60737 +60757 +60761 +60763 +60773 +60779 +60793 +60811 +60821 +60859 +60869 +60887 +60889 +60899 +60901 +60913 +60917 +60919 +60923 +60937 +60943 +60953 +60961 +61001 +61007 +61027 +61031 +61043 +61051 +61057 +61091 +61099 +61121 +61129 +61141 +61151 +61153 +61169 +61211 +61223 +61231 +61253 +61261 +61283 +61291 +61297 +61331 +61333 +61339 +61343 +61357 +61363 +61379 +61381 +61403 +61409 +61417 +61441 +61463 +61469 +61471 +61483 +61487 +61493 +61507 +61511 +61519 +61543 +61547 +61553 +61559 +61561 +61583 +61603 +61609 +61613 +61627 +61631 +61637 +61643 +61651 +61657 +61667 +61673 +61681 +61687 +61703 +61717 +61723 +61729 +61751 +61757 +61781 +61813 +61819 +61837 +61843 +61861 +61871 +61879 +61909 +61927 +61933 +61949 +61961 +61967 +61979 +61981 +61987 +61991 +62003 +62011 +62017 +62039 +62047 +62053 +62057 +62071 +62081 +62099 +62119 +62129 +62131 +62137 +62141 +62143 +62171 +62189 +62191 +62201 +62207 +62213 +62219 +62233 +62273 +62297 +62299 +62303 +62311 +62323 +62327 +62347 +62351 +62383 +62401 +62417 +62423 +62459 +62467 +62473 +62477 +62483 +62497 +62501 +62507 +62533 +62539 +62549 +62563 +62581 +62591 +62597 +62603 +62617 +62627 +62633 +62639 +62653 +62659 +62683 +62687 +62701 +62723 +62731 +62743 +62753 +62761 +62773 +62791 +62801 +62819 +62827 +62851 +62861 +62869 +62873 +62897 +62903 +62921 +62927 +62929 +62939 +62969 +62971 +62981 +62983 +62987 +62989 +63029 +63031 +63059 +63067 +63073 +63079 +63097 +63103 +63113 +63127 +63131 +63149 +63179 +63197 +63199 +63211 +63241 +63247 +63277 +63281 +63299 +63311 +63313 +63317 +63331 +63337 +63347 +63353 +63361 +63367 +63377 +63389 +63391 +63397 +63409 +63419 +63421 +63439 +63443 +63463 +63467 +63473 +63487 +63493 +63499 +63521 +63527 +63533 +63541 +63559 +63577 +63587 +63589 +63599 +63601 +63607 +63611 +63617 +63629 +63647 +63649 +63659 +63667 +63671 +63689 +63691 +63697 +63703 +63709 +63719 +63727 +63737 +63743 +63761 +63773 +63781 +63793 +63799 +63803 +63809 +63823 +63839 +63841 +63853 +63857 +63863 +63901 +63907 +63913 +63929 +63949 +63977 +63997 +64007 +64013 +64019 +64033 +64037 +64063 +64067 +64081 +64091 +64109 +64123 +64151 +64153 +64157 +64171 +64187 +64189 +64217 +64223 +64231 +64237 +64271 +64279 +64283 +64301 +64303 +64319 +64327 +64333 +64373 +64381 +64399 +64403 +64433 +64439 +64451 +64453 +64483 +64489 +64499 +64513 +64553 +64567 +64577 +64579 +64591 +64601 +64609 +64613 +64621 +64627 +64633 +64661 +64663 +64667 +64679 +64693 +64709 +64717 +64747 +64763 +64781 +64783 +64793 +64811 +64817 +64849 +64853 +64871 +64877 +64879 +64891 +64901 +64919 +64921 +64927 +64937 +64951 +64969 +64997 +65003 +65011 +65027 +65029 +65033 +65053 +65063 +65071 +65089 +65099 +65101 +65111 +65119 +65123 +65129 +65141 +65147 +65167 +65171 +65173 +65179 +65183 +65203 +65213 +65239 +65257 +65267 +65269 +65287 +65293 +65309 +65323 +65327 +65353 +65357 +65371 +65381 +65393 +65407 +65413 +65419 +65423 +65437 +65447 +65449 +65479 +65497 +65519 +65521 +65537 +65539 +65543 +65551 +65557 +65563 +65579 +65581 +65587 +65599 +65609 +65617 +65629 +65633 +65647 +65651 +65657 +65677 +65687 +65699 +65701 +65707 +65713 +65717 +65719 +65729 +65731 +65761 +65777 +65789 +65809 +65827 +65831 +65837 +65839 +65843 +65851 +65867 +65881 +65899 +65921 +65927 +65929 +65951 +65957 +65963 +65981 +65983 +65993 +66029 +66037 +66041 +66047 +66067 +66071 +66083 +66089 +66103 +66107 +66109 +66137 +66161 +66169 +66173 +66179 +66191 +66221 +66239 +66271 +66293 +66301 +66337 +66343 +66347 +66359 +66361 +66373 +66377 +66383 +66403 +66413 +66431 +66449 +66457 +66463 +66467 +66491 +66499 +66509 +66523 +66529 +66533 +66541 +66553 +66569 +66571 +66587 +66593 +66601 +66617 +66629 +66643 +66653 +66683 +66697 +66701 +66713 +66721 +66733 +66739 +66749 +66751 +66763 +66791 +66797 +66809 +66821 +66841 +66851 +66853 +66863 +66877 +66883 +66889 +66919 +66923 +66931 +66943 +66947 +66949 +66959 +66973 +66977 +67003 +67021 +67033 +67043 +67049 +67057 +67061 +67073 +67079 +67103 +67121 +67129 +67139 +67141 +67153 +67157 +67169 +67181 +67187 +67189 +67211 +67213 +67217 +67219 +67231 +67247 +67261 +67271 +67273 +67289 +67307 +67339 +67343 +67349 +67369 +67391 +67399 +67409 +67411 +67421 +67427 +67429 +67433 +67447 +67453 +67477 +67481 +67489 +67493 +67499 +67511 +67523 +67531 +67537 +67547 +67559 +67567 +67577 +67579 +67589 +67601 +67607 +67619 +67631 +67651 +67679 +67699 +67709 +67723 +67733 +67741 +67751 +67757 +67759 +67763 +67777 +67783 +67789 +67801 +67807 +67819 +67829 +67843 +67853 +67867 +67883 +67891 +67901 +67927 +67931 +67933 +67939 +67943 +67957 +67961 +67967 +67979 +67987 +67993 +68023 +68041 +68053 +68059 +68071 +68087 +68099 +68111 +68113 +68141 +68147 +68161 +68171 +68207 +68209 +68213 +68219 +68227 +68239 +68261 +68279 +68281 +68311 +68329 +68351 +68371 +68389 +68399 +68437 +68443 +68447 +68449 +68473 +68477 +68483 +68489 +68491 +68501 +68507 +68521 +68531 +68539 +68543 +68567 +68581 +68597 +68611 +68633 +68639 +68659 +68669 +68683 +68687 +68699 +68711 +68713 +68729 +68737 +68743 +68749 +68767 +68771 +68777 +68791 +68813 +68819 +68821 +68863 +68879 +68881 +68891 +68897 +68899 +68903 +68909 +68917 +68927 +68947 +68963 +68993 +69001 +69011 +69019 +69029 +69031 +69061 +69067 +69073 +69109 +69119 +69127 +69143 +69149 +69151 +69163 +69191 +69193 +69197 +69203 +69221 +69233 +69239 +69247 +69257 +69259 +69263 +69313 +69317 +69337 +69341 +69371 +69379 +69383 +69389 +69401 +69403 +69427 +69431 +69439 +69457 +69463 +69467 +69473 +69481 +69491 +69493 +69497 +69499 +69539 +69557 +69593 +69623 +69653 +69661 +69677 +69691 +69697 +69709 +69737 +69739 +69761 +69763 +69767 +69779 +69809 +69821 +69827 +69829 +69833 +69847 +69857 +69859 +69877 +69899 +69911 +69929 +69931 +69941 +69959 +69991 +69997 +70001 +70003 +70009 +70019 +70039 +70051 +70061 +70067 +70079 +70099 +70111 +70117 +70121 +70123 +70139 +70141 +70157 +70163 +70177 +70181 +70183 +70199 +70201 +70207 +70223 +70229 +70237 +70241 +70249 +70271 +70289 +70297 +70309 +70313 +70321 +70327 +70351 +70373 +70379 +70381 +70393 +70423 +70429 +70439 +70451 +70457 +70459 +70481 +70487 +70489 +70501 +70507 +70529 +70537 +70549 +70571 +70573 +70583 +70589 +70607 +70619 +70621 +70627 +70639 +70657 +70663 +70667 +70687 +70709 +70717 +70729 +70753 +70769 +70783 +70793 +70823 +70841 +70843 +70849 +70853 +70867 +70877 +70879 +70891 +70901 +70913 +70919 +70921 +70937 +70949 +70951 +70957 +70969 +70979 +70981 +70991 +70997 +70999 +71011 +71023 +71039 +71059 +71069 +71081 +71089 +71119 +71129 +71143 +71147 +71153 +71161 +71167 +71171 +71191 +71209 +71233 +71237 +71249 +71257 +71261 +71263 +71287 +71293 +71317 +71327 +71329 +71333 +71339 +71341 +71347 +71353 +71359 +71363 +71387 +71389 +71399 +71411 +71413 +71419 +71429 +71437 +71443 +71453 +71471 +71473 +71479 +71483 +71503 +71527 +71537 +71549 +71551 +71563 +71569 +71593 +71597 +71633 +71647 +71663 +71671 +71693 +71699 +71707 +71711 +71713 +71719 +71741 +71761 +71777 +71789 +71807 +71809 +71821 +71837 +71843 +71849 +71861 +71867 +71879 +71881 +71887 +71899 +71909 +71917 +71933 +71941 +71947 +71963 +71971 +71983 +71987 +71993 +71999 +72019 +72031 +72043 +72047 +72053 +72073 +72077 +72089 +72091 +72101 +72103 +72109 +72139 +72161 +72167 +72169 +72173 +72211 +72221 +72223 +72227 +72229 +72251 +72253 +72269 +72271 +72277 +72287 +72307 +72313 +72337 +72341 +72353 +72367 +72379 +72383 +72421 +72431 +72461 +72467 +72469 +72481 +72493 +72497 +72503 +72533 +72547 +72551 +72559 +72577 +72613 +72617 +72623 +72643 +72647 +72649 +72661 +72671 +72673 +72679 +72689 +72701 +72707 +72719 +72727 +72733 +72739 +72763 +72767 +72797 +72817 +72823 +72859 +72869 +72871 +72883 +72889 +72893 +72901 +72907 +72911 +72923 +72931 +72937 +72949 +72953 +72959 +72973 +72977 +72997 +73009 +73013 +73019 +73037 +73039 +73043 +73061 +73063 +73079 +73091 +73121 +73127 +73133 +73141 +73181 +73189 +73237 +73243 +73259 +73277 +73291 +73303 +73309 +73327 +73331 +73351 +73361 +73363 +73369 +73379 +73387 +73417 +73421 +73433 +73453 +73459 +73471 +73477 +73483 +73517 +73523 +73529 +73547 +73553 +73561 +73571 +73583 +73589 +73597 +73607 +73609 +73613 +73637 +73643 +73651 +73673 +73679 +73681 +73693 +73699 +73709 +73721 +73727 +73751 +73757 +73771 +73783 +73819 +73823 +73847 +73849 +73859 +73867 +73877 +73883 +73897 +73907 +73939 +73943 +73951 +73961 +73973 +73999 +74017 +74021 +74027 +74047 +74051 +74071 +74077 +74093 +74099 +74101 +74131 +74143 +74149 +74159 +74161 +74167 +74177 +74189 +74197 +74201 +74203 +74209 +74219 +74231 +74257 +74279 +74287 +74293 +74297 +74311 +74317 +74323 +74353 +74357 +74363 +74377 +74381 +74383 +74411 +74413 +74419 +74441 +74449 +74453 +74471 +74489 +74507 +74509 +74521 +74527 +74531 +74551 +74561 +74567 +74573 +74587 +74597 +74609 +74611 +74623 +74653 +74687 +74699 +74707 +74713 +74717 +74719 +74729 +74731 +74747 +74759 +74761 +74771 +74779 +74797 +74821 +74827 +74831 +74843 +74857 +74861 +74869 +74873 +74887 +74891 +74897 +74903 +74923 +74929 +74933 +74941 +74959 +75011 +75013 +75017 +75029 +75037 +75041 +75079 +75083 +75109 +75133 +75149 +75161 +75167 +75169 +75181 +75193 +75209 +75211 +75217 +75223 +75227 +75239 +75253 +75269 +75277 +75289 +75307 +75323 +75329 +75337 +75347 +75353 +75367 +75377 +75389 +75391 +75401 +75403 +75407 +75431 +75437 +75479 +75503 +75511 +75521 +75527 +75533 +75539 +75541 +75553 +75557 +75571 +75577 +75583 +75611 +75617 +75619 +75629 +75641 +75653 +75659 +75679 +75683 +75689 +75703 +75707 +75709 +75721 +75731 +75743 +75767 +75773 +75781 +75787 +75793 +75797 +75821 +75833 +75853 +75869 +75883 +75913 +75931 +75937 +75941 +75967 +75979 +75983 +75989 +75991 +75997 +76001 +76003 +76031 +76039 +76079 +76081 +76091 +76099 +76103 +76123 +76129 +76147 +76157 +76159 +76163 +76207 +76213 +76231 +76243 +76249 +76253 +76259 +76261 +76283 +76289 +76303 +76333 +76343 +76367 +76369 +76379 +76387 +76403 +76421 +76423 +76441 +76463 +76471 +76481 +76487 +76493 +76507 +76511 +76519 +76537 +76541 +76543 +76561 +76579 +76597 +76603 +76607 +76631 +76649 +76651 +76667 +76673 +76679 +76697 +76717 +76733 +76753 +76757 +76771 +76777 +76781 +76801 +76819 +76829 +76831 +76837 +76847 +76871 +76873 +76883 +76907 +76913 +76919 +76943 +76949 +76961 +76963 +76991 +77003 +77017 +77023 +77029 +77041 +77047 +77069 +77081 +77093 +77101 +77137 +77141 +77153 +77167 +77171 +77191 +77201 +77213 +77237 +77239 +77243 +77249 +77261 +77263 +77267 +77269 +77279 +77291 +77317 +77323 +77339 +77347 +77351 +77359 +77369 +77377 +77383 +77417 +77419 +77431 +77447 +77471 +77477 +77479 +77489 +77491 +77509 +77513 +77521 +77527 +77543 +77549 +77551 +77557 +77563 +77569 +77573 +77587 +77591 +77611 +77617 +77621 +77641 +77647 +77659 +77681 +77687 +77689 +77699 +77711 +77713 +77719 +77723 +77731 +77743 +77747 +77761 +77773 +77783 +77797 +77801 +77813 +77839 +77849 +77863 +77867 +77893 +77899 +77929 +77933 +77951 +77969 +77977 +77983 +77999 +78007 +78017 +78031 +78041 +78049 +78059 +78079 +78101 +78121 +78137 +78139 +78157 +78163 +78167 +78173 +78179 +78191 +78193 +78203 +78229 +78233 +78241 +78259 +78277 +78283 +78301 +78307 +78311 +78317 +78341 +78347 +78367 +78401 +78427 +78437 +78439 +78467 +78479 +78487 +78497 +78509 +78511 +78517 +78539 +78541 +78553 +78569 +78571 +78577 +78583 +78593 +78607 +78623 +78643 +78649 +78653 +78691 +78697 +78707 +78713 +78721 +78737 +78779 +78781 +78787 +78791 +78797 +78803 +78809 +78823 +78839 +78853 +78857 +78877 +78887 +78889 +78893 +78901 +78919 +78929 +78941 +78977 +78979 +78989 +79031 +79039 +79043 +79063 +79087 +79103 +79111 +79133 +79139 +79147 +79151 +79153 +79159 +79181 +79187 +79193 +79201 +79229 +79231 +79241 +79259 +79273 +79279 +79283 +79301 +79309 +79319 +79333 +79337 +79349 +79357 +79367 +79379 +79393 +79397 +79399 +79411 +79423 +79427 +79433 +79451 +79481 +79493 +79531 +79537 +79549 +79559 +79561 +79579 +79589 +79601 +79609 +79613 +79621 +79627 +79631 +79633 +79657 +79669 +79687 +79691 +79693 +79697 +79699 +79757 +79769 +79777 +79801 +79811 +79813 +79817 +79823 +79829 +79841 +79843 +79847 +79861 +79867 +79873 +79889 +79901 +79903 +79907 +79939 +79943 +79967 +79973 +79979 +79987 +79997 +79999 +80021 +80039 +80051 +80071 +80077 +80107 +80111 +80141 +80147 +80149 +80153 +80167 +80173 +80177 +80191 +80207 +80209 +80221 +80231 +80233 +80239 +80251 +80263 +80273 +80279 +80287 +80309 +80317 +80329 +80341 +80347 +80363 +80369 +80387 +80407 +80429 +80447 +80449 +80471 +80473 +80489 +80491 +80513 +80527 +80537 +80557 +80567 +80599 +80603 +80611 +80621 +80627 +80629 +80651 +80657 +80669 +80671 +80677 +80681 +80683 +80687 +80701 +80713 +80737 +80747 +80749 +80761 +80777 +80779 +80783 +80789 +80803 +80809 +80819 +80831 +80833 +80849 +80863 +80897 +80909 +80911 +80917 +80923 +80929 +80933 +80953 +80963 +80989 +81001 +81013 +81017 +81019 +81023 +81031 +81041 +81043 +81047 +81049 +81071 +81077 +81083 +81097 +81101 +81119 +81131 +81157 +81163 +81173 +81181 +81197 +81199 +81203 +81223 +81233 +81239 +81281 +81283 +81293 +81299 +81307 +81331 +81343 +81349 +81353 +81359 +81371 +81373 +81401 +81409 +81421 +81439 +81457 +81463 +81509 +81517 +81527 +81533 +81547 +81551 +81553 +81559 +81563 +81569 +81611 +81619 +81629 +81637 +81647 +81649 +81667 +81671 +81677 +81689 +81701 +81703 +81707 +81727 +81737 +81749 +81761 +81769 +81773 +81799 +81817 +81839 +81847 +81853 +81869 +81883 +81899 +81901 +81919 +81929 +81931 +81937 +81943 +81953 +81967 +81971 +81973 +82003 +82007 +82009 +82013 +82021 +82031 +82037 +82039 +82051 +82067 +82073 +82129 +82139 +82141 +82153 +82163 +82171 +82183 +82189 +82193 +82207 +82217 +82219 +82223 +82231 +82237 +82241 +82261 +82267 +82279 +82301 +82307 +82339 +82349 +82351 +82361 +82373 +82387 +82393 +82421 +82457 +82463 +82469 +82471 +82483 +82487 +82493 +82499 +82507 +82529 +82531 +82549 +82559 +82561 +82567 +82571 +82591 +82601 +82609 +82613 +82619 +82633 +82651 +82657 +82699 +82721 +82723 +82727 +82729 +82757 +82759 +82763 +82781 +82787 +82793 +82799 +82811 +82813 +82837 +82847 +82883 +82889 +82891 +82903 +82913 +82939 +82963 +82981 +82997 +83003 +83009 +83023 +83047 +83059 +83063 +83071 +83077 +83089 +83093 +83101 +83117 +83137 +83177 +83203 +83207 +83219 +83221 +83227 +83231 +83233 +83243 +83257 +83267 +83269 +83273 +83299 +83311 +83339 +83341 +83357 +83383 +83389 +83399 +83401 +83407 +83417 +83423 +83431 +83437 +83443 +83449 +83459 +83471 +83477 +83497 +83537 +83557 +83561 +83563 +83579 +83591 +83597 +83609 +83617 +83621 +83639 +83641 +83653 +83663 +83689 +83701 +83717 +83719 +83737 +83761 +83773 +83777 +83791 +83813 +83833 +83843 +83857 +83869 +83873 +83891 +83903 +83911 +83921 +83933 +83939 +83969 +83983 +83987 +84011 +84017 +84047 +84053 +84059 +84061 +84067 +84089 +84121 +84127 +84131 +84137 +84143 +84163 +84179 +84181 +84191 +84199 +84211 +84221 +84223 +84229 +84239 +84247 +84263 +84299 +84307 +84313 +84317 +84319 +84347 +84349 +84377 +84389 +84391 +84401 +84407 +84421 +84431 +84437 +84443 +84449 +84457 +84463 +84467 +84481 +84499 +84503 +84509 +84521 +84523 +84533 +84551 +84559 +84589 +84629 +84631 +84649 +84653 +84659 +84673 +84691 +84697 +84701 +84713 +84719 +84731 +84737 +84751 +84761 +84787 +84793 +84809 +84811 +84827 +84857 +84859 +84869 +84871 +84913 +84919 +84947 +84961 +84967 +84977 +84979 +84991 +85009 +85021 +85027 +85037 +85049 +85061 +85081 +85087 +85091 +85093 +85103 +85109 +85121 +85133 +85147 +85159 +85193 +85199 +85201 +85213 +85223 +85229 +85237 +85243 +85247 +85259 +85297 +85303 +85313 +85331 +85333 +85361 +85363 +85369 +85381 +85411 +85427 +85429 +85439 +85447 +85451 +85453 +85469 +85487 +85513 +85517 +85523 +85531 +85549 +85571 +85577 +85597 +85601 +85607 +85619 +85621 +85627 +85639 +85643 +85661 +85667 +85669 +85691 +85703 +85711 +85717 +85733 +85751 +85781 +85793 +85817 +85819 +85829 +85831 +85837 +85843 +85847 +85853 +85889 +85903 +85909 +85931 +85933 +85991 +85999 +86011 +86017 +86027 +86029 +86069 +86077 +86083 +86111 +86113 +86117 +86131 +86137 +86143 +86161 +86171 +86179 +86183 +86197 +86201 +86209 +86239 +86243 +86249 +86257 +86263 +86269 +86287 +86291 +86293 +86297 +86311 +86323 +86341 +86351 +86353 +86357 +86369 +86371 +86381 +86389 +86399 +86413 +86423 +86441 +86453 +86461 +86467 +86477 +86491 +86501 +86509 +86531 +86533 +86539 +86561 +86573 +86579 +86587 +86599 +86627 +86629 +86677 +86689 +86693 +86711 +86719 +86729 +86743 +86753 +86767 +86771 +86783 +86813 +86837 +86843 +86851 +86857 +86861 +86869 +86923 +86927 +86929 +86939 +86951 +86959 +86969 +86981 +86993 +87011 +87013 +87037 +87041 +87049 +87071 +87083 +87103 +87107 +87119 +87121 +87133 +87149 +87151 +87179 +87181 +87187 +87211 +87221 +87223 +87251 +87253 +87257 +87277 +87281 +87293 +87299 +87313 +87317 +87323 +87337 +87359 +87383 +87403 +87407 +87421 +87427 +87433 +87443 +87473 +87481 +87491 +87509 +87511 +87517 +87523 +87539 +87541 +87547 +87553 +87557 +87559 +87583 +87587 +87589 +87613 +87623 +87629 +87631 +87641 +87643 +87649 +87671 +87679 +87683 +87691 +87697 +87701 +87719 +87721 +87739 +87743 +87751 +87767 +87793 +87797 +87803 +87811 +87833 +87853 +87869 +87877 +87881 +87887 +87911 +87917 +87931 +87943 +87959 +87961 +87973 +87977 +87991 +88001 +88003 +88007 +88019 +88037 +88069 +88079 +88093 +88117 +88129 +88169 +88177 +88211 +88223 +88237 +88241 +88259 +88261 +88289 +88301 +88321 +88327 +88337 +88339 +88379 +88397 +88411 +88423 +88427 +88463 +88469 +88471 +88493 +88499 +88513 +88523 +88547 +88589 +88591 +88607 +88609 +88643 +88651 +88657 +88661 +88663 +88667 +88681 +88721 +88729 +88741 +88747 +88771 +88789 +88793 +88799 +88801 +88807 +88811 +88813 +88817 +88819 +88843 +88853 +88861 +88867 +88873 +88883 +88897 +88903 +88919 +88937 +88951 +88969 +88993 +88997 +89003 +89009 +89017 +89021 +89041 +89051 +89057 +89069 +89071 +89083 +89087 +89101 +89107 +89113 +89119 +89123 +89137 +89153 +89189 +89203 +89209 +89213 +89227 +89231 +89237 +89261 +89269 +89273 +89293 +89303 +89317 +89329 +89363 +89371 +89381 +89387 +89393 +89399 +89413 +89417 +89431 +89443 +89449 +89459 +89477 +89491 +89501 +89513 +89519 +89521 +89527 +89533 +89561 +89563 +89567 +89591 +89597 +89599 +89603 +89611 +89627 +89633 +89653 +89657 +89659 +89669 +89671 +89681 +89689 +89753 +89759 +89767 +89779 +89783 +89797 +89809 +89819 +89821 +89833 +89839 +89849 +89867 +89891 +89897 +89899 +89909 +89917 +89923 +89939 +89959 +89963 +89977 +89983 +89989 +90001 +90007 +90011 +90017 +90019 +90023 +90031 +90053 +90059 +90067 +90071 +90073 +90089 +90107 +90121 +90127 +90149 +90163 +90173 +90187 +90191 +90197 +90199 +90203 +90217 +90227 +90239 +90247 +90263 +90271 +90281 +90289 +90313 +90353 +90359 +90371 +90373 +90379 +90397 +90401 +90403 +90407 +90437 +90439 +90469 +90473 +90481 +90499 +90511 +90523 +90527 +90529 +90533 +90547 +90583 +90599 +90617 +90619 +90631 +90641 +90647 +90659 +90677 +90679 +90697 +90703 +90709 +90731 +90749 +90787 +90793 +90803 +90821 +90823 +90833 +90841 +90847 +90863 +90887 +90901 +90907 +90911 +90917 +90931 +90947 +90971 +90977 +90989 +90997 +91009 +91019 +91033 +91079 +91081 +91097 +91099 +91121 +91127 +91129 +91139 +91141 +91151 +91153 +91159 +91163 +91183 +91193 +91199 +91229 +91237 +91243 +91249 +91253 +91283 +91291 +91297 +91303 +91309 +91331 +91367 +91369 +91373 +91381 +91387 +91393 +91397 +91411 +91423 +91433 +91453 +91457 +91459 +91463 +91493 +91499 +91513 +91529 +91541 +91571 +91573 +91577 +91583 +91591 +91621 +91631 +91639 +91673 +91691 +91703 +91711 +91733 +91753 +91757 +91771 +91781 +91801 +91807 +91811 +91813 +91823 +91837 +91841 +91867 +91873 +91909 +91921 +91939 +91943 +91951 +91957 +91961 +91967 +91969 +91997 +92003 +92009 +92033 +92041 +92051 +92077 +92083 +92107 +92111 +92119 +92143 +92153 +92173 +92177 +92179 +92189 +92203 +92219 +92221 +92227 +92233 +92237 +92243 +92251 +92269 +92297 +92311 +92317 +92333 +92347 +92353 +92357 +92363 +92369 +92377 +92381 +92383 +92387 +92399 +92401 +92413 +92419 +92431 +92459 +92461 +92467 +92479 +92489 +92503 +92507 +92551 +92557 +92567 +92569 +92581 +92593 +92623 +92627 +92639 +92641 +92647 +92657 +92669 +92671 +92681 +92683 +92693 +92699 +92707 +92717 +92723 +92737 +92753 +92761 +92767 +92779 +92789 +92791 +92801 +92809 +92821 +92831 +92849 +92857 +92861 +92863 +92867 +92893 +92899 +92921 +92927 +92941 +92951 +92957 +92959 +92987 +92993 +93001 +93047 +93053 +93059 +93077 +93083 +93089 +93097 +93103 +93113 +93131 +93133 +93139 +93151 +93169 +93179 +93187 +93199 +93229 +93239 +93241 +93251 +93253 +93257 +93263 +93281 +93283 +93287 +93307 +93319 +93323 +93329 +93337 +93371 +93377 +93383 +93407 +93419 +93427 +93463 +93479 +93481 +93487 +93491 +93493 +93497 +93503 +93523 +93529 +93553 +93557 +93559 +93563 +93581 +93601 +93607 +93629 +93637 +93683 +93701 +93703 +93719 +93739 +93761 +93763 +93787 +93809 +93811 +93827 +93851 +93871 +93887 +93889 +93893 +93901 +93911 +93913 +93923 +93937 +93941 +93949 +93967 +93971 +93979 +93983 +93997 +94007 +94009 +94033 +94049 +94057 +94063 +94079 +94099 +94109 +94111 +94117 +94121 +94151 +94153 +94169 +94201 +94207 +94219 +94229 +94253 +94261 +94273 +94291 +94307 +94309 +94321 +94327 +94331 +94343 +94349 +94351 +94379 +94397 +94399 +94421 +94427 +94433 +94439 +94441 +94447 +94463 +94477 +94483 +94513 +94529 +94531 +94541 +94543 +94547 +94559 +94561 +94573 +94583 +94597 +94603 +94613 +94621 +94649 +94651 +94687 +94693 +94709 +94723 +94727 +94747 +94771 +94777 +94781 +94789 +94793 +94811 +94819 +94823 +94837 +94841 +94847 +94849 +94873 +94889 +94903 +94907 +94933 +94949 +94951 +94961 +94993 +94999 +95003 +95009 +95021 +95027 +95063 +95071 +95083 +95087 +95089 +95093 +95101 +95107 +95111 +95131 +95143 +95153 +95177 +95189 +95191 +95203 +95213 +95219 +95231 +95233 +95239 +95257 +95261 +95267 +95273 +95279 +95287 +95311 +95317 +95327 +95339 +95369 +95383 +95393 +95401 +95413 +95419 +95429 +95441 +95443 +95461 +95467 +95471 +95479 +95483 +95507 +95527 +95531 +95539 +95549 +95561 +95569 +95581 +95597 +95603 +95617 +95621 +95629 +95633 +95651 +95701 +95707 +95713 +95717 +95723 +95731 +95737 +95747 +95773 +95783 +95789 +95791 +95801 +95803 +95813 +95819 +95857 +95869 +95873 +95881 +95891 +95911 +95917 +95923 +95929 +95947 +95957 +95959 +95971 +95987 +95989 +96001 +96013 +96017 +96043 +96053 +96059 +96079 +96097 +96137 +96149 +96157 +96167 +96179 +96181 +96199 +96211 +96221 +96223 +96233 +96259 +96263 +96269 +96281 +96289 +96293 +96323 +96329 +96331 +96337 +96353 +96377 +96401 +96419 +96431 +96443 +96451 +96457 +96461 +96469 +96479 +96487 +96493 +96497 +96517 +96527 +96553 +96557 +96581 +96587 +96589 +96601 +96643 +96661 +96667 +96671 +96697 +96703 +96731 +96737 +96739 +96749 +96757 +96763 +96769 +96779 +96787 +96797 +96799 +96821 +96823 +96827 +96847 +96851 +96857 +96893 +96907 +96911 +96931 +96953 +96959 +96973 +96979 +96989 +96997 +97001 +97003 +97007 +97021 +97039 +97073 +97081 +97103 +97117 +97127 +97151 +97157 +97159 +97169 +97171 +97177 +97187 +97213 +97231 +97241 +97259 +97283 +97301 +97303 +97327 +97367 +97369 +97373 +97379 +97381 +97387 +97397 +97423 +97429 +97441 +97453 +97459 +97463 +97499 +97501 +97511 +97523 +97547 +97549 +97553 +97561 +97571 +97577 +97579 +97583 +97607 +97609 +97613 +97649 +97651 +97673 +97687 +97711 +97729 +97771 +97777 +97787 +97789 +97813 +97829 +97841 +97843 +97847 +97849 +97859 +97861 +97871 +97879 +97883 +97919 +97927 +97931 +97943 +97961 +97967 +97973 +97987 +98009 +98011 +98017 +98041 +98047 +98057 +98081 +98101 +98123 +98129 +98143 +98179 +98207 +98213 +98221 +98227 +98251 +98257 +98269 +98297 +98299 +98317 +98321 +98323 +98327 +98347 +98369 +98377 +98387 +98389 +98407 +98411 +98419 +98429 +98443 +98453 +98459 +98467 +98473 +98479 +98491 +98507 +98519 +98533 +98543 +98561 +98563 +98573 +98597 +98621 +98627 +98639 +98641 +98663 +98669 +98689 +98711 +98713 +98717 +98729 +98731 +98737 +98773 +98779 +98801 +98807 +98809 +98837 +98849 +98867 +98869 +98873 +98887 +98893 +98897 +98899 +98909 +98911 +98927 +98929 +98939 +98947 +98953 +98963 +98981 +98993 +98999 +99013 +99017 +99023 +99041 +99053 +99079 +99083 +99089 +99103 +99109 +99119 +99131 +99133 +99137 +99139 +99149 +99173 +99181 +99191 +99223 +99233 +99241 +99251 +99257 +99259 +99277 +99289 +99317 +99347 +99349 +99367 +99371 +99377 +99391 +99397 +99401 +99409 +99431 +99439 +99469 +99487 +99497 +99523 +99527 +99529 +99551 +99559 +99563 +99571 +99577 +99581 +99607 +99611 +99623 +99643 +99661 +99667 +99679 +99689 +99707 +99709 +99713 +99719 +99721 +99733 +99761 +99767 +99787 +99793 +99809 +99817 +99823 +99829 +99833 +99839 +99859 +99871 +99877 +99881 +99901 +99907 +99923 +99929 +99961 +99971 +99989 +99991 +100003 +100019 +100043 +100049 +100057 +100069 +100103 +100109 +100129 +100151 +100153 +100169 +100183 +100189 +100193 +100207 +100213 +100237 +100267 +100271 +100279 +100291 +100297 +100313 +100333 +100343 +100357 +100361 +100363 +100379 +100391 +100393 +100403 +100411 +100417 +100447 +100459 +100469 +100483 +100493 +100501 +100511 +100517 +100519 +100523 +100537 +100547 +100549 +100559 +100591 +100609 +100613 +100621 +100649 +100669 +100673 +100693 +100699 +100703 +100733 +100741 +100747 +100769 +100787 +100799 +100801 +100811 +100823 +100829 +100847 +100853 +100907 +100913 +100927 +100931 +100937 +100943 +100957 +100981 +100987 +100999 +101009 +101021 +101027 +101051 +101063 +101081 +101089 +101107 +101111 +101113 +101117 +101119 +101141 +101149 +101159 +101161 +101173 +101183 +101197 +101203 +101207 +101209 +101221 +101267 +101273 +101279 +101281 +101287 +101293 +101323 +101333 +101341 +101347 +101359 +101363 +101377 +101383 +101399 +101411 +101419 +101429 +101449 +101467 +101477 +101483 +101489 +101501 +101503 +101513 +101527 +101531 +101533 +101537 +101561 +101573 +101581 +101599 +101603 +101611 +101627 +101641 +101653 +101663 +101681 +101693 +101701 +101719 +101723 +101737 +101741 +101747 +101749 +101771 +101789 +101797 +101807 +101833 +101837 +101839 +101863 +101869 +101873 +101879 +101891 +101917 +101921 +101929 +101939 +101957 +101963 +101977 +101987 +101999 +102001 +102013 +102019 +102023 +102031 +102043 +102059 +102061 +102071 +102077 +102079 +102101 +102103 +102107 +102121 +102139 +102149 +102161 +102181 +102191 +102197 +102199 +102203 +102217 +102229 +102233 +102241 +102251 +102253 +102259 +102293 +102299 +102301 +102317 +102329 +102337 +102359 +102367 +102397 +102407 +102409 +102433 +102437 +102451 +102461 +102481 +102497 +102499 +102503 +102523 +102533 +102539 +102547 +102551 +102559 +102563 +102587 +102593 +102607 +102611 +102643 +102647 +102653 +102667 +102673 +102677 +102679 +102701 +102761 +102763 +102769 +102793 +102797 +102811 +102829 +102841 +102859 +102871 +102877 +102881 +102911 +102913 +102929 +102931 +102953 +102967 +102983 +103001 +103007 +103043 +103049 +103067 +103069 +103079 +103087 +103091 +103093 +103099 +103123 +103141 +103171 +103177 +103183 +103217 +103231 +103237 +103289 +103291 +103307 +103319 +103333 +103349 +103357 +103387 +103391 +103393 +103399 +103409 +103421 +103423 +103451 +103457 +103471 +103483 +103511 +103529 +103549 +103553 +103561 +103567 +103573 +103577 +103583 +103591 +103613 +103619 +103643 +103651 +103657 +103669 +103681 +103687 +103699 +103703 +103723 +103769 +103787 +103801 +103811 +103813 +103837 +103841 +103843 +103867 +103889 +103903 +103913 +103919 +103951 +103963 +103967 +103969 +103979 +103981 +103991 +103993 +103997 +104003 +104009 +104021 +104033 +104047 +104053 +104059 +104087 +104089 +104107 +104113 +104119 +104123 +104147 +104149 +104161 +104173 +104179 +104183 +104207 +104231 +104233 +104239 +104243 +104281 +104287 +104297 +104309 +104311 +104323 +104327 +104347 +104369 +104381 +104383 +104393 +104399 +104417 +104459 +104471 +104473 +104479 +104491 +104513 +104527 +104537 +104543 +104549 +104551 +104561 +104579 +104593 +104597 +104623 +104639 +104651 +104659 +104677 +104681 +104683 +104693 +104701 +104707 +104711 +104717 +104723 +104729 diff --git a/include/clock.h b/include/clock.h index 3f7200a..a2f33b6 100644 --- a/include/clock.h +++ b/include/clock.h @@ -15,6 +15,7 @@ struct clock_register{ void *(*func)(void *); bool if_thread; + bool if_reset = false; int click; int rawclick; void *arg; @@ -23,7 +24,6 @@ struct clock_register{ struct clock_thread_info{ uint32_t tid = 0; pthread_t pht = 0; - bool if_reset = false; void *args = NULL; clock_register *pcr; }; @@ -36,7 +36,7 @@ void setThreadsClock(void); void threadsClock(int); //时钟线程完结前调用此函数进行标记 void clockThreadFinish(uint32_t tid); -void newClock(clock_register ncr); +void newClock(clock_register *pncr); #endif /* clock_h */ diff --git a/include/cproj.h b/include/cproj.h index 51695be..e1169a5 100644 --- a/include/cproj.h +++ b/include/cproj.h @@ -47,6 +47,14 @@ struct stn_read{ //配置文件通用方法类 class setting_file{ +public: + // 检查名字是否合法 + static bool if_name_illegal(string str){ + for(auto c:str){ + if(!if_illegal(c)) return false; + } + return true; + } protected: // 检查路径或文件 void check_paths(string main_path, vector paths){ @@ -55,17 +63,10 @@ protected: } } // 检查字符是否合法 - bool if_illegal(char c){ + static bool if_illegal(char c){ if(isalnum(c) || c == '_') return true; else return false; } -// 检查名字是否合法 - bool if_name_illegal(string str){ - for(auto c:str){ - if(!if_illegal(c)) return false; - } - return true; - } // 寻找保留字 bool search_key(ifstream &ifsfile,string key){ string line; diff --git a/include/net.h b/include/net.h index b2e27df..5fb41fd 100644 --- a/include/net.h +++ b/include/net.h @@ -38,6 +38,8 @@ public: struct sockaddr *RawObj(void); void SetIpv4(void); void SetIpv6(void); + static bool checkValidIP(string ipaddr); + }; //服务器套接字类 diff --git a/include/rsa.h b/include/rsa.h new file mode 100755 index 0000000..f0208f3 --- /dev/null +++ b/include/rsa.h @@ -0,0 +1,39 @@ +#ifndef __RSA_H__ +#define __RSA_H__ + +#include + +// This is the header file for the library librsaencrypt.a + +// Change this line to the file you'd like to use as a source of primes. +// The format of the file should be one prime per line. +char *PRIME_SOURCE_FILE = "primes.txt"; + + +struct public_key_class{ + long long modulus; + long long exponent; +}; + +struct private_key_class{ + long long modulus; + long long exponent; +}; + +// This function generates public and private keys, then stores them in the structures you +// provide pointers to. The 3rd argument should be the text PRIME_SOURCE_FILE to have it use +// the location specified above in this header. +void rsa_gen_keys(struct public_key_class *pub, struct private_key_class *priv, const char *PRIME_SOURCE_FILE); + +// This function will encrypt the data pointed to by message. It returns a pointer to a heap +// array containing the encrypted data, or NULL upon failure. This pointer should be freed when +// you are finished. The encrypted data will be 8 times as large as the original data. +long long *rsa_encrypt(const char *message, const unsigned long message_size, const struct public_key_class *pub); + +// This function will decrypt the data pointed to by message. It returns a pointer to a heap +// array containing the decrypted data, or NULL upon failure. This pointer should be freed when +// you are finished. The variable message_size is the size in bytes of the encrypted message. +// The decrypted data will be 1/8th the size of the encrypted data. +char *rsa_decrypt(const long long *message, const unsigned long message_size, const struct private_key_class *pub); + +#endif diff --git a/include/server.h b/include/server.h index 5d8d5db..f55cffc 100644 --- a/include/server.h +++ b/include/server.h @@ -25,6 +25,7 @@ struct compute_result{ vector *fargs_out; }; + //通用数据包类 class packet{ public: @@ -54,6 +55,14 @@ public: } }; +struct server_info{ + string tag; + string name; + string msqes_ip; + int msqes_prot; + string key; +}; + //通用服务器类 class Server{ protected: @@ -61,6 +70,7 @@ protected: vector packets_in; // 缓存带标签的二进制串管理结构 vector rawdata_in; + struct server_info tsi; public: // 服务器类的接收套接字对象与发送套接字对象 SocketUDPServer socket; diff --git a/include/sha1.h b/include/sha1.h new file mode 100755 index 0000000..96bb008 --- /dev/null +++ b/include/sha1.h @@ -0,0 +1,44 @@ +#ifndef SHA1_H +#define SHA1_H + +/* + SHA-1 in C + By Steve Reid + 100% Public Domain + */ + +#include "stdint.h" + +typedef struct +{ + uint32_t state[5]; + uint32_t count[2]; + unsigned char buffer[64]; +} SHA1_CTX; + +void SHA1Transform( + uint32_t state[5], + const unsigned char buffer[64] + ); + +void SHA1Init( + SHA1_CTX * context + ); + +void SHA1Update( + SHA1_CTX * context, + const unsigned char *data, + uint32_t len + ); + +void SHA1Final( + unsigned char digest[20], + SHA1_CTX * context + ); + +void SHA1( + char *hash_out, + const char *str, + int len); + +#endif /* SHA1_H */ diff --git a/include/sql.h b/include/sql.h index d26394e..6ae4336 100644 --- a/include/sql.h +++ b/include/sql.h @@ -37,6 +37,8 @@ namespace sql { int insert_info(sqlite3 *psql, sqlite3_stmt **psqlsmt, string table_name, vector>value); // 生成字符串格式的数据 string string_type(string str); +// 输出错误信息 + void printError(sqlite3 *psql); } #endif /* sql_h */ diff --git a/src/addr.cpp b/src/addr.cpp index 7a84abc..fbb8fc2 100644 --- a/src/addr.cpp +++ b/src/addr.cpp @@ -73,3 +73,16 @@ void Addr::SetIpv6(void){ address.sin_family = AF_INET6; SetSize(); } + +bool Addr::checkValidIP(string ipaddr){ + char temp[31]; + int a,b,c,d; + + if (sscanf(ipaddr.data(), "%d.%d.%d.%d ", &a, &b, &c, &d) == 4 && a >= 0 && a <= 255 && b >= 0 && b <= 255 && c >= 0 && c <= 255 && d >= 0 && d <= 255){ + sprintf(temp, "%d.%d.%d.%d", a, b, c, d); //把格式化的数据写入字符串temp + if (!strcmp(temp, ipaddr.data())) return true; //success + else return false; + } + else return false; + return true; +} diff --git a/src/client.cpp b/src/client.cpp index 22649c3..6fa5c3f 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -13,19 +13,14 @@ int main(int argc, char *argv[]) { try { - CNodeServer client(9049,"127.0.0.1",9048); + Server BServer(1081,"127.0.0.1",9048); vector fargs = {1,0,0,1}; vectorargs; - CPart::addArg(&args, 12.63); - CPart::addArg(&args, 10); - CPart::addArg(&args, 6); - CPart::addArg(&args, 8.2); - struct compute_result cpur = {"Test",&args,&args,&fargs,&fargs}; - packet pkt = client.CPURS2Packet(cpur); - raw_data rwd = client.Packet2Rawdata(pkt); - client.SignedRawdata(&rwd, "RSTR"); + raw_data rwd; + rwd.setData("Hello"); + BServer.SignedRawdata(&rwd, "TEXT"); while (1) { - client.SentRawdata(&rwd); + BServer.SentRawdata(&rwd); usleep(1000); } diff --git a/src/clock.cpp b/src/clock.cpp index b24a000..474a26f 100644 --- a/src/clock.cpp +++ b/src/clock.cpp @@ -11,10 +11,12 @@ #define CLOCKESE 30 -list clocks_list; +list clocks_list,reset_clocks; map clocks_thread_map; + list clock_thread_finished; static struct itimerval oitrl, itrl; +uint32_t tid_r = 0; static uint64_t clock_erase = CLOCKESE; @@ -33,63 +35,69 @@ void setThreadsClock(void){ setitimer(ITIMER_REAL, &itrl, &oitrl); } -void newClock(clock_register ncr){ - clocks_list.push_back(ncr); +void newClock(clock_register *pncr){ + clocks_list.push_back(pncr); } //时钟滴答调用函数 void threadsClock(int n){ -// 删除到期时钟 - if(clock_erase == 0){ - for(auto i = clocks_list.begin(); i != clocks_list.end();){ - if(i->click == -1) i = clocks_list.erase(i); - else i++; - } -// 重设总滴答数 - clock_erase = CLOCKESE; - } - else clock_erase--; + +// 处理已完成线程 for(auto tid : clock_thread_finished){ clock_thread_info *tcti = clocks_thread_map.find(tid)->second; pthread_join(tcti->pht,NULL); pthread_detach(tcti->pht); clocks_thread_map.erase(clocks_thread_map.find(tid)); -// 如果时钟需要重置 - if(tcti->if_reset){ - clock_register ncr = *tcti->pcr; - ncr.click = ncr.rawclick; - newClock(ncr); - } delete tcti; } clock_thread_finished.clear(); +// 删除到期时钟 + if(clock_erase == 0){ + printf("Cleaning clocks.\n"); + clocks_list.remove_if([](clock_register *pclock){return pclock == NULL;}); +// 重设总滴答数 + clock_erase = CLOCKESE; + } + else clock_erase--; + // 处理时钟列表 - for(auto &clock : clocks_list){ - if(clock.click == 0){ - if(clock.if_thread){ - clock_thread_info *pncti = new clock_thread_info(); - pncti->args = clock.arg; - pncti->pcr = &clock; - pncti->tid = (uint32_t)clocks_thread_map.size()+1; - clocks_thread_map.insert({pncti->tid,pncti}); - pthread_create(&pncti->pht, NULL, clock.func, pncti); + for(auto &pclock : clocks_list){ + if(pclock == NULL) continue; + if(pclock->click == 0){ + clock_thread_info *pncti = new clock_thread_info(); + pncti->args = pclock->arg; + pncti->tid = tid_r++; + pclock->if_thread = 1; + clocks_thread_map.insert({pncti->tid,pncti}); + + pthread_create(&pncti->pht, NULL, pclock->func, pncti); + +// 标记时钟到期 + if(pclock->if_reset){ + pclock->click = pclock->rawclick; } else{ - clock.func(clock.arg); + delete pclock; + pclock = NULL; } -// 标记时钟到期 - clock.click = -1; + } - else if(clock.click > 0){ - clock.click--; + else if(pclock->click > 0){ + pclock->click--; } } } void clockThreadFinish(uint32_t tid){ + // 屏蔽时钟信号 + sigset_t sigs; + sigemptyset(&sigs); + sigaddset(&sigs,SIGALRM); + sigprocmask(SIG_BLOCK,&sigs,0); clock_thread_finished.push_back(tid); + sigprocmask(SIG_UNBLOCK,&sigs,0); } diff --git a/src/main.cpp b/src/main.cpp index e2d24dd..b49d079 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,13 +18,30 @@ int update(string instruct, vector &configs, vector &lconfigs, vector &targets); int construct(string instruct,vector &config, vector &lconfig, vector &target); int server(string instruct, vector &configs, vector &lconfigs, vector &targets); +int init(string instruct, vector &configs, vector &lconfigs, vector &targets); +int set(string instruct, vector &configs, vector &lconfigs, vector &targets); + struct instructions{ - int (*unpack)(string instruct,vector &, vector &, vector &) = NULL; - int (*construct)(string instruct,vector &, vector &, vector &) = NULL; - int (*update)(string instruct,vector &, vector &, vector &) = NULL; - int (*server)(string instruct,vector &, vector &, vector &) = NULL; + int (*unpack)(string, vector &, vector &, vector &) = NULL; + int (*construct)(string, vector &, vector &, vector &) = NULL; + int (*update)(string, vector &, vector &, vector &) = NULL; + int (*server)(string, vector &, vector &, vector &) = NULL; + int (*set)(string, vector &, vector &, vector &) = NULL; + int (*init)(string, vector &, vector &, vector &) = NULL; }; +namespace error { + void printError(string error_info){ + printf("\033[31mError: %s\n\033[0m",error_info.data()); + } + void printWarning(string warning_info){ + printf("\033[33mWarning: %s\n\033[0m",warning_info.data()); + } + void printSuccess(string succes_info){ + printf("\033[32m%s\n\033[0m",succes_info.data()); + } +} + int main(int argc, const char *argv[]){ // 命令 string instruct; @@ -39,6 +56,8 @@ int main(int argc, const char *argv[]){ istns.construct = construct; istns.update = update; istns.server = server; + istns.init = init; + istns.set = set; // 解析命令 int if_instruct = 1; @@ -63,18 +82,26 @@ int main(int argc, const char *argv[]){ // 处理命令 if(instruct == "construct"){ if(istns.construct != nullptr) istns.construct(instruct,config,long_config,target); - else printf("Function not found.\n"); + else error::printError("Function not found."); } else if (instruct == "update"){ if(istns.update != nullptr) istns.update(instruct,config,long_config,target); - else printf("Function not found.\n"); + else error::printError("Function not found."); } else if (instruct == "server"){ if(istns.update != nullptr) istns.server(instruct,config,long_config,target); - else printf("Function not found.\n"); + else error::printError("Function not found."); + } + else if (instruct == "init"){ + if(istns.update != nullptr) istns.init(instruct,config,long_config,target); + else error::printError("Function not found."); + } + else if (instruct == "set"){ + if(istns.update != nullptr) istns.set(instruct,config,long_config,target); + else error::printError("Function not found."); } else{ - printf("Instruction \"%s\" doesn't make sense.\n",instruct.data()); + printf("\033[33mInstruction \"%s\" doesn't make sense.\n\033[0m",instruct.data()); } return 0; @@ -87,11 +114,136 @@ bool config_search(vector &configs,string tfg){ return false; } +int init(string instruct, vector &configs, vector &lconfigs, vector &targets){ + sqlite3 *psql; + sqlite3_stmt *psqlsmt; + sqlite3_open("info.db", &psql); + const char *pzTail; + try { + sql::table_create(psql, "server_info", { + {"name","TEXT"}, + {"tag","TEXT"}, + {"admin_key_sha1","TEXT"}, + {"msqes_ip","TEXT"}, + {"msqes_port","INT"}, + {"msqes_key","TEXT"}, + {"msqes_rsa_public","TEXT"}, + }); + sql::table_create(psql, "sqes_info", { + {"sqes_ip","TEXT PRIMARY KEY"}, + {"sqes_port","INT"}, + {"sqes_key","TEXT"}, + {"rsa_public","TEXT"}, + }); + } catch (const char *error_info) { + if(!strcmp(error_info, "fail to create table")){ + if(!config_search(configs, "-f")){ + printf("\033[33mWarning: Have Already run init process.Try configure -f to continue.\n\033[0m"); + return 0; + } + else{ + string sql_quote = "DELETE FROM server_info;"; + sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, &pzTail); + int rtn = sqlite3_step(psqlsmt); + if(rtn == SQLITE_DONE){ + + } + else{ + const char *error = sqlite3_errmsg(psql); + int errorcode = sqlite3_extended_errcode(psql); + printf("\033[31mSQL Error: [%d]%s\n\033[0m",errorcode,error); + throw error; + } + sqlite3_finalize(psqlsmt); + } + } + } + + + sql::insert_info(psql, &psqlsmt, "server_info", { + {"name","?1"}, + {"tag","?2"} + }); + if(setting_file::if_name_illegal(targets[0])); + else{ + error::printError("Args(name) abnormal."); + } + if(setting_file::if_name_illegal(targets[1])); + else{ + error::printError("Args(tag) abnormal."); + } + sqlite3_bind_text(psqlsmt, 1, targets[0].data(), -1, SQLITE_TRANSIENT); + sqlite3_bind_text(psqlsmt, 2, targets[1].data(), -1, SQLITE_TRANSIENT); + int rtn = sqlite3_step(psqlsmt); + if(rtn == SQLITE_DONE){ + + } + else throw "sql writes error"; + sqlite3_finalize(psqlsmt); + sqlite3_close(psql); + return 0; +} + +int set(string instruct, vector &configs, vector &lconfigs, vector &targets){ + sqlite3 *psql; + sqlite3_stmt *psqlsmt; + const char *pzTail; + if(sqlite3_open("info.db", &psql) == SQLITE_ERROR){ + sql::printError(psql); + } + string sql_quote = "SELECT count(*) FROM sqlite_master WHERE name = 'server_info';"; + sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, &pzTail); + sqlite3_step(psqlsmt); + int if_find = sqlite3_column_int(psqlsmt, 0); + if(if_find); + else{ + error::printError("Couldn't do set before init process."); + return -1; + } + sqlite3_finalize(psqlsmt); + if(targets[0] == "square"){ + sql_quote = "UPDATE server_info SET msqes_ip = ?1, msqes_port = ?2 WHERE rowid = 1;"; + sqlite3_prepare(psql, sql_quote.data(), -1, &psqlsmt, &pzTail); + + if(!Addr::checkValidIP(targets[1])){ + error::printError("Args(ipaddr) abnomal."); + sqlite3_finalize(psqlsmt); + sqlite3_close(psql); + return -1; + } + sqlite3_bind_text(psqlsmt, 1, targets[1].data(), -1, SQLITE_TRANSIENT); + + stringstream ss; + ss<>port; + if(port > 0 && port <= 65535); + else{ + error::printError("Args(port) abnomal."); + sqlite3_finalize(psqlsmt); + sqlite3_close(psql); + return -1; + } + sqlite3_bind_int(psqlsmt, 2, port); + int rtn = sqlite3_step(psqlsmt); + if(rtn != SQLITE_DONE){ + sql::printError(psql); + } + sqlite3_finalize(psqlsmt); + } + else if (targets[1] == "key"){ + + } + error::printSuccess("Succeed."); + sqlite3_close(psql); + return 0; +} + int server(string instruct, vector &configs, vector &lconfigs, vector &targets){ initClock(); setThreadsClock(); Server nsvr; - setServerClock(&nsvr, 2); + setServerClock(&nsvr, 3); while(1) usleep(10000); return 0; } diff --git a/src/rsa.c b/src/rsa.c new file mode 100755 index 0000000..fb6e139 --- /dev/null +++ b/src/rsa.c @@ -0,0 +1,194 @@ +#include +#include +#include +#include +#include +#include + + +char buffer[1024]; +const int MAX_DIGITS = 50; +int i,j = 0; + +struct public_key_class{ + long long modulus; + long long exponent; +}; + +struct private_key_class{ + long long modulus; + long long exponent; +}; + + +// This should totally be in the math library. +long long gcd(long long a, long long b) +{ + long long c; + while ( a != 0 ) { + c = a; a = b%a; b = c; + } + return b; +} + + +long long ExtEuclid(long long a, long long b) +{ + long long x = 0, y = 1, u = 1, v = 0, gcd = b, m, n, q, r; + while (a!=0) { + q = gcd/a; r = gcd % a; + m = x-u*q; n = y-v*q; + gcd = a; a = r; x = u; y = v; u = m; v = n; + } + return y; +} + +long long rsa_modExp(long long b, long long e, long long m) +{ + if (b < 0 || e < 0 || m <= 0){ + exit(1); + } + b = b % m; + if(e == 0) return 1; + if(e == 1) return b; + if( e % 2 == 0){ + return ( rsa_modExp(b * b % m, e/2, m) % m ); + } + else{ + return ( b * rsa_modExp(b, (e-1), m) % m ); + } +} + +// Calling this function will generate a public and private key and store them in the pointers +// it is given. +void rsa_gen_keys(struct public_key_class *pub, struct private_key_class *priv, char *PRIME_SOURCE_FILE) +{ + FILE *primes_list; + if(!(primes_list = fopen(PRIME_SOURCE_FILE, "r"))){ + fprintf(stderr, "Problem reading %s\n", PRIME_SOURCE_FILE); + exit(1); + } + + // count number of primes in the list + long long prime_count = 0; + do{ + size_t bytes_read = fread(buffer,1,sizeof(buffer)-1, primes_list); + buffer[bytes_read] = '\0'; + for (i=0 ; buffer[i]; i++){ + if (buffer[i] == '\n'){ + prime_count++; + } + } + } + while(feof(primes_list) == 0); + + + // choose random primes from the list, store them as p,q + + long long p = 0; + long long q = 0; + + long long e = powl(2, 8) + 1; + long long d = 0; + char prime_buffer[MAX_DIGITS]; + long long max = 0; + long long phi_max = 0; + + srand((unsigned int)time(NULL)); + + do{ + // a and b are the positions of p and q in the list + int a = (double)rand() * (prime_count+1) / (RAND_MAX+1.0); + int b = (double)rand() * (prime_count+1) / (RAND_MAX+1.0); + + // here we find the prime at position a, store it as p + rewind(primes_list); + for(i=0; i < a + 1; i++){ + // for(j=0; j < MAX_DIGITS; j++){ + // prime_buffer[j] = 0; + // } + fgets(prime_buffer,sizeof(prime_buffer)-1, primes_list); + } + p = atol(prime_buffer); + + // here we find the prime at position b, store it as q + rewind(primes_list); + for(i=0; i < b + 1; i++){ + for(j=0; j < MAX_DIGITS; j++){ + prime_buffer[j] = 0; + } + fgets(prime_buffer,sizeof(prime_buffer)-1, primes_list); + } + q = atol(prime_buffer); + + max = p*q; + phi_max = (p-1)*(q-1); + } + while(!(p && q) || (p == q) || (gcd(phi_max, e) != 1)); + + // Next, we need to choose a,b, so that a*max+b*e = gcd(max,e). We actually only need b + // here, and in keeping with the usual notation of RSA we'll call it d. We'd also like + // to make sure we get a representation of d as positive, hence the while loop. + d = ExtEuclid(phi_max,e); + while(d < 0){ + d = d+phi_max; + } + + printf("primes are %lld and %lld\n",(long long)p, (long long )q); + // We now store the public / private keys in the appropriate structs + pub->modulus = max; + pub->exponent = e; + + priv->modulus = max; + priv->exponent = d; +} + + +long long *rsa_encrypt(const char *message, const unsigned long message_size, + const struct public_key_class *pub) +{ + long long *encrypted = malloc(sizeof(long long)*message_size); + if(encrypted == NULL){ + fprintf(stderr, + "Error: Heap allocation failed.\n"); + return NULL; + } + long long i = 0; + for(i=0; i < message_size; i++){ + encrypted[i] = rsa_modExp(message[i], pub->exponent, pub->modulus); + } + return encrypted; +} + + +char *rsa_decrypt(const long long *message, + const unsigned long message_size, + const struct private_key_class *priv) +{ + if(message_size % sizeof(long long) != 0){ + fprintf(stderr, + "Error: message_size is not divisible by %d, so cannot be output of rsa_encrypt\n", (int)sizeof(long long)); + return NULL; + } + // We allocate space to do the decryption (temp) and space for the output as a char array + // (decrypted) + char *decrypted = malloc(message_size/sizeof(long long)); + char *temp = malloc(message_size); + if((decrypted == NULL) || (temp == NULL)){ + fprintf(stderr, + "Error: Heap allocation failed.\n"); + return NULL; + } + // Now we go through each 8-byte chunk and decrypt it. + long long i = 0; + for(i=0; i < message_size/8; i++){ + temp[i] = rsa_modExp(message[i], priv->exponent, priv->modulus); + } + // The result should be a number in the char range, which gives back the original byte. + // We put that into decrypted, then return. + for(i=0; i < message_size/8; i++){ + decrypted[i] = temp[i]; + } + free(temp); + return decrypted; +} diff --git a/src/server.cpp b/src/server.cpp index 38a6060..886cd60 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -12,13 +12,14 @@ extern list clocks_list; void setServerClock(Server *psvr, int clicks){ - clock_register ncr; - ncr.if_thread = true; - ncr.click = 3; - ncr.rawclick = 3; - ncr.func = serverDeamon; - ncr.arg = (void *)psvr; - clocks_list.push_back(ncr); + clock_register *pncr = new clock_register(); + pncr->if_thread = true; + pncr->if_reset = true; + pncr->click = clicks; + pncr->rawclick = clicks; + pncr->func = serverDeamon; + pncr->arg = (void *)psvr; + newClock(pncr); } Server::Server(int port, string send_ip,int send_port):socket(port),send_socket(send_ip,send_port){ @@ -213,6 +214,7 @@ raw_data Server::ProcessSignedRawMsg(char *p_rdt, ssize_t size){ } void *serverDeamon(void *pvcti){ + clock_thread_info *pcti = (clock_thread_info *) pvcti; Server *psvr = (Server *) pcti->args; //cout<<"Server Deamon Checked."<socket.RecvRAW(&str); if(tlen > 0){ - // 记录有效数据包 +// 记录有效数据包 if(Server::CheckRawMsg(str, tlen)){ + printf("Get\n"); raw_data trdt = Server::ProcessSignedRawMsg(str, tlen); psvr->rawdata_in.push_back(trdt); } } free(str); }while (tlen && prm-- > 0); - pcti->if_reset = true; clockThreadFinish(pcti->tid); pthread_exit(NULL); } diff --git a/src/sha1.cpp b/src/sha1.cpp new file mode 100755 index 0000000..c2bf174 --- /dev/null +++ b/src/sha1.cpp @@ -0,0 +1,296 @@ +/* +SHA-1 in C +By Steve Reid +100% Public Domain + +Test Vectors (from FIPS PUB 180-1) +"abc" + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +A million repetitions of "a" + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + +/* #define LITTLE_ENDIAN * This should be #define'd already, if true. */ +/* #define SHA1HANDSOFF * Copies data before messing with it. */ + +#define SHA1HANDSOFF + +#include +#include + +/* for uint32_t */ +#include + +#include "sha1.h" + + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +#if BYTE_ORDER == LITTLE_ENDIAN +#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ + |(rol(block->l[i],8)&0x00FF00FF)) +#elif BYTE_ORDER == BIG_ENDIAN +#define blk0(i) block->l[i] +#else +#error "Endianness not defined!" +#endif +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ + ^block->l[(i+2)&15]^block->l[i&15],1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); +#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); +#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); + + +/* Hash a single 512-bit block. This is the core of the algorithm. */ + +void SHA1Transform( + uint32_t state[5], + const unsigned char buffer[64] +) +{ + uint32_t a, b, c, d, e; + + typedef union + { + unsigned char c[64]; + uint32_t l[16]; + } CHAR64LONG16; + +#ifdef SHA1HANDSOFF + CHAR64LONG16 block[1]; /* use array to appear as a pointer */ + + memcpy(block, buffer, 64); +#else + /* The following had better never be used because it causes the + * pointer-to-const buffer to be cast into a pointer to non-const. + * And the result is written through. I threw a "const" in, hoping + * this will cause a diagnostic. + */ + CHAR64LONG16 *block = (const CHAR64LONG16 *) buffer; +#endif + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a, b, c, d, e, 0); + R0(e, a, b, c, d, 1); + R0(d, e, a, b, c, 2); + R0(c, d, e, a, b, 3); + R0(b, c, d, e, a, 4); + R0(a, b, c, d, e, 5); + R0(e, a, b, c, d, 6); + R0(d, e, a, b, c, 7); + R0(c, d, e, a, b, 8); + R0(b, c, d, e, a, 9); + R0(a, b, c, d, e, 10); + R0(e, a, b, c, d, 11); + R0(d, e, a, b, c, 12); + R0(c, d, e, a, b, 13); + R0(b, c, d, e, a, 14); + R0(a, b, c, d, e, 15); + R1(e, a, b, c, d, 16); + R1(d, e, a, b, c, 17); + R1(c, d, e, a, b, 18); + R1(b, c, d, e, a, 19); + R2(a, b, c, d, e, 20); + R2(e, a, b, c, d, 21); + R2(d, e, a, b, c, 22); + R2(c, d, e, a, b, 23); + R2(b, c, d, e, a, 24); + R2(a, b, c, d, e, 25); + R2(e, a, b, c, d, 26); + R2(d, e, a, b, c, 27); + R2(c, d, e, a, b, 28); + R2(b, c, d, e, a, 29); + R2(a, b, c, d, e, 30); + R2(e, a, b, c, d, 31); + R2(d, e, a, b, c, 32); + R2(c, d, e, a, b, 33); + R2(b, c, d, e, a, 34); + R2(a, b, c, d, e, 35); + R2(e, a, b, c, d, 36); + R2(d, e, a, b, c, 37); + R2(c, d, e, a, b, 38); + R2(b, c, d, e, a, 39); + R3(a, b, c, d, e, 40); + R3(e, a, b, c, d, 41); + R3(d, e, a, b, c, 42); + R3(c, d, e, a, b, 43); + R3(b, c, d, e, a, 44); + R3(a, b, c, d, e, 45); + R3(e, a, b, c, d, 46); + R3(d, e, a, b, c, 47); + R3(c, d, e, a, b, 48); + R3(b, c, d, e, a, 49); + R3(a, b, c, d, e, 50); + R3(e, a, b, c, d, 51); + R3(d, e, a, b, c, 52); + R3(c, d, e, a, b, 53); + R3(b, c, d, e, a, 54); + R3(a, b, c, d, e, 55); + R3(e, a, b, c, d, 56); + R3(d, e, a, b, c, 57); + R3(c, d, e, a, b, 58); + R3(b, c, d, e, a, 59); + R4(a, b, c, d, e, 60); + R4(e, a, b, c, d, 61); + R4(d, e, a, b, c, 62); + R4(c, d, e, a, b, 63); + R4(b, c, d, e, a, 64); + R4(a, b, c, d, e, 65); + R4(e, a, b, c, d, 66); + R4(d, e, a, b, c, 67); + R4(c, d, e, a, b, 68); + R4(b, c, d, e, a, 69); + R4(a, b, c, d, e, 70); + R4(e, a, b, c, d, 71); + R4(d, e, a, b, c, 72); + R4(c, d, e, a, b, 73); + R4(b, c, d, e, a, 74); + R4(a, b, c, d, e, 75); + R4(e, a, b, c, d, 76); + R4(d, e, a, b, c, 77); + R4(c, d, e, a, b, 78); + R4(b, c, d, e, a, 79); + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + /* Wipe variables */ + a = b = c = d = e = 0; +#ifdef SHA1HANDSOFF + memset(block, '\0', sizeof(block)); +#endif +} + + +/* SHA1Init - Initialize new context */ + +void SHA1Init( + SHA1_CTX * context +) +{ + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; +} + + +/* Run your data through this. */ + +void SHA1Update( + SHA1_CTX * context, + const unsigned char *data, + uint32_t len +) +{ + uint32_t i; + + uint32_t j; + + j = context->count[0]; + if ((context->count[0] += len << 3) < j) + context->count[1]++; + context->count[1] += (len >> 29); + j = (j >> 3) & 63; + if ((j + len) > 63) + { + memcpy(&context->buffer[j], data, (i = 64 - j)); + SHA1Transform(context->state, context->buffer); + for (; i + 63 < len; i += 64) + { + SHA1Transform(context->state, &data[i]); + } + j = 0; + } + else + i = 0; + memcpy(&context->buffer[j], &data[i], len - i); +} + + +/* Add padding and return the message digest. */ + +void SHA1Final( + unsigned char digest[20], + SHA1_CTX * context +) +{ + unsigned i; + + unsigned char finalcount[8]; + + unsigned char c; + +#if 0 /* untested "improvement" by DHR */ + /* Convert context->count to a sequence of bytes + * in finalcount. Second element first, but + * big-endian order within element. + * But we do it all backwards. + */ + unsigned char *fcp = &finalcount[8]; + + for (i = 0; i < 2; i++) + { + uint32_t t = context->count[i]; + + int j; + + for (j = 0; j < 4; t >>= 8, j++) + *--fcp = (unsigned char) t} +#else + for (i = 0; i < 8; i++) + { + finalcount[i] = (unsigned char) ((context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */ + } +#endif + c = 0200; + SHA1Update(context, &c, 1); + while ((context->count[0] & 504) != 448) + { + c = 0000; + SHA1Update(context, &c, 1); + } + SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ + for (i = 0; i < 20; i++) + { + digest[i] = (unsigned char) + ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); + } + /* Wipe variables */ + memset(context, '\0', sizeof(*context)); + memset(&finalcount, '\0', sizeof(finalcount)); +} + +void SHA1( + char *hash_out, + const char *str, + int len) +{ + SHA1_CTX ctx; + unsigned int ii; + + SHA1Init(&ctx); + for (ii=0; ii