From 86a83e3e006f179e74612fd85be24c45e0043a04 Mon Sep 17 00:00:00 2001 From: Dario Date: Sun, 22 Sep 2019 08:10:39 +0200 Subject: [PATCH] adding files from other projects, adding http interface pages --- CMakeLists.txt | 7 +- src/cpp/Crypto/DRHash.h | 134 +++++++++ src/cpp/Crypto/DRHashList.cpp | 282 ++++++++++++++++++ src/cpp/Crypto/DRHashList.h | 116 +++++++ src/cpp/Crypto/mnemonic.cpp | 98 ++++++ src/cpp/Crypto/mnemonic.h | 34 +++ src/cpp/Crypto/mnemonic_bip0039.h | 11 + src/cpp/Crypto/mnemonic_german.h | 11 + src/cpp/Gradido_LoginServer.cpp | 81 +++++ src/cpp/Gradido_LoginServer.h | 39 +++ src/cpp/HTTPInterface/ConfigPage.cpp | 105 +++++++ src/cpp/HTTPInterface/ConfigPage.h | 15 + src/cpp/HTTPInterface/HandleFileRequest.cpp | 41 +++ src/cpp/HTTPInterface/HandleFileRequest.h | 15 + .../PageRequestHandlerFactory.cpp | 31 ++ .../HTTPInterface/PageRequestHandlerFactory.h | 19 ++ src/cpp/ServerConfig.cpp | 1 + src/cpp/main.cpp | 18 +- src/cpsp/config.cpsp | 85 ++++++ src/cpsp/login.cpsp | 39 +++ src/cpsp/register.cpsp | 46 +++ 21 files changed, 1217 insertions(+), 11 deletions(-) create mode 100644 src/cpp/Crypto/DRHash.h create mode 100644 src/cpp/Crypto/DRHashList.cpp create mode 100644 src/cpp/Crypto/DRHashList.h create mode 100644 src/cpp/Crypto/mnemonic.cpp create mode 100644 src/cpp/Crypto/mnemonic.h create mode 100644 src/cpp/Crypto/mnemonic_bip0039.h create mode 100644 src/cpp/Crypto/mnemonic_german.h create mode 100644 src/cpp/Gradido_LoginServer.cpp create mode 100644 src/cpp/Gradido_LoginServer.h create mode 100644 src/cpp/HTTPInterface/ConfigPage.cpp create mode 100644 src/cpp/HTTPInterface/ConfigPage.h create mode 100644 src/cpp/HTTPInterface/HandleFileRequest.cpp create mode 100644 src/cpp/HTTPInterface/HandleFileRequest.h create mode 100644 src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp create mode 100644 src/cpp/HTTPInterface/PageRequestHandlerFactory.h create mode 100644 src/cpsp/config.cpsp create mode 100644 src/cpsp/login.cpsp create mode 100644 src/cpsp/register.cpsp diff --git a/CMakeLists.txt b/CMakeLists.txt index 53f155600..78c36c23d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,12 +11,17 @@ include_directories( ) FILE(GLOB TINF "dependencies/tinf/src/*.c" "dependencies/tinf/src/*.h") -SET(LOCAL_SRCS ${TINF}) +FILE(GLOB HTTPInterface "src/cpp/HTTPInterface/*.h" "src/cpp/HTTPInterface/*.cpp") +FILE(GLOB CRYPTO "src/cpp/Crypto/*.h" "src/cpp/Crypto/*.cpp") +FILE(GLOB MAIN "src/cpp/*.cpp" "src/cpp/*.c" "src/cpp/*.h") +SET(LOCAL_SRCS ${TINF} ${MAIN} ${HTTPInterface} ${CRYPTO}) aux_source_directory("src/cpp" LOCAL_SRCS) if(MSVC) # src source_group("tinf" FILES ${TINF}) +source_group("crypto" FILES ${CRYPTO}) +source_group("HTTP-Interface" FILES ${HTTPInterface}) endif(MSVC) diff --git a/src/cpp/Crypto/DRHash.h b/src/cpp/Crypto/DRHash.h new file mode 100644 index 000000000..1558c6433 --- /dev/null +++ b/src/cpp/Crypto/DRHash.h @@ -0,0 +1,134 @@ +/*/************************************************************************* + * * + * Core, Core-Lib for my programs, Core doesn't need any libraries * + * Copyright (C) 2012, 2013, 2014 Dario Rekowski * + * Email: ***REMOVED*** Web: ***REMOVED*** * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ***************************************************************************/ +//--------------------------------------------------------- +// hashing header file +// aus dem Buch "Goldene Regeln der Spieleprogrammierung" von Martin Brownlow +//--------------------------------------------------------- +#ifndef __DR_CORE2_HASH__ +#define __DR_CORE2_HASH__ + +#include + +typedef unsigned int HASH; +typedef unsigned long DHASH; + +#ifndef u32 +typedef unsigned long u32; +#endif + +#ifndef s32 +typedef long s32; +#endif + +//--------------------------------------------------------- +// sample hash creation functions +//--------------------------------------------------------- +inline HASH DRHashRotateLeft( HASH hash, const unsigned int rotateBy ) +{ + return (hash<>(32-rotateBy)); +} + +//--------------------------------------------------------- +// create a hash from a string +//--------------------------------------------------------- +inline HASH DRMakeStringHash( const char *pString ) +{ + HASH ret = 0; + char c; + + if( pString ) + { + while( (c=*(pString++)) != '\0' ) + ret = DRHashRotateLeft(ret,7) + c; + } + return ret; +} + + +inline HASH DRMakeStringHash(const char *pString, unsigned int str_size) +{ + HASH ret = 0; + + if (pString) + { + for (unsigned int i = 0; i < str_size; i++) { + ret = DRHashRotateLeft(ret, 7) + pString[i]; + } + } + return ret; +} + +//--------------------------------------------------------- +// create a hash from a filename +//--------------------------------------------------------- +inline HASH DRMakeFilenameHash( const char *pString ) +{ + HASH ret = 0; + char c; + + if( pString ) + { + while( (c=*(pString++)) != '\0' ) + { + if( c>='A' && c<='Z' ) + c ^= 32; + else if( c=='/' ) + c = '\\'; + ret = DRHashRotateLeft(ret,7) + c; + } + } + return ret; +} + +//----------------------------------------------------------------------------------- +//einen Hash aus zwei Werten erstellen +inline DHASH DRMakeDoubleHash(const char* pTypeName, const char* pFileName) +{ + HASH hTemp1 = DRMakeStringHash(pTypeName); + DHASH hTemp2 = DRMakeFilenameHash(pFileName); + hTemp2 = hTemp2 << 16; + return ((DHASH)(hTemp1)|(DHASH)(hTemp2)); +} +//einen Hash aus 3 Int-Werten generiren +inline DHASH DRMakeThreeIntHash(int i1, int i2, int i3) +{ + DHASH h1 = DRHashRotateLeft(i1, 24); + h1 = h1 | DRHashRotateLeft(i2, 16); + return h1 | i3; +} + + +/* +//ein hash aus einem Vector2D +inline CORE2_API DHASH DRMakeVector2Hash(DRVector2 vVector) +{ + DHASH h1 = DRHashRotateLeft((int)vVector.x, 16); + return h1 | (int)vVector.y; +} + +//ein hash aus einem Vector3D +inline CORE2_API DHASH DRMakeVector3Hash(DRVector3 vector) +{ + return DRMakeThreeIntHash((int)vector.x, (int)vector.y, (int)vector.z); +} + +*/ +#endif //__DR_CORE2_HASH__ diff --git a/src/cpp/Crypto/DRHashList.cpp b/src/cpp/Crypto/DRHashList.cpp new file mode 100644 index 000000000..b912f742c --- /dev/null +++ b/src/cpp/Crypto/DRHashList.cpp @@ -0,0 +1,282 @@ +//------------------------------------------------------------------ +// hash list implementation +//------------------------------------------------------------------ + +#include "DRHashList.h" + +#include +#include + +using namespace std; + +//------------------------------------------------------------------ +// DRStaticHashList +// set the data +//------------------------------------------------------------------ +void DRStaticHashList::setData( u32 nItems, DRHashListItem *pItems) +{ + m_nItems = nItems; + m_pItems = pItems; +} + +//------------------------------------------------------------------ +// DRStaticHashList +// does an item exist +//------------------------------------------------------------------ +bool DRStaticHashList::itemExists( DHASH hashValue, u32 *outIndex ) const +{ + s32 window[3]; + + // empty??? + if( m_nItems==0 ) + return false; + + // simple binary search + // divide and conquer is maybe faster? + window[0] = 0; + window[2] = m_nItems-1; + while( window[0]<=window[2] ) + { + window[1] = (window[0]+window[2])/2; + + // is this the item we're looking for? + if( m_pItems[window[1]].hashValue==hashValue ) + { + if( outIndex ) + outIndex[0] = window[1]; + return true; + } + + // check whether to search top or bottom half of list + if( m_pItems[window[1]].hashValue=m_nItems ) + return 0; + return m_pItems[index].data; +} + +//------------------------------------------------------------------ +// DRStaticHashList +// find a hash by index +//------------------------------------------------------------------ +DHASH DRStaticHashList::findHashByIndex( u32 index ) const +{ + if( index>=m_nItems ) + return 0; + return m_pItems[index].hashValue; +} + +void DRStaticHashList::setDataByIndex(u32 index, void* data) +{ + if (index >= m_nItems) + return; + m_pItems[index].data = data; +} + +//------------------------------------------------------------------ +// DRStaticHashList +// find the index where a given hash value should go +// this is very similar to the FindByHash routine +//------------------------------------------------------------------ +u32 DRStaticHashList::findIndexForHash( DHASH hashValue ) +{ + s32 window[3]; + + if( m_nItems==0 ) + return 0; + + // simple binary search + // divide and conquer is maybe faster? + window[0] = 0; + window[2] = m_nItems-1; + while( window[0]<=window[2] ) + { + window[1] = (window[0]+window[2])/2; + + // is this the item we're looking for? + if( m_pItems[window[1]].hashValue==hashValue ) + return window[1]; + + // check whether to search top or bottom half of list + if( m_pItems[window[1]].hashValuehashValue) > (((DRHashListItem*)b)->hashValue) ) + return 1; + if( (((DRHashListItem*)a)->hashValue) < (((DRHashListItem*)b)->hashValue) ) + return -1; + return 0; +} + +void DRHashList::sortItems( u32 numItems, DRHashListItem *pItems ) +{ + qsort(pItems,numItems,getSizeOfItem(),hashSortFn); +} + +//------------------------------------------------------------------ +// DRHashList +// destructor +//------------------------------------------------------------------ +DRHashList::~DRHashList() +{ + clear(true); +} + +//------------------------------------------------------------------ +// DRHashList +// clear the hash list out +//------------------------------------------------------------------ +void DRHashList::clear( bool freeMemory ) +{ + m_nItems = 0; + if( freeMemory && m_pItems ) + { + m_maxItems = 0; + free(m_pItems); + m_pItems = 0; + } +} + + + +//------------------------------------------------------------------ +// DRHashList +// add an item to the DRHashList +//------------------------------------------------------------------ +bool DRHashList::addByHash( DHASH hashValue, void *pData ) +{ + u32 toIndex; + DRHashListItem *pMe; + + // find where this hashValue goes + toIndex = findIndexForHash(hashValue); + + // is an item with this hash already here? + if( toIndex!=m_nItems && m_pItems[toIndex].hashValue==hashValue ) + return false; + + // create room in the hash table + if( m_nItems==m_maxItems ) + { // need to reallocate some data + m_maxItems += 32; // allocate some more items + m_pItems = (DRHashListItem*)realloc(m_pItems,m_maxItems*getSizeOfItem()); + } + + pMe = &m_pItems[toIndex]; + + // make a hole for me to go + if( toIndex!=m_nItems ) + { + memmove( &pMe[1],pMe,(m_nItems-toIndex)*getSizeOfItem()); + } + + pMe->hashValue = hashValue; + pMe->data = pData; + + m_nItems++; + return true; + +} + +void DRHashList::resize(u32 newSize) +{ + if (newSize > m_maxItems) { + m_maxItems = newSize; + if (m_pItems) { + m_pItems = (DRHashListItem*)realloc(m_pItems, m_maxItems*getSizeOfItem()); + } + else { + m_pItems = (DRHashListItem *)malloc(m_maxItems*getSizeOfItem()); + } + } +} + +//------------------------------------------------------------------ +// DRHashList +// remove an item to the DRHashList +//------------------------------------------------------------------ +bool DRHashList::removeByHash( DHASH hashValue ) +{ + u32 toIndex; + + // find where this hashValue goes + toIndex = findIndexForHash(hashValue); + + // is an item with this hash here? + if( toIndex==m_nItems || m_pItems[toIndex].hashValue!=hashValue ) + return false; + + // remove this item from the list + m_nItems-=1; + if( toIndex!=m_nItems ) + { + memmove(&m_pItems[toIndex],&m_pItems[toIndex+1],(m_nItems-toIndex)*getSizeOfItem()); + } + return true; +} diff --git a/src/cpp/Crypto/DRHashList.h b/src/cpp/Crypto/DRHashList.h new file mode 100644 index 000000000..942ead91c --- /dev/null +++ b/src/cpp/Crypto/DRHashList.h @@ -0,0 +1,116 @@ +/*/************************************************************************* + * * + * Core, Core-Lib for my programs, Core doesn't need any libraries * + * Copyright (C) 2012, 2013, 2014 Dario Rekowski * + * Email: ***REMOVED*** Web: ***REMOVED*** * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ***************************************************************************/ + +//--------------------------------------------------------- +// hash list definition +// aus dem Buch "Goldene Regeln der Spieleprogrammierung" von Martin Brownlow +//--------------------------------------------------------- +#ifndef __DR_CORE2_HASH_LIST__ +#define __DR_CORE2_HASH_LIST__ + +#include "DRHash.h" + +//--------------------------------------------------------- +// an item in the hash list +//--------------------------------------------------------- +class DRHashListItem +{ +public: + DHASH hashValue; + void *data; +}; + +//--------------------------------------------------------- +// static hash list implementation +//--------------------------------------------------------- +class DRStaticHashList +{ +public: + DRStaticHashList() : m_nItems(0),m_pItems(0) { /*empty*/ } + ~DRStaticHashList() { /*empty*/ } + + void setData( u32 nItems, DRHashListItem *pItems); + const void *getData() const { return m_pItems; } + u32 getDataSize( ) const { return m_nItems*sizeof(DRHashListItem); } + u32 getNItems( ) const { return m_nItems; } + + void *findByHash( DHASH hashValue ) const; + void *findByIndex( u32 index ) const; + DHASH findHashByIndex( u32 index ) const; + void setDataByIndex(u32 index, void* data); + bool itemExists( DHASH hashValue, u32 *outIndex=0 ) const; + + + +protected: + // find the index where a hash value should go + u32 findIndexForHash( DHASH hashValue ); + inline static size_t getSizeOfItem() {return sizeof(DRHashListItem);} + +protected: + u32 m_nItems; + DRHashListItem *m_pItems; +}; + +//--------------------------------------------------------- +// general case hash list implementation +//--------------------------------------------------------- +class DRHashList : public DRStaticHashList +{ +public: + static void sortItems( u32 numItems, DRHashListItem *pItems ); + +public: + DRHashList() : DRStaticHashList(), m_maxItems(0) { /*empty*/ } + ~DRHashList(); + + // inherited functionality + //void *FindByHash( DHASH hashValue ) const; + + // clear the list + void clear( bool freeMemory=false ); + + // functions by hash + bool addByHash( DHASH hashValue, void *pData ); + bool removeByHash( DHASH hashValue ); + + void resize(u32 newSize); + + // functions by type + template + inline bool add( X *pData ) + { + return addByHash(pData->makeHash(),pData); + } + + template + inline bool remove( const X *pData ) + { + return removeByHash(pData->makeHash()); + } + +protected: + + u32 m_maxItems; +}; + + +#endif //__DR_CORE2_HASH_LIST__ diff --git a/src/cpp/Crypto/mnemonic.cpp b/src/cpp/Crypto/mnemonic.cpp new file mode 100644 index 000000000..1d6bf747b --- /dev/null +++ b/src/cpp/Crypto/mnemonic.cpp @@ -0,0 +1,98 @@ + + +#include "mnemonic.h" +#include +#include +#include "../dependencies/tinf/src/tinf.h" + +Mnemonic::Mnemonic() +{ + memset(mWords, 0, 2048); + mWordHashIndices.resize(2048); +} + +Mnemonic::~Mnemonic() +{ + for (int i = 0; i < 2048; i++) { + if (mWords[i]) { + free(mWords[i]); + } + } + memset(mWords, 0, 2048); + mWordHashIndices.clear(true); +} + + + +int Mnemonic::init(void(*fill_words_func)(unsigned char*), unsigned int original_size, unsigned int compressed_size) +{ + unsigned char* buffer = (unsigned char*)malloc(compressed_size); + unsigned char* uncompressed_buffer = (unsigned char*)malloc(original_size + 1); + memset(uncompressed_buffer, 0, original_size + 1); + fill_words_func(buffer); + + // uncompress + unsigned int original_size_cpy = original_size; + + if (tinf_gzip_uncompress(uncompressed_buffer, &original_size_cpy, buffer, compressed_size) != TINF_OK) { + free(buffer); + free(uncompressed_buffer); + return -1; + } + if (original_size_cpy != original_size) { + free(buffer); + free(uncompressed_buffer); + return -2; + } + else { + free(buffer); + + //printf("c[Mnemonic::%s] uncompressing success\n", __FUNCTION__); + // fill words in array and hashList + int cursor = 0; + u32 word_begin = 0, word_end = 0; + + for (unsigned int i = 0; i < original_size; i++) { + if (cursor >= 2048) { + return -3; + } + if (uncompressed_buffer[i] == ',') { + word_end = i; + + u32 word_size = word_end - word_begin; + if (word_end < word_begin) { + //printf("%c %c %c\n", uncompressed_buffer[i - 1], uncompressed_buffer[i], uncompressed_buffer[i + 1]); + //printf("%s\n", uncompressed_buffer); + continue; + } + // + 1 for null terminating + mWords[cursor] = (char*)malloc(word_size + 1); + + // fill hash list for fast reverse lookup + memset(mWords[cursor], 0, word_size + 1); + if (word_begin + word_size >= original_size) { + printf("c[Mnemonic::%s] word goes out of array bounds\n", __FUNCTION__); + free(uncompressed_buffer); + return -4; + } + memcpy(mWords[cursor], &uncompressed_buffer[word_begin], word_size); + + //char bu[256]; memset(bu, 0, 256); + //memcpy(bu, &uncompressed_buffer[word_begin - 1], 10); + //printf("word (%d): %s\n", cursor, bu); + + DHASH word_hash = DRMakeStringHash(mWords[cursor]); + mWordHashIndices.addByHash(word_hash, (void*)cursor); + + word_begin = i + 1; + cursor++; + } + } + //printf("c[Mnemonic::%s] before freeing uncompressed buffer \n", __FUNCTION__); + free(uncompressed_buffer); + return 0; + } + //printf("c[Mnemonic::%s] before freeing buffer \n", __FUNCTION__); + free(buffer); +} + diff --git a/src/cpp/Crypto/mnemonic.h b/src/cpp/Crypto/mnemonic.h new file mode 100644 index 000000000..3997e8cee --- /dev/null +++ b/src/cpp/Crypto/mnemonic.h @@ -0,0 +1,34 @@ +#ifndef DR_MNEMONIC_H +#define DR_MNEMONIC_H + +/*! + * + * @author: einhornimmond + * + * @date: 16.06.19 + * + * @desc: Class for handling mnemonic word list, unpacking, reverse lookup + * + */ + +#include "DRHashList.h" + + + +class Mnemonic +{ +public: + Mnemonic(); + ~Mnemonic(); + + int init(void(*fill_words_func)(unsigned char*), unsigned int original_size, unsigned int compressed_size); + + inline const char* getWord(unsigned int index) { if (index < 2048) return mWords[index]; return nullptr; } + inline unsigned long getWordIndex(const char* word) { DHASH word_hash = DRMakeStringHash(word); return (long)mWordHashIndices.findByHash(word_hash); } + +protected: + char* mWords[2048]; + DRHashList mWordHashIndices; +}; + +#endif //DR_MNEMONIC_H diff --git a/src/cpp/Crypto/mnemonic_bip0039.h b/src/cpp/Crypto/mnemonic_bip0039.h new file mode 100644 index 000000000..58ae879a4 --- /dev/null +++ b/src/cpp/Crypto/mnemonic_bip0039.h @@ -0,0 +1,11 @@ +#ifndef DR_MNEMONIC_WORDS_MNEMONIC_BIP0039_H +#define DR_MNEMONIC_WORDS_MNEMONIC_BIP0039_H + +unsigned int g_mnemonic_bip0039_original_size = 13115; +unsigned int g_mnemonic_bip0039_compressed_size = 6252; +void populate_mnemonic_bip0039(unsigned char* p) { +unsigned long long* pll = (unsigned long long*)p; +pll[0]=559903ULL;pll[1]=3074997613589433090ULL;pll[2]=11907643426225996816ULL;pll[3]=9217449475877880139ULL;pll[4]=615455023427346652ULL;pll[5]=14801448739181662793ULL;pll[6]=8803391086233728489ULL;pll[7]=2426966292694974726ULL;pll[8]=10037588029321990513ULL;pll[9]=7322102552812157871ULL;pll[10]=10577771259976922377ULL;pll[11]=16811096359651483899ULL;pll[12]=9206099683518652593ULL;pll[13]=16116579783922292285ULL;pll[14]=12473106395179875618ULL;pll[15]=15379402854760267446ULL;pll[16]=6862484664255141720ULL;pll[17]=9403165371300631679ULL;pll[18]=16474485307470588319ULL;pll[19]=15214297625373061017ULL;pll[20]=4513345045407772149ULL;pll[21]=16519537109011138489ULL;pll[22]=9862768487216860195ULL;pll[23]=16662057905818029797ULL;pll[24]=2586394652194075732ULL;pll[25]=15745457283219814315ULL;pll[26]=17334297893204310330ULL;pll[27]=7201140947293336778ULL;pll[28]=3244169003948906002ULL;pll[29]=7753568520329698280ULL;pll[30]=7546709575388864874ULL;pll[31]=10789119898253420574ULL;pll[32]=6079922622421529510ULL;pll[33]=4272185924537524826ULL;pll[34]=12708641323506945149ULL;pll[35]=415898696366800174ULL;pll[36]=11023270340135826483ULL;pll[37]=7671318521431888052ULL;pll[38]=9939159759796094717ULL;pll[39]=10986345730347228625ULL;pll[40]=17171197043454411786ULL;pll[41]=12390458167688353042ULL;pll[42]=7747416723341705761ULL;pll[43]=5973426371496534757ULL;pll[44]=15058807139224864099ULL;pll[45]=4594057683946621120ULL;pll[46]=5018454935777992126ULL;pll[47]=17966222235761862743ULL;pll[48]=6556289218428502493ULL;pll[49]=12257276381799764355ULL;pll[50]=16834908915120781549ULL;pll[51]=4862033501609092530ULL;pll[52]=17073918826970094850ULL;pll[53]=16453858093503578271ULL;pll[54]=7381191771949559722ULL;pll[55]=4791032410514485115ULL;pll[56]=9951175285980072113ULL;pll[57]=13954620599957667176ULL;pll[58]=14726046150631530814ULL;pll[59]=13740974402831048314ULL;pll[60]=7682054191723735526ULL;pll[61]=4158325069606356315ULL;pll[62]=16016623289493273423ULL;pll[63]=4165113819076826386ULL;pll[64]=18396606696777393291ULL;pll[65]=3053896678833998274ULL;pll[66]=3310301089379462101ULL;pll[67]=18018463020293475614ULL;pll[68]=3657942392444590124ULL;pll[69]=2792826531364565169ULL;pll[70]=3762868349233638096ULL;pll[71]=9041663339055564900ULL;pll[72]=13196737037270149771ULL;pll[73]=5411216423023723161ULL;pll[74]=11934612100383575515ULL;pll[75]=1367431261299779183ULL;pll[76]=4159233611916754729ULL;pll[77]=9132299021972024854ULL;pll[78]=2752526861346174770ULL;pll[79]=11395824326782282255ULL;pll[80]=1961772207728631971ULL;pll[81]=4674065719338509995ULL;pll[82]=15350665345722137987ULL;pll[83]=14878350225939551810ULL;pll[84]=10931771307860176087ULL;pll[85]=2806908403234905075ULL;pll[86]=14889809604218902039ULL;pll[87]=4159404632043478246ULL;pll[88]=7272849563053452031ULL;pll[89]=14265873476849550577ULL;pll[90]=14450802028029232396ULL;pll[91]=10674877555102993176ULL;pll[92]=8743903396835893176ULL;pll[93]=4831765678072374686ULL;pll[94]=15434673695989059147ULL;pll[95]=16775822365316868280ULL;pll[96]=3851047928993921528ULL;pll[97]=12073960150572639704ULL;pll[98]=2280795550650458046ULL;pll[99]=9965457463508456871ULL;pll[100]=78860889661706143ULL;pll[101]=10850841715419216479ULL;pll[102]=13109960861617046727ULL;pll[103]=1720609327230546764ULL;pll[104]=18409665650789554779ULL;pll[105]=11732686918493816845ULL;pll[106]=10881781438244641922ULL;pll[107]=14501367496996463200ULL;pll[108]=17271204846443076028ULL;pll[109]=17219485444530438109ULL;pll[110]=11108951875627776310ULL;pll[111]=2960240838319194475ULL;pll[112]=342016691131669172ULL;pll[113]=11221659340931158321ULL;pll[114]=6530628734873668259ULL;pll[115]=5542898072473205515ULL;pll[116]=5297802350676170965ULL;pll[117]=640443424185287262ULL;pll[118]=14026752941966692308ULL;pll[119]=14433496167851201801ULL;pll[120]=9534799987133773544ULL;pll[121]=6670197095562407383ULL;pll[122]=1924006357217188801ULL;pll[123]=1998522971662889685ULL;pll[124]=13974139698861043586ULL;pll[125]=3840478737406203114ULL;pll[126]=3617800718410551439ULL;pll[127]=10707388782067602534ULL;pll[128]=7537375113012081352ULL;pll[129]=7285690012685637560ULL;pll[130]=9906383210122194504ULL;pll[131]=4544912738321825325ULL;pll[132]=4674197023464575834ULL;pll[133]=5030683515689622409ULL;pll[134]=12438187389912361282ULL;pll[135]=5780045850117203333ULL;pll[136]=12868633087930028779ULL;pll[137]=18179477792216265003ULL;pll[138]=16852037203889667777ULL;pll[139]=14949265866008990920ULL;pll[140]=15793328451320454751ULL;pll[141]=11601473705966785185ULL;pll[142]=5695668533887343067ULL;pll[143]=11863911334108386641ULL;pll[144]=11894111908646054554ULL;pll[145]=5504372852678392175ULL;pll[146]=5304038994444760277ULL;pll[147]=12164484127313728603ULL;pll[148]=759934362106676880ULL;pll[149]=12859203271675241645ULL;pll[150]=14314182972469969312ULL;pll[151]=17873462290993759053ULL;pll[152]=10350557212052485280ULL;pll[153]=4514350485808732088ULL;pll[154]=14111227515946691703ULL;pll[155]=2895342643216368435ULL;pll[156]=211728221911486508ULL;pll[157]=10826201374076727186ULL;pll[158]=11952883493232523753ULL;pll[159]=11099360994692350034ULL;pll[160]=2654947490341213278ULL;pll[161]=2955190437662651909ULL;pll[162]=16615631315622247331ULL;pll[163]=3567926975415055533ULL;pll[164]=10651838504873678290ULL;pll[165]=11687345775502128747ULL;pll[166]=1983625553251770230ULL;pll[167]=14721091784955913981ULL;pll[168]=16140140343884428332ULL;pll[169]=13023432285901679370ULL;pll[170]=13116601198613502756ULL;pll[171]=12064210100820421452ULL;pll[172]=8422249793469411624ULL;pll[173]=3410978685979038637ULL;pll[174]=10801763506229403516ULL;pll[175]=12164505011669613717ULL;pll[176]=16890390074415126085ULL;pll[177]=16611831282538077190ULL;pll[178]=3942269575806298674ULL;pll[179]=8188506546182687081ULL;pll[180]=9093794579583052859ULL;pll[181]=5717113605909049692ULL;pll[182]=7613692090279017937ULL;pll[183]=17612344364840013471ULL;pll[184]=9773444712232654501ULL;pll[185]=602807428882806291ULL;pll[186]=10214408326666954110ULL;pll[187]=14517506173039874658ULL;pll[188]=11141599172715747991ULL;pll[189]=5095015973475602773ULL;pll[190]=2921285664476682425ULL;pll[191]=16874246027902326154ULL;pll[192]=930093020459646011ULL;pll[193]=12834425108262481447ULL;pll[194]=11486667141300368326ULL;pll[195]=1693741192221238343ULL;pll[196]=12475560674970364417ULL;pll[197]=8004412310789906626ULL;pll[198]=5815112582232044586ULL;pll[199]=16422210182644439596ULL;pll[200]=17460446393840667033ULL;pll[201]=8920185150739277501ULL;pll[202]=4493325887983962773ULL;pll[203]=10836451409503053969ULL;pll[204]=2626738329180038369ULL;pll[205]=13167784788368065655ULL;pll[206]=8460523741194271620ULL;pll[207]=4929800025929953969ULL;pll[208]=10673288627946302268ULL;pll[209]=6660897997662043616ULL;pll[210]=11820620031453053931ULL;pll[211]=17917326977670240040ULL;pll[212]=2276175895722306482ULL;pll[213]=1711005795607821754ULL;pll[214]=10939746790565102630ULL;pll[215]=10096018563586074919ULL;pll[216]=589066833573094334ULL;pll[217]=9293948256308863878ULL;pll[218]=1177695512158397131ULL;pll[219]=2261000456937696054ULL;pll[220]=3667509962390324262ULL;pll[221]=13972514271728595845ULL;pll[222]=6077523378905118233ULL;pll[223]=4120573922010256209ULL;pll[224]=7249109661311553959ULL;pll[225]=13308880464437593128ULL;pll[226]=16265936199150153755ULL;pll[227]=9866282031339327418ULL;pll[228]=9550093979925272682ULL;pll[229]=15087274751771567494ULL;pll[230]=7143941333836908172ULL;pll[231]=10697896846819143052ULL;pll[232]=1356361547746314368ULL;pll[233]=1447368054167900114ULL;pll[234]=1174420059337190761ULL;pll[235]=11926017946154691597ULL;pll[236]=17503413096654974520ULL;pll[237]=1799328525963637910ULL;pll[238]=12030379662596820290ULL;pll[239]=6007560318053816824ULL;pll[240]=16317715009657279725ULL;pll[241]=10540595970779923829ULL;pll[242]=2775687287846238307ULL;pll[243]=1840985767185329931ULL;pll[244]=2820563762656611030ULL;pll[245]=16532836083504749308ULL;pll[246]=3482464421605618135ULL;pll[247]=11176900009149169611ULL;pll[248]=9012489302133447664ULL;pll[249]=18389104174564415715ULL;pll[250]=10502041583645217215ULL;pll[251]=9386805246878083601ULL;pll[252]=6521874987267881535ULL;pll[253]=13975907545342648886ULL;pll[254]=8682384796993231393ULL;pll[255]=8705764052144336820ULL;pll[256]=2921593509770646020ULL;pll[257]=4704638969311793513ULL;pll[258]=16889122585158481637ULL;pll[259]=9299168916091212330ULL;pll[260]=7890825970688690398ULL;pll[261]=9877934469740239266ULL;pll[262]=6809809656095683332ULL;pll[263]=8446055165825068417ULL;pll[264]=13107314539107099564ULL;pll[265]=10310056773738122688ULL;pll[266]=16424983210239820659ULL;pll[267]=3109399705478802490ULL;pll[268]=13402790654129227193ULL;pll[269]=12025163985894419781ULL;pll[270]=1232782544925754080ULL;pll[271]=8273595335847341454ULL;pll[272]=8045366445975794779ULL;pll[273]=8878666791840024018ULL;pll[274]=14772553816435612652ULL;pll[275]=4576544572667376077ULL;pll[276]=3995463871455863321ULL;pll[277]=2722296776977395068ULL;pll[278]=16252062710876804468ULL;pll[279]=6616577834990405430ULL;pll[280]=16265081156475884699ULL;pll[281]=3911208485179190598ULL;pll[282]=14565471270805254850ULL;pll[283]=15128163827199295148ULL;pll[284]=7045137586166130716ULL;pll[285]=15819977181487376115ULL;pll[286]=11660502674714412700ULL;pll[287]=4184291049611547366ULL;pll[288]=12140167687053116740ULL;pll[289]=14284489725863665217ULL;pll[290]=3987780279184710219ULL;pll[291]=14192445357127506681ULL;pll[292]=14083155825702172239ULL;pll[293]=4907973053813284681ULL;pll[294]=2413647551998646329ULL;pll[295]=10793944892900372086ULL;pll[296]=7084724721708076127ULL;pll[297]=6753687573227966760ULL;pll[298]=14173343074788215793ULL;pll[299]=11796986056537535213ULL;pll[300]=2960268282638054538ULL;pll[301]=6737404636753054142ULL;pll[302]=15296392597495837660ULL;pll[303]=16088703828072697574ULL;pll[304]=12890259835306410119ULL;pll[305]=4619110671601909160ULL;pll[306]=15609390212919739700ULL;pll[307]=17477799899875893567ULL;pll[308]=8312376955924939918ULL;pll[309]=15537073506151699385ULL;pll[310]=16008499977099329813ULL;pll[311]=4943498365144415261ULL;pll[312]=10053901119702052331ULL;pll[313]=1838450229997147773ULL;pll[314]=11574546285147854752ULL;pll[315]=9254351613593089761ULL;pll[316]=9616893725961567180ULL;pll[317]=16353545655924457673ULL;pll[318]=2404335626480488457ULL;pll[319]=9698584568079561595ULL;pll[320]=3563186883857385402ULL;pll[321]=14366128764084885444ULL;pll[322]=1399388743323022980ULL;pll[323]=17474489419492274780ULL;pll[324]=16472514852542596178ULL;pll[325]=14429262247636164942ULL;pll[326]=13615726534967410992ULL;pll[327]=11905317860054826757ULL;pll[328]=15578885662310141594ULL;pll[329]=322283404344312780ULL;pll[330]=5261814866019094317ULL;pll[331]=15352340419406701247ULL;pll[332]=10107128044599330835ULL;pll[333]=8292021317439281212ULL;pll[334]=9908921368270240228ULL;pll[335]=18258470943382832144ULL;pll[336]=12219301865211036701ULL;pll[337]=14721618714452390771ULL;pll[338]=14246153471713104737ULL;pll[339]=13049447863034286314ULL;pll[340]=14673804627316320373ULL;pll[341]=10781674831455782131ULL;pll[342]=1612555101841410217ULL;pll[343]=3316756336551537940ULL;pll[344]=3395206555532737268ULL;pll[345]=13633578373774623036ULL;pll[346]=3397328804612822684ULL;pll[347]=13931647865006268560ULL;pll[348]=12995012762796853972ULL;pll[349]=17604964552239909869ULL;pll[350]=8321968382838056071ULL;pll[351]=5265308049631161956ULL;pll[352]=8126899327229389832ULL;pll[353]=14838542940676007359ULL;pll[354]=636042811003273384ULL;pll[355]=1284460814773437026ULL;pll[356]=81899117417259351ULL;pll[357]=18244571340642882705ULL;pll[358]=3250180006541416196ULL;pll[359]=16435042523389020642ULL;pll[360]=7931585871114472322ULL;pll[361]=11112105461864172681ULL;pll[362]=17359388754519985570ULL;pll[363]=14570236274938908719ULL;pll[364]=10091193797247494303ULL;pll[365]=268652229827504045ULL;pll[366]=4755232306593098421ULL;pll[367]=14223044830766202492ULL;pll[368]=8379225815673204872ULL;pll[369]=9215390939808439345ULL;pll[370]=6520846990517019586ULL;pll[371]=9515563124828684209ULL;pll[372]=5300898580883093258ULL;pll[373]=10039314023762502141ULL;pll[374]=17911803098954838340ULL;pll[375]=7419110604240763247ULL;pll[376]=9117365425752902477ULL;pll[377]=9117336711734652767ULL;pll[378]=10047220545097422793ULL;pll[379]=7713398097872682602ULL;pll[380]=4551181976065854949ULL;pll[381]=3969060376650118641ULL;pll[382]=10228984677916853008ULL;pll[383]=14130767023113771646ULL;pll[384]=5666835237431754009ULL;pll[385]=13455023390090935746ULL;pll[386]=15234192799142962779ULL;pll[387]=14661716184234348456ULL;pll[388]=11552057512646626924ULL;pll[389]=4809484174875189920ULL;pll[390]=4627053284718957448ULL;pll[391]=9171026219811491307ULL;pll[392]=151712548666360223ULL;pll[393]=10732594826864280622ULL;pll[394]=4952373705347547796ULL;pll[395]=17693448396245961380ULL;pll[396]=9585252792593868659ULL;pll[397]=406059892310868568ULL;pll[398]=10719255501555778871ULL;pll[399]=15424347122286277395ULL;pll[400]=11318905017887593993ULL;pll[401]=4570875513998353336ULL;pll[402]=6941059159084781143ULL;pll[403]=13148693010117502709ULL;pll[404]=7113402622870787242ULL;pll[405]=2824922731990702340ULL;pll[406]=11215763943948688155ULL;pll[407]=3041844212359031260ULL;pll[408]=17734766526146926962ULL;pll[409]=4440320662379658973ULL;pll[410]=10570792423316604493ULL;pll[411]=15163295304947691470ULL;pll[412]=5799795644928670058ULL;pll[413]=17372422098811167896ULL;pll[414]=6876101604566852521ULL;pll[415]=13518523221429055692ULL;pll[416]=17817412975113318281ULL;pll[417]=9477736274139273740ULL;pll[418]=8577156763914029436ULL;pll[419]=3179501529686497719ULL;pll[420]=3357538160842542629ULL;pll[421]=10944138738027543553ULL;pll[422]=7759944646169134824ULL;pll[423]=6696259718950069098ULL;pll[424]=5241425954698165720ULL;pll[425]=788048669733292427ULL;pll[426]=10422372614315763576ULL;pll[427]=17904367366974607979ULL;pll[428]=1817433726185350251ULL;pll[429]=9635549538558969630ULL;pll[430]=1693902766081466140ULL;pll[431]=17135360820906414718ULL;pll[432]=14150835127095542710ULL;pll[433]=13866532645377571930ULL;pll[434]=2960426018529440114ULL;pll[435]=9521245936438705432ULL;pll[436]=5212192780302356043ULL;pll[437]=14828178657699295308ULL;pll[438]=15555829057265086516ULL;pll[439]=13881744067190775947ULL;pll[440]=9131847138495497447ULL;pll[441]=10193955242571024744ULL;pll[442]=9699924941136485112ULL;pll[443]=6590551185060915600ULL;pll[444]=11926176923253477669ULL;pll[445]=9953263035912138523ULL;pll[446]=574076234365478328ULL;pll[447]=12584364150191334446ULL;pll[448]=4612049359444143550ULL;pll[449]=6816231774466090428ULL;pll[450]=96681833339736160ULL;pll[451]=16991005997320806534ULL;pll[452]=17724913663734481755ULL;pll[453]=9923763017224499029ULL;pll[454]=10415625566884837993ULL;pll[455]=8378550439135619364ULL;pll[456]=2383373853141751953ULL;pll[457]=14910360079443595845ULL;pll[458]=12445788233801901640ULL;pll[459]=18180797567449055800ULL;pll[460]=16471284229844082419ULL;pll[461]=2086712586581386112ULL;pll[462]=7294499222951705845ULL;pll[463]=16472413792983398946ULL;pll[464]=18145153176920586269ULL;pll[465]=9286875246188366572ULL;pll[466]=7642419776172100043ULL;pll[467]=13788015427652318518ULL;pll[468]=13797474190498408905ULL;pll[469]=8429203266469778404ULL;pll[470]=15301415331642860692ULL;pll[471]=12042571690320054467ULL;pll[472]=14484867514554839791ULL;pll[473]=15814776958724397592ULL;pll[474]=13755177833530872ULL;pll[475]=2900045168381599108ULL;pll[476]=11716920905000379227ULL;pll[477]=5156448929229013644ULL;pll[478]=9843809839359599906ULL;pll[479]=8633136770373499102ULL;pll[480]=17075108887481257756ULL;pll[481]=9413418273488744932ULL;pll[482]=9247056252352248600ULL;pll[483]=1408306458610026918ULL;pll[484]=7766559497974915800ULL;pll[485]=3604058735805392060ULL;pll[486]=784009464548124407ULL;pll[487]=3832921734016325768ULL;pll[488]=16809662733652323517ULL;pll[489]=9208442605299547127ULL;pll[490]=16056873352831092108ULL;pll[491]=804039244923758380ULL;pll[492]=6460435522628175205ULL;pll[493]=15942115884173733306ULL;pll[494]=16038952488748729030ULL;pll[495]=16701992653825137188ULL;pll[496]=10994534419980309133ULL;pll[497]=7374327012382117408ULL;pll[498]=16856656073549255753ULL;pll[499]=15560854216489285099ULL;pll[500]=10568974129053061501ULL;pll[501]=5037989336593400504ULL;pll[502]=9392475804989967639ULL;pll[503]=5992193546927136435ULL;pll[504]=4341161230016283176ULL;pll[505]=9064036207740696956ULL;pll[506]=10457740676050105724ULL;pll[507]=16058362434448377582ULL;pll[508]=9418165862140727345ULL;pll[509]=6644567400423369079ULL;pll[510]=7799283094558523720ULL;pll[511]=2030085424010787614ULL;pll[512]=13371697362915530044ULL;pll[513]=13505917794475699643ULL;pll[514]=15856389474558912279ULL;pll[515]=8792359573817623553ULL;pll[516]=14414556701838402361ULL;pll[517]=17207668499555855395ULL;pll[518]=6727096701790080495ULL;pll[519]=12130443125055838373ULL;pll[520]=7424716658662176369ULL;pll[521]=18216991036881663368ULL;pll[522]=17141178976591650336ULL;pll[523]=16279919550758135887ULL;pll[524]=7923568505295407467ULL;pll[525]=4585879606179988767ULL;pll[526]=15138715157747612028ULL;pll[527]=7468640666346469934ULL;pll[528]=9808807355680277670ULL;pll[529]=15973855788227672466ULL;pll[530]=10021439504089507117ULL;pll[531]=13611901009391005018ULL;pll[532]=10638788891397126017ULL;pll[533]=16055053563774893497ULL;pll[534]=1573970643172715005ULL;pll[535]=3322246678858048677ULL;pll[536]=10221899659469598207ULL;pll[537]=13527267872074496952ULL;pll[538]=10074630992892768663ULL;pll[539]=6979615656281766999ULL;pll[540]=15384100682478771797ULL;pll[541]=11109721594406582611ULL;pll[542]=15563936054720425114ULL;pll[543]=8618267022432204105ULL;pll[544]=8685834409161527244ULL;pll[545]=15628803744572185809ULL;pll[546]=7017059549004626903ULL;pll[547]=2637122571886478028ULL;pll[548]=4060680620964671593ULL;pll[549]=7540253995246420488ULL;pll[550]=14560691316635336025ULL;pll[551]=9119511398784705992ULL;pll[552]=1907144789530333823ULL;pll[553]=8797240639499039625ULL;pll[554]=3748273381192284199ULL;pll[555]=4895586347598882982ULL;pll[556]=15614142059761667311ULL;pll[557]=6860535051619177736ULL;pll[558]=17122251212781854402ULL;pll[559]=18047002630543301142ULL;pll[560]=10931934796451331333ULL;pll[561]=4063457560954678991ULL;pll[562]=2591650647361202736ULL;pll[563]=3055326166365355693ULL;pll[564]=17417738136369912513ULL;pll[565]=10609857596061664398ULL;pll[566]=2656331137799954953ULL;pll[567]=2397135902071933496ULL;pll[568]=10567827587312626571ULL;pll[569]=6236550262426129380ULL;pll[570]=17745929604907752219ULL;pll[571]=11212950699297205273ULL;pll[572]=9108266882106689322ULL;pll[573]=11636115444476884588ULL;pll[574]=10623919189741358476ULL;pll[575]=979156372925991307ULL;pll[576]=2344543885295828695ULL;pll[577]=12071750026560357374ULL;pll[578]=7286096693766350816ULL;pll[579]=2816488329661773667ULL;pll[580]=13453071150176844914ULL;pll[581]=5420285496441377924ULL;pll[582]=9732434564971761213ULL;pll[583]=5921688320749466811ULL;pll[584]=7174169286485149009ULL;pll[585]=1053971317497505068ULL;pll[586]=1665011056216515291ULL;pll[587]=10748267804662138769ULL;pll[588]=16124380867985428387ULL;pll[589]=17053797571703677865ULL;pll[590]=4977018110540485958ULL;pll[591]=2369327508112877841ULL;pll[592]=3325918771028577719ULL;pll[593]=13995701527527710170ULL;pll[594]=10782333413148230245ULL;pll[595]=15475668948189859397ULL;pll[596]=12341506686201816859ULL;pll[597]=13688387118543807492ULL;pll[598]=15553429770949279550ULL;pll[599]=6403794723070946481ULL;pll[600]=14630818294504015905ULL;pll[601]=6473839443841454544ULL;pll[602]=5837126625654435523ULL;pll[603]=3542174284252221551ULL;pll[604]=10699740444072899951ULL;pll[605]=15876707506172075523ULL;pll[606]=6630513692372593948ULL;pll[607]=5841193148531849169ULL;pll[608]=2046345376171304624ULL;pll[609]=1425452267086078068ULL;pll[610]=4482973386750373650ULL;pll[611]=15648471863344047437ULL;pll[612]=7222794553598382113ULL;pll[613]=2173314911545526457ULL;pll[614]=14446008910277735585ULL;pll[615]=2262809801411241489ULL;pll[616]=447308797412157543ULL;pll[617]=2822282237488319782ULL;pll[618]=4205884899066934814ULL;pll[619]=10038809339571305981ULL;pll[620]=15578141777217419138ULL;pll[621]=183953789171429224ULL;pll[622]=3979598153915402884ULL;pll[623]=9275608091372098080ULL;pll[624]=8097156114737643486ULL;pll[625]=7678189261403080713ULL;pll[626]=1576862044825410187ULL;pll[627]=7709485998639830689ULL;pll[628]=10421527653261458118ULL;pll[629]=1216976279943917446ULL;pll[630]=6597973102005633138ULL;pll[631]=14803171712325818633ULL;pll[632]=15653344262166924124ULL;pll[633]=6225780890351385813ULL;pll[634]=753540898511776108ULL;pll[635]=1881438064984065820ULL;pll[636]=4538280202021216707ULL;pll[637]=2594243162150361761ULL;pll[638]=15511002042404920467ULL;pll[639]=7437887189295305838ULL;pll[640]=14351189846438379388ULL;pll[641]=13184153351617749915ULL;pll[642]=5472018866270599404ULL;pll[643]=6876752575986521318ULL;pll[644]=14153115623775042288ULL;pll[645]=15057626699176261309ULL;pll[646]=16881826699242133306ULL;pll[647]=7112949994274348723ULL;pll[648]=8992290555266597663ULL;pll[649]=12866049947120610642ULL;pll[650]=587741027355370146ULL;pll[651]=3149453334041535840ULL;pll[652]=8770314443036592072ULL;pll[653]=4416908910803823972ULL;pll[654]=14240913290996527465ULL;pll[655]=9886194977080850853ULL;pll[656]=11767378431959640067ULL;pll[657]=10716839907185301770ULL;pll[658]=16977322360744698046ULL;pll[659]=359085067796657206ULL;pll[660]=16468151949699295404ULL;pll[661]=1249146712585551552ULL;pll[662]=13701477223216540052ULL;pll[663]=15330285957427092908ULL;pll[664]=1411875430014282190ULL;pll[665]=15606445354562336072ULL;pll[666]=13248453972608553103ULL;pll[667]=7460280276293386863ULL;pll[668]=9806228533825957931ULL;pll[669]=1113398443809891891ULL;pll[670]=12307839197394121660ULL;pll[671]=7264257377833926607ULL;pll[672]=12650816678753426832ULL;pll[673]=3400753365765543486ULL;pll[674]=16116201368829868831ULL;pll[675]=5857838079805195883ULL;pll[676]=920505065933440447ULL;pll[677]=4673884838851444851ULL;pll[678]=13201348649242045595ULL;pll[679]=2923457405576793536ULL;pll[680]=9098540537640254605ULL;pll[681]=13580432478026968035ULL;pll[682]=8090736498074500385ULL;pll[683]=5369771682163996064ULL;pll[684]=18021502300487332169ULL;pll[685]=17408675461165325158ULL;pll[686]=3837727020370348390ULL;pll[687]=767590417240646771ULL;pll[688]=16078785676077987972ULL;pll[689]=11647934202929306125ULL;pll[690]=11446713085815708252ULL;pll[691]=5435087206251553612ULL;pll[692]=6584024347551851279ULL;pll[693]=13309339168056793412ULL;pll[694]=8841606781699662467ULL;pll[695]=4112204518423065401ULL;pll[696]=6083783722341816220ULL;pll[697]=13655109281888978623ULL;pll[698]=14606146707548475722ULL;pll[699]=17141091043654599970ULL;pll[700]=11721730227128066735ULL;pll[701]=2651298829059473869ULL;pll[702]=16351672445456128641ULL;pll[703]=17682737426399659828ULL;pll[704]=6546220327925124816ULL;pll[705]=3087133277117671842ULL;pll[706]=10657448940102292812ULL;pll[707]=16743531829729889603ULL;pll[708]=4911034155688177264ULL;pll[709]=2957244727040095537ULL;pll[710]=12855103071391239644ULL;pll[711]=13408738168296454882ULL;pll[712]=8681880710252951386ULL;pll[713]=16580456180230254676ULL;pll[714]=5239931982295289976ULL;pll[715]=10308506623459675995ULL;pll[716]=713160289526059652ULL;pll[717]=15284899767890567848ULL;pll[718]=6875739879339274402ULL;pll[719]=13743839049766663588ULL;pll[720]=14399672458060076719ULL;pll[721]=16265970540593873745ULL;pll[722]=806299950252061099ULL;pll[723]=7156014459136066684ULL;pll[724]=10255094914398177675ULL;pll[725]=5237219002252823398ULL;pll[726]=13011597895194978147ULL;pll[727]=6632101264380377865ULL;pll[728]=17655508550986157790ULL;pll[729]=16609375525814787035ULL;pll[730]=14976256118699472872ULL;pll[731]=8232281568647340682ULL;pll[732]=4940910343221731374ULL;pll[733]=5546211526492056572ULL;pll[734]=2774038474944006923ULL;pll[735]=11270215103504338532ULL;pll[736]=17249896166640392067ULL;pll[737]=12416924485797098489ULL;pll[738]=2028865614646280719ULL;pll[739]=14167364787603559953ULL;pll[740]=7372649485275117696ULL;pll[741]=305979105904452736ULL;pll[742]=17030962995314696119ULL;pll[743]=8420977175235799932ULL;pll[744]=2836899915989462575ULL;pll[745]=2663351334470667328ULL;pll[746]=950449359846550135ULL;pll[747]=4633834025044015892ULL;pll[748]=10486600086715017636ULL;pll[749]=18311435157493369658ULL;pll[750]=11551258782970668286ULL;pll[751]=9194861624242202875ULL;pll[752]=4750851535833563646ULL;pll[753]=18234830602097369567ULL;pll[754]=10447134400021679333ULL;pll[755]=1640380733927659082ULL;pll[756]=13970732812153480177ULL;pll[757]=9534506765943096895ULL;pll[758]=9821978639093642665ULL;pll[759]=3186374790517868181ULL;pll[760]=15416808051187318301ULL;pll[761]=5172709891515576210ULL;pll[762]=11467186052418797516ULL;pll[763]=1541327509623409699ULL;pll[764]=16735236697763799289ULL;pll[765]=9232908339168346427ULL;pll[766]=12911124770773512316ULL;pll[767]=1865992514663858695ULL;pll[768]=3704286204264406747ULL;pll[769]=3107751942250086998ULL;pll[770]=87607226951516111ULL;pll[771]=6335505594675886665ULL;pll[772]=375812094504020030ULL;pll[773]=561324634207325095ULL;pll[774]=7141318842752758653ULL;pll[775]=14379371226156681612ULL;pll[776]=8047865443677633542ULL;pll[777]=8522938938623253936ULL;pll[778]=14695905603084287652ULL;pll[779]=8794427864489ULL;pll[780]=16813337791651119103ULL; +p[6248]=59;p[6249]=51;p[6250]=0;p[6251]=0; +} +#endif //DR_MNEMONIC_WORDS_MNEMONIC_BIP0039_H \ No newline at end of file diff --git a/src/cpp/Crypto/mnemonic_german.h b/src/cpp/Crypto/mnemonic_german.h new file mode 100644 index 000000000..f687a5551 --- /dev/null +++ b/src/cpp/Crypto/mnemonic_german.h @@ -0,0 +1,11 @@ +#ifndef DR_MNEMONIC_WORDS_MNEMONIC_GERMAN_H +#define DR_MNEMONIC_WORDS_MNEMONIC_GERMAN_H + +unsigned int g_mnemonic_german_original_size = 19246; +unsigned int g_mnemonic_german_compressed_size = 9387; +void populate_mnemonic_german(unsigned char* p) { +unsigned long long* pll = (unsigned long long*)p; +pll[0]=559903ULL;pll[1]=13448982488816552706ULL;pll[2]=3852556127917956270ULL;pll[3]=15980678496554856870ULL;pll[4]=16025081029345629715ULL;pll[5]=11931935869670735303ULL;pll[6]=11788123267219630418ULL;pll[7]=1908709009333676676ULL;pll[8]=8346352977379473206ULL;pll[9]=16418843308734900584ULL;pll[10]=16992016985717266175ULL;pll[11]=17935581820304837601ULL;pll[12]=2171826644595256317ULL;pll[13]=4953414016917800596ULL;pll[14]=16713555840261670615ULL;pll[15]=7028700098503964848ULL;pll[16]=16569010346541359097ULL;pll[17]=15474299228300815698ULL;pll[18]=15774116605417668257ULL;pll[19]=6882306435767165895ULL;pll[20]=18246470610967150124ULL;pll[21]=13310929877335459248ULL;pll[22]=11291795436619573784ULL;pll[23]=8250060671319667779ULL;pll[24]=9700329907223992748ULL;pll[25]=8557670140288384567ULL;pll[26]=10371210080105258374ULL;pll[27]=5503329446307736351ULL;pll[28]=17301628048772525294ULL;pll[29]=10591929133338458617ULL;pll[30]=3062040330199469055ULL;pll[31]=775133689899437849ULL;pll[32]=7727035469660208365ULL;pll[33]=6691979990943789960ULL;pll[34]=3228511595363822470ULL;pll[35]=15774634736022059957ULL;pll[36]=4435171489230016113ULL;pll[37]=4280404220622372560ULL;pll[38]=16684202944239031145ULL;pll[39]=7424307668651339818ULL;pll[40]=8711226372895422144ULL;pll[41]=14872555948083031652ULL;pll[42]=2842135341760998423ULL;pll[43]=1928204084633600760ULL;pll[44]=7201113047077457302ULL;pll[45]=16970043257222562702ULL;pll[46]=230349745854557691ULL;pll[47]=5218436333381066945ULL;pll[48]=1009878586459969051ULL;pll[49]=16025871587036063234ULL;pll[50]=5444715286765874166ULL;pll[51]=9752306457834191839ULL;pll[52]=10412030267410407603ULL;pll[53]=10581905266253389679ULL;pll[54]=2640391667654333650ULL;pll[55]=11496542934329373273ULL;pll[56]=17214871226267663420ULL;pll[57]=10433737492563915479ULL;pll[58]=9109127012357289324ULL;pll[59]=5945244865545840389ULL;pll[60]=5627462597874350974ULL;pll[61]=2162573802986070780ULL;pll[62]=12414061093423828772ULL;pll[63]=14929685894886078137ULL;pll[64]=8005807317558223201ULL;pll[65]=1610136368861160131ULL;pll[66]=15434820308283746810ULL;pll[67]=3598554134833618002ULL;pll[68]=6375016193782062364ULL;pll[69]=10954743045651577798ULL;pll[70]=11134800642542567059ULL;pll[71]=862009065179687165ULL;pll[72]=17789453769644304206ULL;pll[73]=13198984796814054012ULL;pll[74]=6553510474862169838ULL;pll[75]=16911413513806951955ULL;pll[76]=7489748147048669800ULL;pll[77]=18125051643293992172ULL;pll[78]=17471853784780802437ULL;pll[79]=6200516033448491758ULL;pll[80]=1218748640835191731ULL;pll[81]=11705035547695823982ULL;pll[82]=2199950746010487512ULL;pll[83]=15267464548111831310ULL;pll[84]=15535361527310488635ULL;pll[85]=4085925830490790234ULL;pll[86]=1869041614605599985ULL;pll[87]=6874811418597161267ULL;pll[88]=14671291309436119280ULL;pll[89]=4516763408074395586ULL;pll[90]=4075515203831992890ULL;pll[91]=8937136118455752658ULL;pll[92]=3195569887112350048ULL;pll[93]=11445548488412186773ULL;pll[94]=14757823603422378726ULL;pll[95]=6745179074787761557ULL;pll[96]=4106727650244796861ULL;pll[97]=17955451469382519418ULL;pll[98]=4827715350603408326ULL;pll[99]=13226433210191560252ULL;pll[100]=9021676356646061284ULL;pll[101]=16594321358669662986ULL;pll[102]=10242060044166164113ULL;pll[103]=17791683216524777819ULL;pll[104]=6371294620966694784ULL;pll[105]=9467629050131487682ULL;pll[106]=12936505958954964667ULL;pll[107]=18224280727466400675ULL;pll[108]=4933377210453588068ULL;pll[109]=6414171174427228359ULL;pll[110]=1982921373664033251ULL;pll[111]=2976323283794494371ULL;pll[112]=12638438777285751779ULL;pll[113]=13204417104936898585ULL;pll[114]=16263390492890505443ULL;pll[115]=1599191407598419608ULL;pll[116]=4512532065257553737ULL;pll[117]=9944210780268673658ULL;pll[118]=10436983858228221113ULL;pll[119]=9434649941639962096ULL;pll[120]=18124244167536697011ULL;pll[121]=6934886804468352497ULL;pll[122]=10733398319976118907ULL;pll[123]=8685728978551044275ULL;pll[124]=914116266905099610ULL;pll[125]=4296985318990021639ULL;pll[126]=9487577249402309113ULL;pll[127]=1959548209061817660ULL;pll[128]=3436784443587977341ULL;pll[129]=15619541385074280655ULL;pll[130]=13971302282420712568ULL;pll[131]=6356595456253059458ULL;pll[132]=3194045629502761313ULL;pll[133]=8937797835051501726ULL;pll[134]=7116740252393115313ULL;pll[135]=18225894112722559827ULL;pll[136]=2557193177538730677ULL;pll[137]=1417433783632572016ULL;pll[138]=5772340733126601183ULL;pll[139]=5756850632736558026ULL;pll[140]=12808573860530378228ULL;pll[141]=3220342806162025863ULL;pll[142]=6648952683102322763ULL;pll[143]=14385946229610965338ULL;pll[144]=1063411972631184458ULL;pll[145]=5051947029121113850ULL;pll[146]=11874088609620123333ULL;pll[147]=5838122687419568548ULL;pll[148]=18440180277452851836ULL;pll[149]=10487847660685640498ULL;pll[150]=3653892699935238281ULL;pll[151]=3411500330268548907ULL;pll[152]=5324877015245852846ULL;pll[153]=15028695466935109698ULL;pll[154]=2554113839557711750ULL;pll[155]=9460519047094837649ULL;pll[156]=17299172537873008845ULL;pll[157]=490421558141175851ULL;pll[158]=10919746098028525732ULL;pll[159]=1504897124542612654ULL;pll[160]=5110561933290944858ULL;pll[161]=2430300271248900369ULL;pll[162]=7075986899984777214ULL;pll[163]=376261801920159242ULL;pll[164]=11366589140077852335ULL;pll[165]=2232907300657520130ULL;pll[166]=8944325030418722398ULL;pll[167]=16303336926236227126ULL;pll[168]=13634903838305508505ULL;pll[169]=13011008786163013064ULL;pll[170]=13595633111290385875ULL;pll[171]=10394766999279280144ULL;pll[172]=4125668275488452629ULL;pll[173]=3837311957310100694ULL;pll[174]=13651714524534325601ULL;pll[175]=8250778873198991297ULL;pll[176]=7273807071505556276ULL;pll[177]=9209003621014799090ULL;pll[178]=14108988427626371321ULL;pll[179]=393182841788157571ULL;pll[180]=10097708607866889312ULL;pll[181]=1239259511827428537ULL;pll[182]=10606525572192237645ULL;pll[183]=2577118641441158395ULL;pll[184]=226130790482751248ULL;pll[185]=795077615467014917ULL;pll[186]=10322287600855234276ULL;pll[187]=3588285033045277694ULL;pll[188]=68988346503694788ULL;pll[189]=13264160892293193574ULL;pll[190]=2681041125938939095ULL;pll[191]=2322729402107847363ULL;pll[192]=9803883468919529842ULL;pll[193]=5678362647045320077ULL;pll[194]=7428104024387015045ULL;pll[195]=11811118516768317575ULL;pll[196]=8376286441682205253ULL;pll[197]=7386002688974544396ULL;pll[198]=208556469638272603ULL;pll[199]=1531156989263420752ULL;pll[200]=14817839182852708094ULL;pll[201]=14487090724630162013ULL;pll[202]=15735928694479784416ULL;pll[203]=10070386885748073610ULL;pll[204]=15259672677797007251ULL;pll[205]=1732021499661262542ULL;pll[206]=10327651856005653246ULL;pll[207]=16653172424002569744ULL;pll[208]=4670313424183235968ULL;pll[209]=16217897329796522054ULL;pll[210]=2121892167218398609ULL;pll[211]=7516875806706351422ULL;pll[212]=13170950043881857392ULL;pll[213]=156570392389356480ULL;pll[214]=11609728350063818603ULL;pll[215]=4913496717364631954ULL;pll[216]=5462589374539868760ULL;pll[217]=3893977226993009244ULL;pll[218]=4306951415592166544ULL;pll[219]=11849888784699345018ULL;pll[220]=6506010697470272285ULL;pll[221]=888146853009473036ULL;pll[222]=5558208641495310103ULL;pll[223]=12458786346468195695ULL;pll[224]=8851271867940484635ULL;pll[225]=2447985965119012807ULL;pll[226]=13846771506570363096ULL;pll[227]=1140439477179131897ULL;pll[228]=3344358885970638096ULL;pll[229]=15805119336813488673ULL;pll[230]=9308704250430339378ULL;pll[231]=785114866682503916ULL;pll[232]=13506486052739703378ULL;pll[233]=13970811201240587095ULL;pll[234]=1428160505015238728ULL;pll[235]=7317822105709646329ULL;pll[236]=9293591517799756165ULL;pll[237]=8961672791251569272ULL;pll[238]=13141806849160548985ULL;pll[239]=429447717051539955ULL;pll[240]=18209432821250908927ULL;pll[241]=10534797213007375565ULL;pll[242]=11101205594096787504ULL;pll[243]=3974150163395601645ULL;pll[244]=17751064792404238355ULL;pll[245]=11979223534470102178ULL;pll[246]=6286388483766509973ULL;pll[247]=14269983434569151332ULL;pll[248]=14143664763909260935ULL;pll[249]=14258222545430503321ULL;pll[250]=14432471341434884327ULL;pll[251]=4278091392069171203ULL;pll[252]=17437464318242105626ULL;pll[253]=55701549010281585ULL;pll[254]=969008239720939722ULL;pll[255]=5871007998888485141ULL;pll[256]=8675460901294625797ULL;pll[257]=6903235828108576876ULL;pll[258]=6450495628648382973ULL;pll[259]=17497681757865450655ULL;pll[260]=4877215793609304154ULL;pll[261]=6549433005946129887ULL;pll[262]=6648596259412422471ULL;pll[263]=10100718603908542062ULL;pll[264]=13992119097697525084ULL;pll[265]=11357093427784482566ULL;pll[266]=5268543211038566161ULL;pll[267]=328446225529706147ULL;pll[268]=7019046806955462041ULL;pll[269]=4262794926032356425ULL;pll[270]=5283077099198220985ULL;pll[271]=3064579051809148038ULL;pll[272]=4964177953708896077ULL;pll[273]=4763352840060795915ULL;pll[274]=4074198362434621471ULL;pll[275]=5225998911404167800ULL;pll[276]=12473920361040055930ULL;pll[277]=1767156404088570934ULL;pll[278]=15540729773926956164ULL;pll[279]=1016694450812252416ULL;pll[280]=10725036340501069098ULL;pll[281]=6744402371719005162ULL;pll[282]=3363249881874526249ULL;pll[283]=11111855256386531731ULL;pll[284]=10461786111923686173ULL;pll[285]=11209562841592825077ULL;pll[286]=4048064131957522691ULL;pll[287]=12268511343302078385ULL;pll[288]=11763333434794399057ULL;pll[289]=13353190872277391836ULL;pll[290]=16204573544324685569ULL;pll[291]=5361238034914010702ULL;pll[292]=1294663634204614038ULL;pll[293]=14333675291495942602ULL;pll[294]=1819575138545704644ULL;pll[295]=10994813415524125387ULL;pll[296]=9664672675811878136ULL;pll[297]=17410983688574450682ULL;pll[298]=614576154273994844ULL;pll[299]=17577722134874313412ULL;pll[300]=17855992586182932677ULL;pll[301]=6155310296981360290ULL;pll[302]=14469118963234883482ULL;pll[303]=8582607226619884327ULL;pll[304]=14033938939415276573ULL;pll[305]=15297106712948189651ULL;pll[306]=11257407389785330091ULL;pll[307]=12023678145311345651ULL;pll[308]=9808184963377792514ULL;pll[309]=10717649770430252439ULL;pll[310]=16456938150463112479ULL;pll[311]=2712319798831564970ULL;pll[312]=15213699944574680978ULL;pll[313]=733953121492264432ULL;pll[314]=4352587958008414883ULL;pll[315]=15085010350720691822ULL;pll[316]=1445363152616208059ULL;pll[317]=15276707438331137661ULL;pll[318]=212106560329044725ULL;pll[319]=15461195691108949878ULL;pll[320]=8011482236796057967ULL;pll[321]=10494658731533102528ULL;pll[322]=4733366846808524673ULL;pll[323]=7599573723186804676ULL;pll[324]=5596617371407945869ULL;pll[325]=441368892905614843ULL;pll[326]=14918437849360502579ULL;pll[327]=8792945457221471717ULL;pll[328]=2962986241762411670ULL;pll[329]=9994145122193248316ULL;pll[330]=6608355810206473288ULL;pll[331]=15199847410873505260ULL;pll[332]=1166278930554047399ULL;pll[333]=17203492337990382296ULL;pll[334]=4517468843029510736ULL;pll[335]=12945928611965987628ULL;pll[336]=10299700806051231986ULL;pll[337]=976652755703277660ULL;pll[338]=16948687019741363970ULL;pll[339]=10437631870626704979ULL;pll[340]=356006600992889674ULL;pll[341]=8153075902452244507ULL;pll[342]=5280307891098353217ULL;pll[343]=12896542375052328634ULL;pll[344]=10521478440477838439ULL;pll[345]=9870458104040474896ULL;pll[346]=14979105490104164733ULL;pll[347]=18237613121421459240ULL;pll[348]=5120514183817208391ULL;pll[349]=5662575288210060256ULL;pll[350]=2272979728703863084ULL;pll[351]=8050365265038435058ULL;pll[352]=10502191917763185382ULL;pll[353]=5173621108627272495ULL;pll[354]=11703529270789537172ULL;pll[355]=7353571391615566760ULL;pll[356]=12494253299730089568ULL;pll[357]=12197246614852367876ULL;pll[358]=4953714291901638899ULL;pll[359]=3810052644928667576ULL;pll[360]=795439911454544712ULL;pll[361]=9202184017054747163ULL;pll[362]=6027222900102300584ULL;pll[363]=9995076960294464143ULL;pll[364]=10893521438062444232ULL;pll[365]=13995909268026205718ULL;pll[366]=1055216283595184592ULL;pll[367]=10458364387968510935ULL;pll[368]=6303921624390914870ULL;pll[369]=8690841508196395216ULL;pll[370]=17805126145100988531ULL;pll[371]=1118282176491691364ULL;pll[372]=10295575805284072162ULL;pll[373]=1724581507229018439ULL;pll[374]=2447932763112087139ULL;pll[375]=2856980559568252082ULL;pll[376]=1313879275733838309ULL;pll[377]=9227070883277911464ULL;pll[378]=15029037626645955393ULL;pll[379]=16394995205450868746ULL;pll[380]=485233779348836294ULL;pll[381]=10769687652000890002ULL;pll[382]=10250536462838223606ULL;pll[383]=5862260575951147336ULL;pll[384]=4371325209510563798ULL;pll[385]=17870681694958060042ULL;pll[386]=6790596983136369097ULL;pll[387]=8904535938765032544ULL;pll[388]=14502372659186965632ULL;pll[389]=10752062218475276309ULL;pll[390]=13634533128962516545ULL;pll[391]=4803671136838337582ULL;pll[392]=14814491391326399794ULL;pll[393]=13475158679001286845ULL;pll[394]=18146428291386259999ULL;pll[395]=3537552297325103218ULL;pll[396]=14404143671118619655ULL;pll[397]=3125595767282336857ULL;pll[398]=2923713895500590790ULL;pll[399]=14107762957355486087ULL;pll[400]=9976193337562033957ULL;pll[401]=14524741009192762792ULL;pll[402]=15803705422214359622ULL;pll[403]=7764897699923416700ULL;pll[404]=155635915955288520ULL;pll[405]=17632810289682778552ULL;pll[406]=7872007663198997131ULL;pll[407]=6434006629914404697ULL;pll[408]=5831093891798219249ULL;pll[409]=10810699072296686053ULL;pll[410]=15435988943327470018ULL;pll[411]=420649584361572782ULL;pll[412]=8585084028109433251ULL;pll[413]=11586983014825777340ULL;pll[414]=16536408871188505335ULL;pll[415]=6403797397702718129ULL;pll[416]=7188924416577028732ULL;pll[417]=6980164940554757303ULL;pll[418]=2265674797610137627ULL;pll[419]=10327221537287717005ULL;pll[420]=6493634732126644936ULL;pll[421]=14865188199814226978ULL;pll[422]=15428693045642606867ULL;pll[423]=3495705394686806173ULL;pll[424]=358605750725042527ULL;pll[425]=7920620808208682142ULL;pll[426]=4974043163935479453ULL;pll[427]=7234768619040498744ULL;pll[428]=6375932939265555404ULL;pll[429]=12271660022116827706ULL;pll[430]=3910363578304899823ULL;pll[431]=6822893534877594915ULL;pll[432]=7388155824323905485ULL;pll[433]=2626188643579627359ULL;pll[434]=2928274289917208588ULL;pll[435]=2341453769983525764ULL;pll[436]=6434420044929457273ULL;pll[437]=8085975741200976800ULL;pll[438]=16785480047647023694ULL;pll[439]=9055650889600333975ULL;pll[440]=10493660592735134272ULL;pll[441]=5511248589436125309ULL;pll[442]=7565797012704156670ULL;pll[443]=17587022990078900938ULL;pll[444]=3491398119702405715ULL;pll[445]=8503702219604177456ULL;pll[446]=5059033715610617877ULL;pll[447]=10346679374176742678ULL;pll[448]=3143589316591456142ULL;pll[449]=11283179033866724887ULL;pll[450]=15172724404288180818ULL;pll[451]=5218965741311140751ULL;pll[452]=5816726873639752987ULL;pll[453]=2240873234514927884ULL;pll[454]=14588100744541024317ULL;pll[455]=11587560734181828646ULL;pll[456]=15439594414123993158ULL;pll[457]=1156875376923076706ULL;pll[458]=13209034041464235041ULL;pll[459]=13843522985380319242ULL;pll[460]=11949481035064509092ULL;pll[461]=12200330905744646113ULL;pll[462]=12646039645456446830ULL;pll[463]=315685321771962030ULL;pll[464]=3470968980843524207ULL;pll[465]=7219531430040004042ULL;pll[466]=11514977640213925645ULL;pll[467]=10761067199605503948ULL;pll[468]=15902973514135082225ULL;pll[469]=204526317358865250ULL;pll[470]=13878455024895554062ULL;pll[471]=11677514210123178219ULL;pll[472]=5654517175860537012ULL;pll[473]=5993758167491406896ULL;pll[474]=2873599139480499740ULL;pll[475]=2727777361830582451ULL;pll[476]=6967310983395765471ULL;pll[477]=18380645622925108844ULL;pll[478]=15587010333452537460ULL;pll[479]=13168615031473501346ULL;pll[480]=17534198062139117477ULL;pll[481]=16878487449244557616ULL;pll[482]=15868113678831683226ULL;pll[483]=335680128687978096ULL;pll[484]=8596688765370487744ULL;pll[485]=15802817229183807434ULL;pll[486]=8496164973125594668ULL;pll[487]=18235196530707651806ULL;pll[488]=11396179589820393834ULL;pll[489]=9643403084177711222ULL;pll[490]=15290377234452695215ULL;pll[491]=16970740168293127311ULL;pll[492]=10484911059468166418ULL;pll[493]=10741580704495187693ULL;pll[494]=970078651612164405ULL;pll[495]=9190672886803975226ULL;pll[496]=2024520875257353102ULL;pll[497]=7889034106221158338ULL;pll[498]=3571010851845272032ULL;pll[499]=14759117198275572357ULL;pll[500]=14791983535314091939ULL;pll[501]=634707109223786838ULL;pll[502]=8289946084152566019ULL;pll[503]=2094203229680445440ULL;pll[504]=13021310931236833958ULL;pll[505]=13914722935206301024ULL;pll[506]=69352207731543399ULL;pll[507]=3680289533323600050ULL;pll[508]=6557356208565473563ULL;pll[509]=4364510557358169781ULL;pll[510]=13297343070808020730ULL;pll[511]=1836977571784374695ULL;pll[512]=3425268379530615098ULL;pll[513]=11828667334989797329ULL;pll[514]=12604066573092170682ULL;pll[515]=6873507915274504387ULL;pll[516]=330542195784472300ULL;pll[517]=14278831568329516003ULL;pll[518]=14464503182401001090ULL;pll[519]=8592880918519430473ULL;pll[520]=7842948466810615779ULL;pll[521]=6290370164780339537ULL;pll[522]=649566100016223319ULL;pll[523]=11792032143063984719ULL;pll[524]=14859348105632707242ULL;pll[525]=11257950185136376599ULL;pll[526]=17879496158210746706ULL;pll[527]=1959645071280177713ULL;pll[528]=12910858787253465904ULL;pll[529]=12028336925953173150ULL;pll[530]=7456564717080370698ULL;pll[531]=6428208469071854508ULL;pll[532]=6067678963659206322ULL;pll[533]=10113235404273462204ULL;pll[534]=2893227593176359040ULL;pll[535]=15858046633889199783ULL;pll[536]=3732387325213041998ULL;pll[537]=17296365278164218375ULL;pll[538]=15274071991968620568ULL;pll[539]=15604227946770759156ULL;pll[540]=5114106573648872675ULL;pll[541]=7965154883342696633ULL;pll[542]=18007740972554365652ULL;pll[543]=4242085917597376648ULL;pll[544]=16735661644109491908ULL;pll[545]=17578480167524792631ULL;pll[546]=4178848264945184685ULL;pll[547]=15745358904572725717ULL;pll[548]=5047023476905836928ULL;pll[549]=6341975343058434268ULL;pll[550]=11110761056253218313ULL;pll[551]=707743500938315650ULL;pll[552]=15979804787876777650ULL;pll[553]=7432925958266183026ULL;pll[554]=5748535102944404161ULL;pll[555]=14195502870618450386ULL;pll[556]=4821780092398178208ULL;pll[557]=4396417037208044656ULL;pll[558]=16602369869153833614ULL;pll[559]=7785639487088358666ULL;pll[560]=6759264570634067783ULL;pll[561]=17030858364787685309ULL;pll[562]=1334975158348322189ULL;pll[563]=8961559160717816155ULL;pll[564]=13594854166727432463ULL;pll[565]=1112255899657349492ULL;pll[566]=14364378634121228030ULL;pll[567]=127296623618630986ULL;pll[568]=5825817736577638153ULL;pll[569]=9940815721449910165ULL;pll[570]=6151396157018151256ULL;pll[571]=12513539032892711526ULL;pll[572]=4982095615326421183ULL;pll[573]=6899294145760966745ULL;pll[574]=6177933036612245320ULL;pll[575]=12944578912780143018ULL;pll[576]=11001086601913429325ULL;pll[577]=18029711675830913185ULL;pll[578]=7980839095549330133ULL;pll[579]=10171584920611362343ULL;pll[580]=9395889550121673082ULL;pll[581]=16087412947633326406ULL;pll[582]=11392684511921440773ULL;pll[583]=17384505152876665590ULL;pll[584]=13352562942245498848ULL;pll[585]=13042925121161901197ULL;pll[586]=4046417492114773703ULL;pll[587]=10683351515954957805ULL;pll[588]=7018807803279693127ULL;pll[589]=10337318416293166364ULL;pll[590]=6745349359474038029ULL;pll[591]=15284514578537057083ULL;pll[592]=16495142447435784252ULL;pll[593]=6698299349999666499ULL;pll[594]=7904019316382157947ULL;pll[595]=3434192244022641580ULL;pll[596]=6318887201241725820ULL;pll[597]=15229639126940342852ULL;pll[598]=533555025717620250ULL;pll[599]=7418195343806299446ULL;pll[600]=7096238845180921981ULL;pll[601]=212064728883349962ULL;pll[602]=615981147270653068ULL;pll[603]=5803537410039431180ULL;pll[604]=18203749275187567803ULL;pll[605]=1168234034157736429ULL;pll[606]=326896609967191960ULL;pll[607]=11973206673699893678ULL;pll[608]=580828552067660473ULL;pll[609]=8128883320371638839ULL;pll[610]=1656112873117944112ULL;pll[611]=12722538250730462294ULL;pll[612]=12316154041264961999ULL;pll[613]=6851246260458336309ULL;pll[614]=12530699332575885784ULL;pll[615]=12418104709849172711ULL;pll[616]=18110614482058010089ULL;pll[617]=15305467425601876983ULL;pll[618]=18364984647406265936ULL;pll[619]=14963613316504878078ULL;pll[620]=12281639605675428360ULL;pll[621]=9039964665945946699ULL;pll[622]=6841390652682774858ULL;pll[623]=253814039625729572ULL;pll[624]=16324152366570354901ULL;pll[625]=17345945592374779685ULL;pll[626]=2863327568109687471ULL;pll[627]=2657200390798756359ULL;pll[628]=1370957561240148969ULL;pll[629]=1654163334960643096ULL;pll[630]=14036730100279928966ULL;pll[631]=12846231397805320740ULL;pll[632]=3499167965856114466ULL;pll[633]=7443942090051535032ULL;pll[634]=9763857910206951701ULL;pll[635]=10341615609317169524ULL;pll[636]=181074649806666859ULL;pll[637]=10987465240669471920ULL;pll[638]=9340228947878757234ULL;pll[639]=17173633740217349780ULL;pll[640]=13477883433770211041ULL;pll[641]=15623543351601478486ULL;pll[642]=2797492851930636325ULL;pll[643]=16601065939821294713ULL;pll[644]=4962306558839151681ULL;pll[645]=15249331159045864999ULL;pll[646]=7780430738508066614ULL;pll[647]=4871728710920809900ULL;pll[648]=17771953868912182028ULL;pll[649]=7961341119021063884ULL;pll[650]=4607216976778666212ULL;pll[651]=17928825298710602767ULL;pll[652]=18316118171886505501ULL;pll[653]=9450843830029952584ULL;pll[654]=1274910691810303160ULL;pll[655]=6575265673950130260ULL;pll[656]=14171344321872503964ULL;pll[657]=4444030587197587182ULL;pll[658]=9927563715274532570ULL;pll[659]=15908566921925632508ULL;pll[660]=5488997120077089003ULL;pll[661]=15117011139468037686ULL;pll[662]=4496333870477662041ULL;pll[663]=1184020028369896104ULL;pll[664]=9980949492582447582ULL;pll[665]=6105861200516107546ULL;pll[666]=6688931933085624633ULL;pll[667]=1849727605876568664ULL;pll[668]=745529942381511519ULL;pll[669]=11284376075251362574ULL;pll[670]=4253451973436620596ULL;pll[671]=7244544556814835712ULL;pll[672]=14739682174625879990ULL;pll[673]=8229193040960753785ULL;pll[674]=9496447491517097939ULL;pll[675]=15814966495708386608ULL;pll[676]=15142075576863469713ULL;pll[677]=1209540736448680079ULL;pll[678]=7668183877426163886ULL;pll[679]=4435269797095007623ULL;pll[680]=8942129316894152314ULL;pll[681]=9546880722007351733ULL;pll[682]=1973038916838396208ULL;pll[683]=16466524535788706036ULL;pll[684]=5530753174197139066ULL;pll[685]=12326407258369190638ULL;pll[686]=4839244597813948210ULL;pll[687]=16290719645885707849ULL;pll[688]=7892487799338918960ULL;pll[689]=7384559897506999298ULL;pll[690]=14242548836374343767ULL;pll[691]=1751450982104048065ULL;pll[692]=90606177140585587ULL;pll[693]=10971988517156593140ULL;pll[694]=17300990465715355841ULL;pll[695]=12675933637741724223ULL;pll[696]=3557759121376285371ULL;pll[697]=17810691481561694526ULL;pll[698]=5116827443104360428ULL;pll[699]=5587040504269737993ULL;pll[700]=13396970589233185917ULL;pll[701]=10273677214103451582ULL;pll[702]=14089030882513340462ULL;pll[703]=11797502509672442511ULL;pll[704]=14188223372306287935ULL;pll[705]=16523620735052093310ULL;pll[706]=2645037925516414432ULL;pll[707]=10117342210270875333ULL;pll[708]=16987302771101743050ULL;pll[709]=10461163364351582728ULL;pll[710]=13057719741236173279ULL;pll[711]=7660008244623134126ULL;pll[712]=6757035684887224855ULL;pll[713]=13978428589559356351ULL;pll[714]=9179542961496046972ULL;pll[715]=10471406604924669424ULL;pll[716]=15878298313961823047ULL;pll[717]=5342590989706714220ULL;pll[718]=8304884957872272940ULL;pll[719]=14488226913638653385ULL;pll[720]=2838275877821024060ULL;pll[721]=11255896480798670503ULL;pll[722]=12400672142663656762ULL;pll[723]=9702279964733290598ULL;pll[724]=10547311563311211282ULL;pll[725]=525460894581628568ULL;pll[726]=10186054719843078551ULL;pll[727]=5454629969096263870ULL;pll[728]=6927389740783887087ULL;pll[729]=5456200064294156117ULL;pll[730]=8117985237876031029ULL;pll[731]=14169014112391548192ULL;pll[732]=433266238654475428ULL;pll[733]=9413120380049644454ULL;pll[734]=15621031090516909589ULL;pll[735]=3397957768497735146ULL;pll[736]=1565941151909717970ULL;pll[737]=7487484677687416834ULL;pll[738]=17325603511323307587ULL;pll[739]=6896827218494067304ULL;pll[740]=14341397448550617233ULL;pll[741]=122559696167487728ULL;pll[742]=4668579613988297377ULL;pll[743]=15015963001576764242ULL;pll[744]=9902556379265463624ULL;pll[745]=8108886563283517770ULL;pll[746]=12124404457002245749ULL;pll[747]=13267280379718823768ULL;pll[748]=11612767960549195474ULL;pll[749]=7503646366083630219ULL;pll[750]=11401863167857880454ULL;pll[751]=1971399502676495470ULL;pll[752]=3740411657494406941ULL;pll[753]=17657175420802638225ULL;pll[754]=8848589338860297314ULL;pll[755]=5598480206100831391ULL;pll[756]=15106561013609516630ULL;pll[757]=10068453339624453754ULL;pll[758]=4092733987429319325ULL;pll[759]=11501801042421723705ULL;pll[760]=8978872925462310438ULL;pll[761]=3857669722730487987ULL;pll[762]=6000671975172957975ULL;pll[763]=9582774254979428349ULL;pll[764]=6982657968565750578ULL;pll[765]=11032252299178014735ULL;pll[766]=17939298858002968522ULL;pll[767]=573235925270059801ULL;pll[768]=12926564826593328386ULL;pll[769]=2136814602290983869ULL;pll[770]=12267737273318136521ULL;pll[771]=2053526716828270107ULL;pll[772]=9480674695105271259ULL;pll[773]=821724766589070531ULL;pll[774]=10421864522095047598ULL;pll[775]=1023335462672436524ULL;pll[776]=2008999550702851948ULL;pll[777]=981202451917993369ULL;pll[778]=16031537186325280836ULL;pll[779]=8636808406430132836ULL;pll[780]=3354283871624094007ULL;pll[781]=18269312356039727640ULL;pll[782]=10021327288839475649ULL;pll[783]=16314821293700823303ULL;pll[784]=3335136776987826396ULL;pll[785]=5175931649355817759ULL;pll[786]=3581441343553731906ULL;pll[787]=11877082404786580560ULL;pll[788]=2702222188132946432ULL;pll[789]=15371186782022156324ULL;pll[790]=5482463222787810145ULL;pll[791]=14997129545123763837ULL;pll[792]=9729431777311155081ULL;pll[793]=13441155253156668098ULL;pll[794]=3169342027028993268ULL;pll[795]=14039872980229951397ULL;pll[796]=3259211481723077126ULL;pll[797]=12637213916766824135ULL;pll[798]=12486977733234444928ULL;pll[799]=11614372710043612319ULL;pll[800]=12099427446374925572ULL;pll[801]=15298248689821474387ULL;pll[802]=12958379576971835684ULL;pll[803]=7811606957877830097ULL;pll[804]=12095285659600942244ULL;pll[805]=12860989936212644486ULL;pll[806]=14631435104017762087ULL;pll[807]=15141857090124773546ULL;pll[808]=2260231246134601403ULL;pll[809]=6849894894363947704ULL;pll[810]=14809582057507724724ULL;pll[811]=15740278082577254300ULL;pll[812]=16830565004996222138ULL;pll[813]=15772614572415725017ULL;pll[814]=13990018763531866046ULL;pll[815]=290493241525125343ULL;pll[816]=17483928065728310566ULL;pll[817]=14909585327452951354ULL;pll[818]=8476513668918928585ULL;pll[819]=7237208952934778334ULL;pll[820]=15341246087627581110ULL;pll[821]=15536361604924079261ULL;pll[822]=3215415952171428397ULL;pll[823]=627944781409827306ULL;pll[824]=1657204777650883ULL;pll[825]=16947151839307789159ULL;pll[826]=14799877365706370588ULL;pll[827]=4556750834360949302ULL;pll[828]=1972704835639749493ULL;pll[829]=3229760815343016531ULL;pll[830]=16252590698237713813ULL;pll[831]=14351263676058665851ULL;pll[832]=8943574719035205969ULL;pll[833]=16583089034666807216ULL;pll[834]=8946220161850572300ULL;pll[835]=1951261517914793140ULL;pll[836]=13828552736320211253ULL;pll[837]=13252007063117847865ULL;pll[838]=15854017540788668591ULL;pll[839]=9158719858248959706ULL;pll[840]=17073507995389302295ULL;pll[841]=2697388969395194837ULL;pll[842]=17390030943485942424ULL;pll[843]=1992640443166321287ULL;pll[844]=14876368280299166141ULL;pll[845]=18001653523763062866ULL;pll[846]=920613616378696190ULL;pll[847]=16381398817757854176ULL;pll[848]=6137309864618300340ULL;pll[849]=8198661785299747413ULL;pll[850]=11252482616505560234ULL;pll[851]=13030140843220121247ULL;pll[852]=6520179055165727836ULL;pll[853]=4595879960736785889ULL;pll[854]=13234566032135101874ULL;pll[855]=13711828575646206190ULL;pll[856]=17310896505643121768ULL;pll[857]=11329124540454151826ULL;pll[858]=11761088012737550917ULL;pll[859]=9560498848369344472ULL;pll[860]=6006041899436563813ULL;pll[861]=12473450636564755338ULL;pll[862]=444369075991334159ULL;pll[863]=4111371542468628627ULL;pll[864]=3789098870348635422ULL;pll[865]=2675073214905681948ULL;pll[866]=3727449966663881265ULL;pll[867]=13216787228800502193ULL;pll[868]=9640134313557480774ULL;pll[869]=13947391365748229408ULL;pll[870]=12895441404636363339ULL;pll[871]=15004590072604185267ULL;pll[872]=546725307587326951ULL;pll[873]=13041920359435981112ULL;pll[874]=8271938462661594224ULL;pll[875]=8502100242763175463ULL;pll[876]=18009011359269621061ULL;pll[877]=4395793110252821814ULL;pll[878]=10409467599643399283ULL;pll[879]=7016055096083488069ULL;pll[880]=2409181912938677949ULL;pll[881]=14548425149853749363ULL;pll[882]=8693991012369574290ULL;pll[883]=5547571599821784717ULL;pll[884]=6023946832142986064ULL;pll[885]=3826988611372976454ULL;pll[886]=16977097013719229280ULL;pll[887]=11046565133028354517ULL;pll[888]=12923140738640813949ULL;pll[889]=4991323898241765542ULL;pll[890]=14062404014482800013ULL;pll[891]=9100851188960015177ULL;pll[892]=15607512141040621571ULL;pll[893]=17657839882625304230ULL;pll[894]=7682452395387721440ULL;pll[895]=115890617829686010ULL;pll[896]=10393148587861193223ULL;pll[897]=3923067509733299307ULL;pll[898]=14287312070715753180ULL;pll[899]=12271046329833713344ULL;pll[900]=10195523434393313924ULL;pll[901]=5318294664874135247ULL;pll[902]=1721643928992631772ULL;pll[903]=11074560733132990909ULL;pll[904]=12084198065032004435ULL;pll[905]=13225378480504598060ULL;pll[906]=16561676205766221327ULL;pll[907]=14918389620393441916ULL;pll[908]=17862260992715238614ULL;pll[909]=10441119895544699927ULL;pll[910]=6662011886379878229ULL;pll[911]=2983838630235922048ULL;pll[912]=29710552653335212ULL;pll[913]=8123108094018648157ULL;pll[914]=3704487365379324006ULL;pll[915]=9038486961974811338ULL;pll[916]=2114609497631699583ULL;pll[917]=5515932107570139139ULL;pll[918]=12178377499352232889ULL;pll[919]=9089710878393764160ULL;pll[920]=14644975760426373676ULL;pll[921]=5761993823569288854ULL;pll[922]=9018322023125397334ULL;pll[923]=12042274914785444672ULL;pll[924]=4569531064917671975ULL;pll[925]=6384740283665814951ULL;pll[926]=7431953181749104480ULL;pll[927]=16118624036170699291ULL;pll[928]=9867058321677590359ULL;pll[929]=11153546497561253211ULL;pll[930]=6512455461510833695ULL;pll[931]=1268086140194607602ULL;pll[932]=13546856779910972725ULL;pll[933]=15127085270231746823ULL;pll[934]=5731179024775616213ULL;pll[935]=3581048902816915048ULL;pll[936]=4132713832565211554ULL;pll[937]=4052763506319590121ULL;pll[938]=17900564493294228402ULL;pll[939]=13971865776236424859ULL;pll[940]=484674435796887431ULL;pll[941]=12372474707591795138ULL;pll[942]=4978175716207308314ULL;pll[943]=14708441958801825819ULL;pll[944]=3902507162894039370ULL;pll[945]=1615525758959086357ULL;pll[946]=11518468655428639898ULL;pll[947]=15782888645377782981ULL;pll[948]=18242393776705452011ULL;pll[949]=7895417452071178926ULL;pll[950]=11983803593969842966ULL;pll[951]=4091761955347676429ULL;pll[952]=13264001078216789760ULL;pll[953]=378035936488976979ULL;pll[954]=10227501000466778ULL;pll[955]=14875476890839640294ULL;pll[956]=10611882993844637307ULL;pll[957]=1122551206798097092ULL;pll[958]=11876555702006539686ULL;pll[959]=5799644641230571028ULL;pll[960]=8059998927805589801ULL;pll[961]=6040284863527354387ULL;pll[962]=14773468671281556915ULL;pll[963]=15583835998493986723ULL;pll[964]=3831900853555240521ULL;pll[965]=10154574708550562317ULL;pll[966]=10406688400241633463ULL;pll[967]=9304804737740195764ULL;pll[968]=14610778916915983979ULL;pll[969]=13506976778949522499ULL;pll[970]=10165583815656373569ULL;pll[971]=11898315352277121702ULL;pll[972]=17649869769945666953ULL;pll[973]=7603154327051885724ULL;pll[974]=9089800603231733368ULL;pll[975]=7128471851247758451ULL;pll[976]=6540381995929506459ULL;pll[977]=5343138494737722183ULL;pll[978]=14212033493949655767ULL;pll[979]=13946880379361001154ULL;pll[980]=3790646176597032902ULL;pll[981]=17053038683363723988ULL;pll[982]=11743091364174970752ULL;pll[983]=5870321466043122460ULL;pll[984]=12363432381790700360ULL;pll[985]=17717055441350349166ULL;pll[986]=3800741981094425183ULL;pll[987]=12095841419350154128ULL;pll[988]=6294523004073687056ULL;pll[989]=5046997727659837928ULL;pll[990]=15268496918455470199ULL;pll[991]=11127262256367130784ULL;pll[992]=11812387347189415232ULL;pll[993]=5118868033744145528ULL;pll[994]=15019247789235199478ULL;pll[995]=16160274731075444120ULL;pll[996]=4460935969676516003ULL;pll[997]=1561863949681284649ULL;pll[998]=14757635853486265672ULL;pll[999]=9389987699665899411ULL;pll[1000]=18168215057164776752ULL;pll[1001]=16981995621385597361ULL;pll[1002]=10667176587744113915ULL;pll[1003]=6615456035192851395ULL;pll[1004]=8365244764964174898ULL;pll[1005]=17839496717444085782ULL;pll[1006]=11720661228921416057ULL;pll[1007]=16789597542273923483ULL;pll[1008]=9480923448297780358ULL;pll[1009]=6608062218855062314ULL;pll[1010]=784965141123001850ULL;pll[1011]=16954098652958072242ULL;pll[1012]=3156166674350535561ULL;pll[1013]=8074059736602203290ULL;pll[1014]=5451742278057911794ULL;pll[1015]=10342219885093999147ULL;pll[1016]=15876015823928004259ULL;pll[1017]=14549475416189863889ULL;pll[1018]=14866246217954303400ULL;pll[1019]=454918838176883060ULL;pll[1020]=7906646954542910766ULL;pll[1021]=7284976013681605116ULL;pll[1022]=5375829823998110282ULL;pll[1023]=9126101106630655781ULL;pll[1024]=305573494700797567ULL;pll[1025]=12920916892074203526ULL;pll[1026]=5188799165440702992ULL;pll[1027]=10598839851589035127ULL;pll[1028]=3738609666357039555ULL;pll[1029]=14894919320385002092ULL;pll[1030]=666994205619791646ULL;pll[1031]=13049464149577835209ULL;pll[1032]=9843486779077088846ULL;pll[1033]=18143218917431607554ULL;pll[1034]=6436108281188951180ULL;pll[1035]=1386531088441150690ULL;pll[1036]=17239178758084069113ULL;pll[1037]=7523915853079206007ULL;pll[1038]=1803930793571720209ULL;pll[1039]=12611911116777781520ULL;pll[1040]=13125888410941506533ULL;pll[1041]=8023081904558586071ULL;pll[1042]=14152802606249277415ULL;pll[1043]=16688033175070734691ULL;pll[1044]=17222594119428682242ULL;pll[1045]=4643600226976186140ULL;pll[1046]=16427829054341487168ULL;pll[1047]=13354257560520712272ULL;pll[1048]=11141161818238574161ULL;pll[1049]=12331957719373725806ULL;pll[1050]=12319943410548834312ULL;pll[1051]=3411819142395732091ULL;pll[1052]=2406079594229069960ULL;pll[1053]=11669421397777346574ULL;pll[1054]=4401683769048818622ULL;pll[1055]=5232011605160440599ULL;pll[1056]=4396895003670859573ULL;pll[1057]=5181999396373570037ULL;pll[1058]=2885380466959936103ULL;pll[1059]=14090956876270679061ULL;pll[1060]=8627683536903519407ULL;pll[1061]=4521803628468165540ULL;pll[1062]=6980646874459627383ULL;pll[1063]=10826280151920791255ULL;pll[1064]=6614574216327896022ULL;pll[1065]=7249048151393433367ULL;pll[1066]=13609173163802526930ULL;pll[1067]=439589590882648918ULL;pll[1068]=16156498047502482863ULL;pll[1069]=17880108538732865189ULL;pll[1070]=2511197811559213628ULL;pll[1071]=14014698011573618531ULL;pll[1072]=7014236856348836671ULL;pll[1073]=3298330485783765159ULL;pll[1074]=3578247196207252455ULL;pll[1075]=17730140546627094274ULL;pll[1076]=2618026125836994003ULL;pll[1077]=2900679039275668171ULL;pll[1078]=12870987469585049475ULL;pll[1079]=4488593509911542050ULL;pll[1080]=10105919961634556183ULL;pll[1081]=8435918618307960599ULL;pll[1082]=2054991957844775346ULL;pll[1083]=9746996754640507747ULL;pll[1084]=5372103119896971125ULL;pll[1085]=439883935747051244ULL;pll[1086]=5139910149256232414ULL;pll[1087]=7204048136569166377ULL;pll[1088]=16291000130655253006ULL;pll[1089]=13181468481902396603ULL;pll[1090]=17822624448815033773ULL;pll[1091]=3522633971496264030ULL;pll[1092]=10227385380861461986ULL;pll[1093]=12498958203398898362ULL;pll[1094]=7048240792008360671ULL;pll[1095]=7229665838131883757ULL;pll[1096]=10199954498751578865ULL;pll[1097]=2900557308902983083ULL;pll[1098]=2697639991995663054ULL;pll[1099]=8437576796414732720ULL;pll[1100]=11869751398535976875ULL;pll[1101]=9057927204011333694ULL;pll[1102]=8904814333037104613ULL;pll[1103]=16564590257938383430ULL;pll[1104]=4457163036636239845ULL;pll[1105]=1633159370205538847ULL;pll[1106]=7556988737639710595ULL;pll[1107]=4218320765548228536ULL;pll[1108]=13248952875858078230ULL;pll[1109]=14458870218693484459ULL;pll[1110]=3913135131781312571ULL;pll[1111]=12841828992395953892ULL;pll[1112]=12714257105197068934ULL;pll[1113]=17187737879300464481ULL;pll[1114]=5661292070734536476ULL;pll[1115]=13254441009522082859ULL;pll[1116]=14913173872072397207ULL;pll[1117]=10398005233657699878ULL;pll[1118]=8624355978575230335ULL;pll[1119]=5308233234835104836ULL;pll[1120]=6242658972704799923ULL;pll[1121]=12865575930673871026ULL;pll[1122]=12763511145286790808ULL;pll[1123]=7056602543238134968ULL;pll[1124]=3048808356526334330ULL;pll[1125]=9167697710566940891ULL;pll[1126]=15424052697294805813ULL;pll[1127]=2556911633660227646ULL;pll[1128]=13198273963018464791ULL;pll[1129]=12367189666127836913ULL;pll[1130]=12048678050798956619ULL;pll[1131]=16258692160045703937ULL;pll[1132]=7707183622123561629ULL;pll[1133]=14693956403966203807ULL;pll[1134]=11035191105434413629ULL;pll[1135]=17134716294928251391ULL;pll[1136]=1559678956880000841ULL;pll[1137]=318367688842499867ULL;pll[1138]=5102650288697734116ULL;pll[1139]=14836313399500071478ULL;pll[1140]=2748698000663349654ULL;pll[1141]=16898166374775006925ULL;pll[1142]=12829899867810803785ULL;pll[1143]=10027809646404590186ULL;pll[1144]=12900295011765210382ULL;pll[1145]=13901686500300486765ULL;pll[1146]=18041000267061130665ULL;pll[1147]=1250780088655294419ULL;pll[1148]=18040648341350503548ULL;pll[1149]=6015096245351884323ULL;pll[1150]=6789799956892280311ULL;pll[1151]=14398773146098154890ULL;pll[1152]=12026324455887573331ULL;pll[1153]=3301168446539673906ULL;pll[1154]=14088626117087356726ULL;pll[1155]=16895080898208724705ULL;pll[1156]=10871091856223041318ULL;pll[1157]=3612530255058227667ULL;pll[1158]=1189256841661686888ULL;pll[1159]=17148941382471231547ULL;pll[1160]=13286408522592603557ULL;pll[1161]=3076863079314205048ULL;pll[1162]=1921446092415458938ULL;pll[1163]=5442844261251758055ULL;pll[1164]=6652176303018374310ULL;pll[1165]=5599792304648126161ULL;pll[1166]=3812776145121976887ULL;pll[1167]=10311039792722859102ULL;pll[1168]=4017691643830839662ULL;pll[1169]=18141010945971894884ULL;pll[1170]=15942946456938353670ULL;pll[1171]=18374686514028665759ULL;pll[1172]=3356462396611757055ULL; +p[9384]=75;p[9385]=0;p[9386]=0; +} +#endif //DR_MNEMONIC_WORDS_MNEMONIC_GERMAN_H \ No newline at end of file diff --git a/src/cpp/Gradido_LoginServer.cpp b/src/cpp/Gradido_LoginServer.cpp new file mode 100644 index 000000000..b4b769249 --- /dev/null +++ b/src/cpp/Gradido_LoginServer.cpp @@ -0,0 +1,81 @@ +#include "Gradido_LoginServer.h" +#include "HTTPInterface/PageRequestHandlerFactory.h" + +#include "Poco/Util/HelpFormatter.h" +#include "Poco/Net/ServerSocket.h" +#include "Poco/Net/HTTPServer.h" + +#include + + + +Gradido_LoginServer::Gradido_LoginServer() + : _helpRequested(false) +{ +} + +Gradido_LoginServer::~Gradido_LoginServer() +{ +} + + +void Gradido_LoginServer::initialize(Application& self) +{ + loadConfiguration(); // load default configuration files, if present + ServerApplication::initialize(self); +} + +void Gradido_LoginServer::uninitialize() +{ + ServerApplication::uninitialize(); +} + +void Gradido_LoginServer::defineOptions(Poco::Util::OptionSet& options) +{ + ServerApplication::defineOptions(options); + + options.addOption( + Poco::Util::Option("help", "h", "display help information on command line arguments") + .required(false) + .repeatable(false)); +} + +void Gradido_LoginServer::handleOption(const std::string& name, const std::string& value) +{ + ServerApplication::handleOption(name, value); + if (name == "help") _helpRequested = true; +} + +void Gradido_LoginServer::displayHelp() +{ + Poco::Util::HelpFormatter helpFormatter(options()); + helpFormatter.setCommand(commandName()); + helpFormatter.setUsage("OPTIONS"); + helpFormatter.setHeader("A web server that shows how to work with HTML forms."); + helpFormatter.format(std::cout); +} + +int Gradido_LoginServer::main(const std::vector& args) +{ + if (_helpRequested) + { + displayHelp(); + } + else + { + unsigned short port = (unsigned short)config().getInt("HTTPServer.port", 9980); + + // set-up a server socket + Poco::Net::ServerSocket svs(port); + // set-up a HTTPServer instance + Poco::Net::HTTPServer srv(new PageRequestHandlerFactory, svs, new Poco::Net::HTTPServerParams); + // start the HTTPServer + srv.start(); + // wait for CTRL-C or kill + waitForTerminationRequest(); + // Stop the HTTPServer + srv.stop(); + } + return Application::EXIT_OK; +} + diff --git a/src/cpp/Gradido_LoginServer.h b/src/cpp/Gradido_LoginServer.h new file mode 100644 index 000000000..c2451aad7 --- /dev/null +++ b/src/cpp/Gradido_LoginServer.h @@ -0,0 +1,39 @@ +#ifndef Gradido_LoginServer_INCLUDED +#define Gradido_LoginServer_INCLUDED + +#include "Poco/Util/ServerApplication.h" + +class Gradido_LoginServer : public Poco::Util::ServerApplication +{ + + /// The main application class. + /// + /// This class handles command-line arguments and + /// configuration files. + /// Start the Gradido_LoginServer executable with the help + /// option (/help on Windows, --help on Unix) for + /// the available command line options. + /// + + +public: + Gradido_LoginServer(); + ~Gradido_LoginServer(); + +protected: + void initialize(Application& self); + + void uninitialize(); + + void defineOptions(Poco::Util::OptionSet& options); + + void handleOption(const std::string& name, const std::string& value); + void displayHelp(); + + int main(const std::vector& args); + +private: + bool _helpRequested; +}; + +#endif //Gradido_LoginServer_INCLUDED diff --git a/src/cpp/HTTPInterface/ConfigPage.cpp b/src/cpp/HTTPInterface/ConfigPage.cpp new file mode 100644 index 000000000..8eb2cfd96 --- /dev/null +++ b/src/cpp/HTTPInterface/ConfigPage.cpp @@ -0,0 +1,105 @@ +#include "ConfigPage.h" +#include "Poco/Net/HTTPServerRequest.h" +#include "Poco/Net/HTTPServerResponse.h" +#include "Poco/Net/HTMLForm.h" +#include "Poco/DeflatingStream.h" + + +#line 4 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\config.cpsp" + + + + +void ConfigPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) +{ + response.setChunkedTransferEncoding(true); + response.setContentType("text/html"); + bool _compressResponse(request.hasToken("Accept-Encoding", "gzip")); + if (_compressResponse) response.set("Content-Encoding", "gzip"); + + Poco::Net::HTMLForm form(request, request.stream()); + std::ostream& _responseStream = response.send(); + Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); + std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "Gradido Login Server: Config\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "

Config

\n"; + responseStream << "
\n"; + responseStream << "\t
\n"; + responseStream << "\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\tServer Admin Key\n"; + responseStream << "\t\t\t

Möchtest du einen neuen Server Key generieren oder einen existierenden verwenden?

\n"; + responseStream << "\t\t\t

Wenn du bereits einen besitzt kopiere bitte den Merksatz dafür in die Textarea.

\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\tLogin-Server (dieser Server)\n"; + responseStream << "\t\t\t

Bitte gebe die Daten für diesen Server an.

\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t\tDatenbank\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\tPHP-Server\n"; + responseStream << "\t\t\t

Bitte gebe hier die Daten des php-Servers an.

\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t\tDatenbank\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\n"; + responseStream << "\t
\n"; + responseStream << "
\n"; + responseStream << "\n"; + responseStream << "\n"; + if (_compressResponse) _gzipStream.close(); +} diff --git a/src/cpp/HTTPInterface/ConfigPage.h b/src/cpp/HTTPInterface/ConfigPage.h new file mode 100644 index 000000000..47a7558ed --- /dev/null +++ b/src/cpp/HTTPInterface/ConfigPage.h @@ -0,0 +1,15 @@ +#ifndef ConfigPage_INCLUDED +#define ConfigPage_INCLUDED + + +#include "Poco/Net/HTTPRequestHandler.h" + + +class ConfigPage: public Poco::Net::HTTPRequestHandler +{ +public: + void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); +}; + + +#endif // ConfigPage_INCLUDED diff --git a/src/cpp/HTTPInterface/HandleFileRequest.cpp b/src/cpp/HTTPInterface/HandleFileRequest.cpp new file mode 100644 index 000000000..bc1138f98 --- /dev/null +++ b/src/cpp/HTTPInterface/HandleFileRequest.cpp @@ -0,0 +1,41 @@ +#include "HandleFileRequest.h" +#include "Poco/Net/HTTPServerRequest.h" +#include "Poco/Net/HTTPServerResponse.h" +#include "Poco/DeflatingStream.h" +#include "Poco/FileStream.h" + +void HandleFileRequest::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) +{ + response.setChunkedTransferEncoding(true); + + std::string uri = request.getURI(); + // check endung + size_t last_point = uri.find_last_of('.'); + std::string endung = uri.substr(last_point+1); + + std::string mediaType; + + //printf("endung: %s\n", endung.data()); + if (endung == "css") { + mediaType = "text/css"; + } + else if (endung == "js") { + mediaType = "text/javascript"; + } + else if (endung == "ico") { + mediaType = "image/x-icon"; + } + std::string path = "data" + uri; + printf("file path: %s\n", path.data()); + response.sendFile(path, mediaType); +/* + bool _compressResponse(request.hasToken("Accept-Encoding", "gzip")); + if (_compressResponse) response.set("Content-Encoding", "gzip"); + + std::ostream& _responseStream = response.send(); + Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); + std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; + responseStream << new Poco::FileInputStream("./data/" + uri); + if (_compressResponse) _gzipStream.close(); + */ +} diff --git a/src/cpp/HTTPInterface/HandleFileRequest.h b/src/cpp/HTTPInterface/HandleFileRequest.h new file mode 100644 index 000000000..dd5f99ea8 --- /dev/null +++ b/src/cpp/HTTPInterface/HandleFileRequest.h @@ -0,0 +1,15 @@ +#ifndef HandleFileRequest_INCLUDED +#define HandleFileRequest_INCLUDED + + +#include "Poco/Net/HTTPRequestHandler.h" + + +class HandleFileRequest : public Poco::Net::HTTPRequestHandler +{ +public: + void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); +}; + + +#endif // HandleFileRequest_INCLUDED diff --git a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp new file mode 100644 index 000000000..d8609f6da --- /dev/null +++ b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp @@ -0,0 +1,31 @@ +#include "PageRequestHandlerFactory.h" +#include "Poco/Net/HTTPServerRequest.h" + +#include "ConfigPage.h" +#include "LoginPage.h" +#include "RegisterPage.h" +#include "HandleFileRequest.h" + +PageRequestHandlerFactory::PageRequestHandlerFactory() +{ + +} + +Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest& request) +{ + printf("request uri: %s\n", request.getURI().data()); + + std::string uri = request.getURI(); + + if (uri == "/") { + return new ConfigPage; + } + else if (uri == "/login") { + return new LoginPage; + } + else if (uri == "/register") { + return new RegisterPage; + } + return new HandleFileRequest; + //return new PageRequestHandlerFactory; +} \ No newline at end of file diff --git a/src/cpp/HTTPInterface/PageRequestHandlerFactory.h b/src/cpp/HTTPInterface/PageRequestHandlerFactory.h new file mode 100644 index 000000000..765f50da3 --- /dev/null +++ b/src/cpp/HTTPInterface/PageRequestHandlerFactory.h @@ -0,0 +1,19 @@ +#ifndef __DR_PAGE_REQUEST_HANDLER_FACTORY_H +#define __DR_PAGE_REQUEST_HANDLER_FACTORY_H + +#include "Poco/Net/HTTPRequestHandlerFactory.h" + + +#define HTTP_PAGES_COUNT 1 + +class PageRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory +{ +public: + PageRequestHandlerFactory(); + + Poco::Net::HTTPRequestHandler* createRequestHandler(const Poco::Net::HTTPServerRequest& request); + +protected: +}; + +#endif // __DR_PAGE_REQUEST_HANDLER_FACTORY_H \ No newline at end of file diff --git a/src/cpp/ServerConfig.cpp b/src/cpp/ServerConfig.cpp index e69de29bb..25983c664 100644 --- a/src/cpp/ServerConfig.cpp +++ b/src/cpp/ServerConfig.cpp @@ -0,0 +1 @@ +#include "ServerConfig.h" \ No newline at end of file diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index f279c7bd6..dd0b6d2ec 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -1,16 +1,14 @@ -#include +#include "Gradido_LoginServer.h" #include - -int main(int argc, char* argv[]) { - printf("hallo Welt\n"); - +int main(int argc, char** argv) +{ if (sodium_init() < 0) { /* panic! the library couldn't be initialized, it is not safe to use */ - } - else { - printf("sodium initalized\n"); + printf("error initing sodium, early exit\n"); + return -1; } - return 42; -} \ No newline at end of file + Gradido_LoginServer app; + return app.run(argc, argv); +} diff --git a/src/cpsp/config.cpsp b/src/cpsp/config.cpsp new file mode 100644 index 000000000..2c33b6ba9 --- /dev/null +++ b/src/cpsp/config.cpsp @@ -0,0 +1,85 @@ +<%@ page class="ConfigPage" %> +<%@ page form="true" %> +<%@ page compressed="true" %> +<%! + +%> + + + + + +Gradido Login Server: Config + + + + +

Config

+
+
+ +
+ Server Admin Key +

Möchtest du einen neuen Server Key generieren oder einen existierenden verwenden?

+

Wenn du bereits einen besitzt kopiere bitte den Merksatz dafür in die Textarea.

+

+ + +

+

+ + +

+ +
+
+ Login-Server (dieser Server) +

Bitte gebe die Daten für diesen Server an.

+
+ Datenbank +
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ PHP-Server +

Bitte gebe hier die Daten des php-Servers an.

+
+ Datenbank +
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ +
+
+ + diff --git a/src/cpsp/login.cpsp b/src/cpsp/login.cpsp new file mode 100644 index 000000000..ccb238094 --- /dev/null +++ b/src/cpsp/login.cpsp @@ -0,0 +1,39 @@ +<%@ page class="LoginPage" %> +<%@ page form="true" %> +<%@ page compressed="true" %> +<%! + +%> + + + + + +Gradido Login Server: Login + + + + +

Login

+
+
+
+ Login +

Bitte gebe deine Zugangsdaten ein um dich einzuloggen.

+

+ + +

+

+ + +

+ +
+ +

Du hast noch keinen Account? Dann folge dem Link um dir einen anzulegen

+ Neuen Account anlegen +
+
+ + diff --git a/src/cpsp/register.cpsp b/src/cpsp/register.cpsp new file mode 100644 index 000000000..0159422ba --- /dev/null +++ b/src/cpsp/register.cpsp @@ -0,0 +1,46 @@ +<%@ page class="RegisterPage" %> +<%@ page form="true" %> +<%@ page compressed="true" %> +<%! + +%> + + + + + +Gradido Login Server: Register + + + + +

Login

+
+
+
+ Account anlegen +

Bitte gebe deine Daten um einen Account anzulegen

+

+ + +

+

+ + +

+

Hast du bereits schonmal ein Gradido Konto besessen?

+

+ + +

+

+ + +

+ +
+ +
+
+ +